The merger appends channel/programme arrays without deduplicating programmes by (channel,start,title) or resolving duplicate source records deterministically. bindingRuleByInputId also stores just one rule per input channel ID, dropping earlier rules when multiple canonical channels intentionally select the same source guide channel.
Code: server/epg.js#L350-L483. Reviewed 2026-09-06; these source files are unchanged between local 5ee8134 and GitHub main 0d923cf.
Evidence: Static review of the merge loop. test/integration/epg.test.js mainly tests synthetic array concatenation rather than production conflict/fan-out behavior. The earlier broad EPG issue #16 is closed, so this tracks the remaining concrete semantics.
Acceptance criteria:
Validation note: the local full test suite could not pass because the installed better-sqlite3 binary is incompatible with the available ARM64 Node runtime. Reproductions mentioned above use isolated dependencies and do not claim full application integration coverage.
The merger appends channel/programme arrays without deduplicating programmes by (channel,start,title) or resolving duplicate source records deterministically. bindingRuleByInputId also stores just one rule per input channel ID, dropping earlier rules when multiple canonical channels intentionally select the same source guide channel.
Code: server/epg.js#L350-L483. Reviewed 2026-09-06; these source files are unchanged between local 5ee8134 and GitHub main 0d923cf.
Evidence: Static review of the merge loop. test/integration/epg.test.js mainly tests synthetic array concatenation rather than production conflict/fan-out behavior. The earlier broad EPG issue #16 is closed, so this tracks the remaining concrete semantics.
Acceptance criteria:
Validation note: the local full test suite could not pass because the installed better-sqlite3 binary is incompatible with the available ARM64 Node runtime. Reproductions mentioned above use isolated dependencies and do not claim full application integration coverage.