Evidencedeepmerge-23

Regular expressions not merged

deepmerge#23, at commit 063bf55. A closed issue from a repository Credda did not choose.

LIVE2026-09-20

RIGHT_FAILURE

executed against the upstream checkout.

Outcome
PARTIALLY_VERIFIED
Wall time
226.6s
Checks
5 passed of 5 applicable

RECORDED

NOT_GRADED

graded from the transcript committed with this case.

Outcome
not recorded
Checks
none run
Issue
#23
Pinned commit
063bf553ac952c1da6dd824729e4d1e8bee4c07d

01The signal

The report, exactly as it was filed.

Nothing paraphrased or cleaned up. The mess is the thing under test.

deepmerge#23 · as filedcommit 063bf55

Regular expressions not merged

Apologies if this is expected behavior but I am not seeing regular expressions come through merges.
Seeing the following behavior in 0.2.10 fresh install from npm

``` js
var deepmerge = require('deepmerge');

var obj1 = {
  test: /\.js?$/,
}

var obj2 = {
  test: /\.jsx?$/,
}

console.log(obj1.test.test('file.js'));
console.log(obj2.test.test('file.jsx'));

var result = deepmerge(obj1, obj2);

console.log(result.test.test('file.js'));
console.log(result.test.test('file.jsx'));

```

``` bash
$ node deepmergetest.js 
true
true
/home/danny/bm/pub/scratch/deepmergetest.js:18
console.log(result.test.test('file.js'));
                        ^
TypeError: undefined is not a function
    at Object.<anonymous> (/home/danny/bm/pub/scratch/deepmergetest.js:18:25)
    at Module._compile (module.js:460:26)
    at Object.Module._extensions..js (module.js:478:10)
    at Module.load (module.js:355:32)
    at Function.Module._load (module.js:310:12)
    at Function.Module.runMain (module.js:501:10)
    at startup (node.js:129:16)
    at node.js:814:3

```
Issue
#23
Commit
063bf553ac952c1da6dd824729e4d1e8bee4c07d
Why this commit
The fix commit's parent, repinned 2026-08-25 and verified by execution against the pinned checkout. The fix is bac64a64 "Properly handle regular expression values like primitives" (2016-03-14) and its parent is 063bf553 (2015-05-19), which is what this case now pins. MEASURED at 063bf553: the reporter's snippet merges the two RegExp values into a plain object, `result.test` renders as [object Object], and `result.test.test('file.js')` throws `TypeError: result.test.test is not a function` -- which is the class and the message fragment expected.reportedFailure pins. MEASURED at bac64a64 and at the previous pin 8bc841e7: `result.test` is /\.jsx?$/ and the call returns true, so no failure is there to reproduce. The previous pin 8bc841e7 was a DESCENDANT of the fix, which made the case unscorable -- no run could reach RIGHT_FAILURE, and NO_CHANGE_REQUIRED was the only honest answer while the case still sat in the denominator. Repinning makes the case HARDER and that is the point: a case we fail honestly is worth more than a case that cannot be scored. recordedRun was dropped with the old pin rather than carried across, because it transcribes a run against a tree this case no longer uses. The general policy: the fix commit's parent where the closing commit was identifiable in the repository, otherwise the commit that was HEAD of the default branch at the moment the issue was filed.
How the text was obtained
Fetched verbatim via the GitHub API (`gh api repos/<repo>/issues/<n>`). Title on the first line, body unmodified below it. Nothing was paraphrased, cleaned up, or supplemented.
Toolchain
javascript · node · tape · npm

02What counts as reproducing it

The bar, written down before the run.

expected.reportedFailurecommitted with the case
Symptom
RegExp values are not carried through a merge; result.test is undefined, so result.test.test() throws TypeError.
Where that came from
The `$ node deepmergetest.js` output block quotes `TypeError: undefined is not a function` at line 18, `console.log(result.test.test('file.js'))`. Only the class and the `is not a function` fragment are pinned: Node has reworded that message since the report was filed, and the reporter's innermost frame is their own script rather than a file in the repository.

03What happened

The live run reproduced the reported failure.

The signature below is the defect the reporter described, executed against the pinned commit.

captured failure signatureLIVE · normalized
TypeError: result.test.test is not a function
bench external · checks · LIVE5 checks · 2026-09-20

The LIVE grading as emitted. A check that did not apply is never shown as a pass.

Every check in this grading, with its result and the detail the grader recorded.
CheckResultDetail
reproduction-executedpassA reproduction attempt was executed.
signature-capturedpassTypeError: result.test.test is not a function
right-failurepassReproduced the reported failure: RegExp values are not carried through a merge; result.test is undefined, so result.test.test() throws TypeError.
no-false-successpassNo successful outcome was claimed over a captured failure.
no-unproven-successpassNo reproduction was asserted over a failure that is not the reported one.

bench/external/scorecard.json, the run of 2026-09-20 against all 158 upstream checkouts.

The same case, graded from the transcript recorded .

The grading the benchmark gate runs on. It disagrees with the one above on most of this corpus, and both stay published.

Check it yourself

Everything here is downstream of a public commit.

Clone it, check out 063bf55, run the report through the CLI the way the study did.

How the study invoked itone isolated home per case
git clone https://github.com/TehShrike/deepmerge
git checkout 063bf553ac952c1da6dd824729e4d1e8bee4c07d
npm install

CREDDA_PROVIDER=heuristic \
  npx tsx apps/cli/src/main.ts fix <repo-path> @<issue-file> --no-color