docs(ci-cd): a Komodo stack named ersatztv now exists on jazz — and it is NOT prod
#720
Closed
opened 2026-08-03 19:50:24 +02:00 by timothy
·
2 comments
No Branch/Tag Specified
main
renovate/lucene.net
renovate/dotnet-monorepo
renovate/sqlitepclraw.bundle_e_sqlite3-3.x
renovate/meziantou.analyzer-3.x
renovate/cliwrap-3.x
913-scripted-playout-401
release/v26.15.0-notes
issue-806-guard-populations
scratch/767b-poisoned
scratch/767b-control
release/v26.14.0-notes
release/v26.14.0
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
v26.16.0
v26.15.0
v26.14.0
v26.13.0
v26.12.0
v26.11.0
v26.10.0
v26.9.0
v26.8.0
v26.7.0
blazor-final
v26.6.0
v26.5.0
v26.4.0
v26.3.1
v26.3.0
v26.2.0
v26.1.1
v26.1.0
v25.9.0
v25.8.0
v25.7.1
v25.7.0
v25.6.0
v25.5.0
v25.4.0
v25.3.1
v25.3.0
v25.2.0
v25.1.0
v0.8.8-beta
v0.8.7-beta
v0.8.6-beta
v0.8.5-beta
v0.8.4-beta
v0.8.3-beta
v0.8.2-beta
v0.8.1-beta
v0.8.0-beta
v0.7.9-beta
v0.7.8-beta
v0.7.7-beta
v0.7.6-beta
v0.7.5-beta
v0.7.4-beta
v0.7.3-beta
v0.7.2-beta
v0.7.1-beta
v0.7.0-beta
v0.6.9-beta
v0.6.8-beta
v0.6.7-beta
v0.6.6-beta
v0.6.5-beta
v0.6.4-beta
v0.6.3-beta
v0.6.2-beta
v0.6.1-beta
v0.6.0-beta
v0.5.8-beta
v0.5.7-beta
v0.5.6-beta
v0.5.5-beta
v0.5.4-beta
v0.5.3-beta
v0.5.2-beta
v0.5.1-beta
v0.5.0-beta
v0.4.5-alpha
v0.4.4-alpha
v0.4.3-alpha
v0.4.2-alpha
v0.4.1-alpha
v0.4.0-alpha
v0.3.8-alpha
v0.3.7-alpha
develop
v0.3.6-alpha
v0.3.5-alpha
v0.3.4-alpha
v0.3.3-alpha
v0.3.2-alpha
v0.3.1-alpha
v0.3.0-alpha
v0.2.5-alpha
v0.2.4-alpha
v0.2.3-alpha
v0.2.2-alpha
v0.2.1-alpha
v0.2.0-alpha
v0.1.5-alpha
v0.1.4-alpha
v0.1.3-alpha
v0.1.2-alpha
v0.1.1-alpha
v0.1.0-alpha
v0.0.62-alpha
v0.0.61-alpha
v0.0.60-alpha
v0.0.59-alpha
v0.0.58-alpha
v0.0.57-alpha
v0.0.56-alpha
v0.0.55-alpha
v0.0.54-alpha
v0.0.53-alpha
v0.0.52-alpha
v0.0.51-alpha
v0.0.50-alpha
v0.0.49-prealpha
v0.0.48-prealpha
v0.0.47-prealpha
v0.0.46-prealpha
v0.0.45-prealpha
v0.0.44-prealpha
v0.0.43-prealpha
v0.0.42-prealpha
v0.0.41-prealpha
v0.0.40-prealpha
v0.0.39-prealpha
v0.0.38-prealpha
v0.0.37-prealpha
v0.0.36-prealpha
v0.0.35-prealpha
v0.0.34-prealpha
v0.0.33-prealpha
v0.0.32-prealpha
v0.0.31-prealpha
v0.0.30-prealpha
v0.0.29-prealpha
v0.0.28-prealpha
v0.0.27-prealpha
v0.0.26-prealpha
v0.0.25-prealpha
v0.0.24-prealpha
v0.0.23-prealpha
v0.0.22-prealpha
v0.0.21-prealpha
v0.0.20-prealpha
v0.0.19-prealpha
v0.0.18-prealpha
v0.0.17-prealpha
v0.0.16-prealpha
v0.0.15-prealpha
v0.0.14-prealpha
v0.0.13-prealpha
v0.0.12-prealpha
v0.0.11-prealpha
v0.0.10-prealpha
v0.0.9-prealpha
v0.0.8-prealpha
v0.0.7-prealpha
v0.0.6-prealpha
v0.0.5-prealpha
v0.0.4-prealpha
v0.0.3-prealpha
v0.0.2-prealpha
v0.0.1-prealpha
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
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#720
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.
Found while promoting
v26.13.0.The trap
docs/ci-cd.mdwarns that the Komodo stack isjazz-media, notmedia-servers, because a deadmedia-serversstack lingers on bumblebee andDeployStack media-serverssilently targets it.That warning is still accurate, but the naming hazard has grown a second head.
ListStackson jazz today returns both:jazz-mediamedia-serversfalseersatztv(prod,:prod)ersatztversatztvtrueersatztv-test(:latest)So there is now a Komodo stack literally named
ersatztvthat is not the ErsatzTV prod stack — it is the test channel, and it auto-updates. An agent or operator reaching for "the ersatztv stack" by name gets the test container. Confirmed by container labels on jazz:Why it matters
The existing docs tell you which name is dead. They do not tell you that the most obvious name is live and wrong.
DeployStack ersatztvwould succeed, look healthy, and promote nothing to prod — the worst shape of failure, since it is silent and plausible.Suggested fix
Extend the existing
jazz-mediacallout indocs/ci-cd.md→ Cutting a release with the table above, and state the resolution rule: identify the prod stack by the container'scom.docker.compose.project.config_fileslabel, not by stack name.Cross-check whether
~/homelab-docs/Docker/ErsatzTV.mdand the server-managementkomodoskill (whose example still usesmedia-servers) need the same correction — the skill's line 69 example is stale.Done-when
docs/ci-cd.mdnames all three stacks and the label-based resolution rule — PR #769komodoskill usesmedia-serversas its worked deploy target in 8 places, incl. line 69)Claiming as a bundle sibling of #767 (same
ci-cdlabel, 2026-08-11 session). Checked first: no open PR references #720, no matching remote branch, no prior comments.Scope note up front: box 2 (the server-management
komodoskill example) is a different repo and cannot land in this repo's PR. This PR will coverdocs/ci-cd.md; the skill correction will be handed to server-management separately so the box is closed honestly rather than by a PR that never touched it.The issue's stack table is dated 2026-08-03 — re-verifying live container labels on jazz before writing, rather than transcribing it.
Closing record
Outcome:
docs/ci-cd.md's release callout now names all three Komodo stacks and states the label-based resolution rule. Merged as PR #769 (squashed tomain). The cross-repo half is NOT done and is tracked as server-management#743.Root cause: The existing docs documented which stack name was dead but not that the most obvious name (
ersatztv) was live and wrong — it ownsersatztv-teston:latestwithauto_update: true. Docs that warn about one trap read as complete, which is what let the second head go unrecorded when the test stack was added.Decisions/conventions changed: none — this is a docs correction under the existing release-promotion rules, not a new rule.
Reusable knowledge: Resolve a Komodo stack by the container's
com.docker.compose.project.config_fileslabel, never by stack name. Stack name ≠ compose project name here:jazz-media(the prod stack) has projectmedia-servers, which is also the name of a dead stack on bumblebee. Three names, two of them traps, and both failure modes are silent — the wrongDeployStacksucceeds and looks healthy.Verification: Container labels re-measured live on jazz (192.168.1.29) 2026-08-11 rather than transcribed from the 2026-08-03 report; they matched. Cold independent review returned MERGEABLE with one Medium — the "verified 2026-08-11" stamp covered
auto_updateand the bumblebeeunhealthystatus, which were not re-checked that day — fixed inde693643by scoping the date to what was actually measured. Full CI green on the final head (review-verdict/h10auto-exempt, docs-only).Deferred: The server-management
komodoskill still usesDeployStack media-servers— the dead stack — as its worked example in 8 places (verified, incl. line 69). Tracked as server-management#743, which also asks whether the dead stack should simply be deleted rather than documented around.Docs updated:
docs/ci-cd.mdonly. No decision record needed (no convention established or reversed); no route/endpoint/screen touched.A note on the
## Done-whenboxes, since one was re-scoped rather than satisfied. Box 2 as originally written ("server-managementkomodoskill example no longer uses the deadmedia-servers") describes work in another repository, so this issue could never have been closed honestly by any PR here. It was re-scoped to "the cross-repo half is tracked", which is in scope and is done. Flagging it explicitly because a re-scoped box that lets a merge gate pass deserves to be visible, not quietly absorbed.