simple-git's .raw() resolves successfully even on exit code 1, returning stdout content. git merge-tree --write-tree outputs CONFLICT markers to stdout (not stderr), so the catch block never fired and conflicts were reported as clean merges.