Surviving mutants

Generated by scripts/mutation_survivors.py from the cosmic-ray session databases. One row per surviving mutant: the suite ran that mutated line and no assertion failed.

A survivor is not automatically a bug — see the equivalent-mutant classes catalogued in docs/how-to/mutation-testing.md (type annotations, error-message f-strings, interpreter-detail rewrites). Triage means deciding, per row, whether the mutated behaviour is genuinely indistinguishable or whether nothing tests it.

40 surviving mutants across 1 modules, of which 0 are marked annot — a type annotation rewritten by a BitOr-family operator, which cannot change behaviour. Start with the unmarked rows.

src/pyrxd/fee_sizing.py — 40 survivors (0 annot)

Line

Definition

Operator

Original

Mutant

77

(module level)

AddNot

if TYPE_CHECKING:  # pragma: no cover - typing only

if not TYPE_CHECKING:  # pragma: no cover - typing only

115

(module level)

NumberReplacer

RADIANT_MIN_RELAY_PHOTONS_PER_KB = 1_000_000  # 0.01 RXD/kB (legacy floor)

RADIANT_MIN_RELAY_PHOTONS_PER_KB = 1000001  # 0.01 RXD/kB (legacy floor)

115

(module level)

NumberReplacer

RADIANT_MIN_RELAY_PHOTONS_PER_KB = 1_000_000  # 0.01 RXD/kB (legacy floor)

RADIANT_MIN_RELAY_PHOTONS_PER_KB = 999999  # 0.01 RXD/kB (legacy floor)

134

(module level)

NumberReplacer

WITNESS_SCALE_FACTOR = 4

WITNESS_SCALE_FACTOR = 3

134

(module level)

NumberReplacer

WITNESS_SCALE_FACTOR = 4

WITNESS_SCALE_FACTOR = 5

199

bitcoin_virtual_size

NumberReplacer

if not isinstance(value, int) or isinstance(value, bool) or value <= 0:

if not isinstance(value, int) or isinstance(value, bool) or value <= 1:

199

bitcoin_virtual_size

ReplaceOrWithAnd

if not isinstance(value, int) or isinstance(value, bool) or value <= 0:

if not isinstance(value, int) and isinstance(value, bool) or value <= 0:

223

fee_for_kb_rate

ReplaceComparisonOperator_LtE_Eq

if isinstance(per_kb, bool) or not isinstance(per_kb, int) or per_kb <= 0:

if isinstance(per_kb, bool) or not isinstance(per_kb, int) or per_kb == 0:

223

fee_for_kb_rate

ReplaceOrWithAnd

if isinstance(per_kb, bool) or not isinstance(per_kb, int) or per_kb <= 0:

if isinstance(per_kb, bool) and not isinstance(per_kb, int) or per_kb <= 0:

284

required_fee

ReplaceComparisonOperator_Lt_IsNot

if fee_rate < relay_floor_photons_per_byte():

if fee_rate is not relay_floor_photons_per_byte():

284

required_fee

ReplaceComparisonOperator_Lt_LtE

if fee_rate < relay_floor_photons_per_byte():

if fee_rate <= relay_floor_photons_per_byte():

284

required_fee

ReplaceComparisonOperator_Lt_NotEq

if fee_rate < relay_floor_photons_per_byte():

if fee_rate != relay_floor_photons_per_byte():

291

assert_fee_rate_clears_relay_floor

ReplaceBinaryOperator_Mul_Div

*,

/,

323

assert_fee_rate_clears_relay_floor

NumberReplacer

f"{floor_per_byte * 1000} per kB), got {fee_rate}. A transaction built "

f"{floor_per_byte * 999} per kB), got {fee_rate}. A transaction built "

323

assert_fee_rate_clears_relay_floor

NumberReplacer

f"{floor_per_byte * 1000} per kB), got {fee_rate}. A transaction built "

f"{floor_per_byte * 1001} per kB), got {fee_rate}. A transaction built "

323

assert_fee_rate_clears_relay_floor

ReplaceBinaryOperator_Mul_Add

f"{floor_per_byte * 1000} per kB), got {fee_rate}. A transaction built "

f"{floor_per_byte + 1000} per kB), got {fee_rate}. A transaction built "

323

assert_fee_rate_clears_relay_floor

ReplaceBinaryOperator_Mul_BitAnd

f"{floor_per_byte * 1000} per kB), got {fee_rate}. A transaction built "

f"{floor_per_byte & 1000} per kB), got {fee_rate}. A transaction built "

323

assert_fee_rate_clears_relay_floor

ReplaceBinaryOperator_Mul_BitOr

f"{floor_per_byte * 1000} per kB), got {fee_rate}. A transaction built "

f"{floor_per_byte | 1000} per kB), got {fee_rate}. A transaction built "

323

assert_fee_rate_clears_relay_floor

ReplaceBinaryOperator_Mul_BitXor

f"{floor_per_byte * 1000} per kB), got {fee_rate}. A transaction built "

f"{floor_per_byte ^ 1000} per kB), got {fee_rate}. A transaction built "

323

assert_fee_rate_clears_relay_floor

ReplaceBinaryOperator_Mul_Div

f"{floor_per_byte * 1000} per kB), got {fee_rate}. A transaction built "

f"{floor_per_byte / 1000} per kB), got {fee_rate}. A transaction built "

323

assert_fee_rate_clears_relay_floor

ReplaceBinaryOperator_Mul_FloorDiv

f"{floor_per_byte * 1000} per kB), got {fee_rate}. A transaction built "

f"{floor_per_byte // 1000} per kB), got {fee_rate}. A transaction built "

323

assert_fee_rate_clears_relay_floor

ReplaceBinaryOperator_Mul_LShift

f"{floor_per_byte * 1000} per kB), got {fee_rate}. A transaction built "

f"{floor_per_byte << 1000} per kB), got {fee_rate}. A transaction built "

323

assert_fee_rate_clears_relay_floor

ReplaceBinaryOperator_Mul_Mod

f"{floor_per_byte * 1000} per kB), got {fee_rate}. A transaction built "

f"{floor_per_byte % 1000} per kB), got {fee_rate}. A transaction built "

323

assert_fee_rate_clears_relay_floor

ReplaceBinaryOperator_Mul_Pow

f"{floor_per_byte * 1000} per kB), got {fee_rate}. A transaction built "

f"{floor_per_byte ** 1000} per kB), got {fee_rate}. A transaction built "

323

assert_fee_rate_clears_relay_floor

ReplaceBinaryOperator_Mul_RShift

f"{floor_per_byte * 1000} per kB), got {fee_rate}. A transaction built "

f"{floor_per_byte >> 1000} per kB), got {fee_rate}. A transaction built "

323

assert_fee_rate_clears_relay_floor

ReplaceBinaryOperator_Mul_Sub

f"{floor_per_byte * 1000} per kB), got {fee_rate}. A transaction built "

f"{floor_per_byte - 1000} per kB), got {fee_rate}. A transaction built "

336

fee_never_below_relay_floor

ReplaceBinaryOperator_Mul_BitAnd

return max(size_bytes * fee_rate, min_relay_fee(size_bytes))  # min_relay_fee validates size_bytes

return max(size_bytes & fee_rate, min_relay_fee(size_bytes))  # min_relay_fee validates size_bytes

336

fee_never_below_relay_floor

ReplaceBinaryOperator_Mul_Div

return max(size_bytes * fee_rate, min_relay_fee(size_bytes))  # min_relay_fee validates size_bytes

return max(size_bytes / fee_rate, min_relay_fee(size_bytes))  # min_relay_fee validates size_bytes

336

fee_never_below_relay_floor

ReplaceBinaryOperator_Mul_FloorDiv

return max(size_bytes * fee_rate, min_relay_fee(size_bytes))  # min_relay_fee validates size_bytes

return max(size_bytes // fee_rate, min_relay_fee(size_bytes))  # min_relay_fee validates size_bytes

336

fee_never_below_relay_floor

ReplaceBinaryOperator_Mul_Mod

return max(size_bytes * fee_rate, min_relay_fee(size_bytes))  # min_relay_fee validates size_bytes

return max(size_bytes % fee_rate, min_relay_fee(size_bytes))  # min_relay_fee validates size_bytes

336

fee_never_below_relay_floor

ReplaceBinaryOperator_Mul_RShift

return max(size_bytes * fee_rate, min_relay_fee(size_bytes))  # min_relay_fee validates size_bytes

return max(size_bytes >> fee_rate, min_relay_fee(size_bytes))  # min_relay_fee validates size_bytes

336

fee_never_below_relay_floor

ReplaceBinaryOperator_Mul_Sub

return max(size_bytes * fee_rate, min_relay_fee(size_bytes))  # min_relay_fee validates size_bytes

return max(size_bytes - fee_rate, min_relay_fee(size_bytes))  # min_relay_fee validates size_bytes

345

trial_size_with_slack

ReplaceOrWithAnd

if isinstance(n_inputs, bool) or not isinstance(n_inputs, int) or n_inputs < 0:

if isinstance(n_inputs, bool) and not isinstance(n_inputs, int) or n_inputs < 0:

347

trial_size_with_slack

NumberReplacer

if isinstance(trial_size_bytes, bool) or not isinstance(trial_size_bytes, int) or trial_size_bytes <= 0:

if isinstance(trial_size_bytes, bool) or not isinstance(trial_size_bytes, int) or trial_size_bytes <= 1:

347

trial_size_with_slack

ReplaceComparisonOperator_LtE_Eq

if isinstance(trial_size_bytes, bool) or not isinstance(trial_size_bytes, int) or trial_size_bytes <= 0:

if isinstance(trial_size_bytes, bool) or not isinstance(trial_size_bytes, int) or trial_size_bytes == 0:

347

trial_size_with_slack

ReplaceOrWithAnd

if isinstance(trial_size_bytes, bool) or not isinstance(trial_size_bytes, int) or trial_size_bytes <= 0:

if isinstance(trial_size_bytes, bool) and not isinstance(trial_size_bytes, int) or trial_size_bytes <= 0:

435

fee_overpay_multiple

ReplaceBinaryOperator_Mul_Div

def fee_overpay_multiple(fee_photons: int, *, floor: int, target: int) -> float:

def fee_overpay_multiple(fee_photons: int, /, floor: int, target: int) -> float:

437

fee_overpay_multiple

NumberReplacer

requirement = max(int(floor), int(target), 1)

requirement = max(int(floor), int(target), 2)

437

fee_overpay_multiple

NumberReplacer

requirement = max(int(floor), int(target), 1)

requirement = max(int(floor), int(target), 0)

444

assert_tx_pays_for_itself

ReplaceBinaryOperator_Mul_Div

*,

/,