Validation of a develupdate/customization/nusz-2026-06-16 merge (NÚSZ customization update) FAILED at the lint step with one error, so the merge was NOT committed or pushed — left mid-merge with MERGE_HEAD intact. Root cause is a reusable merge gotcha: an extensionless require() added on the branch side survived a .js.ts rename done on the devel side and broke under the n/no-missing-require eslint rule.

For Agents

  • Worktree: /Users/levander/coding/facekom/vuer_oss-nusz-devel-update
  • Branch: update/customization/nusz-2026-06-16 (HEAD), merging origin/devel (MERGE_HEAD)
  • Status when validation stopped: mid-merge, untouched (validate-only, stop-on-fail). Nothing staged, committed, or pushed.
  • Lint gate: yarn lint = eslint . --max-warnings 0 --ignore-pattern "test/*" (see ci-github-branch-audit-chronically-red for why lint+unit tests are the real per-change gates).
  • Fix is a one-line merge-resolution correction (below), not yet applied.

Symptoms

yarn lint failed with exactly 1 error, 0 warnings:

/Users/levander/coding/facekom/vuer_oss-nusz-devel-update/cron.js
  46:33  error  Can't resolve './server/service/FFmpegService' in
                '/Users/levander/coding/facekom/vuer_oss-nusz-devel-update'  n/no-missing-require

✖ 1 problem (1 error, 0 warnings)

Root Cause — merge-caused, not pre-existing or environmental

Both sides of the merge were individually fine; the combination is what breaks:

  • origin/devel side (MERGE_HEAD): server/service/FFmpegService.js was renamed to FFmpegService.ts. devel’s cron.js has no FFmpegService require at all.
  • nusz branch tip side (HEAD): commit 1d837dac83 “feat: add FFmpegService to service container in setupServices” added an extensionless const FFmpegService = require('./server/service/FFmpegService') to cron.js — written while the file was still .js, so it resolved fine and lint passed on the branch tip.
  • The merge accepted devel’s rename (so only FFmpegService.ts exists now) but kept the nusz extensionless require line in cron.js verbatim. Extensionless require('./server/service/FFmpegService') can no longer resolve to a .ts file under n/no-missing-require → lint error.

cron.js:46 is the lone straggler. Every other caller of the renamed TS services already uses the explicit .ts extension:

CallerLine
server.js:108require('./server/service/FFmpegService.ts')
convert.js:31
background.js:52
server/convert/convert_check.js:4

(Plus JanusService.ts / CallCenterService.ts callers, all already on explicit .ts.)

Fix (NOT yet applied)

Change cron.js line 46 to match the rename and the rest of the codebase:

const FFmpegService = require('./server/service/FFmpegService.ts')

One-line merge-resolution correction. Re-run yarn lint to confirm green before committing the merge.

General gotcha — extensionless require + cross-side .js→.ts rename

When merging a branch where files were renamed .js.ts on one side, any extensionless require() of those files added on the other side survives the merge unchanged and breaks under eslint n/no-missing-require (Node TS resolution requires the explicit .ts extension here; it will not fall back to .ts for an extensionless specifier).

After such merges, grep for extensionless requires of the renamed modules, e.g.:

grep -rn "require('./.*FFmpegService')" .   # extensionless (broken)
grep -rn "FFmpegService'\)"               # cross-check both .js/.ts call sites

Conflict-free text merges hide this: neither side touched the same line, so git produces no conflict marker — the breakage only surfaces at the lint/resolve step.