classDiagram direction TB class RealtimeObservationSource { <> +collect(Request request) CollectionAttempt } class CollectionAttempt { -String attemptId -String sourceOperation -Instant requestedAt -String callPolicyRef -String retentionPolicyVersion } class CollectionOutcome { <> -String kind -Instant receivedAt -String contentDigest } class RetentionPolicy { -String policyId -String version +decision(String dataset, String field) Decision } class ObservationNormalizer { +normalize(CollectionAttempt attempt) ObservationBatch } class ObservationBatch { -String batchId -String attemptId -Instant availableAt } class BusObservation { -String observationId -String routeAxisRef -Instant sourceObservedAt -Instant receivedAt -Instant availableAt } class SeatReading { -String state -Integer remainingSeats -String reason } class BusPosition { -int lastPassedSequence -String phase } class PrivateVehicleRef { -String tokenVersion -String token } class PassageDeriver { +derive(List~ObservationBatch~ window) Result } class TripSegment { -String segmentId -String journeyKey -LocalDate serviceDateKst -Instant startedAt -Instant endedAt } class PassageEvidence { -String evidenceId -String kind -List~Integer~ candidateStopSequences -int elapsedSeconds -String terminalPhase -String derivationVersion } class EvidenceRef { -String role -String observationBatchId -String observationId } RealtimeObservationSource --> CollectionAttempt CollectionAttempt *-- CollectionOutcome CollectionAttempt --> RetentionPolicy ObservationNormalizer ..> CollectionAttempt ObservationNormalizer ..> RetentionPolicy ObservationNormalizer --> ObservationBatch ObservationBatch --> CollectionAttempt ObservationBatch *-- BusObservation BusObservation *-- SeatReading BusObservation *-- BusPosition BusObservation --> PrivateVehicleRef PassageDeriver ..> ObservationBatch PassageDeriver --> TripSegment PassageDeriver --> PassageEvidence TripSegment "1" <-- "0..*" PassageEvidence PassageEvidence *-- "2" EvidenceRef EvidenceRef ..> BusObservation PassageEvidence --> SeatReading