2026-06-04 - 2026-09-04

Overview

391 Active Pull Requests
468 Active Issues
Excluding merges, 3 authors have pushed 224 commits to main and 1282 commits to all branches. On main, 937 files have changed and there have been 125725 additions and 50551 deletions.

14 Releases published by 1 user

Published v26.15.0 2026-08-29 22:28:14 +02:00

Published v26.14.0 2026-08-05 08:13:22 +02:00

Published v26.13.0 2026-08-03 19:02:23 +02:00

Published v26.12.0 2026-07-21 16:49:42 +02:00

Published v26.11.0 v26.11.0 2026-07-20 22:22:04 +02:00

Published v26.10.0 v26.10.0 2026-07-18 21:39:25 +02:00

Published v26.9.0 v26.9.0 2026-07-16 22:24:15 +02:00

Published v26.8.0 v26.8.0 2026-07-13 19:50:39 +02:00

Published v26.7.0 v26.7.0 2026-07-11 21:37:03 +02:00

Published blazor-final 2026-07-11 21:29:49 +02:00

Published v26.6.0 v26.6.0 — ChicoryTV SPA parity release 2026-07-08 19:07:40 +02:00

Published v26.5.0 v26.5.0 2026-07-07 11:23:07 +02:00

Published v26.4.0 v26.4.0 2026-07-07 10:20:30 +02:00

Published v26.3.1 v26.3.1 2026-06-27 00:35:35 +02:00

385 Pull requests merged by 2 users

Merged #906 fix(876): sweep session narrative out of hooks, workflows, scripts, tests and code comments; grow the detector to the process corpus 2026-09-03 21:26:04 +02:00

Merged #905 fix(869,893): re-establish the 1.25.4-dated CI claims on 1.27.1, and settle the page_statuses asymmetry from source 2026-09-02 22:20:45 +02:00

Merged #903 fix(891): a sourced path is code, so every hook resolves it from its own tree 2026-08-30 23:41:20 +02:00

Merged #902 fix(855): two glob dialects cannot be canonicalised into one, so model one shape and refuse the rest 2026-08-30 21:25:24 +02:00

Merged #899 fix(887): the image build builds the SPA and does not test it 2026-08-30 18:06:22 +02:00

Merged #898 docs(release): record the v26.15.0 release notes 2026-08-30 17:25:59 +02:00

Merged #897 fix(858,859): a rule the classifier cannot read is not a rule that matches nothing 2026-08-30 13:33:51 +02:00

Merged #896 fix(870): an empty timeline page is not exhaustion — the walk reads to its cap 2026-08-30 13:29:39 +02:00

Merged #892 fix(880): an absent recurrence array means unrestricted, an explicit [] is rejected 2026-08-30 11:29:03 +02:00

Merged #890 fix(849): the verdict gate replaces every unknown state, and proves the clauses that claim to 2026-08-30 07:55:11 +02:00

Merged #889 fix(845): the verdict writer checks that the gate will honour what it just posted 2026-08-30 04:43:09 +02:00

Merged #888 docs(853): workflow_dispatch can't be ref-restricted at 1.27.1 — and restricting it would close nothing 2026-08-30 03:18:05 +02:00

Merged #884 fix(836): never pass --depth to a checkout that may already be complete 2026-08-30 01:55:30 +02:00

Merged #883 fix(820): derive where Complete<T> is APPLIED, not just what it means 2026-08-30 00:06:39 +02:00

Merged #882 fix(812): classify the narrative sites by who-benefits; keep the detector's reach 2026-08-29 22:28:15 +02:00

Merged #879 fix(823,824): a scheduling NULL collection reads as UNRESTRICTED and is guarded at both read sites; the Elastic indexer gets its own mutation proof 2026-08-29 21:55:55 +02:00

Merged #875 fix(819): derive the SPA page-size guard population from the git index 2026-08-29 11:14:16 +02:00

Merged #874 fix(809,822): isolate the suite from the production hook-fire log by construction 2026-08-29 04:32:27 +02:00

Merged #873 fix(803,664): fence the HEAD alias on the PR timeline's pull_push count 2026-08-29 01:29:48 +02:00

Merged #872 fix(786,789): workflows declare their own per-job metadata; guard populations derive from it 2026-08-28 22:54:54 +02:00

Merged #871 docs(796): verification code is code under test — and the proof it was claiming an exemption from 2026-08-28 22:06:46 +02:00

Merged #868 fix(763): page both /statuses/{sha} reads to a validated terminator 2026-08-28 19:34:49 +02:00

Merged #867 docs(747): re-verify the Gitea 1.25.4-pinned CI claims on 1.27.1, and measure the merge-gate semantics that were source-attested 2026-08-28 18:51:14 +02:00

Merged #866 probe(747c): DO NOT MERGE 2026-08-28 16:55:51 +02:00

Merged #864 probe(747a): DO NOT MERGE 2026-08-28 16:54:17 +02:00

Merged #863 probe(747): absent required status context — DO NOT MERGE 2026-08-28 16:52:20 +02:00

Merged #862 docs(781,799): re-measure the tooling audit from a derived population, and adopt serena 2026-08-28 16:37:35 +02:00

Merged #861 fix(787): derive the dropped-step guard's scope, and reconcile its snapshot against the server 2026-08-28 00:37:05 +02:00

Merged #860 fix(748): declare permissions: on all six workflows, and prove the declaration binds 2026-08-28 00:02:47 +02:00

Merged #857 fix(744,835): ci-image.yml publishes from main only; guard persist-credentials with no exemption 2026-08-27 22:44:45 +02:00

Merged #850 fix(742): inherit an h10 verdict only from an allow-listed reviewer 2026-08-27 04:52:03 +02:00

Merged #847 feat(735): bound the numeric FFmpeg profile fields with a 422, and expose readrate pacing 2026-08-27 00:05:39 +02:00

Merged #846 fix(788): one declarative H10 verdict vocabulary, derived by both sides 2026-08-26 22:58:10 +02:00

Merged #843 feat(732): On Now / Next gets a background box, and is on by default 2026-08-26 21:28:26 +02:00

Merged #842 fix(746): drop the persisted checkout credential; unmask the base-ref fetches 2026-08-26 20:50:57 +02:00

Merged #841 feat(734): field-level progressive disclosure — shared FieldHelp trigger + panel 2026-08-26 20:05:54 +02:00

Merged #838 docs(755): ersatztv owns the fork code, media-management owns channel operations 2026-08-26 19:29:17 +02:00

Merged #834 docs(708): record the live route-2 reproduction against PR #761 2026-08-26 11:11:24 +02:00

Merged #833 fix(690,758): count the same query a paged handler pages 2026-08-26 09:39:25 +02:00

Merged #831 fix(721,740): align Auto-Tune proposal rows on a grid; guard AddItemsDialog's async searches 2026-08-25 23:55:24 +02:00

Merged #827 fix(807): SPA full-replace bodies are built as Complete<T>, with a derived guard over droppable request members 2026-08-23 02:58:21 +02:00

Merged #826 fix(701): guard SongMetadata's nullable primitive collections at the read site 2026-08-23 01:24:42 +02:00

Merged #825 fix(772,792): name the missing toolchain image; stop a refusal leaving a verdict comment 2026-08-23 01:05:36 +02:00

Merged #818 fix(806): guard populations over FILES derive from the git index, not a filesystem walk 2026-08-22 18:07:59 +02:00

Merged #817 docs: a cancelled job reads as failure where a monitor actually looks 2026-08-22 15:35:22 +02:00

Merged #815 feat(790): execute every MUTATION grade instead of asserting it 2026-08-22 15:12:16 +02:00

Merged #814 fix(780): reconcile the ruff gate with #784, merged in parallel 2026-08-22 11:34:05 +02:00

Merged #813 feat(780): commit a ruff config and enforce it in CI 2026-08-22 02:33:20 +02:00

Merged #811 feat(784): a doc records the end state — generalize the no-session-narrative rule 2026-08-22 02:23:24 +02:00

Merged #810 test(785): mutation proofs for the three unproven ranked guards 2026-08-21 22:10:02 +02:00

Merged #808 feat(779): test the deny path at the production config value, and derive full-replace field lists 2026-08-21 21:22:31 +02:00

Merged #802 feat(778): name the check-and-use race, and verify the protection the merge gate rests on 2026-08-21 19:04:14 +02:00

Merged #801 feat(794): witness a fix's test failing BEFORE the fix, and check the claim in CI 2026-08-16 12:25:00 +02:00

Merged #800 docs(781): re-measure §5.3 from a derived population — the zeros split four ways 2026-08-16 10:02:16 +02:00

Merged #795 feat(776): every hook reports that it fired, and the report is measured 2026-08-14 21:11:05 +02:00

Merged #798 fix: the BOM guard was fail-open wherever xxd is not installed 2026-08-14 18:51:00 +02:00

Merged #793 fix(777): repair both broken LSPs, and name the surface a subagent can actually reach 2026-08-14 17:55:21 +02:00

Merged #762 chore(deps): update dependency scriban.signed to 7.2.6 2026-08-14 17:26:38 +02:00

Merged #791 feat(774,775): one rule for guard populations, one for guard proofs — both enforced 2026-08-14 01:17:58 +02:00

Merged #782 docs(773): root-cause the recurring defect shapes across the full closed-issue corpus 2026-08-13 21:16:51 +02:00

Merged #770 fix(767): gate the release path on the delimiter ban with a prerequisite job 2026-08-13 20:04:53 +02:00

Merged #769 docs(720): name all three Komodo stacks and the label-based resolution rule 2026-08-11 21:26:08 +02:00

Merged #768 fix(756): extend the dropped-step guard to docker-build.yml's required jobs, where a drop is fail-OPEN 2026-08-11 01:35:09 +02:00

Merged #764 fix(751): a stray expression delimiter in a COMMENT killed the verdict gate — plus the two nil-slice twins and a dead-code guard it hid 2026-08-10 21:33:34 +02:00

Merged #760 fix(754,757): declare graphicsElementIds + padToNearestMinute, and pin every MCP tool to its OpenAPI contract 2026-08-06 22:42:37 +02:00

Merged #749 fix(743): make review-verdict/h10 unskippable — disable direct push to main + admin force-merge; fix(719) tag-only push 2026-08-06 00:58:17 +02:00

Merged #745 fix(697): scope CI's registry credential so head-resolved workflows cannot forge review-verdict/h10 2026-08-05 21:56:53 +02:00

Merged #741 fix(685): AddItemsDialog resolves by search instead of windowing the whole media-library type 2026-08-05 20:02:00 +02:00

Merged #739 docs(release): record the v26.14.0 release notes 2026-08-05 08:13:23 +02:00

Merged #725 fix(674,688): cross-check decision frontmatter against PyYAML; split the ceiling calibration claim 2026-08-04 23:43:10 +02:00

Merged #737 fix(726): let a lagging realtime input catch up so a sparse bitmap-subtitle stream can't pin it below realtime 2026-08-04 23:24:12 +02:00

Merged #723 fix(706,707,711): fence the review-verdict write on the timeline retarget count 2026-08-03 23:01:13 +02:00

Merged #717 chore(deps): update dependency cliwrap to 3.10.4 2026-08-03 21:28:24 +02:00

Merged #718 chore(deps): update dependency jetbrains.resharper.globaltools to 2025.3.5 2026-08-03 20:50:40 +02:00

Merged #716 docs(release): record the v26.13.0 release notes 2026-08-03 19:02:25 +02:00

Merged #714 chore(deps): batch three Renovate patch bumps (supersedes #679, #680, #681) 2026-07-30 23:31:33 +02:00

Merged #712 chore: ignore .codex/, and stop shipping a plaintext credential in docs 2026-07-30 22:27:34 +02:00

Merged #710 docs(698): correct the Renovate auto-pass rule in CLAUDE.md 2026-07-30 21:58:04 +02:00

Merged #705 fix(698): bind the base, constrain the bot exemption by content, re-derive unattributable successes 2026-07-30 21:22:02 +02:00

Merged #699 fix(672): trigger the verdict gate on pull_request_target scoped to main 2026-07-28 23:44:20 +02:00

Merged #700 fix(691): guard the nullable SongMetadata.Artists/AlbumArtists at their read sites 2026-07-28 23:43:30 +02:00

Merged #692 fix(671): resolve rerun-collection selections through one shared include chain 2026-07-28 20:56:13 +02:00

Merged #687 fix(668): reach accented facet values via a registered Unicode fold on SQLite 2026-07-27 23:08:29 +02:00

Merged #686 fix(684): key the pageSize guard registry on identity, not source position 2026-07-27 19:39:39 +02:00

Merged #683 docs(649): narrow the base-ref headline to what the checkout actually binds 2026-07-27 18:33:24 +02:00

Merged #673 test(649): cover the review-verdict status read and the bot-path guards 2026-07-27 18:22:48 +02:00

Merged #682 docs: permit subagents explicitly, and make claiming an issue a check rather than a label 2026-07-27 18:04:14 +02:00

Merged #676 feat(578): artist typeahead covers music-video and song credits; album_artist stops 404ing 2026-07-27 08:09:31 +02:00

Merged #675 fix(650): two at-cap list truncations, and a completeness guard that keys on the defect 2026-07-27 08:08:14 +02:00

Merged #678 feat(651): library-browse pickers resolve by search, not a 100-row window 2026-07-27 05:47:07 +02:00

Merged #666 fix(649): point the ENFORCED review-verdict gate at the shared PR-file enumeration 2026-07-27 00:04:07 +02:00

Merged #667 fix(632): bind a review verdict to its BASE branch, not only to its head sha 2026-07-26 23:58:50 +02:00

Merged #658 fix(648): an explicit jq version contract + one shared PR-file enumeration 2026-07-26 22:46:05 +02:00

Merged #659 docs(ersatztv skill): record the #510 no-logo-no-bug policy and deco seeding recipe 2026-07-26 22:41:56 +02:00

Merged #657 docs(505): retire the stale "do NOT set QSV on jazz" rule in the ersatztv skill 2026-07-26 22:34:21 +02:00

Merged #655 fix(510): one watermark resolver for all four attachment points 2026-07-26 22:16:36 +02:00

Merged #656 fix(644): stop seven SPA list loads truncating silently — one shared pager, bounded media pickers 2026-07-26 22:10:04 +02:00

Merged #654 fix(505): tonemap QSV HDR through OpenCL — vpp_qsv=tonemap is a silent no-op 2026-07-26 21:56:02 +02:00

Merged #642 fix(620): signal corpus size per RECORD; the aggregate becomes an untresholded trend 2026-07-26 20:17:29 +02:00

Merged #637 fix(631): run scripts/tests in CI as its own job, not inside the flake-covered decisions-guard 2026-07-26 13:56:45 +02:00

Merged #641 fix(621): make an unparseable decision record loud instead of silently invisible 2026-07-26 13:23:13 +02:00

Merged #646 fix(633): document the 0-based paging contract on the OpenAPI parameters 2026-07-26 13:06:32 +02:00

Merged #645 fix(634): page the rerun-collection picker to completeness 2026-07-26 12:20:28 +02:00

Merged #636 fix(629): close six false-opens in the H10 verdict grammar, and give it tests 2026-07-26 03:02:32 +02:00

Merged #639 fix(617): make the cross-repo skills real symlinks and reconcile the ersatztv skill 2026-07-26 02:13:29 +02:00

Merged #635 fix(616): paging is 0-based — correct the MCP contract, fix a live 1-based SPA caller, un-cap two MCP tools 2026-07-26 00:11:22 +02:00

Merged #630 fix(622): bind H10 merge consent to the reviewed sha via a required commit status 2026-07-25 23:33:16 +02:00

Merged #613 fix(491): unique index on LibraryFolder(LibraryPathId, PathHash) + tolerate concurrent insert 2026-07-25 22:00:45 +02:00

Merged #626 [THROWAWAY] probe(622) fix 2026-07-25 21:32:02 +02:00

Merged #625 [THROWAWAY] probe(622) nofix 2026-07-25 21:31:24 +02:00

Merged #624 [THROWAWAY] probe(622): commit pushed AFTER scheduling 2026-07-25 21:30:42 +02:00

Merged #623 [THROWAWAY — DO NOT MERGE] probe(622): does a MISSING required status block auto-merge? 2026-07-25 21:30:06 +02:00

Merged #619 feat(610): split the decision corpus into one YAML-frontmatter file per record 2026-07-25 20:36:08 +02:00

Merged #618 fix(609): the decisions rationale-edit marker is a git trailer, not a bare substring 2026-07-25 19:07:50 +02:00

Merged #607 fix(496): per-library server identity for music videos — itemId diff + soft trash 2026-07-25 18:08:13 +02:00

Merged #612 feat(484): suppress the media-server sweep on projection failures; reject the ratio threshold 2026-07-25 17:08:08 +02:00

Merged #611 fix(503): map WatermarkLocation.MiddleCenter to a centered overlay position 2026-07-25 16:35:28 +02:00

Merged #605 feat(603): adopt OKF's optional stale-after and Sources: decision-record metadata 2026-07-25 16:16:00 +02:00

Merged #591 feat(445,533): headless Playwright UI-E2E flows + fix e2e-local readiness probe 2026-07-25 14:52:33 +02:00

Merged #601 fix(460): write null LastScan on disable-sync instead of the MinValue sentinel 2026-07-25 14:11:35 +02:00

Merged #598 chore(586,594,485): PID-scoped E2E cleanup, ci-image-pin length guard, .gitignore core fix 2026-07-25 13:51:57 +02:00

Merged #602 fix(500): dedup incoming metadata collections so a duplicate name inserts once 2026-07-25 13:45:42 +02:00

Merged #588 chore(docs): trim derivable content from CLAUDE.md, lazy-load the task-completion protocol 2026-07-25 12:25:21 +02:00

Merged #593 docs(592): record that a skipped CI context is not red 2026-07-25 12:07:12 +02:00

Merged #589 feat(440): per-source weight steppers + exclude/add-untagged in the Auto-Tune DetailPanel 2026-07-25 12:06:03 +02:00

Merged #585 chore(583): make per-agent model routing a hard constraint + PreToolUse gate 2026-07-25 11:47:44 +02:00

Merged #584 feat(436): arbitrary-depth rule-builder group nesting 2026-07-25 11:47:15 +02:00

Merged #579 feat(437): inline RuleBuilder smart-query authoring in Channel Builder 2026-07-23 23:17:42 +02:00

Merged #581 feat(415): per-channel fault detection — server-derived health object + Problems filter 2026-07-23 22:45:20 +02:00

Merged #577 feat(438,435,434): RuleBuilder validation, relative-date operators, DB-sourced facet typeahead 2026-07-23 21:16:55 +02:00

Merged #575 feat(414): stamp immutable Channel.Origin (auto-tuned vs user-created) and surface it 2026-07-23 20:12:26 +02:00

Merged #576 fix(458): reject duplicate names on playlist &amp; playlist-group rename 2026-07-23 20:07:43 +02:00

Merged #574 harden(421,559): percent-encode access_token in IPTV URLs, redact from logs, no-store on tokened manifests 2026-07-23 18:31:00 +02:00

Merged #573 feat(392): per-schedule clock-boundary padding toggle + 60-min increment 2026-07-23 09:10:29 +02:00

Merged #571 fix(570): On Now/Next overlay YAML renders (font_family + format_datetime) 2026-07-22 23:39:33 +02:00

Merged #569 feat(74): per-channel On Now/Next transient overlay 2026-07-22 22:36:42 +02:00

Merged #566 refactor(395): dedup Scripted≡YAML enumerator construction into ContentEnumeratorBuilder 2026-07-22 20:52:24 +02:00

Merged #564 test(381): Sequential (YAML) playout golden; document Scripted deferral 2026-07-22 19:40:31 +02:00

Merged #562 feat(297): add channelId to PlayoutListItemResponseModel; SPA reset keys directly 2026-07-22 19:30:25 +02:00

Merged #561 fix(248): focus-trap the shared modal overlay so Tab can't escape a dialog 2026-07-22 19:30:15 +02:00

Merged #560 fix(552): mint a short-lived JWT so the SPA reaches /iptv/* under JWT auth 2026-07-22 18:52:05 +02:00

Merged #558 test(512): flush LibrariesScreen scan-poll chain deterministically instead of waitFor timeouts 2026-07-22 18:02:25 +02:00

Merged #557 fix(553): exclude bot-authored issues from the queue selector 2026-07-22 18:01:20 +02:00

Merged #551 feat(60): in-browser channel preview on the channels list 2026-07-22 00:29:36 +02:00

Merged #556 docs(jellyfin-skill): correct stale "music videos are typed Movie" gotcha 2026-07-21 23:57:57 +02:00

Merged #555 fix(177): map Album/Track in the Jellyfin music video projection 2026-07-21 23:50:19 +02:00

Merged #550 fix(135): from-lineup advanced overrides can express "clear to none" 2026-07-21 22:59:52 +02:00

Merged #546 fix(539): WorkAheadSlots.Release never publishes a negative count 2026-07-21 21:20:43 +02:00

Merged #547 ci(545): require a **Signals:** line on decision records 2026-07-21 20:58:04 +02:00

Merged #549 docs(skill): correct the ersatztv skill for the fork — it described upstream 2026-07-21 20:51:48 +02:00

Merged #544 docs(542): record the workflow lore, then prune the kickoff doc to instructions 2026-07-21 20:43:06 +02:00

Merged #543 chore(541): fast-forward the shared checkout at session end (H13) 2026-07-21 20:23:18 +02:00

Merged #540 fix(68): rebuild on-demand channel guide (and mirrors) on thaw 2026-07-21 19:49:15 +02:00

Merged #538 fix(536): enforce workAheadSegmenterLimit with an atomic slot claim 2026-07-21 18:44:12 +02:00

Merged #537 ci(535): split PR-only git gates into pr-checks.yml so release tags don't red 2026-07-21 18:31:42 +02:00

Merged #534 docs(524): triage #237's 111 comments — no decision retrofit is owed 2026-07-21 17:35:40 +02:00

Merged #531 docs(release): v26.12.0 headline — ErsatzTV MCP server (#58) + external-logo download (#525) 2026-07-21 16:49:43 +02:00

Merged #530 fix(529): floor QSV extra hardware frames so an unthrottled read can't exhaust the pool 2026-07-21 16:41:16 +02:00

Merged #528 feat(525): external channel-logo URLs download + cache at save time (not fetched at render) 2026-07-21 15:36:16 +02:00

Merged #527 feat(520,521): full decision-corpus migration + parallel-orientation startup rewrite (PR2 of 2) 2026-07-21 12:29:19 +02:00

Merged #526 feat(521): decision-lifecycle machinery — keyed records, validator, generated catalog (PR1 of 2) 2026-07-21 11:08:52 +02:00

Merged #518 fix(511): bound remote graphics-engine image fetches (timeout, size cap, decode cap, redirects, pooling) 2026-07-21 01:47:20 +02:00

Merged #517 feat(#58): ErsatzTV.Mcp — read + cautious-write MCP server over /api/v1 2026-07-21 01:02:37 +02:00

Merged #516 fix(350): burst-read the first HLS segments so cold start isn't readrate-bound 2026-07-21 00:33:40 +02:00

Merged #513 fix(502): render the on-screen bug for external-URL channel logos 2026-07-20 23:33:50 +02:00

Merged #514 docs(release): Komodo stack is jazz-media; no auto-update fallback 2026-07-20 23:07:10 +02:00

Merged #509 ci: move both docker build jobs off the small lane 2026-07-20 22:56:20 +02:00

Merged #507 docs(release): v26.11.0 headline is the QSV VA-API decode fix (#498) + unified logo bug (#67) 2026-07-20 22:22:05 +02:00

Merged #506 feat(498): QSV profiles can decode via VA-API (Prefer native decoder) 2026-07-20 22:16:37 +02:00

Merged #504 feat(67): one logo drives both the listing and the on-screen bug 2026-07-20 21:36:45 +02:00

Merged #501 docs(release): prepare v26.11.0 promotion — correct the deploy host to jazz 2026-07-20 19:19:31 +02:00

Merged #499 fix(497): reconcile music-video metadata collections on Jellyfin rescan 2026-07-20 18:53:42 +02:00

Merged #490 docs(489): spec + implementation plan for Jellyfin mixed-content libraries 2026-07-20 18:36:06 +02:00

Merged #493 feat(489): support Jellyfin mixed-content libraries 2026-07-20 18:34:52 +02:00

Merged #495 fix(494): reconcile removed music videos in Jellyfin scanner 2026-07-20 17:22:15 +02:00

Merged #492 fix(488): resolve LibraryFolder from DB so Jellyfin music-video scans stop crashing 2026-07-20 16:09:01 +02:00

Merged #486 fix(480): probe external-JSON remote-stream URLs before ffmpeg 2026-07-20 00:37:29 +02:00

Merged #482 feat(472): sub-split the HLS cold-start startup phase 2026-07-19 23:59:23 +02:00

Merged #483 fix(477): guard media-server library sweeps against successful-but-empty fetches 2026-07-19 23:53:38 +02:00

Merged #479 fix(473): probe media-server remote streams before handing the URL to ffmpeg 2026-07-19 22:24:59 +02:00

Merged #481 fix(476): cascade FileNotFound from removed shows/seasons to descendants 2026-07-19 22:19:38 +02:00

Merged #475 ci(412): sample true peak-anon in the test job, not cache-inflated memory.peak 2026-07-19 21:09:30 +02:00

Merged #471 perf(469): format gate uses dotnet format whitespace --folder (~480s → ~0.5s) 2026-07-19 19:59:34 +02:00

Merged #470 test(444): deterministic functional-E2E for the playout-build lock 409 + isLocked projection 2026-07-19 17:57:42 +02:00

Merged #468 feat(431): TTL-cache health-check results; ?refresh=true forces a fresh run 2026-07-19 15:43:12 +02:00

Merged #467 fix(464): render real channel logos in guide grid + channels list 2026-07-19 14:10:29 +02:00

Merged #466 docs(404): mirror the weight UI into the MultiCollections design prototype 2026-07-19 13:25:27 +02:00

Merged #465 fix(463): bound the schedules "Active schedule" selector so it stops overlapping the header 2026-07-19 12:21:01 +02:00

Merged #462 feat(404): weighted-distribution SPA — per-source weight inputs + WeightedShuffle order 2026-07-19 12:01:41 +02:00

Merged #461 feat(queue): deterministic select-queue.sh — stop re-deriving the selector by hand 2026-07-19 10:46:19 +02:00

Merged #459 fix(409): report never-scanned LastScan as null for API/MCP parity (migration + read coercion) 2026-07-18 21:39:26 +02:00

Merged #455 feat(420): skip re-validating an already-green identical merge tree 2026-07-18 21:14:28 +02:00

Merged #457 feat(403): make unsupported PlaybackOrder loud at build time + tripwire 2026-07-18 19:10:36 +02:00

Merged #456 fix(401): reject Mirror channel with playout (422) + repair dead else-branch 2026-07-18 18:27:26 +02:00

Merged #454 fix(327): validate playlist name on rename (reject empty/whitespace/too-long) 2026-07-18 18:27:20 +02:00

Merged #451 fix(409,447): LibrariesScreen 'Never scanned' label + stabilize flaky scan-poll test 2026-07-18 18:18:46 +02:00

Merged #453 fix(410): log scan cancellation below ERROR (user-initiated, not a failure) 2026-07-18 18:18:10 +02:00

Merged #452 ci(338): distinguish ZAP warning (exit 2) from failure (exit 1) in security-scan 2026-07-18 18:16:49 +02:00

Merged #450 fix(367): correct Plex budget-exhausted guidance when no servers exist 2026-07-18 18:15:43 +02:00

Merged #449 fix(310): strip UTF-8 BOM from the legacy .cs files #269 touched 2026-07-18 18:15:36 +02:00

Merged #448 feat(396): collapsible sidebar + nav-group accordions 2026-07-18 17:24:54 +02:00

Merged #446 feat(350): instrument HLS cold-start latency (phase split + feature flags) 2026-07-18 16:16:39 +02:00

Merged #443 test(363): functional-E2E harness — deterministic scan-lock + collections-lock 409 flows 2026-07-18 16:05:25 +02:00

Merged #442 feat(293): paginate GET /api/v1/search/all-items to cap DoS exposure 2026-07-18 14:17:21 +02:00

Merged #441 fix(308): idempotent concurrent Add*ToCollection instead of a composite-PK 500 2026-07-18 13:29:02 +02:00

Merged #439 feat(425): per-source rotation weights + query corrections for auto-tune channels 2026-07-18 04:29:17 +02:00

Merged #433 feat(176): visual rule builder for the SmartCollection editor 2026-07-18 03:30:24 +02:00

Merged #432 feat(386): Auto-Tune per-channel DetailPanel slide-over (SPA) 2026-07-18 01:54:39 +02:00

Merged #430 feat(164): guided remediation for health checks 2026-07-18 01:12:20 +02:00

Merged #428 feat(385): per-channel overrides in auto-tune bulk-create 2026-07-18 00:03:53 +02:00

Merged #424 ci: pre-push guard against pushing an uncommitted working-tree change (H13) 2026-07-17 23:25:31 +02:00

Merged #426 docs(lore): run local gate + cold review BEFORE pushing to Gitea CI 2026-07-17 22:59:35 +02:00

Merged #429 fix(416): docs-only skip never fired — detect against FETCH_HEAD (shallow-checkout safe) 2026-07-17 22:39:05 +02:00

Merged #423 fix(320): break troubleshoot segment-wait loop on ffmpeg failure 2026-07-17 20:43:08 +02:00

Merged #422 ci(416): skip heavy jobs on docs-only changes without bricking the merge gate 2026-07-17 20:10:25 +02:00

Merged #419 fix(376): XML-escape access_token value in XMLTV guide output 2026-07-17 19:34:25 +02:00

Merged #402 feat(70): weighted / fair-share content distribution (WeightedShuffle playback order) 2026-07-17 19:00:48 +02:00

Merged #417 docs(lore): batching, no "main checkout", trust the queue, diagnosing CI reds 2026-07-17 18:43:34 +02:00

Merged #405 fix(72): report a real per-channel playout count and flag channels that will never play 2026-07-17 18:13:52 +02:00

Merged #413 chore: PreToolUse guard that blocks a commit/push with a BOM'd touched .cs 2026-07-17 17:50:02 +02:00

Merged #411 ci(406): disable persistent compiler servers, cap the services: mysql, report peak RSS 2026-07-17 17:17:55 +02:00

Merged #407 ci: move api-docs and format back to ubuntu-latest (refs #406) 2026-07-17 15:09:11 +02:00

Merged #408 fix(264): record library-level LastScan after a successful local scan 2026-07-17 15:00:58 +02:00

Merged #397 feat(384): auto-tune DetailPanel content-source member read endpoint 2026-07-17 12:43:50 +02:00

Merged #399 ci(390): shared CI toolchain image + drop 110s apt-ffmpeg + rebalance runner lanes 2026-07-17 12:40:25 +02:00

Merged #391 feat(380): extract shuffle-source construction to ShuffleSourceBuilder (kill PlaylistEnumerator's cross-engine reach-in) 2026-07-17 09:05:15 +02:00

Merged #394 design(388): mirror full ChicoryTV design system to prod + design-sync reminder hook 2026-07-17 03:27:13 +02:00

Merged #393 test(77): characterize clock-boundary schedule padding + docs 2026-07-17 03:26:50 +02:00

Merged #389 feat(69): Auto-Tune SPA wizard (Configure → Preview → Create) — PR2 2026-07-17 00:30:53 +02:00

Merged #387 feat(71): per-playout reshuffle + shuffle-state surfacing 2026-07-17 00:19:04 +02:00

Merged #382 test(163): golden characterization tests for playout building (Classic + Block) 2026-07-17 00:01:34 +02:00

Merged #379 feat(69): auto-tuning backend — enumerate library metadata, preview + bulk-create channels (PR1) 2026-07-16 22:35:11 +02:00

Merged #375 feat(analyzers): enable incremental latest-All enforcement 2026-07-16 22:19:07 +02:00

Merged #378 fix(spa): body margin + nav box-sizing resets (#373, #377) 2026-07-16 22:12:52 +02:00

Merged #374 feat(iptv): add configurable advertised base URL for M3U/XMLTV (#340) 2026-07-16 21:51:28 +02:00

Merged #329 chore(deps): update dependency jetbrains.resharper.globaltools to 2025.3.4.1 2026-07-16 20:47:04 +02:00

Merged #328 chore(deps): update dependency humanizer.core to 3.0.10 2026-07-16 20:38:13 +02:00

Merged #370 ci(coverage): collect code coverage and publish a summary (refs #15) 2026-07-16 19:29:35 +02:00

Merged #372 docs(queue): exclude parked selector candidates 2026-07-16 19:25:10 +02:00

Merged #371 fix(api): protect local library path details 2026-07-16 19:16:52 +02:00

Merged #369 docs(queue): cascade selector through priority tiers 2026-07-16 16:14:02 +02:00

Merged #368 fix(api): report direct streams as on air 2026-07-16 15:14:32 +02:00

Merged #366 fix(web): coherent, recoverable Plex authorized-but-no-servers state (#345) 2026-07-16 14:36:52 +02:00

Merged #365 docs: make queue selection non-terminal 2026-07-16 14:13:06 +02:00

Merged #362 ci: advisory functional-E2E curl harness (#299) 2026-07-16 14:00:06 +02:00

Merged #361 refactor(web): extract ChicoryTV shell and routing 2026-07-16 13:42:20 +02:00

Merged #359 refactor(web): extract Guide screen 2026-07-15 21:59:16 +02:00

Merged #360 refactor(web): extract Dashboard screen 2026-07-15 21:30:52 +02:00

Merged #356 docs(queue): record cheap-worker launch config 2026-07-14 21:00:01 +02:00

Merged #352 docs(queue): start tool-bearing selectors at low effort 2026-07-14 20:15:07 +02:00

Merged #351 refactor(spa): extract Playouts screen 2026-07-14 19:35:30 +02:00

Merged #348 docs(queue): enforce milestone-aware picker ranking 2026-07-14 08:03:47 +02:00

Merged #349 fix(spa): clear dirty guard before saved navigation 2026-07-14 08:02:35 +02:00

Merged #346 docs(e2e): record real media-source validation results 2026-07-13 23:00:39 +02:00

Merged #343 docs(workflow): enforce session-wide cost routing 2026-07-13 21:50:18 +02:00

Merged #341 Add Cross-Origin-Resource-Policy baseline header 2026-07-13 21:33:15 +02:00

Merged #337 docs(release): prepare v26.8.0 promotion 2026-07-13 20:02:22 +02:00

Merged #331 feat(ci): #314 — authenticated black-box security scan + Microsoft.OpenApi HIGH-vuln pin 2026-07-13 08:42:43 +02:00

Merged #325 fix(#172): API hardening — null-name 500s, duplicate template items, unreachable 404 2026-07-13 01:27:38 +02:00

Merged #326 feat(api): #286 — mount the whole /api surface at /api/v1 2026-07-13 00:52:26 +02:00

Merged #324 fix(#238): wire TopBar primary-action on create screens, drop dead buttons 2026-07-12 23:51:26 +02:00

Merged #322 fix(api): #265 — If-Match evaluates per RFC 7232 (valid-but-non-matching -> 412) 2026-07-12 23:32:26 +02:00

Merged #323 security(#319): enforcing CSP + Permissions-Policy on the host 2026-07-12 22:52:50 +02:00

Merged #316 #295 PR2: SPA session cutover + #301 side-effecting-GET POST-ification 2026-07-12 22:04:54 +02:00

Merged #321 feat(ci): #315 migration-on-prod-copy smoke for the release path 2026-07-12 21:47:43 +02:00

Merged #318 fix(process): #317 merge-consent gate auto-grants on satisfied path (no double-prompt) 2026-07-12 21:05:28 +02:00

Merged #313 process: #311 H11 rebase-hook + PR-scoped format CI + #312 H12 qualification audit 2026-07-12 20:32:19 +02:00

Merged #309 docs(process): #303 follow-ups — Codex-skip rubric + write-path live-E2E requirement 2026-07-12 20:13:34 +02:00

Merged #307 fix(api): #269 rotate aggregate ETag on Collection/Playout config siblings 2026-07-12 19:50:12 +02:00

Merged #306 chore(process): #303 H10 — review-verdict merge-gate (latest commit must be reviewed) 2026-07-12 19:32:00 +02:00

Merged #305 chore(process): #303 Wave 3 — H3 root-screenshot guard + H9 decisions.md append-only guard 2026-07-12 18:38:41 +02:00

Merged #304 ci: #303 H4/H5 blocking api-docs gate — fail on stale OpenAPI artifacts 2026-07-12 17:54:16 +02:00

Merged #302 fix(api): #269 force-write non-If-Match root writers past a concurrent Version bump 2026-07-12 17:43:09 +02:00

Merged #300 feat(api): #295 PR1 — browser SPA session auth (session-OR-key gate, server-only) 2026-07-12 17:15:00 +02:00

Merged #298 feat(api): #271 collections scan-status REST surface + authoritative SPA reconcile 2026-07-12 15:08:24 +02:00

Merged #296 #197 Bundle C: OpenAPI contract honesty (#287) + wrap raw VMs / nullable DTOs (#288) + channel re-key 2026-07-12 12:25:21 +02:00

Merged #291 security(#283): sniff artwork content type from bytes, remove serve-side ?contentType= reflection 2026-07-12 01:00:55 +02:00

Merged #294 ci: make the MySql migration-apply resilient to concurrent-runner contention 2026-07-12 00:51:03 +02:00

Merged #292 security(#197): fail-closed API auth posture (Bundle A: #280/#281/#282/#284/#285) 2026-07-12 00:34:45 +02:00

Merged #290 docs(#197): record Phase-0 hardening decisions in decisions.md 2026-07-11 23:40:52 +02:00

Merged #279 security(#197): safe hardening — constant-time key compare, clamp playout paging, security headers 2026-07-11 23:28:12 +02:00

Merged #277 ci: prod follows :prod — remove version-pin bump job (#275 rework) 2026-07-11 22:31:15 +02:00

Merged #276 #259: content-aware stable child identity for schedule-item replace 2026-07-11 22:11:28 +02:00

Merged #275 ci: restore bump-prod-compose auto-deploy on v* release 2026-07-11 21:54:05 +02:00

Merged #274 #91b — remove legacy Blazor Server UI 2026-07-11 21:30:15 +02:00

Merged #273 chore(dev): husky pre-commit / pre-push / commit-msg guardrails 2026-07-11 21:07:36 +02:00

Merged #270 feat(#253 PR3): optimistic-concurrency fan-out — Diff + Scalar aggregates 2026-07-11 20:56:31 +02:00

Merged #268 #253 PR2 — optimistic-concurrency fan-out (Template, DecoTemplate, Playlist, schedule-items) 2026-07-11 19:54:06 +02:00

Merged #272 #91b: wire deep-scan + external-collections buttons into LibrariesScreen 2026-07-11 19:34:28 +02:00

Merged #267 feat(235): async-op API contract normalization + playout build observability + F9 scan endpoints 2026-07-11 19:05:54 +02:00

Merged #266 fix(app): post-commit side effects on CancellationToken.None + guide-xml/empty-list hardening (#254) 2026-07-11 18:19:01 +02:00

Merged #263 feat(api): optimistic-concurrency contract for replace-all PUTs — PR1 infra + Block reference (#253) 2026-07-11 18:06:12 +02:00

Merged #262 feat(media-sources): SPA management screens + write REST API (#202) 2026-07-11 17:38:24 +02:00

Merged #261 docs(91b): auth-posture sign-off + rollback-tag procedure for Blazor removal (#205, #206) 2026-07-11 17:20:34 +02:00

Merged #260 fix(ui): pattern-based legacy→SPA redirect matcher for parameterized routes (#204) 2026-07-11 17:00:03 +02:00

Merged #258 fix(scheduling): stop silently resetting fill-group state + invalidate deco edits (#251, #252) 2026-07-11 15:26:13 +02:00

Merged #250 fix(locking): release troubleshooting + playout locks on all terminal paths (#233, #234) 2026-07-11 14:12:53 +02:00

Merged #249 refactor(spa): extract ChannelsScreen from App.tsx (#244, epic #243 phase 1) 2026-07-11 13:38:48 +02:00

Merged #242 fix: reviewer post-merge blockers — empty-lineup bare create (#212) + dirty-guard popstate/shuffle-toggle (#230) 2026-07-11 13:13:56 +02:00

Merged #241 fix(locking): EntityLocker atomicity + scan-lifecycle honesty (#231, #232) 2026-07-11 13:05:16 +02:00

Merged #229 feat: schedules editor full mutation depth + channel-editor gaps (#207, #212, #126) 2026-07-11 12:05:53 +02:00

Merged #240 test(api): locked-path 409 guard tests for ReplaceAlternateSchedules + ReplaceTemplates (#215) 2026-07-11 11:59:44 +02:00

Merged #239 Integration: review-gates batch — #220/#215/#217/#219/#218 + #213 remainder (PRs #223–#228) 2026-07-11 02:03:47 +02:00

Merged #222 fix(spa): gate mutation controls on stale result sets during refetch (#221) 2026-07-11 01:47:37 +02:00

Merged #216 feat: shared Add-to layer — search + media mutation surface (#208, #209) 2026-07-10 08:19:04 +02:00

Merged #214 feat: playouts delete/reset/erase + collections custom-order/all-kind adds + parity nits (#210, #211, #213) 2026-07-09 23:17:30 +02:00

Merged #201 fix(openapi): spec property naming now mirrors the runtime Newtonsoft serializer (#198) 2026-07-09 20:19:21 +02:00

Merged #200 fix(api): existence-check rerun-collection selectedId per selection type (#193) 2026-07-09 20:19:09 +02:00

Merged #199 feat: SPA playback troubleshooting screen + status/subtitles/stream-selectors endpoints (#145) 2026-07-09 08:21:04 +02:00

Merged #196 docs+ci: harden docs-first rule + non-blocking parity-doc reminder 2026-07-08 23:06:32 +02:00

Merged #195 feat: playlist CRUD API + SPA editor (#153) 2026-07-08 22:09:06 +02:00

Merged #194 feat(spa): multi-collection & rerun-collection editor screens (#151, #152) 2026-07-08 20:22:01 +02:00

Merged #192 ci: speed up build pipeline (NuGet cache, shallow checkout, jar layer reorder) (#190) 2026-07-08 19:54:25 +02:00

Merged #188 feat(api): REST CRUD for multi-collections and rerun-collections (#151, #152) 2026-07-08 18:54:36 +02:00

Merged #189 feat(api): GET /api/collections/{id}/items (paged) — full collection contents (#155) 2026-07-08 18:38:25 +02:00

Merged #187 feat: quick wins — security-registry scan, Trakt SPA link, parallel search, dead "New Group" sweep 2026-07-08 08:03:25 +02:00

Merged #186 docs: testing map + generated endpoint index (#185) 2026-07-08 07:52:31 +02:00

Merged #183 feat(web+api): media detail endpoints+pages, image folder browser (#141, #161 items 3+5) 2026-07-07 23:08:44 +02:00

Merged #182 feat(web+api): block-playout history + sequential-YAML validator (#145, #158 items 4–5) 2026-07-07 22:32:32 +02:00

Merged #181 fix(web+api): library picker artwork URLs + season drill-in instead of tile flooding (#180) 2026-07-07 22:00:39 +02:00

Merged #179 feat(web+api): playout alternate schedules + templates editors, default-deco read-side (#144 S6, #162) 2026-07-07 21:03:11 +02:00

Merged #175 feat(web+api): deco templates (#144 S4, #162) 2026-07-07 20:06:36 +02:00

Merged #174 feat(web+api): decos + deco groups, playout default deco, playlist/search pickers (#144 S3, #162) 2026-07-07 19:42:31 +02:00

Merged #173 feat(web+api): scheduling templates + block/template copy (#144 S2, #162) 2026-07-07 19:00:45 +02:00

Merged #171 feat(web+api): blocks CRUD, items editor & preview (#144 S1, #162) 2026-07-07 18:25:26 +02:00

Merged #170 feat(web+api): playout create for all kinds + detail updates (#144 S5, #162) 2026-07-07 18:09:57 +02:00

Merged #168 feat(web+api): media browse, search & trash for SPA parity (#141) 2026-07-07 16:20:23 +02:00

Merged #169 test(web): make Libraries scan-polling tests deterministic (fixes #157) 2026-07-07 16:02:32 +02:00

Merged #167 feat(web+api): Trakt lists screen + REST API for SPA parity (#142) 2026-07-07 15:31:05 +02:00

Merged #166 feat(web+api): FFmpeg profile, filler preset & watermark editors for SPA parity (#143) 2026-07-07 15:06:39 +02:00

Merged #165 feat(web+api): logs & troubleshooting screens for SPA parity (#145) 2026-07-07 14:00:29 +02:00

Merged #156 feat(web): collections management screen — manual + smart collections (#140) 2026-07-07 12:54:19 +02:00

Merged #154 feat(web): dedicated channel edit screen (#146) 2026-07-07 12:40:18 +02:00

Merged #150 feat(web): Classic UI link in Settings + ChicoryTV cue on redirecting Blazor nav links (#147) 2026-07-07 12:40:10 +02:00

Merged #132 chore(deps): update dependency entityframeworkprofiler.appender to 6.0.6053 2026-07-07 11:58:02 +02:00

Merged #61 chore(deps): apply open Renovate patch updates 2026-07-07 11:57:25 +02:00

Merged #148 feat(web): SPA cutover — root route (#91) 2026-07-07 11:12:50 +02:00

Merged #139 feat(web): ChicoryTV rebrand (#90) 2026-07-07 10:11:35 +02:00

Merged #138 feat(web): Settings screen (#93) 2026-07-07 09:34:47 +02:00

Merged #137 fix(deps): bump Scriban.Signed 6.5.2 → 7.2.5 (GHSA-5wr9-m6jw-xx44) 2026-07-07 09:09:56 +02:00

Merged #136 feat(web): Channel Builder (#89) 2026-07-06 23:40:44 +02:00

Merged #134 feat(api): composite create-channel endpoint (#63) 2026-07-06 21:28:02 +02:00

Merged #133 feat(api): channel templates entity + CRUD (#64) 2026-07-06 19:33:31 +02:00

Merged #130 feat(api): library browse + search endpoints (#65) 2026-07-06 07:53:40 +02:00

Merged #129 feat(web): Guide / EPG screen (#85) 2026-07-05 23:12:26 +02:00

Merged #128 feat(web): Libraries screen (#88) 2026-07-05 19:06:51 +02:00

Merged #127 feat(web): Playouts screen (#87) 2026-07-05 17:50:57 +02:00

Merged #125 feat(web): Schedule editor screen (#86) 2026-07-05 12:22:16 +02:00

Merged #124 feat(web): Channels screen (#84) 2026-07-05 11:26:23 +02:00

Merged #123 feat(web): Dashboard real data sources (#109) 2026-07-04 21:20:38 +02:00

Merged #121 feat(core): track active sessions for direct streaming modes (#99) 2026-07-04 20:24:16 +02:00

Merged #122 fix(docker): use valid node:22-bookworm-slim base for web-build stage 2026-07-04 19:42:16 +02:00

Merged #120 feat(web): ChicoryTV SPA foundation (#59 stack) 2026-07-04 08:11:15 +02:00

Merged #112 feat(api): channel on-air / now-playing state endpoint (#97) 2026-07-04 07:48:47 +02:00

Merged #119 feat(api): JSON channel guide endpoint (#102) 2026-07-04 07:43:19 +02:00

Merged #118 feat(api): schedule item duration estimates (#111) 2026-07-04 00:00:33 +02:00

Merged #117 feat(api): artwork upload endpoint (#104) 2026-07-03 23:41:49 +02:00

Merged #115 feat(api): media sources + scan status endpoints (#103 #106) 2026-07-03 23:10:38 +02:00

Merged #116 feat(api): playout read endpoints (#100 #101 #107 #110) 2026-07-03 22:50:06 +02:00

Merged #114 feat(api): health endpoints (#108) 2026-07-03 21:28:13 +02:00

Merged #113 feat(api): filler/watermark/graphics list endpoints (#105) 2026-07-02 22:35:31 +02:00

Merged #56 fix(ffmpeg): align transcode pipelines with ffmpeg 8 2026-07-01 19:51:14 +02:00

Merged #55 feat(jellyfin): sync MusicVideo libraries 2026-06-30 22:54:20 +02:00

Merged #54 feat(api): default-deny mutating API writes 2026-06-30 18:55:32 +02:00

Merged #53 test: make channel logo generator testable 2026-06-30 18:20:49 +02:00

Merged #52 feat(api): standardize FFmpeg profile endpoints 2026-06-30 07:42:06 +02:00

Merged #51 feat(api): add playout REST endpoints 2026-06-29 20:37:27 +02:00

Merged #50 feat(api): add schedule REST endpoints 2026-06-29 18:17:41 +02:00

Merged #47 fix(api): standardize error response contract 2026-06-28 16:37:54 +02:00

Merged #45 feat(api): add collections REST endpoints 2026-06-28 09:37:13 +02:00

Merged #44 feat(api): REST API foundation + Channels CRUD (#2a) 2026-06-27 16:14:15 +02:00

Merged #41 fix: make filler scheduling tests timezone-independent (fixes #24) 2026-06-27 14:29:59 +02:00

Merged #40 test: golden tests for XMLTV guide output (#28) 2026-06-27 14:11:20 +02:00

Merged #33 ci: gate image build on migrations + #1 handoff 2026-06-27 12:29:34 +02:00

Merged #32 docs: retroactive contributors/style guide (#10) 2026-06-27 11:52:04 +02:00

Merged #31 ci: assert key IPTV endpoints in the container smoke test (#16) 2026-06-27 11:28:42 +02:00

Merged #30 ci: EF migration integrity checks for SQLite + MySql (#13) 2026-06-27 11:05:00 +02:00

Merged #29 test: golden-file tests for M3U output (#11) 2026-06-27 10:22:28 +02:00

Merged #27 test: enforce layer dependency direction with NetArchTest (#12) 2026-06-27 09:56:26 +02:00

Merged #26 build: static-analysis pack foundation at suggestion (#15, increment 1) 2026-06-27 09:37:15 +02:00

Merged #23 ci(renovate): enable Dockerfile manager for the HTTP Gitea registry 2026-06-27 02:18:48 +02:00

Merged #20 fix(deps): clear NCalcSync + SQLitePCLRaw vulnerability advisories (#8) 2026-06-27 02:07:49 +02:00

Merged #19 ci(renovate): fix GitHub PAT secret name + bump image pin 2026-06-27 01:48:30 +02:00

Merged #18 ci: self-hosted Renovate (NuGet CPM + Gitea Actions) 2026-06-27 01:38:59 +02:00

Merged #17 build: Central Package Management + scheduled vulnerability scan (#14) 2026-06-27 01:20:55 +02:00

6 Pull requests proposed by 2 users

Proposed #761 chore(deps): update dependency meziantou.analyzer to 3.0.195 2026-08-10 05:03:18 +02:00

Proposed #804 chore(deps): update dependency sqlitepclraw.bundle_e_sqlite3 to 3.0.5 2026-08-17 05:02:28 +02:00

Proposed #805 chore(deps): update dependency system.commandline to 2.0.11 2026-08-17 05:03:21 +02:00

Proposed #828 chore(deps): update dependency cliwrap to 3.10.5 2026-08-24 05:04:28 +02:00

Proposed #829 chore(deps): update lucene.net to 4.8.0-beta00018 2026-08-24 05:05:45 +02:00

Proposed #878 fix(830): a write failure reports to a surface that outlives the dialog that started it 2026-08-29 19:33:02 +02:00

414 Issues closed from 1 user

Closed #876 docs.no-session-narrative reaches hooks and code comments, but nothing has ever swept them — 4 known sites 2026-09-03 21:26:05 +02:00

Closed #893 page_statuses still terminates on its first empty page — is /statuses/{sha} subject to #870's post-pagination filtering? 2026-09-02 22:20:46 +02:00

Closed #869 Finish the 1.25.4-dated CI claim sweep #747 deliberately did not complete 2026-09-02 22:20:45 +02:00

Closed #891 ETV_HOOK_FIRE_LIB is SOURCED from an env-var path in 12 hooks — a decoy tree's code runs inside the gate 2026-08-30 23:41:20 +02:00

Closed #855 Nothing couples ci-image.yml's push.paths to ci-image-pin's expected pathspec 2026-08-30 21:25:24 +02:00

Closed #887 Every image build fails: completeAnnotations.guard.test.ts needs the git index, and the Dockerfile's exclude list is hand-maintained 2026-08-30 18:06:23 +02:00

Closed #900 chore(release): cut and promote v26.15.0 on 736649b3b (main head could not build an image) 2026-08-30 17:29:20 +02:00

Closed #858 pretooluse-merge-consent.sh resolves its verdict classifier from $CLAUDE_PROJECT_DIR — an env var as a security input 2026-08-30 13:33:52 +02:00

Closed #859 Merge-gate branch-protection read: a malformed rule states a cause that did not happen, and the endpoint is now fetched twice 2026-08-30 13:33:51 +02:00

Closed #870 The timeline walk's null terminator is defeatable: Gitea pages BEFORE it filters, so a page of inline-code comments reads as exhaustion 2026-08-30 13:29:39 +02:00

Closed #880 Schedule-item recurrence fields: an omitted array means "never applies" on write but "unrestricted" on read 2026-08-30 11:29:03 +02:00

Closed #849 review-verdict.yml post-write verification: three routes that leave an exemption success over a human failure 2026-08-30 07:55:12 +02:00

Closed #845 post-review-verdict.sh does not check that its own account is on the gate's H10_REVIEWERS allow-list 2026-08-30 04:43:09 +02:00

Closed #886 release.verdict-vocabulary-shared explains the sentinel with a set -u mechanism that measurement refutes 2026-08-30 03:30:53 +02:00

Closed #853 workflow_dispatch still loads attacker YAML from an arbitrary ref — four workflows, no ref restriction 2026-08-30 03:18:05 +02:00

Closed #836 :latest images ship InformationalVersion 0.0.0 — a --depth=2 fetch grafts the build job's full clone shallow 2026-08-30 01:55:30 +02:00

Closed #820 Complete<T> proves its semantics but not its APPLICATION — nothing derives the set of SPA full-replace construction sites 2026-08-30 00:06:40 +02:00

Closed #812 Remediate the 21 session-narrative sites #784's sweep found — 21 judgements, not a regex 2026-08-29 22:28:16 +02:00

Closed #823 Scheduling collection-valued columns: is a runtime null reachable on DaysOfMonth / MonthsOfYear / DaysOfWeek? 2026-08-29 21:55:58 +02:00

Closed #824 ElasticSearchIndex.UpdateSong has no regression test — an Elastic-only reintroduction of the #701 mutation stays CI-green 2026-08-29 21:55:58 +02:00

Closed #819 The SPA page-size guard enumerates web/src with a Vite glob while claiming completeness 2026-08-29 11:14:16 +02:00

Closed #809 The production-hook-fire-log isolation guard is per-test, but its claim is per-suite 2026-08-29 04:32:28 +02:00

Closed #822 test_the_suite_does_not_write_to_the_PRODUCTION_log uses global mutable state as its oracle — any concurrent session reddens it 2026-08-29 04:32:28 +02:00

Closed #664 pr-changed-files.sh head binding cannot see an A→B→A force-push across its paging round-trips 2026-08-29 01:29:49 +02:00

Closed #803 Head-ABA: a force-push H1->H2->H1 during paging defeats pr-changed-files.sh, and three contracts still deny it 2026-08-29 01:29:48 +02:00

Closed #789 Derive the CI toolchain population from workflow-owned metadata, not TOOLCHAIN_JOBS 2026-08-28 22:54:55 +02:00

Closed #786 Extend the machine-checked guard inventory to inline workflow-job guards 2026-08-28 22:54:54 +02:00

Closed #796 A verification harness is itself unproven code — five false greens, each created by the fix for the last 2026-08-28 22:06:46 +02:00

Closed #763 Page both /statuses/{sha} reads in review-verdict.yml — limit clamps to 50, so the post-write race check can miss a raced verdict 2026-08-28 19:34:49 +02:00

Closed #747 Re-verify the Gitea 1.25.4-pinned CI claims after the 1.27.1 upgrade 2026-08-28 18:51:15 +02:00

Closed #781 Plugin/MCP config hygiene: retire what is enabled and never invoked, de-duplicate the gitea server 2026-08-28 16:37:36 +02:00

Closed #799 serena is enabled and starts fine, but its tools never reach a session — establish why, then use or disable it 2026-08-28 16:37:36 +02:00

Closed #787 The dropped-step guard's SCOPE is a dated comment, not a check, against branch protection 2026-08-28 00:37:08 +02:00

Closed #748 Declare permissions: on the status-writing workflows so the Gitea Restricted token default can be enabled 2026-08-28 00:02:47 +02:00

Closed #744 ci-image.yml's push trigger has no branches: filter — any branch push runs attacker YAML on a docker-capable runner 2026-08-27 22:44:46 +02:00

Closed #835 Guard the persist-credentials convention — after #744, with no exemption list 2026-08-27 22:44:46 +02:00

Closed #742 Tighten review-verdict.yml provenance from "non-null creator" to an allow-list of approved reviewers 2026-08-27 04:52:04 +02:00

Closed #735 Validate FFmpeg profile numeric fields to sane ranges instead of silently transforming them, and expose readrate pacing as a bounded field 2026-08-27 00:05:39 +02:00

Closed #788 One shared verdict vocabulary instead of two shell copies plus a parity test 2026-08-26 22:58:11 +02:00

Closed #732 On Now / Next overlay: give it a boxed background for legibility, and enable it on all channels by default 2026-08-26 21:28:27 +02:00

Closed #746 docker-build.yml checkouts should set persist-credentials: false — after the || true fetch masking is removed 2026-08-26 20:50:58 +02:00

Closed #734 SPA: field-level progressive disclosure — short summary → hover popup → (future) deep-dive docs link 2026-08-26 20:05:55 +02:00

Closed #755 Project boundary: ersatztv owns the fork code, media-management owns channel operations 2026-08-26 19:29:18 +02:00

Closed #708 Reproduce #698 route 2 live: push code onto a renovate-authored PR branch and confirm the manifest allow-list refuses the exemption 2026-08-26 11:11:25 +02:00

Closed #690 Rerun collections: paged list TotalCount ignores the search query, so the SPA renders empty pages 2026-08-26 09:39:25 +02:00

Closed #758 GetPagedPlayouts: TotalCount ignores the query filter, so a filtered page reports the unfiltered total 2026-08-26 09:39:25 +02:00

Closed #721 Auto-Tune proposal rows should be a grid — channel numbers do not line up, and the name renders twice 2026-08-25 23:55:25 +02:00

Closed #740 AddItemsDialog.runSearch has no stale-response or is-mounted guard (pre-existing, surfaced during #685) 2026-08-25 23:55:25 +02:00

Closed #807 The SPA's hand-built request objects can silently drop an OPTIONAL DTO field 2026-08-23 02:58:23 +02:00

Closed #701 Search indexers mutate SongMetadata.Artists on a possibly-tracked entity (??= []) — same shape rejected in #691 2026-08-23 01:24:43 +02:00

Closed #792 post-review-verdict.sh exits 0 when it deliberately writes NO status 2026-08-23 01:05:37 +02:00

Closed #772 The pinned CI toolchain image can vanish from the registry and take ALL container CI down, with no signal but a pull error 2026-08-23 01:05:36 +02:00

Closed #806 Guard populations over FILES should derive from the git index, not a filesystem walk 2026-08-22 18:07:59 +02:00

Closed #790 An executable clause-level mutation harness for the shell and python guards 2026-08-22 15:12:17 +02:00

Closed #780 Reconcile Python tooling: commit a ruff config and enforce it, or stop claiming we enforce it 2026-08-22 02:33:21 +02:00

Closed #784 Generalize the no-session-narrative rule from the kickoff file to all docs — the reader never saw the earlier draft 2026-08-22 02:23:25 +02:00

Closed #785 Mutation proofs for the 19 unproven guards, worst-consequence first 2026-08-21 22:10:03 +02:00

Closed #779 Test the deny path with the production config value, and assert full-replace field lists 2026-08-21 21:22:32 +02:00

Closed #778 Audit read-then-write against live remote state: pin a version or use compare-and-set 2026-08-21 19:04:15 +02:00

Closed #794 A fix ships a test witnessed failing BEFORE the fix — mechanise it by reverting the code side and asserting red 2026-08-16 12:25:01 +02:00

Closed #776 Make hooks report that they fired — PreToolUse/PostToolUse execution is currently unobservable 2026-08-14 21:11:06 +02:00

Closed #797 pretooluse-bom-guard.sh is fail-open wherever xxd is not installed — including the CI runner 2026-08-14 18:51:00 +02:00

Closed #777 csharp-lsp and typescript-lsp are broken; the "workflow agents must use csharp-lsp" guidance is stale 2026-08-14 17:55:22 +02:00

Closed #774 Guard convention: derive the expected set from the authoritative source and assert equality — never filter, never sample 2026-08-14 01:17:58 +02:00

Closed #775 Every guard ships with a proof it can go red: delete that guard alone, the suite must fail 2026-08-14 01:17:58 +02:00

Closed #773 Root-cause the recurring defect shapes across closed issues, then build hooks/tooling that make them hard to repeat — plus an audit of the tooling we already have and don't use 2026-08-13 21:16:53 +02:00

Closed #767 Make the delimiter ban fail-CLOSED on the release path — build's Smoke step is still droppable on a v* tag push 2026-08-13 20:04:53 +02:00

Closed #720 docs(ci-cd): a Komodo stack named ersatztv now exists on jazz — and it is NOT prod 2026-08-11 21:26:08 +02:00

Closed #756 Extend the dropped-step guard to docker-build.yml's required jobs, where a dropped step is fail-OPEN 2026-08-11 01:35:09 +02:00

Closed #751 review-verdict.yml's classify/post step never executes — job goes green, review-verdict/h10 is never posted automatically 2026-08-10 21:33:34 +02:00

Closed #754 MCP ersatztv_update_channel omits graphicsElementIds — cannot set the On Now/Next overlay, and silently strips it 2026-08-06 22:42:38 +02:00

Closed #757 MCP tool catalog: query parameters are unguarded — list_playouts omits query, get_playout_items omits showFiller 2026-08-06 22:42:38 +02:00

Closed #719 H11 pre-push guard blocks a tag-only push, on every release cut 2026-08-06 00:58:18 +02:00

Closed #743 review-verdict/h10 is bypassable without forging it: direct pushes to main are server-side permitted 2026-08-06 00:58:17 +02:00

Closed #697 ETV_STATUS_AUTH can write commit statuses, so any head-resolved workflow can still forge review-verdict/h10 2026-08-05 21:56:53 +02:00

Closed #685 CollectionsScreen AddItemsDialog windows the whole media-library type on an empty query, with no truncation surfaced (§3b deviation) 2026-08-05 20:02:00 +02:00

Closed #674 decisions_validate.py stays green on frontmatter PyYAML rejects — an apostrophe in a single-quoted scalar (hit twice in one session) 2026-08-04 23:43:11 +02:00

Closed #688 decisions_validate ceiling calibration test is one line from red — any record ≥61 prose lines fails script-tests 2026-08-04 23:43:11 +02:00

Closed #726 Embedded BITMAP subtitle (PGS/DVD) burn-in + -readrate halves transcode to 0.53x realtime — Live TV buffering 2026-08-04 23:24:13 +02:00

Closed #707 pr-changed-files.sh paging can drop a path when the base branch advances mid-enumeration 2026-08-03 23:01:14 +02:00

Closed #711 .codex/ mirrors the gate-enforcing hooks but is absent from the merge gate's PROTECTED list 2026-08-03 23:01:14 +02:00

Closed #706 review-verdict/h10 writes are not serialized — a stale run can overwrite a fresher verdict (ABA retarget + human-rejection race) 2026-08-03 23:01:13 +02:00

Closed #715 chore(deps): land the three stalled Renovate patch bumps as one batch (#679, #680, #681) 2026-07-30 23:42:41 +02:00

Closed #713 chore: ignore .codex/ and stop shipping a plaintext Gitea credential in tracked docs 2026-07-30 22:30:03 +02:00

Closed #698 The review-verdict/h10 exemption path decides from mutable PR state — three routes to a forged exemption 2026-07-30 21:22:02 +02:00

Closed #672 review-verdict.yml is head-resolved, so a PR editing it can self-approve the required check 2026-07-28 23:44:20 +02:00

Closed #691 SongVideoGenerator dereferences the nullable SongMetadata.Artists unguarded — NRE on the playback path 2026-07-28 23:43:30 +02:00

Closed #671 Rerun collections: the list endpoint returns a null selection for every row, and the detail GET 500s or nulls for five media types 2026-07-28 20:56:14 +02:00

Closed #668 Facet-value typeahead misses accented values on the EF-sourced fields (LOWER() is ASCII-only on SQLite) 2026-07-27 23:08:30 +02:00

Closed #684 main is red: the #650 pageSize call-site guard keys its registry on line:column, so any merge that shifts a line breaks it 2026-07-27 19:39:40 +02:00

Closed #578 #434 follow-ups: typeahead combobox polish + source limitations 2026-07-27 08:09:32 +02:00

Closed #650 Two more list loads truncate at the cap — but at-cap, so #644's over-cap grep could not see them 2026-07-27 08:08:14 +02:00

Closed #651 Library-browse pickers need a searchable source, not a 100-row window or a full-library crawl 2026-07-27 05:47:07 +02:00

Closed #649 The ENFORCED review-verdict.yml guard is weaker than the advisory local hook — duplicated security logic has drifted 2026-07-27 00:04:07 +02:00

Closed #632 A PR base change leaves the head sha — and so the review-verdict/h10 status — unchanged 2026-07-26 23:58:51 +02:00

Closed #662 Typeahead artist suggestions miss free-text credits; album_artist 404s — value-converted list columns have no suggestion source 2026-07-26 23:01:47 +02:00

Closed #648 Pin or preflight jq in CI: the runner ships 1.6, dev machines ship 1.8.x, and that gap silently broke three shell gates 2026-07-26 22:46:05 +02:00

Closed #510 WatermarkSelector: the deco path has a different missing-logo policy than the three precedence levels 2026-07-26 22:16:36 +02:00

Closed #644 Seven more SPA list loads silently truncate at the server cap (same class as #634, one screen over) 2026-07-26 22:10:05 +02:00

Closed #505 QSV native-decode path tonemaps HDR in software (route through tonemap_qsv) 2026-07-26 21:56:03 +02:00

Closed #620 decisions corpus consolidation has no owner — and after #610 the budget number stops reporting it 2026-07-26 20:17:29 +02:00

Closed #647 H10 verdict classifier is inert on jq 1.6: contains("�") matches every string, and a parse error is indistinguishable from an empty list 2026-07-26 20:16:49 +02:00

Closed #643 Merge-consent gate fails OPEN on jq 1.6: a transport failure mid-pagination lets the docs-only exemption fire over a PARTIAL file list 2026-07-26 20:16:45 +02:00

Closed #631 scripts/tests/ is never executed by CI — the Python test suite is local-only 2026-07-26 13:56:46 +02:00

Closed #621 decisions: a record file that fails to parse is silently invisible — no structural "one keyed record per file" check 2026-07-26 13:23:14 +02:00

Closed #633 OpenAPI pageNum parameters carry no description, so the 0-based contract is invisible to REST consumers 2026-07-26 13:06:33 +02:00

Closed #634 Rerun-collection picker in SchedulesScreen silently truncates at 100 (asks for pageSize 1000, server clamps to 100) 2026-07-26 12:20:32 +02:00

Closed #629 merge gate: false-opens in the H10 verdict classifier — an undefined token, code blocks (fenced/indented/HTML), a URL-borne sha, and a read path that failed open 2026-07-26 03:02:32 +02:00

Closed #617 .claude/skills/jellyfin/ is a stale divergent copy, not the symlink CLAUDE.md describes — it documents auth that v12 only accepts by legacy opt-in 2026-07-26 02:13:29 +02:00

Closed #615 Jellyfin merges <Base> - <variant>.mp4 music videos into one multi-version item — Behind the Music (61 files) and Top of the Pops (24 files) each land as a single ErsatzTV item 2026-07-26 00:46:53 +02:00

Closed #616 MCP/API paging traps: pageNum documented 1-based but is 0-based, pageSize cap doesn't clamp the offset, and playout rows carry no channelId 2026-07-26 00:11:23 +02:00

Closed #622 merge gate: docs-only exemption is computed from a TRUNCATED file list (confirmed); auto-merge scheduling also freezes H10 consent (structural) 2026-07-25 23:33:16 +02:00

Closed #491 LibraryFolder has no unique index on (LibraryPathId, Path) — concurrent GetOrAddFolder can insert duplicates 2026-07-25 22:00:46 +02:00

Closed #610 decisions: split the monolithic corpus into one YAML-frontmatter file per record 2026-07-25 20:36:09 +02:00

Closed #609 decisions-validate: [decisions-edit] is a bare substring match — a commit that merely *describes* the token disarms the guard 2026-07-25 19:07:50 +02:00

Closed #496 Music videos have no per-library identity — global GetOrAdd path dedup can cross-library false-trash 2026-07-25 18:08:13 +02:00

Closed #487 MCP acceptance case: populate the empty music collections via the MCP write path (not by hand) 2026-07-25 17:16:20 +02:00

Closed #484 Media-server scanner: ratio-threshold + projection-failure detection for the empty-fetch guard 2026-07-25 17:08:08 +02:00

Closed #503 Watermark MiddleCenter renders bottom-right — missing switch arm in OverlayWatermarkFilter 2026-07-25 16:35:29 +02:00

Closed #603 decisions: adopt OKF's stale-after and Sources: as optional record metadata 2026-07-25 16:16:00 +02:00

Closed #445 functional-E2E: add the UI-interactive Playwright (headless) flows (deferred from #363) 2026-07-25 14:52:33 +02:00

Closed #533 scripts/e2e-local.sh readiness probe hangs on a reused config dir 2026-07-25 14:52:33 +02:00

Closed #460 MediaSourceRepository writes MinValue LastScan on disable-sync — normalize to null (#409 follow-up) 2026-07-25 14:11:35 +02:00

Closed #485 Build hygiene: .gitignore core entry silently ignores new files under any Core/ directory (case-insensitive on macOS) 2026-07-25 13:51:59 +02:00

Closed #586 E2E briefs: scope process cleanup by PID, never a pattern-wide pkill 2026-07-25 13:51:58 +02:00

Closed #594 ci-image-pin accepts any hex length, not the exact 7-char tag ci-image.yml publishes 2026-07-25 13:51:58 +02:00

Closed #500 MediaServer metadata reconcile double-inserts on duplicate collection names (Plex movie + Jellyfin music-video update paths) 2026-07-25 13:45:42 +02:00

Closed #587 chore(docs): trim derivable content from CLAUDE.md and lazy-load the task-completion protocol 2026-07-25 12:25:22 +02:00

Closed #592 CI monitors: record that skipped is not red (build skips on every PR) 2026-07-25 12:07:30 +02:00

Closed #440 Auto-Tune DetailPanel SPA: wire per-source weight steppers + exclude/add-untagged to the #425 backend 2026-07-25 12:06:03 +02:00

Closed #583 Kickoff: make per-agent model routing a hard constraint + a PreToolUse gate 2026-07-25 11:47:44 +02:00

Closed #436 Rule builder: support nesting deeper than one level (#176 follow-up) 2026-07-25 11:47:15 +02:00

Closed #437 Adopt RuleBuilder inline in ChannelBuilder & Auto-Tune (#176 follow-up) 2026-07-23 23:17:42 +02:00

Closed #415 Per-channel fault detection beyond "no playout" (empty schedule, broken source) 2026-07-23 22:45:20 +02:00

Closed #434 Rule builder: facet-value typeahead for text fields (#176 follow-up) 2026-07-23 21:16:56 +02:00

Closed #435 Rule builder: relative-date operators ("in the last N days") (#176 follow-up) 2026-07-23 21:16:56 +02:00

Closed #438 Rule builder: input validation & polish (bundles #176 review minors) 2026-07-23 21:16:56 +02:00

Closed #414 Channels list: distinguish auto-tuned from user-created channels (origin marker) 2026-07-23 20:12:26 +02:00

Closed #458 Playlist/group rename should reject duplicate names (like create does) — #327 follow-up 2026-07-23 20:07:43 +02:00

Closed #178 Idea (far future): Jellyfin plugin to control ErsatzTV from within Jellyfin 2026-07-23 18:32:12 +02:00

Closed #75 [Blue sky] Themed "Resource Packs" for bumpers / branding / interstitials 2026-07-23 18:32:10 +02:00

Closed #559 Harden the /iptv ?access_token= transport: redact from request logs + no-store on tokened manifests 2026-07-23 18:31:01 +02:00

Closed #421 M3U: access_token value not quote-safe in url-tvg="..." attribute 2026-07-23 18:31:00 +02:00

Closed #392 Clock-align convenience: one-click per-channel/schedule pad-to-boundary toggle + 60-min increment (SPA) 2026-07-23 09:10:30 +02:00

Closed #570 On Now/Next overlay YAML fails to render (format_datetime arity + null font_family) — #74 hotfix 2026-07-22 23:39:33 +02:00

Closed #567 Harden channel graphicsElementIds: validate unknown ids (422 not 500) + builtIn discriminator (#74 follow-up) 2026-07-22 22:38:32 +02:00

Closed #74 [Blue sky] On-screen "On Now / On Next" overlay (channel-surf bug) 2026-07-22 22:36:42 +02:00

Closed #395 Refactor: dedup Scripted≡YAML enumerator construction (deferred from #380, gated on #381 goldens) 2026-07-22 20:52:24 +02:00

Closed #523 QSV native-decode (#498) hwupload fails to allocate a QSV surface for certain content — "Cannot allocate memory" kills the stream 2026-07-22 19:41:08 +02:00

Closed #381 Golden characterization tests for remaining scheduler kinds (Sequential YAML + Scripted) 2026-07-22 19:40:32 +02:00

Closed #297 Add channelId to PlayoutListItemResponseModel so the SPA reset button keys directly 2026-07-22 19:30:25 +02:00

Closed #248 SPA dialogs (overlay.tsx) are not focus-trapped / background-inerted 2026-07-22 19:30:15 +02:00

Closed #552 Mint a short-lived JWT for the SPA so /iptv/* works under JWT-enabled deployments 2026-07-22 18:52:05 +02:00

Closed #512 Make LibrariesScreen scan-complete test deterministic (stop racing real microtasks under waitFor) 2026-07-22 18:02:26 +02:00

Closed #553 select-queue.sh ranks Renovate's bot-authored Dependency Dashboard (#22) as a workable pickup 2026-07-22 18:01:23 +02:00

Closed #60 Backlog: browser channel playback after UI redesign 2026-07-22 00:29:36 +02:00

Closed #177 Jellyfin music video sync: map Album/Track metadata (credits-overlay completeness) 2026-07-21 23:50:20 +02:00

Closed #62 Epic: Create Channel — backend prerequisites for the redesigned creation flow 2026-07-21 23:09:01 +02:00

Closed #135 from-lineup advanced overrides cannot express "clear to none" (null = inherit template) 2026-07-21 22:59:52 +02:00

Closed #539 WorkAheadSlots.Release hardening: never go negative, and surface UnbalancedReleases somewhere a human will see it 2026-07-21 21:20:43 +02:00

Closed #545 decisions-guard: require a **Signals:** line (MemPalace recall metadata contract) 2026-07-21 20:58:04 +02:00

Closed #548 docs: the ersatztv skill described archived upstream, not this fork 2026-07-21 20:51:48 +02:00

Closed #542 The kickoff handoff doc should be instructions, not incident history — prune the narrative into decisions.md 2026-07-21 20:43:06 +02:00

Closed #541 H13: session-end must leave the shared checkout fresh — a stale tree serves stale FILES, which no HEAD-reading rule catches 2026-07-21 20:23:18 +02:00

Closed #68 Resume/bookmark playback position for sequential channels (personal continue-watching) 2026-07-21 19:49:15 +02:00

Closed #536 workAheadSegmenterLimit is not enforced: the slot check and its increment straddle an await (N concurrent tune-ins all run unthrottled) 2026-07-21 19:09:50 +02:00

Closed #535 Release-tag builds: small-lane PR-only gate jobs run + fail on v* tag pushes 2026-07-21 18:31:42 +02:00

Closed #532 Re-measure HLS cold start on prod after v26.12.0+ ships the #529 floor, against #350's 13-sample baseline 2026-07-21 17:52:52 +02:00

Closed #524 Retrofit #237's durable-only facts into #521 decision records (post-arc follow-up) 2026-07-21 17:35:40 +02:00

Closed #519 Verify the #350 cold-start burst end-to-end on test, then re-measure on prod 2026-07-21 17:03:05 +02:00

Closed #529 QSV extra_hw_frames=0 kills transcodes on any unthrottled read — live in prod, and made near-deterministic by #516's burst 2026-07-21 16:41:16 +02:00

Closed #525 External channel-logo URLs: download + cache at save time instead of fetching at render time 2026-07-21 15:36:17 +02:00

Closed #521 Make decision knowledge lifecycle-addressable and retrieval-efficient 2026-07-21 12:30:19 +02:00

Closed #520 Retire #237 from startup; run orientation and mechanical top-five selection in parallel 2026-07-21 12:29:19 +02:00

Closed #511 Harden remote-image fetching in the graphics engine (timeout, size cap, redirects, pooling, caching, SSRF) 2026-07-21 01:47:21 +02:00

Closed #58 Backlog: MCP server for ErsatzTV/ChicoryTV API 2026-07-21 01:02:37 +02:00

Closed #350 Channel cold-start ~7s to first segment — slow tune-in via Dispatcharr/Kodi (heavy transcode profile) 2026-07-21 00:33:41 +02:00

Closed #502 External-URL channel logos never render an on-screen bug (File.Exists against a URL in WatermarkSelector) 2026-07-20 23:33:51 +02:00

Closed #515 release: cut and promote v26.11.0 to prod (first release on jazz) 2026-07-20 23:14:42 +02:00

Closed #474 Music channels dead: Music Videos library has no LibraryPath, so /data/music (30 folders) is never scanned — 8+ collections empty 2026-07-20 23:14:07 +02:00

Closed #508 Move the two docker build jobs off the small runner lane 2026-07-20 22:56:20 +02:00

Closed #498 FFmpeg profile should allow separate decode and encode hardware acceleration (QSV encode + VAAPI decode) 2026-07-20 22:16:37 +02:00

Closed #67 Unified logo/bug image handling (one image drives both, separable) 2026-07-20 21:36:47 +02:00

Closed #25 Burn down SonarAnalyzer findings in Blazor .razor (analyzer adoption #15) 2026-07-20 19:26:39 +02:00

Closed #497 JellyfinMusicVideoLibraryScanner.UpdateMetadata drops Tags/Genres/Studios on existing items — Jellyfin metadata edits never sync 2026-07-20 18:53:43 +02:00

Closed #489 Support Jellyfin mixed-content libraries (currently dropped silently) — keep music/standup segregated from Movies &amp; TV Shows 2026-07-20 18:34:52 +02:00

Closed #494 JellyfinMusicVideoLibraryScanner does no reconciliation — music videos removed from Jellyfin are never removed from ErsatzTV 2026-07-20 17:22:16 +02:00

Closed #488 JellyfinMusicVideoLibraryScanner crashes immediately: ArgumentNullException from null LibraryPath.LibraryFolders (feature has never worked) 2026-07-20 16:09:01 +02:00

Closed #480 External-JSON playout channels still hand ffmpeg an unprobed remote-stream URL (#473 class survives there) 2026-07-20 00:37:30 +02:00

Closed #472 Split HLS cold-start startup phase into spawn / input-open+probe / first-GOP 2026-07-19 23:59:23 +02:00

Closed #477 Scanner has no anti-nuke guard: a successful-but-empty media-server fetch flags an entire library FileNotFound 2026-07-19 23:53:38 +02:00

Closed #478 Channels 102/107 repeatedly fail to tune: h264_vaapi hwupload -22 / exit 234 on prod 2026-07-19 23:01:08 +02:00

Closed #473 Tune-in hard-fails (ffmpeg exit 8) when a playout item's media file no longer exists — 717 stale episodes across 10 removed shows on prod 2026-07-19 22:25:00 +02:00

Closed #476 Scanner: FileNotFound does not cascade show → seasons → episodes, so playouts keep scheduling episodes of shows deleted upstream 2026-07-19 22:19:38 +02:00

Closed #412 CI: peak-memory instrument reports cache-inflated memory.peak; sample true peak anon instead 2026-07-19 21:09:30 +02:00

Closed #469 CI: speed up the Formatting job (dotnet format --include still loads the whole solution) 2026-07-19 19:59:34 +02:00

Closed #444 functional-E2E: add the playout-build lock 409 + isLocked projection flow (deferred from #363) 2026-07-19 17:57:42 +02:00

Closed #431 Backend: TTL-cache PerformHealthChecks (GET /api/v1/health re-runs 14 checks, 4 shell out to ffmpeg, per request) 2026-07-19 15:43:12 +02:00

Closed #464 Guide + channels list show generated fallback icons instead of the actual channel logo 2026-07-19 14:10:29 +02:00

Closed #463 Schedules screen: "Active schedule" selector stretches full-width and overlaps the header 2026-07-19 12:21:01 +02:00

Closed #404 SPA: per-source weight inputs + fair-share toggle in the schedule editor (#70 UI) 2026-07-19 12:01:43 +02:00

Closed #409 Never-scanned local libraries render "Last scan 12:00 AM" instead of "Never scanned" (LastScan seeded as DateTime.MinValue, not NULL) 2026-07-18 21:39:26 +02:00

Closed #420 CI: PR run and merge-to-main run re-execute the full matrix over identical code 2026-07-18 21:14:28 +02:00

Closed #403 Scheduling: an unhandled PlaybackOrder fails silently at five of six dispatch sites 2026-07-18 19:10:37 +02:00

Closed #398 CI: build once, reuse artifacts across test / migrations / functional-e2e (742s of redundant compilation per run) 2026-07-18 18:34:33 +02:00

Closed #401 UpdateChannel silently coerces Mirror→Generated when the channel has a playout (should be 422) 2026-07-18 18:27:27 +02:00

Closed #327 Playlist rename (ReplacePlaylistItems) does no name validation — empty / >50-char names accepted 2026-07-18 18:27:20 +02:00

Closed #447 Flaky SPA test: LibrariesScreen "stops scan polling and refreshes sources once when scans complete" 2026-07-18 18:19:00 +02:00

Closed #410 Scan cancellation is logged at ERROR ("Scan was canceled") across all four scan handlers 2026-07-18 18:18:20 +02:00

Closed #338 ci: distinguish ZAP warning exit 2 from FAIL in security-scan 2026-07-18 18:17:02 +02:00

Closed #367 Plex: budget-exhausted message says "Use Refresh" but there is no global Refresh when zero servers exist 2026-07-18 18:15:43 +02:00

Closed #310 De-BOM the 17 legacy .cs files #269 touched (charset=utf-8 violation) 2026-07-18 18:15:36 +02:00

Closed #383 Auto-Tune: per-channel configuration (DetailPanel) — editable per-channel step 2026-07-18 17:30:31 +02:00

Closed #396 Collapsible left sidebar + collapsible nav groups 2026-07-18 17:24:54 +02:00

Closed #363 functional-E2E harness: add the deferred media/lock/Playwright flows (follow-up to #299) 2026-07-18 16:05:25 +02:00

Closed #293 Page/cap GET /api/search/all-items (DoS hardening — deferred from #285) 2026-07-18 14:17:21 +02:00

Closed #308 Concurrent same-item Add*ToCollection can 500 on composite-PK violation (pre-existing idempotency-under-concurrency gap) 2026-07-18 13:29:02 +02:00

Closed #425 Auto-Tune DetailPanel: per-source rotation weights + query corrections (weighted-distribution redesign) 2026-07-18 04:29:17 +02:00

Closed #176 Rethink channel/playout/schedule creation: PseudoTV-style channel-first flow with a Kodi-smart-playlist-like query builder 2026-07-18 03:30:25 +02:00

Closed #386 Auto-Tune DetailPanel: per-channel editor slide-over (SPA) 2026-07-18 01:54:40 +02:00

Closed #164 Health checks UX: audit usefulness + guided/automated remediation 2026-07-18 01:12:20 +02:00

Closed #385 Auto-Tune DetailPanel: per-channel overrides + rotation weights in bulk-create 2026-07-18 00:03:55 +02:00

Closed #320 TroubleshootController playback segment-wait loop doesn't check notifier.IsFailed (spins until client cancel if ffmpeg dies) 2026-07-17 20:43:08 +02:00

Closed #416 CI: docs-only changes run the full build/test matrix (~9 min) for nothing 2026-07-17 20:10:25 +02:00

Closed #376 XMLTV: access_token query value interpolated raw into guide (pre-existing XML-injection) 2026-07-17 19:34:25 +02:00

Closed #70 Weighted / fair-share content distribution (playback order) 2026-07-17 19:00:48 +02:00

Closed #72 Channel lineup health at-a-glance (status states in the channels list) 2026-07-17 18:13:52 +02:00

Closed #406 CI: cut peak build RSS (Roslyn), cap the services: mysql, and move api-docs/format back to ubuntu-latest 2026-07-17 17:18:43 +02:00

Closed #264 Local libraries always show "Never scanned" — local scanner sets path-level LastScan but not library.LastScan 2026-07-17 15:00:59 +02:00

Closed #59 Backlog: full UI redesign and ChicoryTV rebrand 2026-07-17 14:08:18 +02:00

Closed #384 Auto-Tune DetailPanel: enumerate a SmartCollection's distinct members (read endpoint) 2026-07-17 12:43:50 +02:00

Closed #390 CI: shared toolchain base image (.NET 10 SDK + Node 22 + ffmpeg) for CI jobs 2026-07-17 12:40:25 +02:00

Closed #73 Seasonal / date-conditional channels &amp; schedule rules 2026-07-17 09:20:55 +02:00

Closed #380 Refactor: shared enumerator-construction/state seam for PlaybackOrder across scheduling engines 2026-07-17 09:05:15 +02:00

Closed #388 Mirror the ChicoryTV design system to prod (Claude Design ↔ shipped SPA) 2026-07-17 03:27:14 +02:00

Closed #77 Pad/snap channel schedules to clock boundaries (:00/:15/:30) using filler 2026-07-17 03:26:50 +02:00

Closed #69 Auto-tuning: generate channels automatically from library metadata 2026-07-17 00:30:53 +02:00

Closed #357 Jellyfin/Kodi PoC: player-owned channel playback with ErsatzTV as channel engine 2026-07-17 00:26:08 +02:00

Closed #71 Persistent shuffle state + explicit "Reroll" control 2026-07-17 00:19:04 +02:00

Closed #163 Golden-style characterization tests for playout building 2026-07-17 00:01:34 +02:00

Closed #15 Adopt a C# lint/format/static-analysis stack (the ruff equivalent) and enforce in CI 2026-07-16 22:19:07 +02:00

Closed #373 bug(spa): white border around the edges of the login / boot pages (missing body margin reset) 2026-07-16 22:12:53 +02:00

Closed #377 SPA: left sidebar scrolls horizontally (unwanted overflow-x) 2026-07-16 22:12:53 +02:00

Closed #340 Add configurable advertised IPTV base URL for M3U/XMLTV output 2026-07-16 21:51:29 +02:00

Closed #333 test: run #202 real-server media-source integration validation 2026-07-16 21:40:10 +02:00

Closed #334 security: keep local-library filesystem paths authenticated when reads are open 2026-07-16 19:16:52 +02:00

Closed #354 ChicoryTV: subtitles progressively run ahead of dialogue during playback 2026-07-16 17:06:34 +02:00

Closed #99 Backend: track active sessions for MPEG-TS and HLS-Direct streams 2026-07-16 15:14:32 +02:00

Closed #345 Plex pin flow reports connected but strands authorized accounts with no servers 2026-07-16 14:36:53 +02:00

Closed #364 docs: make queue selection non-terminal 2026-07-16 14:13:06 +02:00

Closed #299 CI: codify the manual live-E2E flows into an automated functional-E2E harness 2026-07-16 14:00:06 +02:00

Closed #243 Refactor ChicoryTV App.tsx into screen-owned modules and a small app shell 2026-07-16 13:43:12 +02:00

Closed #247 Extract ChicoryTV shell/routing and replace implicit TopBar action coupling 2026-07-16 13:42:20 +02:00

Closed #246 Extract Dashboard and Guide screens from App.tsx 2026-07-15 21:59:44 +02:00

Closed #355 docs: record tested Codex cheap-worker launch configuration 2026-07-14 21:00:01 +02:00

Closed #353 docs: start tool-bearing selectors at low effort 2026-07-14 20:15:22 +02:00

Closed #245 Extract PlayoutsScreen and playout UI helpers from App.tsx 2026-07-14 19:35:30 +02:00

Closed #347 Queue selector skips milestone work and repicks completed reviewer audits 2026-07-14 08:03:47 +02:00

Closed #344 Saving a remote connection falsely triggers the dirty guard 2026-07-14 08:02:35 +02:00

Closed #342 Enforce session-wide low-cost routing for bounded reconnaissance 2026-07-13 21:50:18 +02:00

Closed #330 Add Cross-Origin-Resource-Policy header (ZAP #314 authenticated-scan Low) 2026-07-13 21:33:15 +02:00

Closed #339 docs: require low-cost queue selection preflight 2026-07-13 20:56:58 +02:00

Closed #237 ChicoryTV rewrite — queue tracker (goal, arc, session protocol) 2026-07-13 20:45:58 +02:00

Closed #335 release: cut v26.8.0 and complete ChicoryTV go-live 2026-07-13 20:44:15 +02:00

Closed #336 docs: prepare the v26.8.0 release boundary 2026-07-13 20:02:23 +02:00

Closed #197 Cold adversarial review: REST API contract + security posture (pre-ossification) 2026-07-13 19:24:35 +02:00

Closed #332 docs: make ChicoryTV queue handoff client-neutral 2026-07-13 19:00:17 +02:00

Closed #314 Out-of-ecosystem black-box security scan against the running container (#197 exit criterion) 2026-07-13 08:42:43 +02:00

Closed #172 Scheduling API hardening follow-ups from #144 S1/S2 reviews 2026-07-13 01:27:38 +02:00

Closed #286 #197 C1 [BLOCKER]: no API versioning — mount /api/v1 before the contract freezes 2026-07-13 00:52:26 +02:00

Closed #238 TopBar primaryAction button is inert on every screen except SchedulesScreen 2026-07-12 23:51:26 +02:00

Closed #253 Replace-all PUTs have no optimistic concurrency — stale two-tab overwrite; define a shared If-Match/version contract before more editors ossify 2026-07-12 23:33:24 +02:00

Closed #265 If-Match parsing: return 412 (not 400) for syntactically-valid but non-matching entity-tags (RFC 7232 semantics) 2026-07-12 23:32:26 +02:00

Closed #319 Set security response headers (CSP, X-Content-Type-Options, Permissions-Policy, COEP) on the host — ZAP baseline finding (#314 / #197 input) 2026-07-12 22:52:50 +02:00

Closed #301 #295: side-effecting GET endpoints bypass the session CSRF gate (troubleshoot playback/archive) — resolve with the SPA session cutover (PR2) 2026-07-12 22:04:56 +02:00

Closed #295 [PLAN-MODE] Browser SPA auth = OIDC + local login (session); demote API key to external/MCP-only — revise Bundle A posture 2026-07-12 22:04:55 +02:00

Closed #315 Release path: migration-on-prod-copy smoke (restore backup → apply migrations → boot) before promoting 2026-07-12 21:47:43 +02:00

Closed #317 Merge-consent gate double-prompts on the satisfied path (exit-0 allow doesn't suppress the MCP prompt) — #303 H6/H10 follow-up 2026-07-12 21:05:28 +02:00

Closed #303 Process hardening: queue-drift root-cause fix + methodology review + rigor-enforcement hooks 2026-07-12 20:38:42 +02:00

Closed #311 Process hardening: enforce formatting-as-you-touch + rebase-before-push (H11 + PR-scoped format CI) 2026-07-12 20:32:20 +02:00

Closed #312 Process hardening: H12 — session-end issue-qualification audit 2026-07-12 20:32:20 +02:00

Closed #269 #253 follow-up: same-root config sibling writers don't rotate the aggregate ETag (cross-editor invalidation) 2026-07-12 19:50:12 +02:00

Closed #271 External-collections scan has no status/progress REST surface — SPA collections buttons are optimistic + timeout-bounded 2026-07-12 15:08:24 +02:00

Closed #287 #197 C2/C4/C5/C6 [BLOCKER/HIGH]: OpenAPI security scheme, 401/400 docs, operationIds, DayOfWeek — by construction 2026-07-12 12:25:22 +02:00

Closed #288 #197 C3+C7 [HIGH]: DTO nullability noise + raw VMs + search pageNum before freeze 2026-07-12 12:25:22 +02:00

Closed #289 #197 MCP [HIGH]: harden the read-only MCP server (runtime verb-guard, JSON-crash DoS, injection framing) — PR #76 2026-07-12 01:27:12 +02:00

Closed #283 #197 S4+S9 [HIGH]: stored XSS via unvalidated upload content-type reflected on serve (supersedes #66) 2026-07-12 01:00:55 +02:00

Closed #285 #197 S7+S10 [MED]: mutating GETs, spoofable ForwardedHeaders, scanner exemption, unpaged all-items 2026-07-12 00:36:30 +02:00

Closed #284 #197 S6 [HIGH/MED]: CORS AllowAll — drive-by cross-origin reads/writes 2026-07-12 00:36:28 +02:00

Closed #282 #197 S3+S5 [HIGH]: unauthenticated GETs leak private media samples, env vars, logs, settings, FS paths 2026-07-12 00:36:22 +02:00

Closed #281 #197 S2 [HIGH]: persistent mutation outside /api bypasses the write key even when configured (SortController) 2026-07-12 00:36:21 +02:00

Closed #280 #197 S1 [BLOCKER]: API writes are fail-OPEN by default — no key ⇒ every mutation unauthenticated 2026-07-12 00:34:46 +02:00

Closed #66 Full image-type support for logo/watermark (incl. transparent re-encode) 2026-07-11 23:22:22 +02:00

Closed #278 chore(release): ship v26.7.0 (Blazor removal) to prod + revert deploy model to :prod-following 2026-07-11 22:40:00 +02:00

Closed #259 Replace-all reconcile: content-aware stable child identity (moved item inherits the wrong slot's state) — split from #253 2026-07-11 22:11:28 +02:00

Closed #91 ChicoryTV SPA: Blazor → SPA cutover (retire old UI) 2026-07-11 21:31:23 +02:00

Closed #235 Async-op API contract normalization + playout build observability (reviewer#20 F7+F8+F9) 2026-07-11 19:05:54 +02:00

Closed #149 CI flake: migrations job MySQL service publishes fixed host port 3306 — concurrent runs collide 2026-07-11 19:05:51 +02:00

Closed #254 Mutation hardening cluster (audit #21/#22/#23 low-severity): post-commit token consistency, orphan guide xml, child-id stability, dirty-nav guard, empty-list semantics 2026-07-11 18:19:01 +02:00

Closed #257 Plex library-preferences save releases the library lock before the network scan runs (Unlock ordering) 2026-07-11 17:39:36 +02:00

Closed #256 Media-source sign-out/disconnect handlers leak their EntityLocker on exception (no finally) — permanent 409 2026-07-11 17:39:31 +02:00

Closed #255 Path-replacement UPDATE SQL is not source-scoped — a PUT to source A can overwrite source B's replacement 2026-07-11 17:39:28 +02:00

Closed #202 Blazor removal blocked: media-source add/edit/path-replacement has NO SPA equivalent and NO write REST API 2026-07-11 17:38:25 +02:00

Closed #205 Rollback: cut and document a dedicated pre-removal Blazor tag before deletion 2026-07-11 17:21:33 +02:00

Closed #206 Removal plan has no auth step: deleting the last challenged Blazor page leaves only the open SPA 2026-07-11 17:21:31 +02:00

Closed #204 Redirect matcher is exact-match only: parameterized legacy routes will hard-404 after Blazor deletion (Step 1 infeasible as written) 2026-07-11 17:00:03 +02:00

Closed #251 Deco-template / deco edits don't invalidate dependent playouts — editor reports success but filler/break content stays stale until a manual Reset 2026-07-11 15:26:13 +02:00

Closed #252 Schedule-items PUT cascade-deletes PlayoutScheduleItemFillGroupIndex — every save (even a no-op) silently resets fill-group progression 2026-07-11 15:26:13 +02:00

Closed #234 Subtitle extraction leaks all playout locks on cancellation/exception; BuildPlayout ignores lock result (reviewer#20 F4+F5.2) 2026-07-11 14:14:06 +02:00

Closed #233 Troubleshooting playback lock leaks permanently on "media not on disk"; lock conflict = 404 (reviewer#20 F3) 2026-07-11 14:12:53 +02:00

Closed #244 Extract ChannelsScreen from App.tsx with colocated tests 2026-07-11 13:38:48 +02:00

Closed #212 SPA channel editor gaps: external logo URL, bare-channel create, enumerated pickers downgraded to free-text 2026-07-11 13:15:25 +02:00

Closed #230 Schedules editor dirty-draft guard gaps: popstate navigation + shuffle-toggle normalization 2026-07-11 13:15:25 +02:00

Closed #231 [PLAN-MODE] EntityLocker soundness: atomic bool locks + ownership model (reviewer#20 F5) 2026-07-11 13:05:17 +02:00

Closed #232 Scan lifecycle honesty: 200-on-dropped-scan, non-finally unlocks, unguarded enqueue (reviewer#20 F1+F2+F6) 2026-07-11 13:05:17 +02:00

Closed #126 API: schedule item polymorphic fields rely on implicit Newtonsoft runtime-type serialization (OpenAPI schema gap) 2026-07-11 12:05:54 +02:00

Closed #207 SPA schedules editor is read-only at mutation depth — create/edit/delete + per-item editing missing (blocks #91 phase b) 2026-07-11 12:05:54 +02:00

Closed #215 API playout mutations skip EntityLocker build-lock gating (delete/reset/erase race with in-flight builds) 2026-07-11 11:59:44 +02:00

Closed #213 Parity nits batch: block/watermark copy UI, trash select-all/see-all, logs sort, page-size persistence, stale UI notes, decision-log entries 2026-07-11 02:03:47 +02:00

Closed #217 Add-items handlers validate existence for only 4 of 10 media kinds (collections + playlists) 2026-07-11 02:03:47 +02:00

Closed #218 Sidebar shows stray "Playouts 3" badge (and "1 failing" health chip) on a fresh empty DB 2026-07-11 02:03:47 +02:00

Closed #219 Per-show scan API can scan the wrong show because it resolves by substring title 2026-07-11 02:03:47 +02:00

Closed #220 Episode cards remain inert despite search card-navigation parity claim 2026-07-11 02:03:47 +02:00

Closed #221 Search and browse mutation controls can act on stale result sets during refetch 2026-07-11 01:47:37 +02:00

Closed #236 CI: EF-migration mysql service publishes host port 3306 — concurrent jobs on one runner collide 2026-07-11 01:08:33 +02:00

Closed #208 SPA search screen has no mutation surface: multi-select, add-to-collection/playlist, save-as-smart-collection, card navigation (blocks #91 phase b) 2026-07-10 08:19:33 +02:00

Closed #209 SPA media browse/detail: add-to-* affordances, per-show scan, per-episode info/troubleshoot entries missing (blocks #91 phase b) 2026-07-10 08:19:33 +02:00

Closed #211 SPA collections: custom playback order has no endpoint/UI; add-items picker covers 4 of 10 media kinds (blocks #91 phase b) 2026-07-09 23:40:31 +02:00

Closed #210 SPA playouts: unwired delete/reset endpoints, missing erase-items/history + scheduling-context, templates preview calendar (blocks #91 phase b) 2026-07-09 23:40:30 +02:00

Closed #203 Parity doc is unreliable as the deletion checklist: "SPA-READY" conflates screen-exists with functional parity 2026-07-09 21:42:20 +02:00

Closed #198 OpenAPI spec property casing drifts from runtime JSON for leading-acronym fields (fFmpegProfileId vs ffmpegProfileId) — ChannelEditScreen silently mis-reads profile 2026-07-09 20:19:21 +02:00

Closed #193 Harden rerun-collection create/update: existence-check the selected id 2026-07-09 20:19:09 +02:00

Closed #145 SPA parity: Logs & troubleshooting pages (#91 blocker) 2026-07-09 08:21:04 +02:00

Closed #153 API gap: playlists/playlist groups have no REST endpoints (blocks full #140 parity / #91) 2026-07-08 22:09:06 +02:00

Closed #151 API gap: multi-collections have no REST endpoints (blocks full #140 parity / #91) 2026-07-08 20:22:01 +02:00

Closed #152 API gap: rerun collections have no REST endpoints (blocks full #140 parity / #91) 2026-07-08 20:22:01 +02:00

Closed #190 CI speed: cache NuGet packages (+ minor Docker/checkout wins) 2026-07-08 19:54:25 +02:00

Closed #155 API gap: no endpoint lists a manual collection's items (GET /api/collections/{id}/items) 2026-07-08 18:38:25 +02:00

Closed #184 ApiControllerSecurityTests registry has drifted: 9 controllers unlisted (2 with mutating verbs) — replace hardcoded array with assembly scanning 2026-07-08 08:03:25 +02:00

Closed #185 Onboarding docs, part 2: testing map + generated endpoint index (HIGH PRIORITY, next session) 2026-07-08 07:52:31 +02:00

Closed #141 SPA parity: Media browsing, search & trash (#91 blocker) 2026-07-07 23:09:33 +02:00

Closed #161 API gap: media browse (all kinds), search, detail, delete, image folders (#141 blocker) 2026-07-07 23:09:30 +02:00

Closed #158 API gap: logs + troubleshooting endpoints (#145 blocker) 2026-07-07 22:33:12 +02:00

Closed #180 Channel Builder library picker: one tile per season floods the grid — group seasons under their show 2026-07-07 22:01:25 +02:00

Closed #162 API gap: scheduling REST surface — blocks/decos/templates/deco-templates + playout create/detail editors (#144 blocker) 2026-07-07 21:04:10 +02:00

Closed #144 SPA parity: Scheduling building blocks + playout detail editors (#91 blocker) 2026-07-07 21:03:57 +02:00

Closed #157 Flaky web test: 'stops Libraries scan polling and refreshes sources once when scans complete' (App.test.tsx) 2026-07-07 16:02:32 +02:00

Closed #160 API gap: Trakt lists controller (#142 blocker) 2026-07-07 15:31:37 +02:00

Closed #142 SPA parity: Trakt lists (#91 blocker) 2026-07-07 15:31:22 +02:00

Closed #159 API gap: filler preset + watermark editor CRUD; FFmpeg profile response DTO round-trip (#143 blocker) 2026-07-07 15:07:34 +02:00

Closed #143 SPA parity: FFmpeg profiles, filler presets, watermarks editors (#91 blocker) 2026-07-07 15:07:12 +02:00

Closed #140 SPA parity: Collections management screen (#91 blocker) 2026-07-07 12:54:20 +02:00

Closed #146 SPA parity: Channel edit + channel numbers (#91 blocker) 2026-07-07 12:40:18 +02:00

Closed #147 SPA: discoverable link to the legacy Blazor UI while parity gaps remain (#91 follow-up) 2026-07-07 12:40:10 +02:00

Closed #90 ChicoryTV SPA: rebrand assets + naming 2026-07-07 10:11:35 +02:00

Closed #93 ChicoryTV SPA: Settings screen (prototype → implement) 2026-07-07 09:55:27 +02:00

Closed #92 Enable /design-sync round-trip (Claude Design ↔ repo, no zip) 2026-07-07 09:41:10 +02:00

Closed #89 ChicoryTV SPA: Channel Builder (primary deliverable) 2026-07-06 23:40:45 +02:00

Closed #63 Composite "create channel from lineup" endpoint 2026-07-06 21:28:02 +02:00

Closed #64 Channel Templates (built-in + custom) bundling technical/behavioral defaults 2026-07-06 19:33:31 +02:00

Closed #65 Library browse + search API with artwork (for the create-channel picker) 2026-07-06 07:53:40 +02:00

Closed #85 ChicoryTV SPA: Guide / EPG screen 2026-07-05 23:12:26 +02:00

Closed #88 ChicoryTV SPA: Libraries screen 2026-07-05 19:06:51 +02:00

Closed #87 ChicoryTV SPA: Playouts screen 2026-07-05 17:50:57 +02:00

Closed #86 ChicoryTV SPA: Schedule editor screen 2026-07-05 12:24:52 +02:00

Closed #84 ChicoryTV SPA: Channels screen 2026-07-05 11:26:23 +02:00

Closed #109 ChicoryTV SPA: Dashboard follow-up — replace stubbed data with real sources 2026-07-04 21:20:38 +02:00

Closed #97 Backend: channel on-air / now-playing state API (for Channels screen live treatment) 2026-07-04 08:11:15 +02:00

Closed #102 Backend: JSON channel-guide endpoint for the EPG grid 2026-07-04 07:43:19 +02:00

Closed #111 Backend: schedule item duration estimates + schedule total 2026-07-04 00:00:33 +02:00

Closed #104 Backend: logo/watermark image upload endpoint 2026-07-03 23:41:49 +02:00

Closed #103 Backend: media sources + libraries read model (GET /api/media-sources) 2026-07-03 23:10:38 +02:00

Closed #106 Backend: library scan status/progress endpoint 2026-07-03 23:10:38 +02:00

Closed #101 Backend: GET /api/playouts/{id}/items endpoint 2026-07-03 22:50:07 +02:00

Closed #107 Backend: playout build status + warnings count in the API 2026-07-03 22:50:07 +02:00

Closed #110 Backend: playout reset-all endpoint + reset-mode reconciliation 2026-07-03 22:50:07 +02:00

Closed #100 Backend: GET /api/playouts (list) endpoint 2026-07-03 22:50:06 +02:00

Closed #108 Backend: expose health checks via REST (GET /api/health) 2026-07-03 21:28:13 +02:00

Closed #105 Backend: list endpoints for filler presets, watermarks, graphics elements 2026-07-02 22:35:31 +02:00

Closed #98 Backend: bulk channel operations API (renumber, move to group, bulk delete) 2026-07-02 19:08:02 +02:00

Closed #96 Backend: extend channel list API for the management table (group, enabled, EPG visibility) 2026-07-02 18:56:26 +02:00

Closed #95 Fix SPA foundation review findings (#78-#81 follow-up) 2026-07-02 18:37:13 +02:00

Closed #94 Fix app-shell review findings (#82 follow-up) 2026-07-02 18:33:31 +02:00

Closed #83 ChicoryTV SPA: Dashboard screen 2026-07-02 18:29:37 +02:00

Closed #82 ChicoryTV SPA: app shell (sidebar + top bar + routing) 2026-07-02 18:22:22 +02:00

Closed #81 ChicoryTV SPA: typed API client + auth 2026-07-02 08:23:52 +02:00

Closed #80 ChicoryTV SPA: component library (primitives) 2026-07-02 08:10:16 +02:00

Closed #79 ChicoryTV SPA: design tokens + 3 themes 2026-07-02 07:56:33 +02:00

Closed #78 ChicoryTV SPA: scaffold + build integration 2026-07-02 07:37:21 +02:00

Closed #3 CI/CD pipeline and test/prod environments 2026-07-01 20:01:59 +02:00

Closed #57 chore: stop tracking local MCP config 2026-07-01 19:59:44 +02:00

Closed #9 FFmpeg 8 compatibility (app-side) for transcode pipelines 2026-07-01 19:51:41 +02:00

Closed #42 Implement Jellyfin MusicVideo library sync (currently silently dropped) 2026-06-30 22:54:49 +02:00

Closed #43 API write-auth: decide a global default-deny model for all /api/* mutating endpoints 2026-06-30 18:57:08 +02:00

Closed #39 test: make ChannelLogoGenerator testable (inject overlay/font paths) for a channel-logo property test 2026-06-30 18:21:15 +02:00

Closed #2 Build REST API for channel/collection/schedule CRUD 2026-06-30 07:47:53 +02:00

Closed #38 REST API #2e: Standardization cleanup (retrofit FFmpegProfileController, OpenAPI/CORS/docs) 2026-06-30 07:42:37 +02:00

Closed #37 REST API #2d: Playouts create/delete 2026-06-29 20:37:27 +02:00

Closed #36 REST API #2c: Schedules CRUD + schedule items (TPT-heavy) 2026-06-29 18:17:52 +02:00

Closed #46 REST API: standardize error response body contract 2026-06-28 16:38:32 +02:00

Closed #35 REST API #2b: Collections CRUD + items (+ retrofit SmartCollectionController) 2026-06-28 09:37:13 +02:00

Closed #34 REST API #2a: API foundation + Channels CRUD (pattern-setter) 2026-06-27 16:14:15 +02:00

Closed #24 2 PlayoutModeSchedulerBase filler tests fail under non-UTC local timezones 2026-06-27 14:29:59 +02:00

Closed #28 Golden tests for XMLTV guide + channel-logo output (follow-up to #11) 2026-06-27 14:12:13 +02:00

Closed #5 Jellyfin removes ErsatzTV items during library scan (MTV Unplugged) 2026-06-27 13:29:09 +02:00

Closed #1 Fix M3U tvg-logo URLs hardcoding localhost 2026-06-27 12:58:24 +02:00

Closed #10 Write a retroactive contributors / style guide capturing established patterns 2026-06-27 12:13:01 +02:00

Closed #16 Container E2E: assert key IPTV endpoints on the built image 2026-06-27 11:41:15 +02:00

Closed #13 CI checks for EF Core migration integrity (SQLite + MySql) 2026-06-27 11:13:39 +02:00

Closed #11 Golden-file tests for M3U / XMLTV / channel-logo output 2026-06-27 10:29:40 +02:00

Closed #12 Enforce architecture / layering with tests 2026-06-27 10:07:53 +02:00

Closed #8 Update vulnerable transitive dependencies (NuGet audit advisories) 2026-06-27 02:18:45 +02:00

Closed #14 Dependency hygiene: scheduled vulnerability scan + Central Package Management 2026-06-27 01:34:25 +02:00

Closed #4 Set up Gitea Actions Docker build workflow 2026-06-27 00:14:38 +02:00

463 Issues created by 2 users

Opened #8 Update vulnerable transitive dependencies (NuGet audit advisories) 2026-06-26 22:22:22 +02:00

Opened #9 FFmpeg 8 compatibility (app-side) for transcode pipelines 2026-06-26 22:23:39 +02:00

Opened #10 Write a retroactive contributors / style guide capturing established patterns 2026-06-27 00:03:34 +02:00

Opened #11 Golden-file tests for M3U / XMLTV / channel-logo output 2026-06-27 00:06:21 +02:00

Opened #12 Enforce architecture / layering with tests 2026-06-27 00:06:23 +02:00

Opened #13 CI checks for EF Core migration integrity (SQLite + MySql) 2026-06-27 00:06:30 +02:00

Opened #14 Dependency hygiene: scheduled vulnerability scan + Central Package Management 2026-06-27 00:06:37 +02:00

Opened #15 Adopt a C# lint/format/static-analysis stack (the ruff equivalent) and enforce in CI 2026-06-27 00:06:42 +02:00

Opened #16 Container E2E: assert key IPTV endpoints on the built image 2026-06-27 00:06:53 +02:00

Opened #22 Dependency Dashboard 2026-06-27 01:53:24 +02:00

Opened #24 2 PlayoutModeSchedulerBase filler tests fail under non-UTC local timezones 2026-06-27 02:19:58 +02:00

Opened #25 Burn down SonarAnalyzer findings in Blazor .razor (analyzer adoption #15) 2026-06-27 09:27:41 +02:00

Opened #28 Golden tests for XMLTV guide + channel-logo output (follow-up to #11) 2026-06-27 10:16:28 +02:00

Opened #34 REST API #2a: API foundation + Channels CRUD (pattern-setter) 2026-06-27 13:46:02 +02:00

Opened #35 REST API #2b: Collections CRUD + items (+ retrofit SmartCollectionController) 2026-06-27 13:46:07 +02:00

Opened #36 REST API #2c: Schedules CRUD + schedule items (TPT-heavy) 2026-06-27 13:46:14 +02:00

Opened #37 REST API #2d: Playouts create/delete 2026-06-27 13:46:18 +02:00

Opened #38 REST API #2e: Standardization cleanup (retrofit FFmpegProfileController, OpenAPI/CORS/docs) 2026-06-27 13:46:23 +02:00

Opened #39 test: make ChannelLogoGenerator testable (inject overlay/font paths) for a channel-logo property test 2026-06-27 13:53:36 +02:00

Opened #42 Implement Jellyfin MusicVideo library sync (currently silently dropped) 2026-06-27 14:41:31 +02:00

Opened #43 API write-auth: decide a global default-deny model for all /api/* mutating endpoints 2026-06-27 15:43:53 +02:00

Opened #46 REST API: standardize error response body contract 2026-06-28 10:42:40 +02:00

Opened #57 chore: stop tracking local MCP config 2026-07-01 19:59:41 +02:00

Opened #58 Backlog: MCP server for ErsatzTV/ChicoryTV API 2026-07-01 20:21:20 +02:00

Opened #59 Backlog: full UI redesign and ChicoryTV rebrand 2026-07-01 20:21:20 +02:00

Opened #60 Backlog: browser channel playback after UI redesign 2026-07-01 20:21:20 +02:00

Opened #62 Epic: Create Channel — backend prerequisites for the redesigned creation flow 2026-07-01 23:01:35 +02:00

Opened #63 Composite "create channel from lineup" endpoint 2026-07-01 23:01:47 +02:00

Opened #64 Channel Templates (built-in + custom) bundling technical/behavioral defaults 2026-07-01 23:01:55 +02:00

Opened #65 Library browse + search API with artwork (for the create-channel picker) 2026-07-01 23:01:57 +02:00

Opened #66 Full image-type support for logo/watermark (incl. transparent re-encode) 2026-07-01 23:02:01 +02:00

Opened #67 Unified logo/bug image handling (one image drives both, separable) 2026-07-01 23:02:05 +02:00

Opened #68 Resume/bookmark playback position for sequential channels (personal continue-watching) 2026-07-01 23:02:11 +02:00

Opened #69 Auto-tuning: generate channels automatically from library metadata 2026-07-01 23:44:02 +02:00

Opened #70 Weighted / fair-share content distribution (playback order) 2026-07-01 23:44:09 +02:00

Opened #71 Persistent shuffle state + explicit "Reroll" control 2026-07-01 23:44:16 +02:00

Opened #72 Channel lineup health at-a-glance (status states in the channels list) 2026-07-01 23:44:18 +02:00

Opened #73 Seasonal / date-conditional channels &amp; schedule rules 2026-07-01 23:44:23 +02:00

Opened #74 [Blue sky] On-screen "On Now / On Next" overlay (channel-surf bug) 2026-07-01 23:44:36 +02:00

Opened #75 [Blue sky] Themed "Resource Packs" for bumpers / branding / interstitials 2026-07-01 23:44:38 +02:00

Opened #77 Pad/snap channel schedules to clock boundaries (:00/:15/:30) using filler 2026-07-02 00:43:10 +02:00

Opened #78 ChicoryTV SPA: scaffold + build integration 2026-07-02 01:07:17 +02:00

Opened #79 ChicoryTV SPA: design tokens + 3 themes 2026-07-02 01:07:17 +02:00

Opened #80 ChicoryTV SPA: component library (primitives) 2026-07-02 01:07:17 +02:00

Opened #81 ChicoryTV SPA: typed API client + auth 2026-07-02 01:07:17 +02:00

Opened #82 ChicoryTV SPA: app shell (sidebar + top bar + routing) 2026-07-02 01:07:18 +02:00

Opened #83 ChicoryTV SPA: Dashboard screen 2026-07-02 01:07:18 +02:00

Opened #84 ChicoryTV SPA: Channels screen 2026-07-02 01:07:18 +02:00

Opened #85 ChicoryTV SPA: Guide / EPG screen 2026-07-02 01:07:18 +02:00

Opened #86 ChicoryTV SPA: Schedule editor screen 2026-07-02 01:07:18 +02:00

Opened #87 ChicoryTV SPA: Playouts screen 2026-07-02 01:07:18 +02:00

Opened #88 ChicoryTV SPA: Libraries screen 2026-07-02 01:07:18 +02:00

Opened #89 ChicoryTV SPA: Channel Builder (primary deliverable) 2026-07-02 01:07:19 +02:00

Opened #90 ChicoryTV SPA: rebrand assets + naming 2026-07-02 01:07:19 +02:00

Opened #91 ChicoryTV SPA: Blazor → SPA cutover (retire old UI) 2026-07-02 01:07:19 +02:00

Opened #92 Enable /design-sync round-trip (Claude Design ↔ repo, no zip) 2026-07-02 01:08:43 +02:00

Opened #93 ChicoryTV SPA: Settings screen (prototype → implement) 2026-07-02 01:08:43 +02:00

Opened #94 Fix app-shell review findings (#82 follow-up) 2026-07-02 18:29:22 +02:00

Opened #95 Fix SPA foundation review findings (#78-#81 follow-up) 2026-07-02 18:31:12 +02:00

Opened #96 Backend: extend channel list API for the management table (group, enabled, EPG visibility) 2026-07-02 18:48:48 +02:00

Opened #97 Backend: channel on-air / now-playing state API (for Channels screen live treatment) 2026-07-02 18:48:48 +02:00

Opened #98 Backend: bulk channel operations API (renumber, move to group, bulk delete) 2026-07-02 18:48:48 +02:00

Opened #99 Backend: track active sessions for MPEG-TS and HLS-Direct streams 2026-07-02 19:14:42 +02:00

Opened #100 Backend: GET /api/playouts (list) endpoint 2026-07-02 19:44:02 +02:00

Opened #101 Backend: GET /api/playouts/{id}/items endpoint 2026-07-02 19:44:02 +02:00

Opened #102 Backend: JSON channel-guide endpoint for the EPG grid 2026-07-02 19:44:02 +02:00

Opened #103 Backend: media sources + libraries read model (GET /api/media-sources) 2026-07-02 19:44:02 +02:00

Opened #104 Backend: logo/watermark image upload endpoint 2026-07-02 19:44:02 +02:00

Opened #105 Backend: list endpoints for filler presets, watermarks, graphics elements 2026-07-02 19:44:03 +02:00

Opened #106 Backend: library scan status/progress endpoint 2026-07-02 19:44:03 +02:00

Opened #107 Backend: playout build status + warnings count in the API 2026-07-02 19:44:03 +02:00

Opened #108 Backend: expose health checks via REST (GET /api/health) 2026-07-02 19:44:03 +02:00

Opened #109 ChicoryTV SPA: Dashboard follow-up — replace stubbed data with real sources 2026-07-02 19:44:03 +02:00

Opened #110 Backend: playout reset-all endpoint + reset-mode reconciliation 2026-07-02 19:44:03 +02:00

Opened #111 Backend: schedule item duration estimates + schedule total 2026-07-02 19:44:04 +02:00

Opened #126 API: schedule item polymorphic fields rely on implicit Newtonsoft runtime-type serialization (OpenAPI schema gap) 2026-07-05 12:02:24 +02:00

Opened #135 from-lineup advanced overrides cannot express "clear to none" (null = inherit template) 2026-07-06 22:43:15 +02:00

Opened #140 SPA parity: Collections management screen (#91 blocker) 2026-07-07 10:45:06 +02:00

Opened #141 SPA parity: Media browsing, search & trash (#91 blocker) 2026-07-07 10:45:06 +02:00

Opened #142 SPA parity: Trakt lists (#91 blocker) 2026-07-07 10:45:06 +02:00

Opened #143 SPA parity: FFmpeg profiles, filler presets, watermarks editors (#91 blocker) 2026-07-07 10:45:06 +02:00

Opened #144 SPA parity: Scheduling building blocks + playout detail editors (#91 blocker) 2026-07-07 10:45:06 +02:00

Opened #145 SPA parity: Logs & troubleshooting pages (#91 blocker) 2026-07-07 10:45:06 +02:00

Opened #146 SPA parity: Channel edit + channel numbers (#91 blocker) 2026-07-07 10:45:06 +02:00

Opened #147 SPA: discoverable link to the legacy Blazor UI while parity gaps remain (#91 follow-up) 2026-07-07 11:02:27 +02:00

Opened #149 CI flake: migrations job MySQL service publishes fixed host port 3306 — concurrent runs collide 2026-07-07 11:59:03 +02:00

Opened #151 API gap: multi-collections have no REST endpoints (blocks full #140 parity / #91) 2026-07-07 12:22:35 +02:00

Opened #152 API gap: rerun collections have no REST endpoints (blocks full #140 parity / #91) 2026-07-07 12:22:35 +02:00

Opened #153 API gap: playlists/playlist groups have no REST endpoints (blocks full #140 parity / #91) 2026-07-07 12:22:35 +02:00

Opened #155 API gap: no endpoint lists a manual collection's items (GET /api/collections/{id}/items) 2026-07-07 12:44:01 +02:00

Opened #157 Flaky web test: 'stops Libraries scan polling and refreshes sources once when scans complete' (App.test.tsx) 2026-07-07 13:05:55 +02:00

Opened #158 API gap: logs + troubleshooting endpoints (#145 blocker) 2026-07-07 13:23:25 +02:00

Opened #159 API gap: filler preset + watermark editor CRUD; FFmpeg profile response DTO round-trip (#143 blocker) 2026-07-07 13:23:34 +02:00

Opened #160 API gap: Trakt lists controller (#142 blocker) 2026-07-07 13:23:50 +02:00

Opened #161 API gap: media browse (all kinds), search, detail, delete, image folders (#141 blocker) 2026-07-07 13:24:00 +02:00

Opened #162 API gap: scheduling REST surface — blocks/decos/templates/deco-templates + playout create/detail editors (#144 blocker) 2026-07-07 13:24:21 +02:00

Opened #163 Golden-style characterization tests for playout building 2026-07-07 13:39:09 +02:00

Opened #164 Health checks UX: audit usefulness + guided/automated remediation 2026-07-07 13:39:19 +02:00

Opened #172 Scheduling API hardening follow-ups from #144 S1/S2 reviews 2026-07-07 18:51:47 +02:00

Opened #176 Rethink channel/playout/schedule creation: PseudoTV-style channel-first flow with a Kodi-smart-playlist-like query builder 2026-07-07 20:42:47 +02:00

Opened #177 Jellyfin music video sync: map Album/Track metadata (credits-overlay completeness) 2026-07-07 20:46:02 +02:00

Opened #178 Idea (far future): Jellyfin plugin to control ErsatzTV from within Jellyfin 2026-07-07 20:48:21 +02:00

Opened #180 Channel Builder library picker: one tile per season floods the grid — group seasons under their show 2026-07-07 21:11:47 +02:00

Opened #184 ApiControllerSecurityTests registry has drifted: 9 controllers unlisted (2 with mutating verbs) — replace hardcoded array with assembly scanning 2026-07-07 23:04:32 +02:00

Opened #185 Onboarding docs, part 2: testing map + generated endpoint index (HIGH PRIORITY, next session) 2026-07-07 23:07:45 +02:00

Opened #190 CI speed: cache NuGet packages (+ minor Docker/checkout wins) 2026-07-08 19:08:30 +02:00

Opened #193 Harden rerun-collection create/update: existence-check the selected id 2026-07-08 19:40:16 +02:00

Opened #197 Cold adversarial review: REST API contract + security posture (pre-ossification) 2026-07-09 00:12:25 +02:00

Opened #198 OpenAPI spec property casing drifts from runtime JSON for leading-acronym fields (fFmpegProfileId vs ffmpegProfileId) — ChannelEditScreen silently mis-reads profile 2026-07-09 08:01:30 +02:00

Opened #202 Blazor removal blocked: media-source add/edit/path-replacement has NO SPA equivalent and NO write REST API 2026-07-09 21:16:38 +02:00

Opened #203 Parity doc is unreliable as the deletion checklist: "SPA-READY" conflates screen-exists with functional parity 2026-07-09 21:21:20 +02:00

Opened #204 Redirect matcher is exact-match only: parameterized legacy routes will hard-404 after Blazor deletion (Step 1 infeasible as written) 2026-07-09 21:21:34 +02:00

Opened #205 Rollback: cut and document a dedicated pre-removal Blazor tag before deletion 2026-07-09 21:21:46 +02:00

Opened #206 Removal plan has no auth step: deleting the last challenged Blazor page leaves only the open SPA 2026-07-09 21:21:54 +02:00

Opened #207 SPA schedules editor is read-only at mutation depth — create/edit/delete + per-item editing missing (blocks #91 phase b) 2026-07-09 21:39:55 +02:00

Opened #208 SPA search screen has no mutation surface: multi-select, add-to-collection/playlist, save-as-smart-collection, card navigation (blocks #91 phase b) 2026-07-09 21:40:01 +02:00

Opened #209 SPA media browse/detail: add-to-* affordances, per-show scan, per-episode info/troubleshoot entries missing (blocks #91 phase b) 2026-07-09 21:40:11 +02:00

Opened #210 SPA playouts: unwired delete/reset endpoints, missing erase-items/history + scheduling-context, templates preview calendar (blocks #91 phase b) 2026-07-09 21:40:27 +02:00

Opened #211 SPA collections: custom playback order has no endpoint/UI; add-items picker covers 4 of 10 media kinds (blocks #91 phase b) 2026-07-09 21:40:36 +02:00

Opened #212 SPA channel editor gaps: external logo URL, bare-channel create, enumerated pickers downgraded to free-text 2026-07-09 21:40:44 +02:00

Opened #213 Parity nits batch: block/watermark copy UI, trash select-all/see-all, logs sort, page-size persistence, stale UI notes, decision-log entries 2026-07-09 21:40:53 +02:00

Opened #215 API playout mutations skip EntityLocker build-lock gating (delete/reset/erase race with in-flight builds) 2026-07-09 23:06:57 +02:00

Opened #217 Add-items handlers validate existence for only 4 of 10 media kinds (collections + playlists) 2026-07-10 00:24:58 +02:00

Opened #218 Sidebar shows stray "Playouts 3" badge (and "1 failing" health chip) on a fresh empty DB 2026-07-10 07:56:35 +02:00

Opened #219 Per-show scan API can scan the wrong show because it resolves by substring title 2026-07-10 08:27:36 +02:00

Opened #220 Episode cards remain inert despite search card-navigation parity claim 2026-07-10 08:27:36 +02:00

Opened #221 Search and browse mutation controls can act on stale result sets during refetch 2026-07-10 08:27:36 +02:00

Opened #230 Schedules editor dirty-draft guard gaps: popstate navigation + shuffle-toggle normalization 2026-07-11 00:48:48 +02:00

Opened #231 [PLAN-MODE] EntityLocker soundness: atomic bool locks + ownership model (reviewer#20 F5) 2026-07-11 00:54:49 +02:00

Opened #232 Scan lifecycle honesty: 200-on-dropped-scan, non-finally unlocks, unguarded enqueue (reviewer#20 F1+F2+F6) 2026-07-11 00:55:14 +02:00

Opened #233 Troubleshooting playback lock leaks permanently on "media not on disk"; lock conflict = 404 (reviewer#20 F3) 2026-07-11 00:55:25 +02:00

Opened #234 Subtitle extraction leaks all playout locks on cancellation/exception; BuildPlayout ignores lock result (reviewer#20 F4+F5.2) 2026-07-11 00:55:33 +02:00

Opened #235 Async-op API contract normalization + playout build observability (reviewer#20 F7+F8+F9) 2026-07-11 00:55:51 +02:00

Opened #236 CI: EF-migration mysql service publishes host port 3306 — concurrent jobs on one runner collide 2026-07-11 01:03:46 +02:00

Opened #237 ChicoryTV rewrite — queue tracker (goal, arc, session protocol) 2026-07-11 01:14:09 +02:00

Opened #238 TopBar primaryAction button is inert on every screen except SchedulesScreen 2026-07-11 01:27:59 +02:00

Opened #243 Refactor ChicoryTV App.tsx into screen-owned modules and a small app shell 2026-07-11 12:49:19 +02:00

Opened #244 Extract ChannelsScreen from App.tsx with colocated tests 2026-07-11 12:50:17 +02:00

Opened #245 Extract PlayoutsScreen and playout UI helpers from App.tsx 2026-07-11 12:50:17 +02:00

Opened #246 Extract Dashboard and Guide screens from App.tsx 2026-07-11 12:50:17 +02:00

Opened #247 Extract ChicoryTV shell/routing and replace implicit TopBar action coupling 2026-07-11 12:50:17 +02:00

Opened #248 SPA dialogs (overlay.tsx) are not focus-trapped / background-inerted 2026-07-11 13:05:49 +02:00

Opened #251 Deco-template / deco edits don't invalidate dependent playouts — editor reports success but filler/break content stays stale until a manual Reset 2026-07-11 14:29:02 +02:00

Opened #252 Schedule-items PUT cascade-deletes PlayoutScheduleItemFillGroupIndex — every save (even a no-op) silently resets fill-group progression 2026-07-11 14:29:15 +02:00

Opened #253 Replace-all PUTs have no optimistic concurrency — stale two-tab overwrite; define a shared If-Match/version contract before more editors ossify 2026-07-11 14:29:30 +02:00

Opened #254 Mutation hardening cluster (audit #21/#22/#23 low-severity): post-commit token consistency, orphan guide xml, child-id stability, dirty-nav guard, empty-list semantics 2026-07-11 14:29:53 +02:00

Opened #255 Path-replacement UPDATE SQL is not source-scoped — a PUT to source A can overwrite source B's replacement 2026-07-11 15:06:20 +02:00

Opened #256 Media-source sign-out/disconnect handlers leak their EntityLocker on exception (no finally) — permanent 409 2026-07-11 15:06:28 +02:00

Opened #257 Plex library-preferences save releases the library lock before the network scan runs (Unlock ordering) 2026-07-11 15:06:41 +02:00

Opened #259 Replace-all reconcile: content-aware stable child identity (moved item inherits the wrong slot's state) — split from #253 2026-07-11 16:16:59 +02:00

Opened #264 Local libraries always show "Never scanned" — local scanner sets path-level LastScan but not library.LastScan 2026-07-11 17:17:33 +02:00

Opened #265 If-Match parsing: return 412 (not 400) for syntactically-valid but non-matching entity-tags (RFC 7232 semantics) 2026-07-11 17:18:09 +02:00

Opened #269 #253 follow-up: same-root config sibling writers don't rotate the aggregate ETag (cross-editor invalidation) 2026-07-11 19:23:18 +02:00

Opened #271 External-collections scan has no status/progress REST surface — SPA collections buttons are optimistic + timeout-bounded 2026-07-11 19:25:08 +02:00

Opened #278 chore(release): ship v26.7.0 (Blazor removal) to prod + revert deploy model to :prod-following 2026-07-11 22:39:55 +02:00

Opened #280 #197 S1 [BLOCKER]: API writes are fail-OPEN by default — no key ⇒ every mutation unauthenticated 2026-07-11 23:20:22 +02:00

Opened #281 #197 S2 [HIGH]: persistent mutation outside /api bypasses the write key even when configured (SortController) 2026-07-11 23:20:30 +02:00

Opened #282 #197 S3+S5 [HIGH]: unauthenticated GETs leak private media samples, env vars, logs, settings, FS paths 2026-07-11 23:20:38 +02:00

Opened #283 #197 S4+S9 [HIGH]: stored XSS via unvalidated upload content-type reflected on serve (supersedes #66) 2026-07-11 23:20:45 +02:00

Opened #284 #197 S6 [HIGH/MED]: CORS AllowAll — drive-by cross-origin reads/writes 2026-07-11 23:20:56 +02:00

Opened #285 #197 S7+S10 [MED]: mutating GETs, spoofable ForwardedHeaders, scanner exemption, unpaged all-items 2026-07-11 23:21:08 +02:00

Opened #286 #197 C1 [BLOCKER]: no API versioning — mount /api/v1 before the contract freezes 2026-07-11 23:21:16 +02:00

Opened #287 #197 C2/C4/C5/C6 [BLOCKER/HIGH]: OpenAPI security scheme, 401/400 docs, operationIds, DayOfWeek — by construction 2026-07-11 23:21:24 +02:00

Opened #288 #197 C3+C7 [HIGH]: DTO nullability noise + raw VMs + search pageNum before freeze 2026-07-11 23:21:32 +02:00

Opened #289 #197 MCP [HIGH]: harden the read-only MCP server (runtime verb-guard, JSON-crash DoS, injection framing) — PR #76 2026-07-11 23:21:46 +02:00

Opened #293 Page/cap GET /api/search/all-items (DoS hardening — deferred from #285) 2026-07-12 00:36:51 +02:00

Opened #295 [PLAN-MODE] Browser SPA auth = OIDC + local login (session); demote API key to external/MCP-only — revise Bundle A posture 2026-07-12 11:52:46 +02:00

Opened #297 Add channelId to PlayoutListItemResponseModel so the SPA reset button keys directly 2026-07-12 12:26:58 +02:00

Opened #299 CI: codify the manual live-E2E flows into an automated functional-E2E harness 2026-07-12 16:19:17 +02:00

Opened #301 #295: side-effecting GET endpoints bypass the session CSRF gate (troubleshoot playback/archive) — resolve with the SPA session cutover (PR2) 2026-07-12 16:37:54 +02:00

Opened #303 Process hardening: queue-drift root-cause fix + methodology review + rigor-enforcement hooks 2026-07-12 16:50:21 +02:00

Opened #308 Concurrent same-item Add*ToCollection can 500 on composite-PK violation (pre-existing idempotency-under-concurrency gap) 2026-07-12 19:20:36 +02:00

Opened #310 De-BOM the 17 legacy .cs files #269 touched (charset=utf-8 violation) 2026-07-12 20:07:54 +02:00

Opened #311 Process hardening: enforce formatting-as-you-touch + rebase-before-push (H11 + PR-scoped format CI) 2026-07-12 20:08:19 +02:00

Opened #312 Process hardening: H12 — session-end issue-qualification audit 2026-07-12 20:10:27 +02:00

Opened #314 Out-of-ecosystem black-box security scan against the running container (#197 exit criterion) 2026-07-12 20:37:48 +02:00

Opened #315 Release path: migration-on-prod-copy smoke (restore backup → apply migrations → boot) before promoting 2026-07-12 20:38:02 +02:00

Opened #317 Merge-consent gate double-prompts on the satisfied path (exit-0 allow doesn't suppress the MCP prompt) — #303 H6/H10 follow-up 2026-07-12 20:51:50 +02:00

Opened #319 Set security response headers (CSP, X-Content-Type-Options, Permissions-Policy, COEP) on the host — ZAP baseline finding (#314 / #197 input) 2026-07-12 21:02:05 +02:00

Opened #320 TroubleshootController playback segment-wait loop doesn't check notifier.IsFailed (spins until client cancel if ffmpeg dies) 2026-07-12 21:06:14 +02:00

Opened #327 Playlist rename (ReplacePlaylistItems) does no name validation — empty / >50-char names accepted 2026-07-13 00:39:30 +02:00

Opened #330 Add Cross-Origin-Resource-Policy header (ZAP #314 authenticated-scan Low) 2026-07-13 08:27:46 +02:00

Opened #332 docs: make ChicoryTV queue handoff client-neutral 2026-07-13 19:00:14 +02:00

Opened #333 test: run #202 real-server media-source integration validation 2026-07-13 19:04:07 +02:00

Opened #334 security: keep local-library filesystem paths authenticated when reads are open 2026-07-13 19:21:33 +02:00

Opened #335 release: cut v26.8.0 and complete ChicoryTV go-live 2026-07-13 19:37:32 +02:00

Opened #336 docs: prepare the v26.8.0 release boundary 2026-07-13 19:51:15 +02:00

Opened #338 ci: distinguish ZAP warning exit 2 from FAIL in security-scan 2026-07-13 20:36:26 +02:00

Opened #339 docs: require low-cost queue selection preflight 2026-07-13 20:56:53 +02:00

Opened #340 Add configurable advertised IPTV base URL for M3U/XMLTV output 2026-07-13 21:24:32 +02:00

Opened #342 Enforce session-wide low-cost routing for bounded reconnaissance 2026-07-13 21:35:44 +02:00

Opened #344 Saving a remote connection falsely triggers the dirty guard 2026-07-13 22:30:15 +02:00

Opened #345 Plex pin flow reports connected but strands authorized accounts with no servers 2026-07-13 22:48:23 +02:00

Opened #347 Queue selector skips milestone work and repicks completed reviewer audits 2026-07-13 23:20:15 +02:00

Opened #350 Channel cold-start ~7s to first segment — slow tune-in via Dispatcharr/Kodi (heavy transcode profile) 2026-07-14 18:32:09 +02:00

Opened #353 docs: start tool-bearing selectors at low effort 2026-07-14 20:15:22 +02:00

Opened #354 ChicoryTV: subtitles progressively run ahead of dialogue during playback 2026-07-14 20:30:03 +02:00

Opened #355 docs: record tested Codex cheap-worker launch configuration 2026-07-14 20:32:46 +02:00

Opened #357 Jellyfin/Kodi PoC: player-owned channel playback with ErsatzTV as channel engine 2026-07-14 20:59:41 +02:00

Opened #363 functional-E2E harness: add the deferred media/lock/Playwright flows (follow-up to #299) 2026-07-16 13:46:06 +02:00

Opened #364 docs: make queue selection non-terminal 2026-07-16 14:01:19 +02:00

Opened #367 Plex: budget-exhausted message says "Use Refresh" but there is no global Refresh when zero servers exist 2026-07-16 14:33:45 +02:00

Opened #373 bug(spa): white border around the edges of the login / boot pages (missing body margin reset) 2026-07-16 19:27:38 +02:00

Opened #376 XMLTV: access_token query value interpolated raw into guide (pre-existing XML-injection) 2026-07-16 21:13:17 +02:00

Opened #377 SPA: left sidebar scrolls horizontally (unwanted overflow-x) 2026-07-16 21:39:17 +02:00

Opened #380 Refactor: shared enumerator-construction/state seam for PlaybackOrder across scheduling engines 2026-07-16 23:15:34 +02:00

Opened #381 Golden characterization tests for remaining scheduler kinds (Sequential YAML + Scripted) 2026-07-16 23:34:05 +02:00

Opened #383 Auto-Tune: per-channel configuration (DetailPanel) — editable per-channel step 2026-07-16 23:44:53 +02:00

Opened #384 Auto-Tune DetailPanel: enumerate a SmartCollection's distinct members (read endpoint) 2026-07-16 23:45:12 +02:00

Opened #385 Auto-Tune DetailPanel: per-channel overrides + rotation weights in bulk-create 2026-07-16 23:45:26 +02:00

Opened #386 Auto-Tune DetailPanel: per-channel editor slide-over (SPA) 2026-07-16 23:45:37 +02:00

Opened #388 Mirror the ChicoryTV design system to prod (Claude Design ↔ shipped SPA) 2026-07-17 00:03:06 +02:00

Opened #390 CI: shared toolchain base image (.NET 10 SDK + Node 22 + ffmpeg) for CI jobs 2026-07-17 00:09:59 +02:00

Opened #392 Clock-align convenience: one-click per-channel/schedule pad-to-boundary toggle + 60-min increment (SPA) 2026-07-17 01:14:32 +02:00

Opened #395 Refactor: dedup Scripted≡YAML enumerator construction (deferred from #380, gated on #381 goldens) 2026-07-17 01:20:59 +02:00

Opened #396 Collapsible left sidebar + collapsible nav groups 2026-07-17 01:27:44 +02:00

Opened #398 CI: build once, reuse artifacts across test / migrations / functional-e2e (742s of redundant compilation per run) 2026-07-17 09:13:36 +02:00

Opened #401 UpdateChannel silently coerces Mirror→Generated when the channel has a playout (should be 422) 2026-07-17 12:42:42 +02:00

Opened #403 Scheduling: an unhandled PlaybackOrder fails silently at five of six dispatch sites 2026-07-17 12:59:29 +02:00

Opened #404 SPA: per-source weight inputs + fair-share toggle in the schedule editor (#70 UI) 2026-07-17 12:59:29 +02:00

Opened #406 CI: cut peak build RSS (Roslyn), cap the services: mysql, and move api-docs/format back to ubuntu-latest 2026-07-17 13:36:37 +02:00

Opened #409 Never-scanned local libraries render "Last scan 12:00 AM" instead of "Never scanned" (LastScan seeded as DateTime.MinValue, not NULL) 2026-07-17 14:31:29 +02:00

Opened #410 Scan cancellation is logged at ERROR ("Scan was canceled") across all four scan handlers 2026-07-17 14:35:39 +02:00

Opened #412 CI: peak-memory instrument reports cache-inflated memory.peak; sample true peak anon instead 2026-07-17 15:51:09 +02:00

Opened #414 Channels list: distinguish auto-tuned from user-created channels (origin marker) 2026-07-17 16:32:47 +02:00

Opened #415 Per-channel fault detection beyond "no playout" (empty schedule, broken source) 2026-07-17 16:32:47 +02:00

Opened #416 CI: docs-only changes run the full build/test matrix (~9 min) for nothing 2026-07-17 16:52:40 +02:00

Opened #420 CI: PR run and merge-to-main run re-execute the full matrix over identical code 2026-07-17 19:08:45 +02:00

Opened #421 M3U: access_token value not quote-safe in url-tvg="..." attribute 2026-07-17 19:09:21 +02:00

Opened #425 Auto-Tune DetailPanel: per-source rotation weights + query corrections (weighted-distribution redesign) 2026-07-17 20:08:03 +02:00

Opened #431 Backend: TTL-cache PerformHealthChecks (GET /api/v1/health re-runs 14 checks, 4 shell out to ffmpeg, per request) 2026-07-17 22:08:31 +02:00

Opened #434 Rule builder: facet-value typeahead for text fields (#176 follow-up) 2026-07-18 01:50:36 +02:00

Opened #435 Rule builder: relative-date operators ("in the last N days") (#176 follow-up) 2026-07-18 01:50:36 +02:00

Opened #436 Rule builder: support nesting deeper than one level (#176 follow-up) 2026-07-18 01:50:37 +02:00

Opened #437 Adopt RuleBuilder inline in ChannelBuilder & Auto-Tune (#176 follow-up) 2026-07-18 01:50:37 +02:00

Opened #438 Rule builder: input validation & polish (bundles #176 review minors) 2026-07-18 01:50:38 +02:00

Opened #440 Auto-Tune DetailPanel SPA: wire per-source weight steppers + exclude/add-untagged to the #425 backend 2026-07-18 04:31:22 +02:00

Opened #444 functional-E2E: add the playout-build lock 409 + isLocked projection flow (deferred from #363) 2026-07-18 15:20:23 +02:00

Opened #445 functional-E2E: add the UI-interactive Playwright (headless) flows (deferred from #363) 2026-07-18 15:20:34 +02:00

Opened #447 Flaky SPA test: LibrariesScreen "stops scan polling and refreshes sources once when scans complete" 2026-07-18 15:56:10 +02:00

Opened #458 Playlist/group rename should reject duplicate names (like create does) — #327 follow-up 2026-07-18 18:28:39 +02:00

Opened #460 MediaSourceRepository writes MinValue LastScan on disable-sync — normalize to null (#409 follow-up) 2026-07-18 18:57:23 +02:00

Opened #463 Schedules screen: "Active schedule" selector stretches full-width and overlaps the header 2026-07-19 11:54:39 +02:00

Opened #464 Guide + channels list show generated fallback icons instead of the actual channel logo 2026-07-19 11:54:40 +02:00

Opened #469 CI: speed up the Formatting job (dotnet format --include still loads the whole solution) 2026-07-19 15:44:27 +02:00

Opened #472 Split HLS cold-start startup phase into spawn / input-open+probe / first-GOP 2026-07-19 20:33:30 +02:00

Opened #473 Tune-in hard-fails (ffmpeg exit 8) when a playout item's media file no longer exists — 717 stale episodes across 10 removed shows on prod 2026-07-19 20:34:18 +02:00

Opened #474 Music channels dead: Music Videos library has no LibraryPath, so /data/music (30 folders) is never scanned — 8+ collections empty 2026-07-19 20:34:46 +02:00

Opened #476 Scanner: FileNotFound does not cascade show → seasons → episodes, so playouts keep scheduling episodes of shows deleted upstream 2026-07-19 20:59:10 +02:00

Opened #477 Scanner has no anti-nuke guard: a successful-but-empty media-server fetch flags an entire library FileNotFound 2026-07-19 20:59:32 +02:00

Opened #478 Channels 102/107 repeatedly fail to tune: h264_vaapi hwupload -22 / exit 234 on prod 2026-07-19 20:59:54 +02:00

Opened #480 External-JSON playout channels still hand ffmpeg an unprobed remote-stream URL (#473 class survives there) 2026-07-19 21:25:56 +02:00

Opened #484 Media-server scanner: ratio-threshold + projection-failure detection for the empty-fetch guard 2026-07-19 23:31:23 +02:00

Opened #485 Build hygiene: .gitignore core entry silently ignores new files under any Core/ directory (case-insensitive on macOS) 2026-07-19 23:31:24 +02:00

Opened #487 MCP acceptance case: populate the empty music collections via the MCP write path (not by hand) 2026-07-20 00:19:30 +02:00

Opened #488 JellyfinMusicVideoLibraryScanner crashes immediately: ArgumentNullException from null LibraryPath.LibraryFolders (feature has never worked) 2026-07-20 00:26:07 +02:00

Opened #489 Support Jellyfin mixed-content libraries (currently dropped silently) — keep music/standup segregated from Movies &amp; TV Shows 2026-07-20 00:44:01 +02:00

Opened #491 LibraryFolder has no unique index on (LibraryPathId, Path) — concurrent GetOrAddFolder can insert duplicates 2026-07-20 01:04:02 +02:00

Opened #494 JellyfinMusicVideoLibraryScanner does no reconciliation — music videos removed from Jellyfin are never removed from ErsatzTV 2026-07-20 16:05:00 +02:00

Opened #496 Music videos have no per-library identity — global GetOrAdd path dedup can cross-library false-trash 2026-07-20 16:57:44 +02:00

Opened #497 JellyfinMusicVideoLibraryScanner.UpdateMetadata drops Tags/Genres/Studios on existing items — Jellyfin metadata edits never sync 2026-07-20 17:33:27 +02:00

Opened #498 FFmpeg profile should allow separate decode and encode hardware acceleration (QSV encode + VAAPI decode) 2026-07-20 18:25:57 +02:00

Opened #500 MediaServer metadata reconcile double-inserts on duplicate collection names (Plex movie + Jellyfin music-video update paths) 2026-07-20 18:38:29 +02:00

Opened #502 External-URL channel logos never render an on-screen bug (File.Exists against a URL in WatermarkSelector) 2026-07-20 20:00:55 +02:00

Opened #503 Watermark MiddleCenter renders bottom-right — missing switch arm in OverlayWatermarkFilter 2026-07-20 20:16:16 +02:00

Opened #505 QSV native-decode path tonemaps HDR in software (route through tonemap_qsv) 2026-07-20 21:27:35 +02:00

Opened #508 Move the two docker build jobs off the small runner lane 2026-07-20 22:23:32 +02:00

Opened #510 WatermarkSelector: the deco path has a different missing-logo policy than the three precedence levels 2026-07-20 22:45:35 +02:00

Opened #511 Harden remote-image fetching in the graphics engine (timeout, size cap, redirects, pooling, caching, SSRF) 2026-07-20 22:46:02 +02:00

Opened #512 Make LibrariesScreen scan-complete test deterministic (stop racing real microtasks under waitFor) 2026-07-20 22:57:25 +02:00

Opened #515 release: cut and promote v26.11.0 to prod (first release on jazz) 2026-07-20 23:14:37 +02:00

Opened #519 Verify the #350 cold-start burst end-to-end on test, then re-measure on prod 2026-07-21 00:34:13 +02:00

Opened #520 Retire #237 from startup; run orientation and mechanical top-five selection in parallel 2026-07-21 01:04:17 +02:00

Opened #521 Make decision knowledge lifecycle-addressable and retrieval-efficient 2026-07-21 01:05:00 +02:00

Opened #523 QSV native-decode (#498) hwupload fails to allocate a QSV surface for certain content — "Cannot allocate memory" kills the stream 2026-07-21 02:38:39 +02:00

Opened #524 Retrofit #237's durable-only facts into #521 decision records (post-arc follow-up) 2026-07-21 02:40:17 +02:00

Opened #525 External channel-logo URLs: download + cache at save time instead of fetching at render time 2026-07-21 02:42:02 +02:00

Opened #529 QSV extra_hw_frames=0 kills transcodes on any unthrottled read — live in prod, and made near-deterministic by #516's burst 2026-07-21 15:39:34 +02:00

Opened #532 Re-measure HLS cold start on prod after v26.12.0+ ships the #529 floor, against #350's 13-sample baseline 2026-07-21 17:02:53 +02:00

Opened #533 scripts/e2e-local.sh readiness probe hangs on a reused config dir 2026-07-21 17:31:12 +02:00

Opened #535 Release-tag builds: small-lane PR-only gate jobs run + fail on v* tag pushes 2026-07-21 17:36:02 +02:00

Opened #536 workAheadSegmenterLimit is not enforced: the slot check and its increment straddle an await (N concurrent tune-ins all run unthrottled) 2026-07-21 17:50:29 +02:00

Opened #539 WorkAheadSlots.Release hardening: never go negative, and surface UnbalancedReleases somewhere a human will see it 2026-07-21 18:27:25 +02:00

Opened #541 H13: session-end must leave the shared checkout fresh — a stale tree serves stale FILES, which no HEAD-reading rule catches 2026-07-21 19:19:11 +02:00

Opened #542 The kickoff handoff doc should be instructions, not incident history — prune the narrative into decisions.md 2026-07-21 19:35:56 +02:00

Opened #545 decisions-guard: require a **Signals:** line (MemPalace recall metadata contract) 2026-07-21 20:14:22 +02:00

Opened #548 docs: the ersatztv skill described archived upstream, not this fork 2026-07-21 20:49:54 +02:00

Opened #552 Mint a short-lived JWT for the SPA so /iptv/* works under JWT-enabled deployments 2026-07-21 23:21:01 +02:00

Opened #553 select-queue.sh ranks Renovate's bot-authored Dependency Dashboard (#22) as a workable pickup 2026-07-21 23:21:54 +02:00

Opened #554 Channel preview can sit at &quot;starting&quot; when autoplay is blocked, with no hint to press play 2026-07-21 23:22:21 +02:00

Opened #559 Harden the /iptv ?access_token= transport: redact from request logs + no-store on tokened manifests 2026-07-22 17:32:08 +02:00

Opened #563 Scripted playout: integration-test harness (deferred from #381 golden net) 2026-07-22 19:12:07 +02:00

Opened #565 [Blue sky] Bridge Auto-Tune → Scripted: an "escape hatch" from a generated channel into a custom script 2026-07-22 20:04:59 +02:00

Opened #567 Harden channel graphicsElementIds: validate unknown ids (422 not 500) + builtIn discriminator (#74 follow-up) 2026-07-22 22:10:05 +02:00

Opened #568 Harden channel graphicsElementIds: validate unknown ids (422 not 500) + builtIn discriminator (#74 follow-up) 2026-07-22 22:10:28 +02:00

Opened #570 On Now/Next overlay YAML fails to render (format_datetime arity + null font_family) — #74 hotfix 2026-07-22 23:06:10 +02:00

Opened #572 CustomFontMapper crashes on a null font_family instead of using the default font 2026-07-22 23:40:58 +02:00

Opened #578 #434 follow-ups: typeahead combobox polish + source limitations 2026-07-23 21:03:25 +02:00

Opened #580 Auto-Tune: generalize the fixed axis picker into an arbitrary group-by field builder (backend, #437 split) 2026-07-23 22:10:17 +02:00

Opened #582 flaky: LibrariesScreen "stops scan polling and refreshes sources once when scans complete" still non-deterministic (#512 fix incomplete) 2026-07-23 22:56:44 +02:00

Opened #583 Kickoff: make per-agent model routing a hard constraint + a PreToolUse gate 2026-07-25 11:01:34 +02:00

Opened #586 E2E briefs: scope process cleanup by PID, never a pattern-wide pkill 2026-07-25 11:20:51 +02:00

Opened #587 chore(docs): trim derivable content from CLAUDE.md and lazy-load the task-completion protocol 2026-07-25 11:23:27 +02:00

Opened #590 Auto-Tune source rows: share the Lucene escaper, warn on exclude-all, handle &gt;50-source axes 2026-07-25 11:31:35 +02:00

Opened #592 CI monitors: record that skipped is not red (build skips on every PR) 2026-07-25 11:53:17 +02:00

Opened #594 ci-image-pin accepts any hex length, not the exact 7-char tag ci-image.yml publishes 2026-07-25 12:00:10 +02:00

Opened #595 Active decisions corpus is at its 5600-line budget — schedule the consolidation 2026-07-25 12:11:13 +02:00

Opened #596 PID-scope the Playwright-MCP stall recovery — pkill -f ms-playwright-mcp is the same shared-host reap as #586 2026-07-25 12:28:29 +02:00

Opened #597 ci-image.yml should tag with --short=7 so the 7-char pin length is an enforced invariant, not an observed one 2026-07-25 12:41:31 +02:00

Opened #600 Remove-stale + add-new reconcile idiom: 8 further copies still double-insert on duplicate names (#500 follow-up) 2026-07-25 13:03:59 +02:00

Opened #603 decisions: adopt OKF's stale-after and Sources: as optional record metadata 2026-07-25 14:49:53 +02:00

Opened #604 Collection membership rebuild has no projection-failure guard — a swallowed drop silently empties a collection 2026-07-25 14:52:11 +02:00

Opened #606 One MediaItem row per file path globally — a second library serving the same file never gets its own row 2026-07-25 15:15:20 +02:00

Opened #608 GetParentFolderId bypasses GetFolder — case-insensitive parent resolution can distort the folder tree on MySQL 2026-07-25 15:24:26 +02:00

Opened #609 decisions-validate: [decisions-edit] is a bare substring match — a commit that merely *describes* the token disarms the guard 2026-07-25 15:31:22 +02:00

Opened #610 decisions: split the monolithic corpus into one YAML-frontmatter file per record 2026-07-25 15:32:34 +02:00

Opened #615 Jellyfin merges <Base> - <variant>.mp4 music videos into one multi-version item — Behind the Music (61 files) and Top of the Pops (24 files) each land as a single ErsatzTV item 2026-07-25 17:01:00 +02:00

Opened #616 MCP/API paging traps: pageNum documented 1-based but is 0-based, pageSize cap doesn't clamp the offset, and playout rows carry no channelId 2026-07-25 17:14:57 +02:00

Opened #617 .claude/skills/jellyfin/ is a stale divergent copy, not the symlink CLAUDE.md describes — it documents auth that v12 only accepts by legacy opt-in 2026-07-25 17:27:55 +02:00

Opened #620 decisions corpus consolidation has no owner — and after #610 the budget number stops reporting it 2026-07-25 19:36:08 +02:00

Opened #621 decisions: a record file that fails to parse is silently invisible — no structural "one keyed record per file" check 2026-07-25 20:35:40 +02:00

Opened #622 merge gate: docs-only exemption is computed from a TRUNCATED file list (confirmed); auto-merge scheduling also freezes H10 consent (structural) 2026-07-25 20:44:59 +02:00

Opened #627 Re-arm the MySQL data-migration fixture in CI — the dedupe DML has no automated coverage on MySQL 2026-07-25 21:41:46 +02:00

Opened #629 merge gate: false-opens in the H10 verdict classifier — an undefined token, code blocks (fenced/indented/HTML), a URL-borne sha, and a read path that failed open 2026-07-25 21:48:48 +02:00

Opened #631 scripts/tests/ is never executed by CI — the Python test suite is local-only 2026-07-25 21:52:42 +02:00

Opened #632 A PR base change leaves the head sha — and so the review-verdict/h10 status — unchanged 2026-07-25 21:53:05 +02:00

Opened #633 OpenAPI pageNum parameters carry no description, so the 0-based contract is invisible to REST consumers 2026-07-25 23:42:51 +02:00

Opened #634 Rerun-collection picker in SchedulesScreen silently truncates at 100 (asks for pageSize 1000, server clamps to 100) 2026-07-25 23:42:51 +02:00

Opened #640 ~25 music-video files are on disk but never ingested by Jellyfin — 4 folders short of their file count (not multi-version merging) 2026-07-26 00:45:20 +02:00

Opened #643 Merge-consent gate fails OPEN on jq 1.6: a transport failure mid-pagination lets the docs-only exemption fire over a PARTIAL file list 2026-07-26 01:40:35 +02:00

Opened #644 Seven more SPA list loads silently truncate at the server cap (same class as #634, one screen over) 2026-07-26 11:16:48 +02:00

Opened #647 H10 verdict classifier is inert on jq 1.6: contains("�") matches every string, and a parse error is indistinguishable from an empty list 2026-07-26 12:17:25 +02:00

Opened #648 Pin or preflight jq in CI: the runner ships 1.6, dev machines ship 1.8.x, and that gap silently broke three shell gates 2026-07-26 20:21:27 +02:00

Opened #649 The ENFORCED review-verdict.yml guard is weaker than the advisory local hook — duplicated security logic has drifted 2026-07-26 20:21:50 +02:00

Opened #650 Two more list loads truncate at the cap — but at-cap, so #644's over-cap grep could not see them 2026-07-26 20:49:10 +02:00

Opened #651 Library-browse pickers need a searchable source, not a 100-row window or a full-library crawl 2026-07-26 20:49:11 +02:00

Opened #652 Revive the generated-initials logo bug by caching it, not by fetching it at render time 2026-07-26 20:53:25 +02:00

Opened #653 Song-progress overlay bypasses WatermarkSelector and can hand ffmpeg a nonexistent -i path 2026-07-26 21:02:21 +02:00

Opened #660 Anamorphic HDR sources are excluded from the QSV OpenCL tonemap (runtime sar vs calculated SAR) 2026-07-26 22:37:00 +02:00

Opened #661 HardwareUploadVaapiFilter(setFormat, deriveDevice = false) — a defaulted bool that silently strands frames on the wrong device 2026-07-26 22:37:28 +02:00

Opened #662 Typeahead artist suggestions miss free-text credits; album_artist 404s — value-converted list columns have no suggestion source 2026-07-26 23:00:59 +02:00

Opened #663 A review-verdict/h10 success is repo-global, so a second PR with the same head inherits it 2026-07-26 23:28:26 +02:00

Opened #664 pr-changed-files.sh head binding cannot see an A→B→A force-push across its paging round-trips 2026-07-26 23:28:42 +02:00

Opened #665 ChannelBuilder library-browse "Load more": cross-page sort order and an overclaimed totalCount permit no-op requests 2026-07-26 23:37:45 +02:00

Opened #668 Facet-value typeahead misses accented values on the EF-sourced fields (LOWER() is ASCII-only on SQLite) 2026-07-26 23:54:14 +02:00

Opened #669 Song artist typeahead scans the whole SongMetadata table per keystroke — consider a normalized SongArtist join table 2026-07-26 23:54:39 +02:00

Opened #670 FillerPresets: collection-family selections outside the first 100 browse rows render as #150 instead of a name 2026-07-26 23:58:28 +02:00

Opened #671 Rerun collections: the list endpoint returns a null selection for every row, and the detail GET 500s or nulls for five media types 2026-07-27 00:00:10 +02:00

Opened #672 review-verdict.yml is head-resolved, so a PR editing it can self-approve the required check 2026-07-27 00:05:43 +02:00

Opened #674 decisions_validate.py stays green on frontmatter PyYAML rejects — an apostrophe in a single-quoted scalar (hit twice in one session) 2026-07-27 01:12:45 +02:00

Opened #677 Selection-id boundary: ScheduleItemInspector is unguarded, and list-backed pickers drop malformed options silently 2026-07-27 04:23:26 +02:00

Opened #684 main is red: the #650 pageSize call-site guard keys its registry on line:column, so any merge that shifts a line breaks it 2026-07-27 18:48:28 +02:00

Opened #685 CollectionsScreen AddItemsDialog windows the whole media-library type on an empty query, with no truncation surfaced (§3b deviation) 2026-07-27 19:01:09 +02:00

Opened #688 decisions_validate ceiling calibration test is one line from red — any record ≥61 prose lines fails script-tests 2026-07-27 20:53:17 +02:00

Opened #689 LibraryFolderDedupeMigrationTests claims CI sets ETV_REQUIRE_MYSQL_TESTS=1 — nothing does 2026-07-27 22:08:19 +02:00

Opened #690 Rerun collections: paged list TotalCount ignores the search query, so the SPA renders empty pages 2026-07-28 19:33:04 +02:00

Opened #691 SongVideoGenerator dereferences the nullable SongMetadata.Artists unguarded — NRE on the playback path 2026-07-28 20:02:37 +02:00

Opened #697 ETV_STATUS_AUTH can write commit statuses, so any head-resolved workflow can still forge review-verdict/h10 2026-07-28 21:37:18 +02:00

Opened #698 The review-verdict/h10 exemption path decides from mutable PR state — three routes to a forged exemption 2026-07-28 22:32:48 +02:00

Opened #701 Search indexers mutate SongMetadata.Artists on a possibly-tracked entity (??= []) — same shape rejected in #691 2026-07-28 23:06:05 +02:00

Opened #706 review-verdict/h10 writes are not serialized — a stale run can overwrite a fresher verdict (ABA retarget + human-rejection race) 2026-07-29 20:36:01 +02:00

Opened #707 pr-changed-files.sh paging can drop a path when the base branch advances mid-enumeration 2026-07-29 20:36:55 +02:00

Opened #708 Reproduce #698 route 2 live: push code onto a renovate-authored PR branch and confirm the manifest allow-list refuses the exemption 2026-07-30 21:04:17 +02:00

Opened #711 .codex/ mirrors the gate-enforcing hooks but is absent from the merge gate's PROTECTED list 2026-07-30 21:59:53 +02:00

Opened #713 chore: ignore .codex/ and stop shipping a plaintext Gitea credential in tracked docs 2026-07-30 22:29:47 +02:00

Opened #715 chore(deps): land the three stalled Renovate patch bumps as one batch (#679, #680, #681) 2026-07-30 23:41:42 +02:00

Opened #719 H11 pre-push guard blocks a tag-only push, on every release cut 2026-08-03 19:49:57 +02:00

Opened #720 docs(ci-cd): a Komodo stack named ersatztv now exists on jazz — and it is NOT prod 2026-08-03 19:50:24 +02:00

Opened #721 Auto-Tune proposal rows should be a grid — channel numbers do not line up, and the name renders twice 2026-08-03 20:13:06 +02:00

Opened #726 Embedded BITMAP subtitle (PGS/DVD) burn-in + -readrate halves transcode to 0.53x realtime — Live TV buffering 2026-08-04 21:19:07 +02:00

Opened #727 FFmpeg version health check warns on our own bundled FFmpeg — hardcoded 7.1.1 vs bundled 8.1.2 2026-08-04 21:19:26 +02:00

Opened #728 Channels list: row checkbox renders a visible "Select &lt;channel name&gt;" label, duplicating the name column 2026-08-04 21:19:34 +02:00

Opened #729 Channel edit → Branding: logo renders broken — detail endpoint returns a relative logo path, list endpoint returns absolute 2026-08-04 21:21:17 +02:00

Opened #730 Settings → System: stale "managed in the legacy UI" copy pointing at a UI removed in #91b, and it renders as a dead link 2026-08-04 21:23:48 +02:00

Opened #731 Dashboard "On air now": channel logo never rendered — ChannelLogo is called without src, always falling back to initials 2026-08-04 21:27:35 +02:00

Opened #732 On Now / Next overlay: give it a boxed background for legibility, and enable it on all channels by default 2026-08-04 21:39:41 +02:00

Opened #733 dvbsub/dvb_subtitle are missing from both IsImage lists, so DVB bitmap subtitles are routed down the text/libass path 2026-08-04 22:16:19 +02:00

Opened #734 SPA: field-level progressive disclosure — short summary → hover popup → (future) deep-dive docs link 2026-08-04 22:38:17 +02:00

Opened #735 Validate FFmpeg profile numeric fields to sane ranges instead of silently transforming them, and expose readrate pacing as a bounded field 2026-08-04 22:38:46 +02:00

Opened #736 Advanced: editable FFmpeg arguments box — show the composed command, allow override, reset to default 2026-08-04 22:42:49 +02:00

Opened #740 AddItemsDialog.runSearch has no stale-response or is-mounted guard (pre-existing, surfaced during #685) 2026-08-05 18:36:35 +02:00

Opened #742 Tighten review-verdict.yml provenance from "non-null creator" to an allow-list of approved reviewers 2026-08-05 20:37:00 +02:00

Opened #743 review-verdict/h10 is bypassable without forging it: direct pushes to main are server-side permitted 2026-08-05 20:53:54 +02:00

Opened #744 ci-image.yml's push trigger has no branches: filter — any branch push runs attacker YAML on a docker-capable runner 2026-08-05 21:06:57 +02:00

Opened #746 docker-build.yml checkouts should set persist-credentials: false — after the || true fetch masking is removed 2026-08-05 23:32:37 +02:00

Opened #747 Re-verify the Gitea 1.25.4-pinned CI claims after the 1.27.1 upgrade 2026-08-05 23:32:37 +02:00

Opened #748 Declare permissions: on the status-writing workflows so the Gitea Restricted token default can be enabled 2026-08-05 23:46:38 +02:00

Opened #751 review-verdict.yml's classify/post step never executes — job goes green, review-verdict/h10 is never posted automatically 2026-08-06 14:36:21 +02:00

Opened #754 MCP ersatztv_update_channel omits graphicsElementIds — cannot set the On Now/Next overlay, and silently strips it 2026-08-06 20:41:12 +02:00

Opened #755 Project boundary: ersatztv owns the fork code, media-management owns channel operations 2026-08-06 20:41:29 +02:00

Opened #756 Extend the dropped-step guard to docker-build.yml's required jobs, where a dropped step is fail-OPEN 2026-08-06 21:30:32 +02:00

Opened #757 MCP tool catalog: query parameters are unguarded — list_playouts omits query, get_playout_items omits showFiller 2026-08-06 21:35:24 +02:00

Opened #758 GetPagedPlayouts: TotalCount ignores the query filter, so a filtered page reports the unfiltered total 2026-08-06 21:49:47 +02:00

Opened #759 MCP query-parameter guard ignores a $ref'd OpenAPI parameter instead of failing loudly 2026-08-06 21:49:48 +02:00

Opened #763 Page both /statuses/{sha} reads in review-verdict.yml — limit clamps to 50, so the post-write race check can miss a raced verdict 2026-08-10 19:28:49 +02:00

Opened #767 Make the delimiter ban fail-CLOSED on the release path — build's Smoke step is still droppable on a v* tag push 2026-08-10 22:48:43 +02:00

Opened #772 The pinned CI toolchain image can vanish from the registry and take ALL container CI down, with no signal but a pull error 2026-08-13 19:34:10 +02:00

Opened #773 Root-cause the recurring defect shapes across closed issues, then build hooks/tooling that make them hard to repeat — plus an audit of the tooling we already have and don't use 2026-08-13 19:34:55 +02:00

Opened #774 Guard convention: derive the expected set from the authoritative source and assert equality — never filter, never sample 2026-08-13 19:57:40 +02:00

Opened #775 Every guard ships with a proof it can go red: delete that guard alone, the suite must fail 2026-08-13 19:57:53 +02:00

Opened #776 Make hooks report that they fired — PreToolUse/PostToolUse execution is currently unobservable 2026-08-13 19:58:04 +02:00

Opened #777 csharp-lsp and typescript-lsp are broken; the "workflow agents must use csharp-lsp" guidance is stale 2026-08-13 19:58:20 +02:00

Opened #778 Audit read-then-write against live remote state: pin a version or use compare-and-set 2026-08-13 19:58:39 +02:00

Opened #779 Test the deny path with the production config value, and assert full-replace field lists 2026-08-13 19:58:48 +02:00

Opened #780 Reconcile Python tooling: commit a ruff config and enforce it, or stop claiming we enforce it 2026-08-13 19:59:02 +02:00

Opened #781 Plugin/MCP config hygiene: retire what is enabled and never invoked, de-duplicate the gitea server 2026-08-13 19:59:12 +02:00

Opened #783 ersatztv skill states the stack names correctly but does not warn that two of the three fail silently 2026-08-13 20:10:21 +02:00

Opened #784 Generalize the no-session-narrative rule from the kickoff file to all docs — the reader never saw the earlier draft 2026-08-13 20:54:00 +02:00

Opened #785 Mutation proofs for the 19 unproven guards, worst-consequence first 2026-08-13 21:59:10 +02:00

Opened #786 Extend the machine-checked guard inventory to inline workflow-job guards 2026-08-13 21:59:11 +02:00

Opened #787 The dropped-step guard's SCOPE is a dated comment, not a check, against branch protection 2026-08-13 21:59:12 +02:00

Opened #788 One shared verdict vocabulary instead of two shell copies plus a parity test 2026-08-13 22:21:30 +02:00

Opened #789 Derive the CI toolchain population from workflow-owned metadata, not TOOLCHAIN_JOBS 2026-08-13 22:21:30 +02:00

Opened #790 An executable clause-level mutation harness for the shell and python guards 2026-08-13 22:21:31 +02:00

Opened #792 post-review-verdict.sh exits 0 when it deliberately writes NO status 2026-08-14 01:44:55 +02:00

Opened #794 A fix ships a test witnessed failing BEFORE the fix — mechanise it by reverting the code side and asserting red 2026-08-14 16:25:59 +02:00

Opened #796 A verification harness is itself unproven code — five false greens, each created by the fix for the last 2026-08-14 17:07:27 +02:00

Opened #797 pretooluse-bom-guard.sh is fail-open wherever xxd is not installed — including the CI runner 2026-08-14 17:15:08 +02:00

Opened #799 serena is enabled and starts fine, but its tools never reach a session — establish why, then use or disable it 2026-08-14 17:34:40 +02:00

Opened #803 Head-ABA: a force-push H1->H2->H1 during paging defeats pr-changed-files.sh, and three contracts still deny it 2026-08-16 14:11:25 +02:00

Opened #806 Guard populations over FILES should derive from the git index, not a filesystem walk 2026-08-21 19:18:45 +02:00

Opened #807 The SPA's hand-built request objects can silently drop an OPTIONAL DTO field 2026-08-21 19:43:52 +02:00

Opened #809 The production-hook-fire-log isolation guard is per-test, but its claim is per-suite 2026-08-21 20:07:56 +02:00

Opened #812 Remediate the 21 session-narrative sites #784's sweep found — 21 judgements, not a regex 2026-08-21 22:49:00 +02:00

Opened #816 Mutation harness: reset_sandbox does not restore .git control state 2026-08-22 15:00:36 +02:00

Opened #819 The SPA page-size guard enumerates web/src with a Vite glob while claiming completeness 2026-08-22 17:38:54 +02:00

Opened #820 Complete<T> proves its semantics but not its APPLICATION — nothing derives the set of SPA full-replace construction sites 2026-08-22 22:10:58 +02:00

Opened #821 curl -u "$VAR" puts a credential in argv on shared hosts — five call sites, one class 2026-08-22 23:42:26 +02:00

Opened #822 test_the_suite_does_not_write_to_the_PRODUCTION_log uses global mutable state as its oracle — any concurrent session reddens it 2026-08-22 23:51:22 +02:00

Opened #823 Scheduling collection-valued columns: is a runtime null reachable on DaysOfMonth / MonthsOfYear / DaysOfWeek? 2026-08-23 00:07:12 +02:00

Opened #824 ElasticSearchIndex.UpdateSong has no regression test — an Elastic-only reintroduction of the #701 mutation stays CI-green 2026-08-23 00:07:30 +02:00

Opened #830 AddItemsDialog: a failed add is silently swallowed when the dialog is closed mid-request 2026-08-25 23:24:21 +02:00

Opened #832 MediaCards paged handlers: 1-based paging + delete-or-keep (count drift fixed in #690/#758) 2026-08-26 08:20:35 +02:00

Opened #835 Guard the persist-credentials convention — after #744, with no exemption list 2026-08-26 17:41:00 +02:00

Opened #836 :latest images ship InformationalVersion 0.0.0 — a --depth=2 fetch grafts the build job's full clone shallow 2026-08-26 18:22:19 +02:00

Opened #837 Scripted-playout _off: the documented "null -> all off" behaviour depends on an unrecorded formatter setting, and no test would catch it changing 2026-08-26 19:06:53 +02:00

Opened #839 FieldHelp's panel placement is verified by hand, not by a test 2026-08-26 19:24:07 +02:00

Opened #840 FieldHelp's portalled panel puts a docsHref link at the end of the tab order 2026-08-26 19:24:08 +02:00

Opened #844 Per-channel default-adoption state, so "on by default" can stop re-adding an overlay the operator cleared 2026-08-26 20:41:45 +02:00

Opened #845 post-review-verdict.sh does not check that its own account is on the gate's H10_REVIEWERS allow-list 2026-08-26 21:46:10 +02:00

Opened #848 The QSV frame-pool 422 can name a control the editor is not rendering 2026-08-26 23:36:54 +02:00

Opened #849 review-verdict.yml post-write verification: three routes that leave an exemption success over a human failure 2026-08-27 00:25:17 +02:00

Opened #853 workflow_dispatch still loads attacker YAML from an arbitrary ref — four workflows, no ref restriction 2026-08-27 20:17:52 +02:00

Opened #854 docker/ci/Dockerfile's FFMPEG-bump comment still says a push publishes — and cannot be fixed on its own 2026-08-27 20:18:44 +02:00

Opened #855 Nothing couples ci-image.yml's push.paths to ci-image-pin's expected pathspec 2026-08-27 20:47:14 +02:00

Opened #858 pretooluse-merge-consent.sh resolves its verdict classifier from $CLAUDE_PROJECT_DIR — an env var as a security input 2026-08-27 22:01:23 +02:00

Opened #859 Merge-gate branch-protection read: a malformed rule states a cause that did not happen, and the endpoint is now fetched twice 2026-08-27 22:01:24 +02:00

Opened #869 Finish the 1.25.4-dated CI claim sweep #747 deliberately did not complete 2026-08-28 18:52:25 +02:00

Opened #870 The timeline walk's null terminator is defeatable: Gitea pages BEFORE it filters, so a page of inline-code comments reads as exhaustion 2026-08-28 21:06:38 +02:00

Opened #876 docs.no-session-narrative reaches hooks and code comments, but nothing has ever swept them — 4 known sites 2026-08-29 18:54:40 +02:00

Opened #877 Dismissible write failures, shape A2: the error state survives but its render site is gated by the same condition dismissal clears 2026-08-29 19:30:54 +02:00

Opened #880 Schedule-item recurrence fields: an omitted array means "never applies" on write but "unrestricted" on read 2026-08-29 20:21:30 +02:00

Opened #881 Mutation claims in PROSE are outside testing.mutation-claims-are-executed — 4 false ones in #812, each caught by a separate review round 2026-08-29 21:21:06 +02:00

Opened #885 Same-repo pull_request runs get REGISTRY_PASSWORD from head-supplied YAML — the route #853 found under the dispatch class 2026-08-30 01:40:56 +02:00

Opened #886 release.verdict-vocabulary-shared explains the sentinel with a set -u mechanism that measurement refutes 2026-08-30 02:00:22 +02:00

Opened #887 Every image build fails: completeAnnotations.guard.test.ts needs the git index, and the Dockerfile's exclude list is hand-maintained 2026-08-30 02:35:21 +02:00

Opened #891 ETV_HOOK_FIRE_LIB is SOURCED from an env-var path in 12 hooks — a decoy tree's code runs inside the gate 2026-08-30 10:15:52 +02:00

Opened #893 page_statuses still terminates on its first empty page — is /statuses/{sha} subject to #870's post-pagination filtering? 2026-08-30 10:57:49 +02:00

Opened #894 SPA lets a user build an empty recurrence set the server now rejects (#880 residual) 2026-08-30 10:59:44 +02:00

Opened #895 "all N tests stayed green" claims in test comments go stale the moment anyone adds a test — 4 found, no detector 2026-08-30 12:37:34 +02:00

Opened #900 chore(release): cut and promote v26.15.0 on 736649b3b (main head could not build an image) 2026-08-30 17:29:13 +02:00

Opened #901 Convention: for a predicate over shell or config TEXT, pin the artifact whole — "match a shape" is the exception that must argue for itself 2026-08-30 18:44:42 +02:00

Opened #904 test_docs_only_detector_clone_depth.py flakes ~8% in the CI container (measured, pre-existing on main) 2026-08-30 22:58:57 +02:00