OBSERVERTC / Reference
Known implementation differences
Verified discrepancies to account for when building integrations.
Delta reset semantics
DERIVED_METRICS says zero; positiveDelta returns undefined. Source wins. Other consumers can explicitly coalesce; do not overgeneralize either direction.
Outdated metric names
DERIVED_METRICS examples use InboundRtpMonitor.fractionLost, isFreezed, and OutboundRtpMonitor.encodeTimePerFrameInMs; the current relevant names are deltaFractionLost/totalFractionLost, track flow state, and avgEncodeTimePerFrameInMs. See field inventory.
Pixelation explanation
ClientMonitorConfig prose still says bitPerPixel, while PixelatedVideoDetector uses normalizedQp.
Audio synthesis taxonomy
The stable taxonomy describes AudioPlayoutSynthesis as event-only/missing issue; actual constructor binds an InboundTrackMonitor and raises synthesized-audio using playout counters through that track.
Scoring prose
“open issues and nothing else,” “healthy/no issues always 5,” and root score becomes undefined with nothing measurable do not describe all actual paths. Continuous ramps and root early-return/default behavior contradict those statements.
Observer AcceptContext comment
The comment says merged into appData; actual factories can consume it at creation, and it is otherwise transient event context. Current changelog/config text correctly explains the distinction.
Observer middleware contract
Omitting next() does not stop ingestion; throwing logs “dropping” but still ingests; next(newPayload) does not replace the object dispatched. Observer.accept proceeds after process(), and no final callback controls dispatch. The existing middleware tests cover ordering/mutation/removal, not these advertised cases.
On-change ICE compatibility
Client Monitor sends static ICE metadata first/on change by default; ObservedIceTransport.update() assigns absent metadata to undefined. Thus roles, certificate IDs and crypto fields disappear on ordinary later samples. This needs a receiver-side retention contract or explicit sender setting, not documentation alone.
Zero score history
ObservedClient accepts score 0, but if (this.calculatedScore.value) skips its cumulative score measurement count. Current instantaneous score remains 0; historical counters omit that measurement.
Source references
- client-monitor-js/docs/DERIVED_METRICS.md
- client-monitor-js/src/utils/common.ts
- client-monitor-js/src/ClientMonitorConfig.ts
- client-monitor-js/src/detectors/AudioPlayoutSynthesisDetector.ts
- client-monitor-js/docs/DETECTOR_TAXONOMY.md
- client-monitor-js/src/scores/DefaultScoreCalculator.ts
- observer-js/src/Observer.ts · accept
- observer-js/src/common/Middleware.ts
- observer-js/src/ObservedIceTransport.ts · update
- observer-js/src/ObservedClient.ts · accept
Focused execution results. These are source-snapshot findings, not claims about unexamined later releases.