Current (2026-07-08): Address Chocolatey moderation feedback.
- Goal: update Chocolatey package metadata so the next publish clears the moderator-requested automated review guidelines/suggestions and aligns the package version with the current software release.
- Scope:
packaging/chocolatey/, Chocolatey publish workflow templating, docs/memory closeout. Do not change unrelated package channels. - Assumption: because
0.1.68is under moderation while the repo is atv0.1.85, the safest path is to make the package template correct for the next/current release and let the existing Chocolatey moderation item be rejected or superseded if needed. - Done: patched the Chocolatey nuspec/template metadata, added a controlled package icon asset, corrected the explicit Windows shim target, and made the publish workflow rewrite nuspec/install-script content before packing so existing release tags can be republished without moving tags.
- Done: after the first dispatch queued indefinitely because no online runner had the old
Windowslabel, changed Chocolatey publishing to run on the repo Linux runner pool and pack/push with .NET/NuGet. - Done: after the first Linux dispatch failed because setup-dotnet tried to write
/usr/share/dotnetwithout permission, constrained the .NET install directory to runner temp. - Done: after the next Linux dispatch hung while downloading the release ZIP in a reused self-hosted workspace, moved the asset download under runner temp and replaced
gh release downloadwith timeout-boundedcurlretries; packing hashes that explicit path. - Done: headless public page checks confirmed Chocolatey
0.1.68is stillWaiting for Maintainer; thev0.1.85publish run builds the.nupkgand downloads the Windows ZIP successfully, then Chocolatey returns403 Forbiddenat the push endpoint. - Done: tried the exact-version moderation update for
v0.1.68; it failed before push because the checked-out old tag uses an older exact-match tag guard script, so the Chocolatey workflow now performs the ancestor guard inline from the current workflow file. - Done: the next exact-version
v0.1.68push was accepted by Chocolatey, but headless raw-package inspection showeddotnet packhad stripped Chocolatey-specific metadata from the.nupkg; the workflow now replaces the packed root nuspec with the exact Chocolatey nuspec and asserts the required metadata tags before pushing. - Done: the first packed-nuspec preservation dispatch hung inside the monolithic PowerShell pack/push script before any native command output was available; a second bounded PowerShell attempt still hid the stall before markers printed, so the workflow now uses split Bash prepare/push steps, a unique temp pack directory, progress markers, and GitHub step timeouts.
- Done: reran
Publish Chocolateyforv0.1.68as run28960144574; Chocolatey accepted the package, the raw.nupkgnow containsiconUrl,packageSourceUrl,projectSourceUrl,docsUrl,bugTrackerUrl, andreleaseNotes, the install script points at the nested ZIP executable path, and the public package page now shows statusUpdated. - Done: updated release-channel docs and changelog with the Chocolatey moderation state and fix.
- Verification: XML/SVG syntax checks, PowerShell parser checks, extracted workflow parser checks, extracted bash parser check, local curl download/checksum for the
v0.1.85Windows ZIP, simulatedPack and pushworkflow dry runs against oldv0.1.85tag contents, local Bash prepare-step simulation, localdotnet packsmoke for the Chocolatey nuspec, install-script shim-path stub test, local packed-nupkg metadata inspection,git diff --check, local identity scan, and full./scripts/verifypassed. - Next: wait for Chocolatey moderator review on
0.1.68; after approval or rejection clears the first-version gate, rerunPublish Chocolateyfor the current release tagv0.1.85.
Current (2026-06-16): Fix COPR publishing credentials and rerun v0.1.85.
- Goal: restore COPR publishing for
v0.1.85by rotating or replacing the invalid COPR credentials, then rerunrelease-copr.yml. - Scope: COPR/Fedora browser login, GitHub COPR secrets, COPR workflow rerun, verification/closeout memory. Do not print or commit secrets.
- Assumption: user explicitly authorized using Chrome and confirmed regenerating the persistent COPR API token.
- Done: regenerated the COPR API token in the logged-in browser session without printing secret values, verified COPR CLI write auth locally, and rotated
COPR_LOGIN/COPR_TOKENin GitHub Actions secrets. - Done: COPR workflow run
27710982704passed auth and upload forv0.1.85, proving the rotated token works. - Found: the successful rerun uploaded stale SRPM
0.1.78because the workflow reused persistent~/rpmbuildstate on a self-hosted runner and selected the first SRPM viafind ... -quit. - Done: pushed
892e825to make the COPR workflow build in an isolated temp RPM topdir, copy the expectediptvtunerr-${version}-1.src.rpminto a relativedist/path, disable the flaky self-hosted Go cache restore, and upload only that explicit SRPM. - Done: rerun
27711455455uploadeddist/iptvtunerr-0.1.85-1.src.rpm, created COPR build10612565, andcopr-cli watch-build 10612565reportedsucceeded. - Done: removed the temporary COPR token files after GitHub secrets were rotated and COPR verification completed.
- Next: commit/push closeout memory updates and verify final GitHub checks for the closeout commit.
Previous (2026-06-16): Release v0.1.85 and recover package-channel fallout.
- Goal: commit every local dirty and unrelated change as requested, push
main, tagv0.1.85, monitor release automation, and action release-channel failures. - Scope: pre-existing dirty Plex/PMS access and Live TV proxy changes, memory-bank/council generated files, release changelog, full release-readiness verification, commit/push/tag, GitHub release workflow monitoring, and COPR package-channel recovery.
- Assumption: user explicitly confirmed the full dirty tree is in scope, including unrelated and generated files.
- Done: fast-forwarded local
mainto include the completed PR/security sweep commits before reapplying the dirty tree. - Done: resolved generated-file conflicts, promoted release notes into
v0.1.85, committed the full requested tree as1c7fcd7, pushedmain, tagged and pushedv0.1.85, and published the GitHub release. - Done:
./scripts/release-readiness.shpassed locally; release workflow, Docker, AUR, PPA, main CI, CodeQL, Gitleaks, and local-identity checks completed successfully for1c7fcd7. - Found: COPR publishing failed before upload because COPR rejected the configured API token as invalid or expired.
- Done: pushed follow-up
f5c79dbto make COPR retry with the already-configured Fedora GSSAPI fallback when token auth reports invalid/expired; YAML parsing,actionlintwith the repo's custom runner label ignored, changelog gate, local identity scan, diff check, and GitHub CI/CodeQL/Gitleaks/Local Identity checks passed. - Blocked: rerun
27634610662still failed at COPR write auth. The fallback was attempted, but COPR returned a non-JSON API response for the write path; browser GSSAPI login also returned401 Unauthorized, and OIDC stopped at a Fedora username/password/OTP form. No readable local/OpenBao replacement credential was available. - Next: rotate
COPR_LOGIN/COPR_TOKENfrom the COPR API page or add valid COPR Kerberos keytab secrets, then rerunrelease-copr.ymlforv0.1.85.
Previous (2026-06-16): Resolve open PR and security issues.
- Done: landed the consolidated dependency/security fix on
main, closed superseded Dependabot PRs #22, #23, #26, #27, #28, and #29 with explicit resolution comments, and deleted their remote branches. - Done: GitHub open issues, Dependabot alerts, code-scanning alerts, and secret-scanning alerts were empty after dependency graph refresh.
- Verification:
npm --prefix web audit,go run golang.org/x/vuln/cmd/govulncheck@latest ./...,npm --prefix web run build,./scripts/check-local-identity-leaks.sh, full./scripts/verify, and GitHub CI/CodeQL/Gitleaks/Local Identity checks passed.
Current (2026-05-21): Completed v0.1.84 release for recording identity and release-channel hardening.
- Update:
v0.1.82Docker still failed after the one-shot retry; logs prove the BuildKit container cannot resolveregistry-1.docker.iothrough8.8.8.8even though the host resolver works. Preparing follow-upv0.1.83with explicit BuildKit DNS plus a Docker Hub mirror. - Update:
v0.1.83Docker still failed because BuildKit continued using8.8.8.8;v0.1.82COPR also progressed past the missingrequests-gssapidependency but failed by choosing Fedora OTP auth before the configured API token path. Preparingv0.1.84to generate BuildKit DNS from the runner resolver and prefer COPR API token credentials. - Goal: commit the deployed
etalk/short recurring show XMLTV identity fix plus fixes for failed package-channel publishing, pushmain, tag a release, and monitor release automation. - Scope: XMLTV recurring-title identity heuristic, Docker/COPR/PPA release workflow hardening, focused/full verification, changelog promotion, and release tag.
- Assumption:
v0.1.81covers the proxy DVR subscription-read hardening; this follow-up release is needed because tester logs showed the remaining failure was title-only guide identity foretalk. - Done: found Plex created subscription
783at2026-05-20 18:00:08 CSTfortv.plex.xmltv://movie/etalk;/media/subscriptions/scheduledhad noetalkgrab, and proxy logs had no tester subscription POST. - Done: patched XMLTV output so metadata-poor short recurring rows get date-specific
sub-title,date, andepisode-num system="iptvtunerr"while rows with existing episode metadata are preserved. - Done: deployed the patched binary to the live tuner host, restarted primary/sports/proxy services, verified
etalkrows in/guide.xmlnow carry stable identity, reloaded both Plex DVR guides, and deleted stale title-only subscription783. - Done: investigated failed
v0.1.81package channels: Docker hit transient Docker Hub DNS resolution failures, COPR lackedrequests-gssapifor configured GSSAPI auth, and the PPA workflow uploaded successfully from Actions but Launchpad later rejected the source upload because the.dscwas not readable in incoming processing. - Done: patched Docker publishing to retry the build/push once, COPR tooling to install
requests-gssapi, and PPA upload to validate referenced files and upload payloads,.dsc, and.changesin an ordered retried sequence. - Verification: focused
go test -count=1 ./internal/tuner -run 'TestXMLTV_externalSourceRemap_Stabilizes(RecurringEventIdentity|ShortRecurringProgrammeIdentity)'passed; full packagego test -count=1 ./internal/tunerpassed. - Verification: follow-up release-readiness after the Docker BuildKit DNS/mirror patch passed.
- Done:
v0.1.84Release, Docker, AUR, PPA, COPR, CI, CodeQL, Gitleaks, and local-identity checks completed successfully in GitHub Actions. - Next: watch for asynchronous Launchpad acceptance/rejection email for the PPA upload; Actions upload is green, but Launchpad acceptance remains asynchronous.
Current (2026-05-21): Cut v0.1.81 for Plex DVR recording visibility hardening.
- Goal: commit and push the full dirty tree, tag
v0.1.81, and monitor release automation. - Scope: Plex Live TV proxy DVR subscription-read hardening, tests, docs, council generated files, memory-bank updates, changelog promotion, release-readiness verification, commit/push/tag.
- Assumption: next patch tag after
v0.1.80isv0.1.81. - Done: patched and deployed the Live TV proxy hotfix before release prep; full
./scripts/verifypassed before the runbook doc update. - Next: promote changelog, rerun release-readiness, commit, push, tag, and monitor the release workflow.
Current (2026-05-20): Harden shared-user Plex DVR recording visibility after tester report.
- Goal: make the shared-user Plex Record flow more reliable when the save appears accepted but Plex does not show a scheduled-recording marker.
- Scope: Live TV proxy classification for
/media/subscriptions*reads and Plex XMLTV hint bodies; focused proxy tests; full verification. - Assumption: Plex may follow a successful save with read-only detail/scheduled subscription requests such as
/media/subscriptions/{id}that carry no XMLTV fields; those reads are part of DVR UI discovery and should borrow owner tuner entitlement, while mutating rule edits must stay XMLTV-scoped. - Done: read-only
/media/subscriptions*paths now elevate as DVR discovery except/media/subscriptions/template, which still requires Live TV/XMLTV evidence so library subscription templates are not elevated. - Done: mutating subscription requests now scan form bodies for Plex
hints[...]fields includinghints[ratingKey], not only directguid/key/uriform keys. - Verification: focused
go test -count=1 ./internal/plexlabelproxypassed; full./scripts/verifypassed. - Done: built a commit-stamped proxy binary, installed it to
/opt/iptvtunerr/iptv-tunerr-proxy, restartedplex-live-tv-proxy.service, and confirmed the service is active. - Done: live proxy validation returned
200for/identity,200for owner-token/media/subscriptionsand/media/subscriptions/scheduled, and403for no-token/media/subscriptions/42. - Next: ask tester to hard refresh Plex and retry Record on a short programme; if it still does not show scheduled state, inspect the fresh
/media/subscriptions*access log lines around the attempt.
Current (2026-05-20): Cut v0.1.80 and deploy current release.
- Goal: commit the full dirty tree as requested, push
main, tagv0.1.80, monitor release automation, and ensure the live network deployment runs the newest code. - Scope: include all dirty and unrelated files, including council generated files and the pre-existing
AGENTS.mdchange; do not exclude unrelated work because the user explicitly requested it. - Assumption: next patch tag after
v0.1.79isv0.1.80. - Done: promoted Unreleased changelog notes into
v0.1.80. - Done: release-readiness and full verify passed, committed the full dirty tree as
984b24e, pushedmain, pushed annotated tagv0.1.80, and published the GitHub release with binary/package assets. - Done: deployed the
v0.1.80binary to the live network primary/sports Tunerr services and Live TV proxy service, restarted them, and verified both Tunerr/readyzendpoints plus all three services are active. - In progress: GitHub Release workflow has published the release but is still marked in post-job cleanup; the Docker tag workflow was rerun after a transient Docker Hub DNS lookup failure and is queued.
- Next: monitor queued/in-progress GitHub Actions if release-channel status is needed; live deployment is complete.
Current (2026-05-20): Fix stale Plex Live TV recording marker and external-user playback error.
- Goal: identify why Plex shows a recording flag on current Live TV guide rows that were only recorded days ago, fix the Tunerr/Plex metadata cause, deploy, and validate Live TV is usable again.
- Scope: live systemd/bare-metal Tunerr services, Plex/Tunerr logs, XMLTV/programme identity generation, focused tests, and deployment restart if a code/config fix is needed.
- Assumption: the stale marker is likely caused by reusable XMLTV programme identifiers across days/timeslots or stale Plex DVR state tied to those identifiers; keep recovery scoped and avoid changing unrelated Plex proxy behavior.
- Done: found Plex held a stale DVR subscription for
tv.plex.xmltv://movie/Live%3A%20NBA%20Basketball, proving current rows were collapsing to a title-only movie identity. - Done: patched XMLTV remapping/merged-guide output to add date-specific subtitle/date plus deterministic
episode-num system="iptvtunerr"fields for recurring event-like rows while preserving the visible title. - Done: broadened protection beyond the observed NBA row to cover all
Live:rows plus generic sports event titles such as plainNBA Basketball, so Plex has channel/start-specific XMLTV identity instead of title-only movie identity. - Done: added regression coverage for both XMLTV remapping and the real merged EPG provider-import path.
- Done: deleted the stale Plex subscription, deployed the patched binary to both live Tunerr bridge services, restarted them, and forced Plex guide reloads for both DVRs.
- Verification:
./scripts/verifypassed; live/guide.xmlnow includes date/subtitle/episode identity fields on NBA, NWSL, wrestling, SportsCentre, and other recurring event rows; Plex subscriptions list is empty; primary/sports/proxy services are active; direct TSN 1 stream pull returned MPEG-TS bytes. - Next: ask affected external user to hard refresh Plex Web and retry the TSN/NBA row after Plex finishes client-side cache refresh.
Current (2026-05-18): Cut v0.1.79 for Plex DVR token-audit hardening.
- Goal: commit current proxy/token-audit hardening, push
main, tagv0.1.79, and monitor the release workflow. - Scope: include the Plex Live TV classifier/logging hardening, smoke port-collision retry fix, generated council updates, changelog, and memory-bank updates.
- Assumption: next patch tag after
v0.1.78isv0.1.79. - Done: promoted Unreleased Plex DVR/CI notes into the
v0.1.79changelog section. - Done: confirmed
v0.1.78Release workflow completed successfully, including Discord, Matrix, and package-channel dispatch. - Next: run release-readiness, commit/push, tag/push
v0.1.79, then monitor release automation.
Current (2026-05-18): Audit Plex Live TV token elevation gaps after v0.1.78.
- Goal: find remaining Plex request shapes where shared-user Live TV/DVR flows may need owner-token substitution, clearer denial logging, or explicit non-elevation coverage.
- Scope:
internal/plexlabelproxyclassifier/proxy behavior, recent tests, and live proxy logs where available. - Assumption: keep relaxation narrow to Live TV/XMLTV/tuner evidence; do not broadly elevate library subscription or non-Live-TV Plex paths.
- Done: found a remaining classifier edge where a DVR save could carry only a double-encoded XMLTV
ratingKeyvalue. - Done: patched Live TV text detection to decode repeated URL-encoding layers and still keep matching scoped to Live TV/XMLTV identifiers.
- Done: added access logging for all
/media/subscriptions*requests, including redacted query-key names and status, so future non-elevated Plex save shapes are visible without raw token/value leakage. - Done: recent live proxy logs showed no fresh subscription-denial traffic after
v0.1.78; only zero-count audit summaries appeared in the sampled window. - Verification:
go test -count=1 ./internal/plexlabelproxypassed. - Done: first full
./scripts/verifyrun exposed a smoke retry bug where a Web UI sidecar bind failure left the tuner process alive and skipped the port-collision retry branch; patched the smoke script to kill/retry on the log evidence. - Done: direct
bash scripts/ci-smoke.shpassed after the smoke retry fix. - Done: full
./scripts/verifypassed after rerun. - Done: deployed the patched proxy binary to the internal Live TV proxy service and restarted only that service.
- Done: live no-token validation showed the double-encoded XMLTV
hints[ratingKey]shape is nowlive_tv=trueand denied before elevation due to missing token, while a library subscription shape stayslive_tv=falseand logs redacted query keys/status. - Next: commit/push if requested, or monitor the next shared-user retry for
/media/subscriptions*access/audit logs.
Current (2026-05-18): Cut v0.1.78 for Plex DVR save fix.
- Goal: commit any remaining dirty work, push
main, tagv0.1.78, and monitor the release workflow. - Scope: release prep for the shared-user Plex DVR subscription-save classifier fixes already deployed to the internal proxy.
- Assumption: next patch tag after
v0.1.77isv0.1.78. - Done: promoted Unreleased Plex DVR notes into the
v0.1.78changelog section. - Done:
./scripts/release-readiness.shpassed; optional macOS and Windows package lanes were skipped by default. - Next: commit/push release prep, tag and push
v0.1.78, then monitor GitHub release automation.
Previous (2026-05-18): Fix shared-user Plex DVR Record Options failure.
- Goal: stop Plex shared users from seeing "There was a problem saving your changes" when recording Live TV from Plex.
- Scope: Live TV entitlement proxy classification for Plex DVR subscription list/read endpoints and XMLTV-backed rule edit paths; deploy to the live proxy without interrupting tuner/capture services.
- Assumption: read-only
/media/subscriptionsand/media/subscriptions/scheduledcalls made by Plex's Record Options UI are part of Live TV discovery for this proxy, while create/update paths still need XMLTV scoping. - Done: PMS logs showed the external tester's Record Options flow was failing on shared-user
403responses fromGET /media/subscriptionsandGET /media/subscriptions/scheduled. - Done: patched the Live TV proxy classifier so those read-only subscription list endpoints borrow owner tuner entitlement as Live TV discovery.
- Done: added focused proxy coverage for both subscription list paths.
- Done: focused tests passed, deployed the patched proxy binary, restarted
plex-live-tv-proxy.service, and verified the live service is active. - Done: live validation showed missing-token probes are still denied, while authorized requests to both subscription list endpoints are elevated and return
200. - Done: audited recent proxy/PMS failure evidence after the deploy; no new real shared-user
403paths appeared, but existing recording-rule edits can use/media/subscriptions/{id}with XMLTV body/query evidence. - Done: hardened the classifier for XMLTV-backed subscription rule edits across PUT/PATCH/DELETE-style paths while leaving id-only deletes and library subscription edits on the user's token.
- Done: redeployed the hardened proxy binary, verified the service is active, and validated that an XMLTV-style no-token rule edit is caught as Live TV while a library-style edit is not classified for elevation.
- Done: committed and pushed the full requested dirty tree as
e9bc7e2, including package-smoke evidence/scaffolding, council output, workflow changes, and the Plex proxy fix. - Done: built commit-stamped internal binary
e9bc7e2, installed it to the primary/sports Tunerr binary and Live TV proxy binary paths, restarted all three services, and verified service health. - Done: internal validation after deploy returned
200for primary ready/guide, sports ready/guide, and proxy identity; Plex DVR registration reactivated 426 primary channels and 125 sports channels. - Done: found the remaining shared-user save failure was
POST /media/subscriptionscarrying XMLTV identity in bracketed query hints such ashints[guid], patched the classifier, deployed the proxy hotfix, and verified the path is now classified as Live TV. - Next: have the tester retry Plex Record from the same client; if it still fails, capture the next PMS/proxy log window around the retry.
Previous (2026-05-18): Fix package-channel publication gaps found by smoke validation.
- Goal: make failed public channels publish the requested release version and install cleanly without needing a new-release-only validation path.
- Scope: Docker Hub image naming/publication, Launchpad Jammy/Noble PPA publishing, COPR chroot/version publication, RPM installer scriptlets, GitLab dispatch/promotion, and package-smoke validation scaffolding.
- Done: changed Docker Hub publishing to the expected
snapetech/iptvtunerrimage when Docker Hub credentials are present, instead of deriving the namespace from a repo variable. - Done: GitLab release promotion now dispatches AUR, Snap, PPA, and COPR GitHub publisher workflows, and promotes the internal registry image to Docker Hub tags.
- Done: PPA publishing now runs for both
jammyandnobleand explicitly includes the staged binary indebian/source/include-binaries. - Done: COPR publishing now modifies existing projects with the required Fedora 43 and Rawhide chroots before building for those chroots.
- Done: direct RPM scriptlets no longer rely on unresolved
%systemd_*macros when built outside a Fedora macro environment; a local package rebuild showed plain shell scriptlets. - Validation: YAML parse, shell syntax,
git diff --check, and targeted RPM package rebuild/scriptlet inspection passed. - Next: after these changes are pushed, rerun the package publisher workflows for
v0.1.77, then rerun package-smoke against Docker Hub, PPA Jammy/Noble, and COPR.
Previous (2026-05-18): Commit current tree and cut v0.1.77.
- Goal: commit and push the entire dirty working tree, configure Discord release announcements, and publish a new release.
- Scope: include dirty and unrelated repo changes as explicitly requested; do not commit secrets. Use the existing release workflow with a repository secret for Discord.
- Assumption: next patch tag after
v0.1.76isv0.1.77. - Done: confirmed the release workflow already posts Discord announcements when
DISCORD_RELEASE_WEBHOOKis configured. - Done: set the repository
DISCORD_RELEASE_WEBHOOKsecret from the operator-provided webhook URL without adding the URL to tracked files. - Done: promoted current changelog entries into
v0.1.77. - Done:
./scripts/release-readiness.shpassed; optional macOS and Windows package host lanes were skipped by default. - Done: checked the tracked tree does not contain the Discord webhook literal.
- Done: committed all dirty changes as
8ff0872, pushedmain, and pushed tagv0.1.77. - Done: first release workflow run failed at the changelog gate because the real release note used a word reserved by the placeholder detector; reworded that note and moved the tag to the corrected commit.
- Done: second release workflow run reached binary smoke and failed because a smoke server selected a port already in use on the runner; patched the smoke startup path to retry cleanly.
- Done: local
bash ./scripts/ci-smoke.shand./scripts/release-readiness.shpassed with the smoke retry fix. - Done: committed and pushed the smoke retry fix as
8e76c52, then moved tagv0.1.77to that commit. - Done: third release workflow passed verify and smoke, then failed in
Build binariesbecause the runner did not havezipinstalled for Windows release archives. - Done: fourth release workflow published
v0.1.77; release asset build/verification, Discord announcement, Matrix announcement, and package-channel dispatch all passed. - Done: committed and pushed Debian package tool installation as
0625c70, then moved tagv0.1.77to include it. - Done: fifth release workflow hit another smoke port collision in a custom
servelaunch block; extended the retry wrapper to all custom smokeservelaunch paths and verifiedbash ./scripts/ci-smoke.shlocally. - In progress: fifth release workflow also exposed council generated-count drift after the smoke hardening; regenerated council state and updated the active backlog count.
- Done: sixth release workflow exposed the same port-collision class on the Web UI sidecar port; added retry handling around the combined tuner/Web UI startup and verified
bash ./scripts/ci-smoke.shlocally. - Done: committed and pushed the final smoke fix as
75d800f, then moved tagv0.1.77to include it. - Done: final Release run
26008882309passed: verify, release smoke, asset build, package asset build, asset verification, GitHub Release publish, Discord announcement, Matrix announcement, and package-channel dispatch. - Done: latest
mainchecks on75d800fpassed: CI, CodeQL, Gitleaks, Docker, and Local Identity Leak Check. - In progress: downstream package channel workflows from the successful release are running/queued.
- Next: monitor package-channel completion if needed; no release blocker remains.
Previous (2026-05-17): Improve Plex DVR event-only sports recording windows.
- Goal: make Plex's own Record button work for event-only sports rows without requiring shared users to visit the Tunerr operator UI.
- Scope: XMLTV fallback programme durations for parseable event rows; deploy to the live tuner host after verification.
- Assumptions: Plex cannot present Tunerr-owned prompts, so duration handling must be encoded in guide metadata.
- Done: local standby Live TV proxy saw no traffic during the reported attempt; sports tuner lineup and guide endpoints were healthy, and the suspected NBA Pass stream delivered MPEG-TS bytes.
- Done: root cause was event-only sports rows falling back to a week-long XMLTV placeholder, which gave Plex a bad DVR scheduling window and produced a vague client-side recording error.
- Done: patched event fallback programmes to use bounded 3-hour windows from explicit
(YYYY-MM-DD HH:MM:SS)or namedSun 17 May 19:00 EDTchannel times, including fixed North American timezone offsets. - Done: installed the patched binary on the live tuner host, restarted
iptvtunerr-sports.serviceandiptvtunerr-primary.service, and verified Plex activated all 160 sports channel mappings. - Done: validated the DET/CLE event row now publishes
20260517230000 +0000to20260518020000 +0000; direct stream pull returned MPEG-TS data. - Done:
./scripts/verifypassed. - Done: added sport-aware duration defaults for Plex users who only see the Plex guide: basketball/hockey 3.5h, soccer/rugby 2.5h, baseball 4.5h, plus extra padding for Game 7/finals/playoff text.
- Done: deployed the refined duration build and verified the DET/CLE NBA row now publishes
20260517230000 +0000to20260518023000 +0000; Plex reactivated 158 sports mappings. - Done:
./scripts/verifypassed after rerun; first full run hit an existing guide-policy timing flake, while focused tests and rerun passed. - Done: checked recent live Tunerr logs after the user retried; no new Plex DVR tune request reached Tunerr, but the matching guide row is stream
1634335, guide channel10129, titledNEXT | DET - PISTONS VS CLE - CAVALIERS | Sun 17 May 19:00 EDT (US) | 8K EXCLUSIVE | US: NBA PASS PPV 1. - Done: started an emergency manual capture for stream
1634335on the live tuner host at/var/lib/iptvtunerr/emergency-recordings/det-cle-game7-20260518T001150Z.ts; verified the ffmpeg process is running and the file is growing. - Done: added a Plex-library visible capture under
/mnt/datapool_lvm_media/plex/movies/NBA Game 7 Pistons vs Cavaliers (2026)/, adjusted per operator request from 6h to 3.5h. Active visible file:NBA Game 7 Pistons vs Cavaliers (2026) - 3h30-20260518T001519Z.ts. - Done: found the shared user's Record button failure in PMS logs:
GET /media/subscriptions/template?guid=tv.plex.xmltv...returned403as the shared user because the Live TV proxy did not classify Plex XMLTV recording subscription template/create paths as Live TV entitlement requests. - Done: patched the Live TV proxy classifier so XMLTV-backed
/media/subscriptions/templateandPOST /media/subscriptionsrequests borrow owner tuner entitlement while ordinary library subscriptions remain on the user token. - Done: focused proxy tests passed; deployed the patched proxy binary and restarted only
plex-live-tv-proxy.service. Active captures were not interrupted. Validation: no-token request to the formerly failing template path is denied by the proxy as Live TV, and an authorized-token request is elevated and returns200. - Next: wait for user retry; if the Record button still fails, capture the next PMS/proxy log window.
Latest (2026-05-12): Plex Live TV playback works again on kspls0; remaining issue is startup latency. Sports DVR is expanded to 480 channels with IPTV_TUNERR_LINEUP_RECIPE=sports_now, IPTV_TUNERR_LINEUP_MAX_CHANNELS=480, IPTV_TUNERR_GUIDE_POLICY=off, and IPTV_TUNERR_LINEUP_PROBE_ENABLED=false; Plex activated all 480. Deployed a proxy fix so JSON /media/providers responses rewrite allowTuners entitlement hints, matching the existing XML rewrite. Direct Tunerr stream test returned ~24 MB in 20s, and user confirmed playback works but starts slowly.
Current (2026-05-16): Cut v0.1.76 from current main.
- Goal: publish a new GitHub release for the GitHub PR/security maintenance batch now on
main. - Scope: release prep only: changelog promotion, release-readiness verification, commit/push, tag/push, and workflow monitoring.
- Assumption: next semver patch tag after
v0.1.75isv0.1.76. - Done: promoted
docs/CHANGELOG.mdUnreleased notes intov0.1.76. - Done: patched local-runner workflow failures by replacing Debian-only installs with
scripts/install-ci-tools.shand making CodeQL use an explicit Go build. - Done:
./scripts/release-readiness.shpassed locally. - Done: committed and pushed release prep as
80004d4, pushed annotated tagv0.1.76, and the GitHub release job uploaded release assets. - Done: found a local-runner Gitleaks action cache extraction failure after the tag release; patched and pushed the workflow fix as
c8bcd40. - Done: remote replacement Gitleaks scan completed successfully; release Discord announcement completed successfully.
- Done: patched release-channel local-runner follow-up failures through
d502b64: Gitleaks direct CLI scan, PPA directdpkg/FTP upload, COPR isolated CLI venv, and Snap directsnap pack. - Done: PPA rerun completed successfully with the inline installer and Launchpad FTP upload.
- Done: COPR and Snap reruns completed successfully.
- Done: latest
mainchecks ond502b64completed successfully: CI, CodeQL, Gitleaks, and Local Identity Leak Check. - Next: no release-monitoring action pending.
Current (2026-05-18): Add reusable post-release package-channel validation.
- Goal: validate public install channels after release publication from internal GitLab, with equivalent GitHub scaffolding committed but disabled.
- Scope: package-smoke harness, project channel manifest, GitLab tag-only post-release validation jobs, and disabled GitHub workflow entrypoint.
- Assumption: Windows package channels remain manually gated; Linux public channels and container channels can run from GitLab runners as they become available.
- Done: added
packaging/smoke/package-smokewith evidence JSON, JUnit, logs, public-channel install adapters, version checks, container multi-arch smoke, and uninstall cleanup hooks. - Done: added GitLab
post_release_validatestage with tag-only matrix jobs for containers, Ubuntu channels, Fedora channels, AUR, and Snap. - Done: added disabled
workflow_dispatchGitHub package-smoke workflow for future activation. - Next: run the new GitLab validation stage against the next release tag and tighten
allow_failureonce runner/channel delays are characterized.
Previous (2026-05-16): Triage and action all open GitHub PRs and security issues for snapetech/iptvtunerr.
- Goal: inspect open PRs, failing checks, review comments, and GitHub security/dependency/code-scanning alerts; fix what is actionable; merge PRs that are safe; document anything blocked.
- Scope: GitHub PR and security maintenance only. Avoid unrelated refactors and do not recreate removed split-brain deployment paths.
- Assumptions: user explicitly asked to action/upgrade/fix/merge/resolve all items, so safe merges and alert resolutions are in scope after verification; anything requiring unavailable external privileges or unsafe compatibility choices should be reported rather than guessed.
- Done: merged Dependabot PRs
#19and#20; applied the stale/conflicting#15brotli upgrade directly on currentmain. - Done: hardened CodeQL security findings by redacting Plex proxy source/header logs, constraining provider lineup URLs, and validating HDHomeRun lineup URLs.
- Done: switched GitHub Actions Linux jobs to the local
self-hosted, Linux, X64, iptvtunerr-deployrunner labels and Windows package jobs toself-hosted, Windows, X64. - Done: focused package tests and
./scripts/verifypassed locally. - Next: commit and push
main; close obsolete PR#15after the direct upgrade is onmain.
Previous (2026-05-15): Cut v0.1.75 from current main.
- Goal: commit/push the current repo state and publish a new GitHub release tag.
- Scope: whole worktree as explicitly requested by the user; working tree was already clean before release prep, so only release-prep memory/changelog edits are expected locally.
- Assumption: next semver patch tag after
v0.1.74isv0.1.75; use the existing populated changelog entries as the release notes. - Done: confirmed
mainis atorigin/mainwith commits afterv0.1.74. - Done: promoted
docs/CHANGELOG.mdUnreleased notes intov0.1.75. - Done:
./scripts/verifyand./scripts/release-readiness.shpassed locally. - Next: commit, push
main, tagv0.1.75, push the tag, and monitor the release workflow.
Previous (2026-05-14): Repair Winget PR installation validation for microsoft/winget-pkgs#374269.
- Done: patched the Winget manifest generator and release-asset verification so generated ZIP portable manifests use
iptv-tunerr-vX.Y.Z-windows-amd64/iptv-tunerr.exe. - Done: pushed
microsoft/winget-pkgs#374269update commit740f80f081ewith only the corrected nested installer path. - Follow-up: wait for Microsoft validation to rerun; do not post another
@wingetbot rununless the pushed manifest update does not trigger validation. - Done: added
packaging/aurmetadata foriptvtunerrandiptvtunerr-bin, AUR helper scripts, and.github/workflows/release-aur.yml. - Done: unsealed local OpenBao, checked for release-channel credentials, added
AUR_SSH_KEY,GPG_PRIVATE_KEY,LAUNCHPAD_SFTP_KEY, andLAUNCHPAD_SFTP_USERGitHub secrets forsnapetech/iptvtunerr. - Done: created and pushed the initial AUR repos
iptvtunerrandiptvtunerr-bin. - Done: created Launchpad PPA
ppa:keefshape/iptvtunerr(Launchpad account namekeefshape, display nameslskdn). - Done: added
COPR_LOGINandCOPR_TOKENGitHub secrets forsnapetech/iptvtunerr; installedsnapd/snapcraftlocally. - Done:
SNAPCRAFT_STORE_CREDENTIALSis now configured forsnapetech/iptvtunerr. - Done: added Chocolatey and Winget packaging/workflow scaffolding for Windows release ZIP assets.
- Done: added Snap, Launchpad/PPA, and COPR package metadata/workflows for this Go binary.
- Done: set
DOCKERHUB_USERNAME=keefshaperepo variable andWINGETCREATE_GITHUB_TOKENsecret. - Done: added
CHOCO_API_KEYGitHub secret for theslskdnChocolatey account. - Done: added release asset build/verification scripts for raw binaries, archives, checksums, and a manifest.
- Done: added direct
.deband.rpmGitHub Release package assets. - Done: added tag-on-current-main guards to release, Docker, AUR, Snap, PPA, COPR, Chocolatey, and Winget workflows.
- Done: changed Docker publishing to tag-only and added CI release-asset verification.
- Done: added local git hook, installer, CI gate, and release gate requiring changelog updates and populated release tag sections.
- Done: signed the Microsoft CLA for the Winget PR by posting the GitHub bot agreement comment; the CLA check cleared.
- Done: patched the Snap source archive layout;
v0.1.73Snap, AUR, COPR, PPA, Winget workflow, Docker, and GitHub Release runs completed successfully. - In progress: assessing Windows package gates and pausing automatic Chocolatey/Winget dispatch until Chocolatey push permissions and Winget validation state are resolved.
- Follow-up: Chocolatey still needs portal/account/API-key remediation for
403 Forbidden; Winget PRmicrosoft/winget-pkgs#374269needs validation follow-up before submitting more versions.