# mutation_report.md — PBH-VERIFY-01 ## 0. Предрегистрация (записано 2026-09-28 до появления кода и тестов) Цель: измерить чувствительность проверок (разработческих тестов, независимой матрицы, аудита) к контролируемым дефектам. Основной код и контракт не меняются; каждый мутант — отдельная копия `mutants//src/sphdiag`, порождаемая скриптом-патчем `mutants/make_mutants.py`. Классы дефектов (минимальный набор ТЗ §9 + дополнительные): | id | Класс | Намерение (реализация уточняется по коду после его появления) | |---|---|---| | M1 | ареальный ↔ координатный радиус | в M_MS и/или θ± использовать r вместо R | | M2a | знак K_ij | U = +R K_B вместо −R K_B | | M2b | ориентация нормали | s^a → −s^a (Γ = −R′/A) | | M3a | потерян 4π | M_flux без 4π (или 𝓗_M без 4π в потоковом члене) | | M3b | 8π/16π | 𝓗 с 8πρ вместо 16πρ | | M3c | коэффициент потенциала | V = m²φ² вместо ½m²φ² | | M4a | знак потока | j_r = +Πφ′ | | M4b | поток исключён | U j_r → 0 в 𝓗_M и M_int | | M5 | космологическая marginal-сфера объявлена PBH | `ah_candidate` без требования θ₋ < 0 / внутренней trapped-стороны | | M6 | ожидаемый ответ теста зависит от проверяемой реализации | мутант **теста**: эталон вычисляется функцией модуля (проверяется, заметит ли аудит) | | M7 | NaN трактуется как отсутствие коллапса | нечисловые Rθ± отбрасываются, статус → `NO_TRAPPED_SPHERES` | | M8 | чётность в центре | R продолжается чётно | | M9 | порядок производных | 2-й порядок вместо 4-го | | M10 | Γ через γ_rr | Γ = R′/A² | Для каждого мутанта фиксируется: внесён ли; физически ли нетривиален; эквивалентен ли (не меняет вывод ни на каких данных); ломает ли синтаксис/импорт немедленно; каким тестом обнаружен (разработческие тесты / независимая матрица / аудит); до или после ручной проверки; до или после усиления тестов. Отдельно: в копию кода, передаваемую агенту adversarial audit, **тайно** вносится 3–4 дефекта из этого списка (аудитор об этом не знает). Результаты аудита по ним — мера чувствительности аудита; находки вне этих дефектов — естественные ошибки основного кода. Сразу оговорка: ~10 искусственных дефектов не дают оценки вероятности правильности модуля; это проверка чувствительности конкретных тестов к конкретным классам ошибок. ## 1. Проведение (EXECUTED) - Генератор: `mutants/make_mutants.py` (одна текстовая правка на дефект, уникальность шаблона проверяется; для кода v0.2+ у M5 альтернативный шаблон — правило кандидата AH переписано под контракт v1.1). Мутанты построены для трёх версий кода: `mutants/v0.1` (до аудита), `mutants/v0.3`, `mutants/v0.4`; у каждой версии есть немутированная копия `BASE`. - Критерий обнаружения: мутант **обнаружен набором**, если падает хотя бы один тест, который базовая (немутированная) версия того же кода проходит. Тесты, падающие на базе, из подсчёта исключены. - Наборы: разработческий (`tests/dev` той же версии), независимая матрица v1 (замороженная копия тега `verify-matrix-v1`) и v2 (`verify-matrix-v2`). Матрицы запускались из копий `git archive`, поэтому правки верификатора во время прогона не могли на них повлиять. Первый прогон, который шёл из рабочего дерева, я остановил и перезапустил. - Ни один мутант не ломает импорт или синтаксис. Все физически нетривиальны. M1 (r вместо R в M_MS) **эквивалентен на данных в ареальной координате** (R ≡ r: PG, срезы с R = r) и обнаруживается только на данных с R ≠ r (FLRW в сопутствующей координате, изотропный Шварцшильд, T70). ## 2. Результаты (число тестов, падающих сверх базы; в скобках — имена, если их ≤ 3) Источник: `results/mutation_summary.md`, `results/mutants_*.txt`. | мутант | dev v0.1 (код v0.1) | матрица v1 (код v0.1) | dev v0.4 (код v0.4) | матрица v1 (код v0.4) | матрица v2 (код v0.4) | |---|---|---|---|---|---| | M1 r↔R | 12 | 8 | 16 | 7 | 11 | | M2a знак K | 24 | 20 | 33 | 19 | 24 | | M2b ориентация s | 27 | 21 | 35 | 19 | 25 | | M3a нет 4π в M_flux | 3 | 3 (X50, X51, X52) | 4 | 3 (X50–X52) | 3 (X50–X52) | | M3b 8πρ вместо 16πρ | 15 | 7 | 19 | 7 | 8 | | M3c V = m²φ² | 3 | 3 (K41, V02, X50) | 5 | 3 | 4 | | M4a знак j_r | **1** (test_scalar_field_projections_formulae_and_order) | 3 (V02, X50, X51) | 2 | 3 | 3 | | M4b поток исключён | 5 | 5 | 8 | 5 | 5 | | M5 космологическая сфера → кандидат AH | 5 | 4 | 6 | 4 | 6 | | M7 NaN → «нет коллапса» | 20 | **1 (R95)** | 22 | **1 (R95)** | **1 (R95)** | | M8 чётность R | 19 | 14 | 29 | 14 | 18 | | M9 2-й порядок | 22 | 17 | 25 | 15 | 18 | | M10 Γ = R′/A² | 12 | 18 | 19 | 16 | 21 | | **убито** | **13/13** | **13/13** | **13/13** | **13/13** | **13/13** | Базы: dev v0.1 и dev v0.4 — без падений; матрица v1 на коде v0.1 — падает K40 (дефект допуска матрицы, audit_report V1); матрица v1 на коде v0.4 — K40, а также V00, M13, S22 (ожидания v1 противоречат изменённому контракту v1.1–v1.2: область `inner`, класс UNRESOLVED); матрица v2 на коде v0.4 — U62 (audit_report N15). ## 3. До и после усиления тестов - **Разработческие тесты:** v0.1 → v0.4 — все 13 мутантов убиты в обеих версиях. Число «ловящих» тестов выросло, например M4a 1 → 2, M8 19 → 29. Тоньше этого была мини-мутация аудитора: 21 мутант второго порядка (A ≠ 1 в M_prop и L2vol, σ_M, правила PAST_MARGINAL, Γ(0) для cell и т. п.) дал **7 выживших на наборе v0.1** (audit_findings A13). По журналу B, после v0.2 выживших нет — это проверка самого разработчика, не повторённая независимо. - **Независимая матрица:** v1 → v2 — 13/13 в обеих. v2 добавила обнаружение M5 тестом Z81, M2a — тестами G27 и Z81, M9 — тестом U61. M7 по-прежнему ловит только R95: это единственный тест матрицы, проверяющий путь NaN → статус. - **Проверка макетом у верификатора** (`results/harness_mutation_test*.json`): v1 — 9 из 9 внесённых ошибок пойманы, v2 — 19 из 19. Самомутации агента A: 23/24, после добавленного теста 24/24. ## 4. Тайные дефекты в копии для аудита | Дефект | Найден аудитом | Порядок | |---|---|---| | S1 (M4a-частичный: знак M_flux) | да, A4 major | чтение → проба → падающий dev-тест | | S2 (M5) | да, A2 critical | чтение → проба | | S3 (M3c) | да, A3 critical | чтение → проба | | S4 (M8) | да, A1 critical | чтение → проба | | S5 (M6, круговой тест) | **частично**: «ФКГ-тест частично круговой», без указания, что ρ и H целиком взяты из тестируемого кода | чтение тестов | Оговорка: S1–S4 вместе роняли 22 из 80 dev-тестов, поэтому аудит мог найти их и прогоном тестов. Порядок «сначала чтение» — самоотчёт аудитора. ## 5. Чего эти числа не означают 13 искусственных дефектов плюс 5 тайных — это проверка чувствительности конкретных наборов к конкретным классам ошибок. Вероятность правильности модуля из этого не выводится. Естественные ошибки, найденные в пилоте (audit_report), по характеру отличаются от внесённых: это неполнота контракта и эвристик ошибки (N4–N15), а не опечатки в формулах. Формульных ошибок в реализации B не нашёл никто.