# Mutants mutmut generates that survive (or time out) for reasons that don't indicate
# a real test gap - each is a change the *code* cannot behave differently for, or (for
# the "timeout" entry) a change that turns the line into an infinite loop, which
# mutmut correctly reports as non-equivalent but under a status other than "survived".
#
# CI (.github/workflows/tests.yml, job "mutation") fails only on a survivor NOT listed
# here, so this file is the thing to update - after re-verifying the reasoning below
# still holds - if `uv run mutmut show <name>` shows something new isn't actually
# equivalent. Never add an entry just to make CI pass without doing that check.
#
# Regenerate this exact set with:
#   uv run mutmut run; uv run mutmut results | awk '{print $1}' | sed 's/:$//'
# then diff against this file before committing - the diff is your changelog.

# configparser's default optionxform lowercases option names on both write and read, so
# looking a key up (or storing it) under a different case than the source reads it back
# identically either way - "user"/"USER", "host"/"HOST", "port"/"PORT" are the same key.
detssh.registry.x_load_registry__mutmut_12
detssh.registry.x_load_registry__mutmut_14
detssh.registry.x_load_registry__mutmut_19
detssh.registry.x_save_registry__mutmut_4
detssh.registry.x_save_registry__mutmut_7
detssh.registry.x_save_registry__mutmut_9
detssh.registry.x_save_registry__mutmut_12

# run()'s else-branch computes `argv = sys.argv[1:]` and passes `args=argv` unmodified -
# click.BaseCommand.main() already defaults args=None to sys.argv[1:] itself, so passing
# that exact value explicitly or omitting it (args=None) are the same call.
detssh.cli.x_run__mutmut_14
detssh.cli.x_run__mutmut_16

# write_hosts_file's os.open(..., mode=HOSTS_FILE_MODE) is immediately followed by an
# unconditional os.fchmod(fd, HOSTS_FILE_MODE) - whatever mode os.open used gets
# overwritten right after, so dropping the os.open mode argument is a no-op. (ensure_include
# has no such fchmod call, which is why its equivalent mutant - dropping SSH_CONFIG_FILE_MODE
# from its own os.open - is NOT in this list: it's real, and is tested by
# test_ensure_include_creates_a_missing_ssh_dir_with_correct_permissions.)
detssh.ssh_config.x_write_hosts_file__mutmut_16
# Same reasoning: write_keypair's os.open(..., PRIVATE_KEY_MODE) is followed by an
# unconditional os.fchmod(fd, PRIVATE_KEY_MODE).
detssh.keygen.x_write_keypair__mutmut_43

# Python's codec lookup is case-insensitive ("utf-8" and "UTF-8" resolve to the same
# codec), and hashlib's hash-algorithm-name lookup is too ("sha256" and "SHA256" give the
# same digest) - every one of these mutates a hardcoded codec/hash name to a different
# case, which cannot change what the code does.
detssh.keygen.x_write_keypair__mutmut_29
detssh.keygen.x_public_key_line__mutmut_20
detssh.backends.base.x_authorize_and_recap__mutmut_25
detssh.backends.kdf.scrypt.xǁScryptǁrun__mutmut_35
detssh.backends.kdf.bcrypt_pbkdf.xǁBcryptPbkdfǁrun__mutmut_13
detssh.backends.kdf.pbkdf2.xǁPbkdf2ǁrun__mutmut_12
detssh.backends.kdf.pbkdf2.xǁPbkdf2ǁrun__mutmut_17
detssh.backends.kdf._argon2.xǁArgon2Baseǁrun__mutmut_19
detssh.backends.salt.sha512.xǁSha512ǁdigest__mutmut_4
detssh.backends.salt.sha384.xǁSha384ǁdigest__mutmut_4
detssh.backends.salt.sha256.xǁSha256ǁdigest__mutmut_4
detssh.backends.salt.blake2s.xǁBlake2sǁdigest__mutmut_7
detssh.backends.salt.sha3_512.xǁSha3512ǁdigest__mutmut_4
detssh.backends.salt.blake2b.xǁBlake2bǁdigest__mutmut_7
detssh.backends.salt.sha3_256.xǁSha3256ǁdigest__mutmut_4
detssh.backends.salt.sha3_384.xǁSha3384ǁdigest__mutmut_4

# click.prompt(..., show_default=None) vs show_default=False: with default="" (falsy),
# click treats both the same - neither shows a "[]" default hint. Confirmed empirically;
# see the type= mutants on the same line (mutmut_34, 38), which ARE real and are killed
# by test_wizard_register_prompt_reasks_on_a_non_integer_port.
detssh.cli.x__register_interactively__mutmut_33
# One mutant turns a loop into an infinite one: `name = None` inside
# `_register_interactively`'s `while not name:` reprompt loop, which can never become
# truthy again. mutmut correctly reports it as "timeout", not "survived" - CI's grep only
# matches lines ending in "survived", so it doesn't need listing here, but is noted for
# anyone diffing this file against a fresh `mutmut results`.
# detssh.cli.x__register_interactively__mutmut_14: timeout
