# Regression reproduction on unchanged source Node v24.21.0; npm 11.19.0; baseline netlify/build c9ae6ed4a119a518c3d90a1cf5fc48fe8836f8ee. ## Command forwarding: two failures Command: NETLIFY_INTERNAL_GIT=1 npx vitest run --config packages/run-utils/vitest.config.ts packages/run-utils/tests/options.test.ts RUN v3.2.6 /tmp/netliloop-work/build {"cwd":"/tmp/netliloop-work/build"} ❯ packages/run-utils/tests/options.test.ts (2 tests | 2 failed) 60ms × runCommand resolves project-local binaries by default and honors preferLocal: false 17ms → Command failed with ENOENT: netlify-run-utils-local-fixture spawn netlify-run-utils-local-fixture ENOENT × run preserves options when the arguments array is omitted 42ms → expected { cwd: '/tmp/netliloop-work/build' } to deeply equal { …(2) } ⎯⎯⎯⎯⎯⎯⎯ Failed Tests 2 ⎯⎯⎯⎯⎯⎯⎯ FAIL packages/run-utils/tests/options.test.ts > runCommand resolves project-local binaries by default and honors preferLocal: false Error: Command failed with ENOENT: netlify-run-utils-local-fixture spawn netlify-run-utils-local-fixture ENOENT ⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯[1/2]⎯ FAIL packages/run-utils/tests/options.test.ts > run preserves options when the arguments array is omitted AssertionError: expected { cwd: '/tmp/netliloop-work/build' } to deeply equal { …(2) } - Expected + Received { - "cwd": "/tmp/run-utils-options-OqZXbh", - "value": "child-value", + "cwd": "/tmp/netliloop-work/build", } ❯ packages/run-utils/tests/options.test.ts:42:30 40| child.stdin!.end('console.log(JSON.stringify({ cwd: process.cwd(), v… 41| const { stdout } = await child 42| expect(JSON.parse(stdout)).toEqual({ cwd, value: 'child-value' }) | ^ 43| }) 44| ⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯[2/2]⎯ Test Files 1 failed (1) Tests 2 failed (2) Start at 04:08:17 Duration 272ms (transform 28ms, setup 0ms, collect 37ms, tests 60ms, environment 0ms, prepare 43ms) ## Raw Git paths: six failures, one control pass Command: NETLIFY_INTERNAL_GIT=1 npx vitest run --config packages/git-utils/vitest.config.ts packages/git-utils/tests/filenames.test.ts RUN v3.2.6 /tmp/netliloop-work/build ❯ packages/git-utils/tests/filenames.test.ts (7 tests | 6 failed) 851ms × preserves the filename "café.txt" across changes and fileMatch 121ms → expected [ '"caf\303\251.txt"' ] to deeply equal [ 'café.txt' ] ✓ preserves the filename "space name.txt" across changes and fileMatch 197ms × preserves the filename "tab\tname.txt" across changes and fileMatch 106ms → expected [ '"tab\tname.txt"' ] to deeply equal [ 'tab\tname.txt' ] × preserves the filename "line\nbreak.txt" across changes and fileMatch 108ms → expected [ '"line\nbreak.txt"' ] to deeply equal [ 'line\nbreak.txt' ] × preserves the filename "quote\"name.txt" across changes and fileMatch 106ms → expected [ '"quote\"name.txt"' ] to deeply equal [ 'quote"name.txt' ] × preserves the filename "back\\slash.txt" across changes and fileMatch 106ms → expected [ '"back\\slash.txt"' ] to deeply equal [ 'back\slash.txt' ] × preserves the filename "trailing\n" across changes and fileMatch 105ms → expected [ '"trailing\n"' ] to deeply equal [ 'trailing\n' ] ⎯⎯⎯⎯⎯⎯⎯ Failed Tests 6 ⎯⎯⎯⎯⎯⎯⎯ FAIL packages/git-utils/tests/filenames.test.ts > preserves the filename "café.txt" across changes and fileMatch AssertionError: expected [ '"caf\303\251.txt"' ] to deeply equal [ 'café.txt' ] - Expected + Received [ - "café.txt", + "\"caf\\303\\251.txt\"", ] ❯ packages/git-utils/tests/filenames.test.ts:44:36 42| 43| const additions = getGitUtils({ base, head: created, cwd }) 44| expect(additions.createdFiles).toEqual([filename]) | ^ 45| expect(additions.fileMatch('**').created).toEqual([filename]) 46| const modifications = getGitUtils({ base: created, head: modified,… ⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯[1/6]⎯ FAIL packages/git-utils/tests/filenames.test.ts > preserves the filename "tab\tname.txt" across changes and fileMatch AssertionError: expected [ '"tab\tname.txt"' ] to deeply equal [ 'tab\tname.txt' ] - Expected + Received [ - "tab name.txt", + "\"tab\\tname.txt\"", ] ❯ packages/git-utils/tests/filenames.test.ts:44:36 42| 43| const additions = getGitUtils({ base, head: created, cwd }) 44| expect(additions.createdFiles).toEqual([filename]) | ^ 45| expect(additions.fileMatch('**').created).toEqual([filename]) 46| const modifications = getGitUtils({ base: created, head: modified,… ⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯[2/6]⎯ FAIL packages/git-utils/tests/filenames.test.ts > preserves the filename "line\nbreak.txt" across changes and fileMatch AssertionError: expected [ '"line\nbreak.txt"' ] to deeply equal [ 'line\nbreak.txt' ] - Expected + Received [ - "line - break.txt", + "\"line\\nbreak.txt\"", ] ❯ packages/git-utils/tests/filenames.test.ts:44:36 42| 43| const additions = getGitUtils({ base, head: created, cwd }) 44| expect(additions.createdFiles).toEqual([filename]) | ^ 45| expect(additions.fileMatch('**').created).toEqual([filename]) 46| const modifications = getGitUtils({ base: created, head: modified,… ⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯[3/6]⎯ FAIL packages/git-utils/tests/filenames.test.ts > preserves the filename "quote\"name.txt" across changes and fileMatch AssertionError: expected [ '"quote\"name.txt"' ] to deeply equal [ 'quote"name.txt' ] - Expected + Received [ - "quote\"name.txt", + "\"quote\\\"name.txt\"", ] ❯ packages/git-utils/tests/filenames.test.ts:44:36 42| 43| const additions = getGitUtils({ base, head: created, cwd }) 44| expect(additions.createdFiles).toEqual([filename]) | ^ 45| expect(additions.fileMatch('**').created).toEqual([filename]) 46| const modifications = getGitUtils({ base: created, head: modified,… ⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯[4/6]⎯ FAIL packages/git-utils/tests/filenames.test.ts > preserves the filename "back\\slash.txt" across changes and fileMatch AssertionError: expected [ '"back\\slash.txt"' ] to deeply equal [ 'back\slash.txt' ] - Expected + Received [ - "back\\slash.txt", + "\"back\\\\slash.txt\"", ] ❯ packages/git-utils/tests/filenames.test.ts:44:36 42| 43| const additions = getGitUtils({ base, head: created, cwd }) 44| expect(additions.createdFiles).toEqual([filename]) | ^ 45| expect(additions.fileMatch('**').created).toEqual([filename]) 46| const modifications = getGitUtils({ base: created, head: modified,… ⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯[5/6]⎯ FAIL packages/git-utils/tests/filenames.test.ts > preserves the filename "trailing\n" across changes and fileMatch AssertionError: expected [ '"trailing\n"' ] to deeply equal [ 'trailing\n' ] - Expected + Received [ - "trailing - ", + "\"trailing\\n\"", ] ❯ packages/git-utils/tests/filenames.test.ts:44:36 42| 43| const additions = getGitUtils({ base, head: created, cwd }) 44| expect(additions.createdFiles).toEqual([filename]) | ^ 45| expect(additions.fileMatch('**').created).toEqual([filename]) 46| const modifications = getGitUtils({ base: created, head: modified,… ⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯[6/6]⎯ Test Files 1 failed (1) Tests 6 failed | 1 passed (7) Start at 04:08:17 Duration 1.11s (transform 50ms, setup 0ms, collect 64ms, tests 851ms, environment 0ms, prepare 50ms) The original reproduction used fileMatch("**"); final tests use fileMatch(filename) because micromatch wildcard behavior for newline characters is outside the filename-decoding fix. Failures shown here occur at the raw createdFiles assertion before matching.