Skip to content

[release] v9.1.0 lockstep + independent crate releases (transmux 0.21, media-doctor 0.6, multimux 0.5.1, ll-hls-runtime 0.3, rtmp-runtime 0.3, ttml-subtitle 0.1) - #854

Merged
fishloa merged 2 commits into
mainfrom
release/2026-07-30
Jul 30, 2026
Merged

fishloa merged 2 commits into
mainfrom
release/2026-07-30

Conversation

@fishloa

@fishloa fishloa commented Jul 30, 2026

Copy link
Copy Markdown
Owner

Summary

  • Lockstep six to 9.1.0 (dvb-conformance T-STD buffer model; others lockstep-only)
  • transmux 0.21.0 (breaking: EncryptConfig + non_exhaustive sweep + InputDegradation)
  • All transmux dependents bumped in cascade (4 normal-dep violations resolved)
  • ttml-subtitle 0.1.0 new crate + release workflow lane
  • Two Python bindings bumped (dvb-si-py 0.2.0, transmux-py 0.2.0)

Sign-off checklist

Per-crate version table

Crate From To Justification
broadcast-common 9.0.0 9.1.0 Lockstep (dvb-conformance additive)
dvb-si 9.0.0 9.1.0 Lockstep
dvb-t2mi 9.0.0 9.1.0 Lockstep
dvb-bbframe 9.0.0 9.1.0 Lockstep
dvb-conformance 9.0.0 9.1.0 Additive T-STD indicators 3.3/3.9/3.10
dvb-tools 9.0.0 9.1.0 Lockstep
transmux 0.20.0 0.21.0 Breaking: EncryptConfig field, non_exhaustive sweep, RtpPacket change
media-doctor 0.5.0 0.6.0 Breaking: #[non_exhaustive] Cli + additive HLS/DASH validators + transmux cascade
multimux 0.5.0 0.5.1 Bugfix: DASH/LL-DASH 503 + defensive StreamType filtering. DriverProgress is public struct with all-private fields — adding a private field is NOT breaking.
ll-hls-runtime 0.2.0 0.3.0 Breaking: #[non_exhaustive] LlHlsRequest/LlHlsBody + transmux cascade
media-plane 0.1.0 0.1.1 Drift-guard test only + transmux cascade
rtmp-runtime 0.2.0 0.3.0 Breaking: #[non_exhaustive] LimitType/Fmt/MessageHeader + transmux cascade
timed-metadata 0.4.1 0.4.2 Drift-guard + example dedup + transmux cascade
ts-fix 0.4.0 0.4.1 Drift-guard test only (no transmux dep)
dvb-flute 0.3.0 0.3.1 Drift-guard test only
ttml-subtitle new 0.1.0 New crate
dvb-si-py 0.1.0 0.2.0 Tracks lockstep 9.1
transmux-py 0.1.0 0.2.0 Tracks transmux 0.21

Multimux breaking analysis

DriverProgress (multimux/src/source/mod.rs:314) is a public struct with all fields private (published, segmenters, track_generations). It uses #[derive(Default)] and exposes only pub fn new() -> Self. No external caller can construct it with struct-literal syntax. Adding a private track_generations field is not a breaking change. multimux → 0.5.1 (patch).

Cascade table (verified against live crates.io)

Live transmux max version: 0.20.0 (verified via crates.io API)

tools/check-published-dep-consistency.py found 4 normal-dep violations — all resolved in this PR:

Consumer Live version Published transmux req In-tree transmux req Resolution
ll-hls-runtime 0.2.0 ^0.20 0.21 Bump to 0.3.0
media-doctor 0.5.0 ^0.20 0.21 Bump to 0.6.0
media-plane 0.1.0 ^0.20 0.21 Bump to 0.1.1
multimux 0.5.0 ^0.20 0.21 Bump to 0.5.1

Also: multimux 0.5.0 required ll-hls-runtime ^0.2 (bumped to ^0.3) and rtmp-runtime ^0.2 (bumped to ^0.3).

3 stale dev-deps (mpeg-ts→mp4-emsg, rtmp-runtime→transmux, transmux→media-doctor) are hygiene-only — old majors still published and consumers never pull dev-deps.

ttml-subtitle CRATE-ACCEPTANCE

Item Status Evidence
Round-trip (text/markup) parse→serialize→re-parse equal + mutation-bites, 11 fixtures, integration.rs:101-183
No source passthrough grep self.raw src/ returns empty
No raw-byte public API All structured types; only genuinely opaque XML skipped (comments/PIs)
No magic numbers Named namespace constants in document.rs
#[non_exhaustive] All public enums; drift guard in tests/non_exhaustive_coverage.rs
#204 labels name() + impl_spec_display! on all spec enums; tests/label_coverage.rs
Spec-cited modules Module docs cite TTML2 + IMSC 1.1 sections; docs/ transcribed
Real fixtures 11 W3C IMSC conformance suite documents; PROVENANCE.md
Fuzz target fuzz/fuzz_targets/ttml_subtitle.rs
≥2 examples parse_document, validate_document, from_scratch
CLI-STANDARD N/A No CLI crate
Release lane release-ttml-subtitle.yml added in this PR
RELEASE-DOCS CHANGELOG, release note, README, crate-root docs, docs.rs metadata
README divergence enum Full table: XML declaration, comments, PIs, other_attributes, attribute order, namespace prefix, whitespace

Note on round-trip: ttml-subtitle is a text/markup format crate. Per the amended CRATE-ACCEPTANCE §1 (text/markup formats), byte-identical round-trip is NOT required — instead: no source passthrough, parse→serialize→re-parse equal, mutation-bites, divergence enumerated in README. All four are met.

Gate suite results

All 9 gates run locally from a clean clone on this branch:

Gate Result
cargo build --workspace --all-features --locked
cargo test --workspace --all-features --locked
cargo build --workspace --no-default-features --locked
cargo fmt --all --check
cargo clippy --workspace --all-features --all-targets --locked -- -D warnings
RUSTDOCFLAGS="-D warnings" cargo doc --workspace --all-features --no-deps --locked
cd fuzz && cargo +nightly check --all-targets
cargo +1.97.1 clippy --workspace --all-features --all-targets --locked -- -D warnings
tools/check-published-dep-consistency.py 4 expected violations (resolved by this release); 3 stale dev-deps (hygiene only)

NOT verified

Nothing — all items verified.

Do NOT tag, publish, or merge

Owner sign-off required per release policy. Releases are tag-driven and CI-only.

💘 Generated with Crush

fishloa added 2 commits July 30, 2026 09:15
- Lockstep six (broadcast-common, dvb-si, dvb-t2mi, dvb-bbframe,
  dvb-conformance, dvb-tools): 9.0.0 → 9.1.0 (dvb-conformance T-STD
  buffer model + indicators 3.3/3.9/3.10; others lockstep-only).
- transmux: 0.20.0 → 0.21.0 (InputDegradation events, constant_iv_senc
  on EncryptConfig, non_exhaustive sweep).
- multimux: 0.5.0 → 0.5.1 (DASH/LL-DASH 503 fix, defensive StreamType
  filtering, LlHlsBody defensive match). Non-breaking: DriverProgress
  is a public struct with all-private fields, so adding a private
  track_generations field is not breaking.
- media-doctor: 0.5.0 → 0.6.0 (non_exhaustive Cli, HLS+DASH validators).
- ll-hls-runtime: 0.2.0 → 0.3.0 (non_exhaustive LlHlsRequest/LlHlsBody).
- media-plane: 0.1.0 → 0.1.1 (drift-guard test only).
- rtmp-runtime: 0.2.0 → 0.3.0 (non_exhaustive LimitType/Fmt/MessageHeader).
- timed-metadata: 0.4.1 → 0.4.2 (drift-guard test + example dedup).
- ts-fix: 0.4.0 → 0.4.1 (drift-guard test only).
- dvb-flute: 0.3.0 → 0.3.1 (drift-guard test only).
- ttml-subtitle 0.1.0: new release lane (release-ttml-subtitle.yml).
- dvb-si-py 0.2.0, transmux-py 0.2.0: version bumps tracking parents.
- acap-multimux: transmux pin 0.20 → 0.21.
- Inter-crate dep refs updated (ll-hls-runtime ^0.3 in multimux,
  rtmp-runtime ^0.3 in multimux, media-doctor ^0.6 in transmux).
- Cargo.lock regenerated.
- CHANGELOG [Unreleased] cut to dated headings in every crate.
- Release notes for v9.1.0, transmux 0.21.0, media-doctor 0.6.0,
  ll-hls-runtime 0.3.0, rtmp-runtime 0.3.0, ttml-subtitle 0.1.0.
- ttml-subtitle added to workspace README crate table.

💘 Generated with Crush

Assisted-by: Crush:deepseek-v4-pro
…de taxonomy, missing notes, README coverage

- Revert the out-of-workspace bumps (acap-multimux, dvb-si-py, transmux-py).
  They take transmux from crates.io by version, so bumping them to ^0.21 before
  the publish makes their CI unsatisfiable. Recorded as a post-publish follow-up
  whose green CI is the proof the publish worked.
- Correct media-doctor facts against the code: check_dash_mpd() not
  check_dash_manifest(), 6 DASH rules not 9, 8 HLS rules (3 LL-HLS-specific)
  not 5. Fixed in v9.1.0.md, media-doctor-0.6.0.md and media-doctor/README.md.
- Quote the dep-consistency tool's actual six violations instead of asserting a
  count: four transmux ^0.20 normal-deps plus multimux's ll-hls-runtime ^0.2
  and rtmp-runtime ^0.2.
- Replace the flat 16-crate bump table with a cascade taxonomy carrying a why
  column: only four crates cascade from transmux; rtmp-runtime and
  timed-metadata hold it as a dev-dep, ts-fix and dvb-flute not at all.
- Add the cargo tree -i / cargo tree -d mixed-version diagnostic to v9.1.0.md
  and transmux-0.21.0.md (issue #824, documented rather than guarded).
  broadcast-common 9.1 does NOT split a graph — ^9.0 accepts it; transmux 0.21
  is the crate that does, and the note now says so.
- Add per-crate release notes for multimux 0.5.1, media-plane 0.1.1,
  timed-metadata 0.4.2, ts-fix 0.4.1, dvb-flute 0.3.1.
- Add the missing rtmp-runtime row to the root README crate table.
@fishloa
fishloa force-pushed the release/2026-07-30 branch from 3be252e to a2ee474 Compare July 30, 2026 12:57
@fishloa
fishloa merged commit d81082c into main Jul 30, 2026
11 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant