From c3a318573ef84a1482729b913acc83356d7ddec3 Mon Sep 17 00:00:00 2001 From: Shay Date: Sat, 11 Jul 2026 00:50:53 -0700 Subject: [PATCH] feat: integrate MetaRHEvidence into workbench schemas and journal --- workbench/journal.py | 2 ++ workbench/schemas.py | 38 ++++++++++++++++++++++++++++++++++++++ 2 files changed, 40 insertions(+) diff --git a/workbench/journal.py b/workbench/journal.py index 677dc01a..e63b64d7 100644 --- a/workbench/journal.py +++ b/workbench/journal.py @@ -60,6 +60,7 @@ class TurnJournalEntry: pipeline_record: CognitivePipelineRecord | dict[str, Any] | None = None field_evidence: FieldEvidence | dict[str, Any] | None = None construction_evidence: ConstructionEvidence | dict[str, Any] | None = None + meta_rh_evidence: dict[str, Any] | None = None practice_evidence: dict[str, Any] | None = None trace_integrity: TraceIntegrity | None = None journal_digest: str = "" @@ -103,6 +104,7 @@ class TurnJournalEntry: pipeline_record=to_data(result.pipeline_record), field_evidence=to_data(result.field_evidence), construction_evidence=to_data(result.construction_evidence), + meta_rh_evidence=to_data(getattr(result, "meta_rh_evidence", None)), practice_evidence=to_data(getattr(result, "practice_evidence", None)), trace_integrity=_trace_integrity_for_hash(result.trace_hash), ) diff --git a/workbench/schemas.py b/workbench/schemas.py index 50b5a56a..1f36f12c 100644 --- a/workbench/schemas.py +++ b/workbench/schemas.py @@ -176,6 +176,41 @@ class FieldEvidence: transition_inner_product: float | None +@dataclass(frozen=True, slots=True) +class MetaRHEvidence: + """Bi-hemisphere Meta-RH observability evidence. + + Surfaces the exact rule-based controller metrics from Sopher's RH governor + into the CORE evidence chain, ensuring we don't build a parallel telemetry stack. + """ + + schema_version: Literal["meta_rh_evidence_v1"] + status: PipelineEvidenceStatus + missing_reason: str | None + rh_energy: float + rh_mean_norm: float + rh_max_norm: float + rh_drift: float + violation_count: int + correction_count: int + mean_correction_magnitude: float + vault_n_records: int + vault_n_queries: int + vault_conflicts: int + vault_precision_proxy: float + lh_latency_ms: float + lh_emissary: str + lh_capabilities: tuple + harmful_compliance: float + over_refusal: float + utility: float + mean_logit_gap: float + closure_mode: str + closure_max_residual: float + closure_collapse_count: int + closure_field_max_residual: float + + @dataclass(frozen=True, slots=True) class LivedLifeHeartbeat: """One beat of the continuous life (read-only telemetry). @@ -266,6 +301,7 @@ class EvidenceBundle: pipeline_record: CognitivePipelineRecord | None field_evidence: FieldEvidence | None leeway_evidence: LeewayEvidence | None + meta_rh_evidence: MetaRHEvidence | None replay_reproducer: str bundle_digest: str @@ -336,6 +372,7 @@ class ChatTurnResult: pipeline_record: CognitivePipelineRecord | None = None field_evidence: FieldEvidence | None = None construction_evidence: ConstructionEvidence | None = None + meta_rh_evidence: MetaRHEvidence | None = None turn_id: int | None = None @@ -374,6 +411,7 @@ class TurnJournalEntrySchema: pipeline_record: CognitivePipelineRecord | None = None field_evidence: FieldEvidence | None = None construction_evidence: ConstructionEvidence | None = None + meta_rh_evidence: MetaRHEvidence | None = None @dataclass(frozen=True, slots=True)