docs(release): record the v26.14.0 release notes #738
Closed
timothy
wants to merge 4 commits from
release/v26.14.0 into main
pull from: release/v26.14.0
merge into: :main
:main
:renovate/meziantou.analyzer-3.x
:release/v26.15.0-notes
:fix/830-add-items-error-surface
:renovate/lucene.net
:renovate/cliwrap-3.x
:issue-806-guard-populations
:renovate/dotnet-monorepo
:scratch/767b-poisoned
:scratch/767b-control
:release/v26.14.0-notes
:release/v26.14.0
:renovate/sqlitepclraw.bundle_e_sqlite3-3.x
:docs/510-skill-logo-bug-policy
:fix/510-watermark-resolution-policy
:fix/629-verdict-classifier-falseopens
:fix/609-decisions-edit-token-scope
:issue-135-clear-to-none
:release/v26.12.0-notes
:fix/409b-lastscan-api-parity
:fix/401-updatechannel-mirror-422
:fix/327-playlist-rename-validation
:fix/410-scancancel-log-level
:fix/409-447-librariesscreen-neverscanned
:fix/338-zap-exit-code
:fix/367-plex-budget-message
:fix/310-debom-legacy-cs
:ci/604-lane-rebalance
:feat/388-design-mirror
:feat/247-test-ownership
:feat/247-primary-action
:feat/357-player-owned-playback
:feat/357-jellyfin-plugin-poc
:fix/289-mcp-hardening
:issue58-mcp
:feat/244-channels-extract
:ci/auto-bump-prod-compose
:feat/multi-rerun-collections-api
:feat/collections-api
:feat/quick-wins
:feat/185-docs-part2
:feat/140-collections-screen
:feat/146-channel-edit
:feat/147-classic-ui-link
:issue22-renovate-dashboard
:feat/91-cutover
:feat/63-composite-create
:feat/65-library-browse
:feat/85-epg
:feat/86-schedule-editor
:feat/109-dashboard-data
:feat/99-session-tracking
:fix/dockerfile-node-tag
:feat/59-spa-foundation
:docs/59-ui-redesign-brief
:feat/102-json-guide
:feat/111-schedule-durations
:feat/104-artwork-upload
:feat/103-media-sources-api
:feat/playouts-read-api
:feat/108-health-api
:feat/105-picker-list-endpoints
:issue-97-channel-state-api
:issue42-jellyfin-musicvideos
:issue46-rest-api-error-contract
:dependabot/nuget/ErsatzTV.FFmpeg.Tests/multi-d307a2e06f
:qsv-improvements
:hdr-vulkan-cuda-test
No Reviewers
Labels
Clear labels
ad-hoc
api
bug
ci-cd
content
dependencies
enhancement
frontend
in-progress
jellyfin
parked
priority: high
priority: low
priority: medium
review
security
One-off / ad-hoc work not tracked by a dedicated issue
REST API / HTTP endpoints
Something isn't working
Build, test, deploy pipeline
Channel content / schedules / playlists
Dependency updates (Renovate)
New feature or improvement
ChicoryTV React SPA frontend
Claimed by an active session — do not pick up
Jellyfin tuner / IPTV integration
Excluded from automatic queue pickup; work only when explicitly selected
Adversarial review finding
Security / vulnerability fix
No labels
Milestone
No items
No Milestone
Projects
Clear projects
No projects
No Assignees
Notifications
Due Date
No due date set.
Dependencies
No dependencies set.
Reference: timothy/ersatztv#738
Reference in New Issue
Block a user
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.
Docs-only. Adds the
v26.14.0row to the release table indocs/ci-cd.md. This is the commit thev26.14.0tag will be pushed onto, matching howv26.13.0was cut (#716).Head:
7b20dbd36(rebased ona2b3a56d9— see the rebase comment below).What's in v26.14.0
Everything on
mainsincev26.13.0:-readratestarvation (0.53x realtime → stalling Live TV)The headline is #726.
-readratepaces an input off its furthest-behind stream, and an embedded PGS/DVD subtitle is read through the video's own-i— sparse enough to drag the whole process to 0.53x realtime against the 1.0x a client consumes, draining the buffer until the channel stalls. Fixed with a capability-gated-readrate_catchup(ffmpeg 8.0+), which keeps-readrateon the frame-producing path soffmpeg.qsv-extra-hw-frames-flooris untouched. Measured 0.533x → 1.067x on QSV and software libx264, with a 240s QSV soak clean of allocation errors.Affected population is 3,182 of 24,646 media versions on prod, and it's a property of the item, not the channel — which is why the stall presented as random.
Release preflight (phase 1 of
docs/ci-cd.md→ "Cutting a release")Re-run on the rebased head
7b20dbd36:decisions_validate— OK, and now genuinely PyYAML-aware (via #725)build_decisions_catalog— no driftpytest scripts/tests— 432 passeddotnet list package --vulnerable --include-transitive— clean across all 17 projects[skip ci]token in any commit on this branch (Gitea reads skip-ci from the tagged commit and would suppress the release build)After this merges
v26.14.0on the merge commit (detaching atorigin/mainfirst, per the H11 tag-push guard — #719).:prod+ immutable:26.14.0+:<sha>. Do not overlap with an in-flightmainbuild — they share:buildcacheand the smoke container name.scripts/security-scan.shon jazz against the immutable:26.14.0, and triage.DeployStack jazz-media(media-serversis the dead stack on bumblebee — confirm with/read ListStacks). Promotion is manual;auto_update: false.0ac25e1447to7b20dbd360Rebased — scope of v26.14.0 grew
mainmoved while this PR was open: #725 (fix/674-688-decisions-validator) merged asa2b3a56d9. Two consequences, both handled:0ac25e144 "Merge branch 'main' into release/v26.14.0"had been pushed onto this branch (Gitea's Update branch button does this). That contradictsrelease.format-as-you-touch-rebase— keep a PR branch current by rebasing, never merge main in — so I rebased ontoa2b3a56d9and force-pushed over it.Before forcing I verified nothing would be lost, three ways:
No other session's commits were on the branch. Head is now
7b20dbd36, linear ona2b3a56d9.The added claim is verified, not assumed
The new row says #674/#688 makes a PyYAML-truncating record fail the local gate. Checked by re-breaking this release's own
readrate-catchup-sparse-streamsrecord (unquotingrule:so the#350truncates) and re-running the validator:That is exactly the defect that reached CI earlier in this session on
57ad5efb3, because the pre-#725 validator structurally could not see it. It is now caught before a push.scripts/tests: 432 passed (was 411 before #725 added its cases).Why this PR had no CI runs before
For the record, since it looked like a runner problem and wasn't: the original push produced zero
ActionRunrecords (checked against 7,168 listed tasks, none forb48f44dc7).docs/ci-cd.mddocuments this — several pushes fired back-to-back get silently dropped. Compounded here bymainmoving underneath the branch. The rebase + force-push is the re-trigger.Preflight re-run on the rebased head
decisions_validate— OK, and now genuinely PyYAML-awarebuild_decisions_catalog— no driftpytest scripts/tests— 432 passed[skip ci]token in any commit on this branch (it is the tag target)dotnet list package --vulnerable --include-transitive— clean across all 17 projects (re-verified pre-rebase; no dependency changed in the rebase)Superseded by #739 — same content (the
v26.14.0release-notes row), rebuilt as a single clean commit offa2b3a56d9.Closing this one to avoid two open release-notes PRs. Note #739 has the same problem, so the branch here isn't at fault: Gitea has not created a run from any git event repo-wide since ~21:46 UTC. A brand-new PR with a fresh
openedevent also produced nothing, which rules out anything branch- or PR-state-specific.Full evidence is in #739's description.
Pull request closed