"""Negative controls: apply ONE mutation, run the rows, expect the named row RED.
Usage: python mutate.py <id>   (tree must be committed; restore with git checkout)"""
import sys
M = {
 'M1': ('crates/spt/src/cli.rs',
        'let Some(meta) = meta.filter(|m| m.bundle.is_some()) else {',
        'let Some(meta) = meta else {'),
 'M2': ('crates/spt/src/cli.rs',
        'Some((installed, true)) if version_is_newer(bundled, installed) => {',
        'Some((installed, true)) if !version_is_newer(installed, bundled) => {'),
 'M3': ('crates/spt/src/cli.rs',
        'if !actual.eq_ignore_ascii_case(&m.sha256) {',
        'if false && !actual.eq_ignore_ascii_case(&m.sha256) {'),
 'M4': ('crates/spt-runtime/src/registry.rs',
        '        built_in: false,\r\n    };',
        '        built_in: load_record(adapters_dir, &manifest.adapter.name).is_ok_and(|r| r.built_in),\r\n    };'),
}
p, old, new = M[sys.argv[1]]
b = open(p, 'rb').read().decode('utf-8')
assert b.count(old) == 1, (sys.argv[1], b.count(old))
open(p, 'wb').write(b.replace(old, new).encode('utf-8'))
print('mutated', sys.argv[1], p)
