feat(perception): seal M4.8S reference graph replay

This commit is contained in:
DCCONSTRUCTIONS
2026-08-25 16:44:26 +03:00
parent 33cef2fdea
commit 05590867b7
12 changed files with 2578 additions and 1 deletions
+34
View File
@@ -110,6 +110,10 @@ _RollingItem = _Temporal | _StopSignal
_ThreatItem = _Temporal | _Rolled | _StopSignal
_QueueItem = SourcePacket | _Detected | _Associated | _Temporal | _Rolled | _StopSignal
_QueueItemT = TypeVar("_QueueItemT", bound=_QueueItem)
DeliveryEvidenceObserver = Callable[
[DeliveredFrame, SourcePacket, tuple[ObjectProposal2D, ...], frozenset[str], int],
None,
]
class ReferencePerceptionGraphV1:
@@ -127,6 +131,8 @@ class ReferencePerceptionGraphV1:
threat: ThreatProvider,
telemetry_identity: PipelineTelemetryIdentity | None = None,
telemetry_sink: PipelineTelemetrySink | None = None,
delivery_observer: Callable[[DeliveredFrame, int], None] | None = None,
delivery_evidence_observer: DeliveryEvidenceObserver | None = None,
clock_ns: Callable[[], int] = time.monotonic_ns,
) -> None:
if config.graph_id != REFERENCE_GRAPH_ID:
@@ -145,6 +151,8 @@ class ReferencePerceptionGraphV1:
run_mode=GraphRunMode.SOURCE_PACED_LATEST_WINS,
telemetry_identity=telemetry_identity,
telemetry_sink=telemetry_sink,
delivery_observer=delivery_observer,
delivery_evidence_observer=delivery_evidence_observer,
clock_ns=clock_ns,
)
@@ -162,6 +170,8 @@ class ReferencePerceptionGraphV1:
run_mode: GraphRunMode,
telemetry_identity: PipelineTelemetryIdentity | None,
telemetry_sink: PipelineTelemetrySink | None,
delivery_observer: Callable[[DeliveredFrame, int], None] | None,
delivery_evidence_observer: DeliveryEvidenceObserver | None,
clock_ns: Callable[[], int],
) -> None:
if (telemetry_identity is None) is not (telemetry_sink is None):
@@ -177,6 +187,8 @@ class ReferencePerceptionGraphV1:
self.run_mode = run_mode
self.telemetry_identity = telemetry_identity
self.telemetry_sink = telemetry_sink
self.delivery_observer = delivery_observer
self.delivery_evidence_observer = delivery_evidence_observer
self._clock_ns = clock_ns
self._state = GraphState.CREATED
self._state_lock = Lock()
@@ -510,6 +522,23 @@ class ReferencePerceptionGraphV1:
obstacle_map=obstacle_map,
threats=threats,
)
completed_ns = self._now()
with self._result_lock:
admitted_at_ns = self._admitted_at_ns[item.packet.envelope.sequence]
completion_age_ns = item.packet.envelope.source_age_ns + max(
0,
completed_ns - admitted_at_ns,
)
if self.delivery_observer is not None:
self.delivery_observer(delivery, completion_age_ns)
if self.delivery_evidence_observer is not None:
self.delivery_evidence_observer(
delivery,
item.packet,
item.proposals,
item.associated_proposal_ids,
completion_age_ns,
)
with self._result_lock:
self._deliveries.append(delivery)
self._terminal(
@@ -845,6 +874,8 @@ class ReferencePerceptionGraphV2(ReferencePerceptionGraphV1):
run_mode: GraphRunMode,
telemetry_identity: PipelineTelemetryIdentity | None = None,
telemetry_sink: PipelineTelemetrySink | None = None,
delivery_observer: Callable[[DeliveredFrame, int], None] | None = None,
delivery_evidence_observer: DeliveryEvidenceObserver | None = None,
clock_ns: Callable[[], int] = time.monotonic_ns,
) -> None:
if config.graph_id != REFERENCE_GRAPH_ID_V2:
@@ -865,6 +896,8 @@ class ReferencePerceptionGraphV2(ReferencePerceptionGraphV1):
run_mode=run_mode,
telemetry_identity=telemetry_identity,
telemetry_sink=telemetry_sink,
delivery_observer=delivery_observer,
delivery_evidence_observer=delivery_evidence_observer,
clock_ns=clock_ns,
)
@@ -903,6 +936,7 @@ __all__ = [
"REFERENCE_GRAPH_ID_V2",
"TERMINAL_OUTCOME_SCHEMA",
"DeliveredFrame",
"DeliveryEvidenceObserver",
"GraphExecutionError",
"GraphRunResult",
"GraphRunResultV2",