Version history

The schema version lives in sources/version.txt and is stamped into every generated artifact. The three published packages — @observertc/schemas, @observertc/samples-encoder and @observertc/samples-decoder — are versioned in lockstep with it by the generator.

Current version: 3.3.0

Timeline

VersionDateHeadlineWire-format impact
3.3.02026-08key on ClientIssue; TypeScript generator rewrite⚠️ ClientIssue field numbers shift
3.2.02026-03ECN / RFC 8888 counters, PSNR, structured quality-limitation durationsAdditive
3.1.02025-06BigInt byte counters on outbound RTPEncoder/decoder only
3.0.02025-06Complete rewrite of the schema🚨 Breaking vs 2.x

What changed between 3.0.0 and 3.3.0

Everything added since 3.0.0, in one place. No field was removed and no field was renamed, so a decoder that understands 3.3.0 reads every 3.x sample — with the one wire-format caveat noted under 3.3.0.

New records

RecordIntroducedWhere it is used
PsnrSum3.2.0OutboundRtpStats.psnrSum — per-plane PSNR (y, u, v)
QualityLimitationDurations3.2.0OutboundRtpStats.qualityLimitationDurations — was a loose map, now a named record with none, cpu, bandwidth, other

New fields

RecordFieldVersionPurpose
ClientIssuekey3.3.0Ties an issue raise to its <type>-resolved companion
InboundRtpStatspacketsReceivedWithEct13.2.0ECN — packets marked ECT(1)
InboundRtpStatspacketsReceivedWithCe3.2.0ECN — packets marked CE
InboundRtpStatspacketsReportedAsLost3.2.0RFC 8888 — reported with a zero R bit
InboundRtpStatspacketsReportedAsLostButRecovered3.2.0RFC 8888 — later recovered
RemoteInboundRtpStatspacketsReceivedWithEct13.2.0ECN, remote side
RemoteInboundRtpStatspacketsReceivedWithCe3.2.0ECN, remote side
RemoteInboundRtpStatspacketsReportedAsLost3.2.0RFC 8888, remote side
RemoteInboundRtpStatspacketsReportedAsLostButRecovered3.2.0RFC 8888, remote side
RemoteInboundRtpStatspacketsWithBleachedEct1Marking3.2.0ECT(1) marking stripped by a middlebox
OutboundRtpStatsencodingIndex3.2.0Index of this encoding in the encodings array
OutboundRtpStatspsnrSum3.2.0Cumulative PSNR by plane
OutboundRtpStatspsnrMeasurements3.2.0Number of PSNR measurements
OutboundRtpStatspacketsSentWithEct13.2.0ECN — packets sent marked ECT(1)
IceTransportStatsccfbMessagesSent3.2.0Congestion Control Feedback messages sent
IceTransportStatsccfbMessagesReceived3.2.0Congestion Control Feedback messages received

Type widenings

Several byte and packet counters moved from int to long in 3.2.0 so long calls at high bitrate do not overflow, and outbound byte counters round-trip as BigInt through the encoder/decoder as of 3.1.0.

Documentation-only changes

IceCandidatePairStats.state gained documentation in 3.3.0 recording which RTCStatsIceCandidatePairState symbols are no longer in the W3C spec — new (never standardised) and cancelled (removed after w3c/webrtc-stats#66). Both symbols are retained, so nothing about the wire format changed.

How versioning works

Change typeVersion bumpCompatibility
Field addition at the end of its groupMinorAdditive; older decoders ignore it
Field addition elsewhere in its groupMinor⚠️ renumbers protobuf fields after it
Field removalMajorBreaking
Type changeMajorBreaking
DocumentationPatchNon-breaking

Protobuf field numbers come from field order

The generator sorts fields — repeated, then required, then optional, each sorted by name — and assigns protobuf numbers from that order. Inserting a field anywhere but the end of its group renumbers every field after it, which breaks the wire format for decoders built against the older schema.

This is why 3.3.0 carries a wire-format warning despite adding only one field. Always keep @observertc/samples-encoder and @observertc/samples-decoder on the same version.

Upgrading

  1. Read the release page for every version you are skipping.
  2. Upgrade encoder and decoder together — they are released in lockstep for a reason.
  3. If you store encoded samples, decode with a version that matches what wrote them, or re-encode.
  4. Update your own processing for any new field you want to consume; nothing existing was removed.
  5. Deploy incrementally and watch for decode errors before switching writers over.

Sources