# physics_contract.md — PBH-VERIFY-01 **Версия 1.4** (2026-09-29; v1.4 — §16 (окно для σ); v1.3 — §15 (σ производных вычисленных полей, коды предупреждений); v1.2 — §14 (класс UNRESOLVED, найден на данных V1-Vlasov); v1.1 — v1.0 заморожена тегом `contract-v1.0` до любых численных экспериментов и включала исправления Р1–Р7 из derivation.md §6; изменения v1.1 — §13, приняты после первичного аудита и первого прогона независимой матрицы). Любое изменение после заморозки — новая версия с записью в §12 и в `audit_report.md`. Модуль: `sphdiag` — физические диагностики сферически-симметричных 3+1-данных. Он **не** эволюционирует данные и **не** решает связи; он только измеряет. --- ## 1. Сигнатура, единицы, нормировки - Сигнатура (−,+,+,+). Геометрические единицы **G = c = 1**. ħ в модуль не входит. - Единица длины кода L_u произвольна и задаётся пользователем (например 1/H_k или 1/m_φ). Все величины: длина и время ~ L_u, масса M ~ L_u (т.е. M_phys = M_code · L_u c²/G), плотности ρ, j, S ~ L_u⁻², K_ij (смешанные) ~ L_u⁻¹, θ± ~ L_u⁻¹. - **Масса поля m_φ хранится как обратная длина** (= обратное время при c = 1): m_φ,code = (m_φ c/ħ)·L_u. Физическая масса частицы: m_φ c² = ħ c m_φ,code / L_u. - **Нормировка поля:** действие S = ∫√(−g) [ ⁴R/(16π) − ½ g^{ab}∂_aφ∂_bφ − V(φ) ] d⁴x, V(φ) = ½ m_φ² φ². Тогда φ безразмерно и φ_code = √G φ_phys/c², т.е. φ_phys = φ_code · m_Pl (m_Pl = √(ħc/G) — нередуцированная планковская масса); φ/M̄_Pl = √(8π) φ_code. - **Обозначения масс (не смешивать):** m_φ — масса поля; M_MS — квазилокальная масса Misner–Sharp; M_ρ, M_flux, M_int, M_prop — интегральные массы вещества (§6); μ (или δ) — амплитуда возмущения (в модуле не используется); M_H — масса горизонта (в модуле не используется). - q = m_φ/H_k, H_k — хаббловская скорость при входе масштаба в горизонт, a(t_k)H(t_k) r_m = 1 (соглашение плана V1b, §7.3). **Модуль q не использует и не выводит.** ## 2. Метрика и переменные среза ds² = −α² dt² + A² (dr + β^r dt)² + R² dΩ², где r — **координатный** радиус (любая монотонная метка сфер), R(r) — **ареальный** радиус (площадь сферы 4πR²). Пространственная метрика γ_rr = A², γ_θθ = R², γ_φφ = R² sin²θ. Отображение на другие записи: изотропная (A = ψ², R = ψ² r); areal (r ≡ R, R′ = 1); сопутствующая (β = 0). - α > 0 — lapse, β^r — shift. **Диагностики среза от α и β не зависят**; они принимаются только для вспомогательного пересчёта ∂_tφ → Π. - Будущенаправленная единичная нормаль к срезу: n_a = (−α, 0, 0, 0), n^a = (1, −β^r, 0, 0)/α. - Внешняя единичная пространственная нормаль к сфере в срезе: s^a = (0, 1/A, 0, 0) — **в сторону роста r** (не обязательно роста R). - **Внешняя кривизна:** K_ij = −(1/2α)(∂_tγ_ij − D_iβ_j − D_jβ_i) = −γ_i^a γ_j^b ∇_a n_b; K = γ^{ij}K_ij = −∇_a n^a. Расширяющийся FLRW: K = −3H < 0. На вход подаются **смешанные** компоненты K_A ≡ K^r_r, K_B ≡ K^θ_θ = K^φ_φ (инвариантны при радиальных заменах координат). - **Π ≡ n^a∇_aφ = (∂_tφ − β^r ∂_rφ)/α** (совпадает с V1b Code A, план §7.2). Вспомогательная функция `pi_from_dtphi`. Вспомогательные скаляры (инварианты сферы в срезе): - Γ ≡ s^a∇_aR = R′/A, ′ ≡ ∂_r; - U ≡ n^a∇_aR = −R K_B [F1]. ## 3. Регулярность и границы Параметр `center` среза: - `"vertex"`: r[0] = 0 — регулярный центр на сетке; - `"cell"`: r[0] > 0, регулярный центр r = 0 вне сетки, сетка продолжается отражением r → −r; - `"none"`: внутренний край — не центр (напр. экстерьер); односторонние шаблоны. Чётности при регулярном центре: A, K_A, K_B, φ, Π — чётные; R — нечётная. Условия в центре: R(0) = 0, Γ(0) = 1 (локальная плоскость), K_A(0) = K_B(0), j_r = O(r). Модуль **проверяет** (не навязывает) Γ(0) → 1 и K_A(0) → K_B(0) и сообщает отклонения. Внешняя граница: только односторонние шаблоны; никаких граничных условий модуль не накладывает. ## 4. Материя: EKG Из действия §1: T_ab = ∂_aφ ∂_bφ − g_ab[½ g^{cd}∂_cφ∂_dφ + V] [F2]. Уравнение поля □φ = V′(φ) = m_φ² φ. Проекции (n-наблюдатель, Φ ≡ φ′/A — производная по собственной длине): - ρ = T_ab n^a n^b = ½Π² + ½Φ² + V [F3] - j_i = −γ_i^a n^b T_ab ⇒ **j_r = −Π φ′** (ковариантная), ортонормированная J = j_r/A = −ΠΦ [F4] - S_ij = γ_i^aγ_j^b T_ab; смешанные S^r_r = ½Π² + ½Φ² − V, S^θ_θ = ½Π² − ½Φ² − V; S = S^i_i [F5] Адаптер Vlasov (расширение): `VlasovMoments(E, J, p, q)` → ρ = E, j_r = A·J, S^r_r = p, S^θ_θ = q (моменты в n-кадре, как в `pbhgr.cosmo_ev`). Однородный предел (тест FKG, [F6]; пространственно-плоский случай k = 0, R = a r): φ(t), H = ȧ/a, φ̈ + 3Hφ̇ + m_φ²φ = 0, H² = (8π/3)(½φ̇² + V), Ḣ = −4πφ̇²; на срезе R = a r, A = a, K_A = K_B = −H, Π = φ̇, ρ = ½φ̇² + V, p = S^r_r = S^θ_θ = ½φ̇² − V (мгновенно, не ноль; ⟨p⟩ → 0 только по периоду при m_φ ≫ H). Для k = ±1: R = a S_k(r), Γ = S_k′, H² + k/a² = (8π/3)ρ, Ḣ = −4πφ̇² + k/a². ## 5. Связи (сферическая симметрия, общий радиальный калибр) ³R = 2(1 − Γ²)/R² − 4Γ′/(A R) [F7] **Гамильтонова:** 𝓗 ≡ ³R + K² − K_ijK^ij − 16πρ = ³R + 4K_AK_B + 2K_B² − 16πρ = 0 [F8] **Импульсная (r-компонента):** 𝓜 ≡ K_B′ − (R′/R)(K_A − K_B) + 4π j_r = 0 [F9] (получена из D_j(K^j_i − δ^j_i K) = 8π j_i, делённой на −2). **Массовая форма (регулярна в центре):** 𝓗_M ≡ M_MS′ − 4πR²(ρR′ + U j_r) = **+**(R² R′/4)·𝓗 + R³ K_B·𝓜 [F10] Тождество [F10] — алгебраическое следствие [F1, F7–F9, F11]; проверяется в derivation.md. Нормировки невязок (без деления на почти ноль): для каждой невязки X = Σ_k T_k (слагаемые T_k с их знаками) относительная невязка X_rel = |X| / Σ_k|T_k|, если Σ_k|T_k| > 0; иначе не определена (NaN с пометкой). Слагаемые: 𝓗: {2(1−Γ²)/R², −4Γ′/(AR), 4K_AK_B, 2K_B², −16πρ}; 𝓜: {K_B′, −(R′/R)(K_A−K_B), 4πj_r}; 𝓗_M: {M′, −4πR²ρR′, −4πR²U j_r}. ## 6. Масса Misner–Sharp и интегральные массы M_MS = (R/2)(1 − g^{ab}∂_aR ∂_bR), a,b ∈ {t, r}. Через срез: g^{ab}∂_aR∂_bR = −(n·∇R)² + (s·∇R)² = Γ² − U², поэтому **M_MS = (R/2)(1 − Γ² + U²) = (R/2)(1 − (R′/A)² + R²K_B²)** [F11] Следствие [F10] при 𝓗 = 𝓜 = 0: **M_MS′ = 4πR²(ρR′ + U j_r)**. На уравнениях dM_MS = 4πR²ρ dR (в любой радиальной метке, R′ ≠ 0) тогда и только тогда, когда U j_r = 0 (нет радиального потока или U = 0, т.е. K_B = 0); запись dM/dr = 4πr²ρ дополнительно требует r ≡ R. Интегральные массы (интегрирование от внутреннего края r₀ с начальным значением M_MS(r₀); при регулярном центре M_MS(0) = 0): - M_ρ(r) = ∫ 4πR²ρ R′ dr — «наивная» масса без потока; - M_flux(r) = ∫ 4πR² U j_r dr — потоковый вклад; - M_int = M_MS(r₀) + M_ρ + M_flux — должна совпадать с M_MS при выполненных связях; - M_prop(r) = ∫ 4πR² A ρ dr — масса по собственному объёму (другая величина, в общем случае ≠ M_MS даже в статике). ## 7. Световые расширения и классификация сфер k_±^a = n^a ± s^a (нормировка n·k_± = −1). Для сферы ареального радиуса R: **θ± = (2/R) k_±^a ∇_a R = (2/R)(U ± Γ) = 2(±R′/(AR) − K_B)** [F12] Тождества: **R²θ₊θ₋/4 = U² − Γ² = 2M_MS/R − 1** [F13]; поэтому 2M_MS/R = 1 ⇔ θ₊θ₋ = 0 — **этого недостаточно** для горизонта ЧД. (0,−) и (+,0) возможны только при Γ > 0; (−,0) и (0,+) — только при Γ < 0. θ± зависят от нормировки k± (масштабирование k± → λk± умножает θ± на λ > 0) и от выбора среза через данную сферу (буст n: θ₊ → e^η θ₊, θ₋ → e^{−η} θ₋); M_MS, θ₊θ₋, знаки и нули от этого не зависят. Модуль выдаёт безразмерные конечные R θ± = 2(U ± Γ) и сами θ±. При R = 0 θ± не определены (расходятся как ±2/R): значение NaN с классом `CENTER`, искусственная конечность не навязывается; R θ± → ±2 − 2A(0)K_B(0)·r + O(r²) при регулярном центре (Rθ± не имеет чётности: призрачные точки строятся из U (нечётная) и Γ (чётная), не из Rθ±). Знак s_± ∈ {+, 0, −} величины Rθ±: «0», если |Rθ±| ≤ τ_± = max(κ·σ(Rθ±), 1e3·ε_mach·(|U| + |Γ|)), κ = 3, где σ — оценка численной ошибки (§9). | (s₊, s₋) | класс сферы | |---|---| | (+, −) | `NORMAL` | | (−, +) | `NORMAL_REVERSED` (s^a указывает в сторону убывания R, напр. за горловиной) | | (−, −) | `FUTURE_TRAPPED` | | (+, +) | `PAST_TRAPPED` (anti-trapped; напр. FLRW при R > 1/H) | | (0, −) или (−, 0) | `FUTURE_MARGINAL` | | (0, +) или (+, 0) | `PAST_MARGINAL` | | (0, 0) | `DOUBLY_MARGINAL`: U = Γ = 0 (R′ = 0 и n·∇R = 0) — горловина Эйнштейна–Розена, экватор закрытого FLRW в момент остановки и т. п.; горизонтом быть не обязана | | τ± > τ_max = 0.1 (знак не разрешён; естественный масштаб Rθ± равен 2) [v1.2] | `UNRESOLVED` | | R = 0 | `CENTER` | | нечисловые входы/выходы | `INVALID` | **Корни.** Для каждой смены знака Rθ± между соседними точками (или точного нуля) — корень: положение r*, R*, M_MS(R*), интервал неопределённости [R_lo, R_hi] (из различия линейной и кубической интерполяции и полосы ±τ), знак другого расширения в корне, знаки Rθ на внутренней/внешней стороне. Тип: - `FUTURE_MOTS`: θ_zero = 0, другое < 0. **Кандидат в apparent horizon ЧД (`ah_candidate = True`)** только если нуль у **исходящего** расширения θ_out (в сторону роста R: θ_out = θ₊ при Γ > 0, θ_out = θ₋ при Γ < 0 в корне), другое расширение < 0, θ_out < 0 со стороны меньших R и > 0 со стороны больших R (внешняя граница будущей trapped-области). [v1.1: критерий не зависит от направления нумерации r.] Внешний (по R) такой корень — `outer_ah_candidate`. - `PAST_MOTS`: другое > 0 — **космологическая/белодырная marginal-сфера, никогда не PBH**. - `DEGENERATE`: оба нуля или знак другого не определён. Статус геометрии среза (**одно** значение; при нескольких подходящих берётся первый по порядку UNDETERMINED > AH_CANDIDATE > FUTURE_TRAPPED_NO_AH_CANDIDATE > UNCERTAIN > PAST_TRAPPED_ONLY > NO_TRAPPED_SPHERES): - `UNDETERMINED` — есть `INVALID` или численный сбой вне документированных точек центра; **никогда не трактуется как отсутствие коллапса**; - `AH_CANDIDATE` — есть хотя бы один `ah_candidate`; - `FUTURE_TRAPPED_NO_AH_CANDIDATE` — есть `FUTURE_TRAPPED`, но нет корня-кандидата (напр. trapped-область доходит до края сетки); - `PAST_TRAPPED_ONLY` — есть точки `PAST_TRAPPED` или корень `PAST_MOTS` с разрешёнными сторонами, нет будущих; - `UNCERTAIN` — есть маргинальные точки любого типа (`FUTURE_MARGINAL`/`PAST_MARGINAL`/`DOUBLY_MARGINAL`), не отнесённые к корню известного типа (`FUTURE_MOTS`/`PAST_MOTS`) с разрешёнными знаками по обе стороны, кроме изолированной (обе соседние точки — разрешённые не-маргинальные, класс не `UNRESOLVED`) `DOUBLY_MARGINAL`/`DEGENERATE` точки с τ± ≤ τ_max [v1.2] (она → `NO_TRAPPED_SPHERES` + `marginal_present`, это исключение имеет приоритет над `UNCERTAIN`), либо корень `DEGENERATE` рядом с trapped-точкой; [v1.1: неразрешённый знак больше не превращается в `PAST_TRAPPED_ONLY`] - `NO_TRAPPED_SPHERES` — все сферы `NORMAL`/`NORMAL_REVERSED`/`CENTER`; допускаются изолированные маргинальные точки с корнем `DEGENERATE` и не-trapped соседями — тогда флаг `marginal_present = True` в `status`. Ограничение: поиск корней по смене знака пропускает касательные нули (рождение пары MOTS); на корне θ₊ на уравнениях d(Rθ₊)/dℓ ∝ 1 − 8πR²(ρ − J) (derivation.md), поэтому корень θ₊ может быть внешней границей trapped-области только при 8πR²(ρ − J) < 1. Меток `PBH_FORMED`, «event horizon», «black hole» модуль **не выдаёт**: локальная apparent-horizon диагностика одного снимка не устанавливает ни ЧД, ни её отсутствие в будущем. Статусы исхода эволюции (§11 ТЗ: COLLAPSE / RESOLVED_NO_COLLAPSE_BY_DEADLINE / …) относятся к последовательности снимков с проверенной численной надёжностью и в модуль-диагностику среза не входят. ## 8. Производные Все радиальные производные — конечными разностями на (возможно неравномерной) сетке r, веса Fornberg: порядок p = 4 (5 точек) — основной; p = 6 (7 точек) — только для оценки ошибки. Центр `vertex`/`cell`: призрачные точки по чётности (§3); `none` и внешняя граница: односторонние шаблоны того же порядка. Требование: N ≥ 8. Пользователь может передать аналитические производные `dA, dR, dKB` (тогда используются они, а оценки ошибки = 0). ## 9. Оценки численной ошибки и статусы качества - Ошибка производной: σ(f′) = |D⁽⁴⁾f − D⁽⁶⁾f| + σ_round(f′), σ_round = C·ε·Σ_k|w_k f_k| (C ≤ 10) (эвристика: оценивает ошибку D⁽⁴⁾ на гладких разрешённых данных; **не** оценивает ошибку на изломах, скачках и сеточном шуме — см. «разрешённость» и σ_noise ниже). - [v1.1] Сеточный шум: σ_noise(f) = max по окну 7 точек |Δ⁶f|/√924 (Δ⁶ — неделённая 6-я разность; для белого шума её с.к.о. в √924 раз больше с.к.о. шума). τ± = max(κ·(σ(Rθ±) + 2σ_noise(U) + 2σ_noise(Γ)), floor). - [v1.1] Для `ScalarField` ошибка численной φ′ входит в σ(ρ), σ(j_r) и далее в σ невязок. - [v1.1] Разрешённость: точка невязки X `UNRESOLVED`, если σ(X) > 0.1·Σ_k|T_k|; глобальный статус связей `UNRESOLVED`, если таких точек > 5 % среди оценённых или хотя бы одна в области `center`. `CONSISTENT_WITH_TRUNCATION` означает только |X| ≤ κ_c σ(X) + floor на разрешённых точках и не заменяет проверку сходимости на двух сетках. - σ(Rθ±) = 2 σ(Γ) (σ(Γ) = σ(R′)/A); σ(M_MS) = R |Γ| σ(Γ); σ(𝓗) = 4|Γ|σ(Γ)/R² + 4σ(Γ′)/(AR); σ(𝓜) = σ(K_B′) + |K_A − K_B|σ(R′)/R; σ(𝓗_M) = σ(M′) + 4πR²|ρ|σ(R′). Входные поля считаются точными. - Статус связей в точке: `VIOLATED`, если |X| > κ_c·σ(X) + 1e3·ε_mach·max(Σ|T_k|, S_X), κ_c = 10, S_X — масштаб округления слагаемых (при Σ|T_k| = 0 порог не обнуляется); иначе `CONSISTENT`. Глобальный статус связей (приоритет): `NOT_EVALUATED` (нет материи или data ≠ OK), `VIOLATED`, `UNRESOLVED`, `CONSISTENT_WITH_TRUNCATION`. Это **не** утверждение о физической точности; допуски тестов фиксирует `verification_plan.md`. - Статус данных: `OK`, `INVALID_INPUT` (неверные формы/монотонность/A ≤ 0/R < 0/нечисла на входе; [v1.1] R = 0 где-либо, кроме r[0] при `center="vertex"`), `NUMERICAL_FAILURE` (нечисла в выходах вне документированных точек R = 0). - [v1.1] Предупреждения (`status['warnings']`, статус данных не меняют): отклонение центра |Γ(0) − 1| > max(κ·σ_Γ0, 1e-8) или |K_A(0) − K_B(0)| > 1e-8·max|K|; `M_int_mismatch` = max|M_int − M_MS|/(max|M_MS| + max σ_M) > 1e-6 (при материи); M_MS < −κ σ_M где-либо; неопределённые относительные невязки (`n_rel_undefined`). - [v1.1] L2vol ≡ √(∫X² dV), dV = 4πR²A dr, без нормировки на объём; квадратура M_ρ, M_flux, M_prop — 4-го порядка (кубика по 4 соседним узлам); при `center="cell"` интегралы берутся от r₀ (шар [0, r₀] не включается — записывается в warnings). M′ в 𝓗_M — конечная разность массива M_MS (не цепное правило), иначе 𝓗_M стал бы тождественной комбинацией 𝓗 и 𝓜. При `center="none"` область норм `center` называется `inner`. - Известное свойство: L∞(𝓗) в области `center` сходится как h² (члены (1−Γ²)/R², Γ′/R), остальные невязки — как h⁴. - Нормы невязок: L∞; L2 по собственному объёму dV = 4πR²A dr (трапеции по r); отдельно по областям: `center` (первые max(4, N/20) точек с R > 0), `bulk`, `outer` (последние 4 точки). Точка R = 0 исключается из 𝓗 и 𝓜 (0/0) и помечается; 𝓗_M включается. ## 10. Программный интерфейс (обязателен для реализации и независимых тестов) Пакет `sphdiag` (каталог `src/sphdiag`, импорт при `PYTHONPATH=src`). ```python SphericalSlice(r, A, R, KA, KB, center="vertex"|"cell"|"none", alpha=None, beta=None, dA=None, dR=None, dKB=None) ScalarField(phi, Pi, m_phi) # .projections(slc) -> Projections VlasovMoments(E, J, p, q) # .projections(slc) -> Projections Projections(rho, j_r, S_rr, S_thth) # S_rr = S^r_r, S_thth = S^theta_theta (смешанные); j_r ковариантная pi_from_dtphi(dtphi, dphi_dr, alpha, beta) -> Pi diagnose(slc, matter=None, *, kappa_theta=3.0, kappa_c=10.0) -> Diagnostics ``` `matter` — `ScalarField`, `VlasovMoments`, `Projections` или `None`. Поля `Diagnostics` (массивы длины N, если не сказано иное): | Поле | Смысл | |---|---| | `Gamma, U, dR` | Γ, U, R′ | | `M, sigma_M` | M_MS и оценка ошибки | | `compactness` | 2M_MS/R (0 при R = 0) | | `M_over_R3` | M_MS/R³ (при R = 0 — экстраполяция, `M_over_R3_extrapolated = True`) | | `Rtheta_plus, Rtheta_minus, sigma_Rtheta_plus, sigma_Rtheta_minus` | Rθ± и ошибки | | `theta_plus, theta_minus` | θ± (NaN при R = 0) | | `sphere_class` | массив строк по §7 | | `roots` | список dict: `which` ('+'/'-'), `r`, `R`, `R_lo`, `R_hi`, `M`, `type`, `ah_candidate`, `other_sign`, `inner_sign`, `outer_sign` | | `outer_ah_candidate` | dict корня или None | | `projections` | `Projections` или None | | `ham, ham_rel, mom, mom_rel, hamM, hamM_rel` | невязки §5 (NaN при отсутствии материи) | | `sigma_ham, sigma_mom, sigma_hamM` | их оценки ошибки | | `norms` | dict: `norms[name][region][kind]`, name ∈ {ham, mom, hamM}, region ∈ {all, center, bulk, outer}, kind ∈ {Linf, L2vol, Linf_rel} | | `M_rho, M_flux, M_int, M_prop` | §6 | | `center_checks` | dict: `Gamma0` (Γ в центре или экстраполяция), `KA_minus_KB0` | | `status` | dict: `data`, `constraints`, `geometry` (§7, §9) | ## 11. Прослеживаемость | ID | Формула | Вывод (derivation.md) | Первоисточник | |---|---|---|---| | F1 | Γ = R′/A, U = −R K_B | D1 | [S2] (Γ, U в сопутствующем калибре) | | F2–F5 | T_ab, ρ, j_r, S | D2 | стандарт; [S1] (поток) | | F6 | FKG | D3 | стандарт | | F7 | ³R | D4 | — | | F8–F9 | 𝓗, 𝓜 | D5 | [S2] (сопутствующий случай); [S1] (6c) (с потоком) | | F10 | массовая форма | D6 | [S2] (12) (без потока), [S1] (16) (с потоком) | | F11 | M_MS | D7 | [S2] (13), [S3] (49), [S4] (16) | | F12–F13 | θ±, произведение | D8 | [S3] (6), (29), (50); [S4] (17) | ## 12. Журнал версий - 1.0-draft (2026-09-28): первая редакция до вывода-проверки (derivation.md) и до кода. - 1.4 (2026-09-29): §16. - 1.3 (2026-09-29): §15. - 1.2 (2026-09-29): §14. - 1.1 (2026-09-29): §13. - 1.0 (2026-09-28): приняты Р1–Р7 derivation.md §6. **Р1 — естественная ошибка черновика контракта**: знак при 𝓗 в тождестве F10 был неверен (−, правильно +); найдена ролью Physics derivation символьно (sympy), до написания кода. Источники: [S1] Milligan et al., arXiv:2504.02600v2; [S2] Bloomfield et al., arXiv:1504.02071v1; [S3] dual null formalism, arXiv:1506.07122v2; [S4] geometric inequalities, arXiv:1607.00199v2 (там k — прошлонаправленный, знак θθ противоположен). ## 13. Изменения v1.1 и их происхождение | # | Изменение | Кто обнаружил проблему (независимо) | |---|---|---| | C1 | Кандидат AH через исходящее расширение θ_out (по росту R), инвариантно к нумерации r | аудит A6; агент A (п. 7) | | C2 | Противоречие `UNCERTAIN` vs `NO_TRAPPED_SPHERES`+`marginal_present` разрешено явным исключением | реализация B (I-1); агент A (п. 1); верификатор (K3a′) | | C3 | Неразрешённые (+,0) → `UNCERTAIN`, не `PAST_TRAPPED_ONLY` | аудит A10; верификатор (K3c); derivation §7 п. 5 | | C4 | σ_round в σ(f′); порог VIOLATED не обнуляется при Σ|T| = 0 | реализация B (I-3); агент A (п. 3); верификатор (K23) | | C5 | Ошибка численной φ′ в σ невязок для `ScalarField` | реализация B (I-4); агент A (п. 3); верификатор (K24) | | C6 | σ_noise по 6-й неделённой разности в τ± | агент A (п. 2: ложный AH/ложный NO_TRAPPED на шуме у касательной сферы) | | C7 | Статус разрешённости `UNRESOLVED` | аудит A7, A11 | | C8 | R = 0 вне вершины-центра → `INVALID_INPUT` | аудит A9 | | C9 | Предупреждения: центр, M_int ≠ M_MS, M < 0, неопределённые rel | аудит A8, A12, A15 | | C10 | Уточнены L2vol, квадратура, M′, область `inner`, h²-сходимость 𝓗 в центре | агент A (п. 5, 8–11); аудит A16; верификатор | Не принято в v1.1 (остаётся ограничением): погрешности входных полей (σ_KB, σ_A) не учитываются (аудит A14); касательные нули не ищутся. ## 14. Изменение v1.2 (C11) **Проблема (найдена в расширении пилота на данных `pbhgr.cosmo_ev`, μ = 0.36 и 0.10):** первый горизонт V1 появляется на одном ребре у центра, где 2m/R скачет от 0 до > 1 за одну ячейку. σ(Rθ±) там O(1), и точки получают класс `DOUBLY_MARGINAL` по неразрешённости, а не как настоящий двойной нуль. По формулировке v1.1 цепочка таких точек без trapped-соседей подпадала под исключение, и статус был `PAST_TRAPPED_ONLY`: благоприятный статус для неразрешённого будущего-trapped ядра. **Правило v1.2:** 1. Точка с τ₊ > τ_max или τ₋ > τ_max (τ_max = 0.1) получает класс `UNRESOLVED` вместо таблицы знаков. 2. Любая точка `UNRESOLVED` (кроме `CENTER`) делает статус геометрии не лучше `UNCERTAIN`: `AH_CANDIDATE` и `FUTURE_TRAPPED_NO_AH_CANDIDATE` сохраняют приоритет, но `status['n_unresolved_points'] > 0` и предупреждение, если неразрешённые точки лежат внутри (по R) кандидата. 3. Исключение для `DOUBLY_MARGINAL` действует только при τ± ≤ τ_max и если обе соседние точки — разрешённые не-маргинальные. 4. Для эволюций (вне модуля): «первый горизонт» — первый снимок со статусом `AH_CANDIDATE`, не первый срез, где 2m/R ≥ 1 хотя бы в одном узле. ## 15. Изменения v1.3 (C12, C13) **C12 (найдено независимой матрицей v2, тест U62, у обеих реализаций A и B одинаково):** на гладких точных данных (скалярный FLRW-фон + возмущение с потоком, N = 100) 𝓗_M в первой точке у центра |X|/σ ≈ 95 → ложный `VIOLATED`. Причина: узловые значения вычисленных полей (M_MS, Γ) несут негладкую ошибку усечения O(h⁴), а |D⁴f − D⁶f| её не видит. Правило: для производной поля f, вычисленного модулем (M_MS, Γ), σ(f′) = |D⁴f − D⁶f| + Σ_k |w_k| σ(f_k) + σ_round, где w_k — веса D⁴, σ(f_k) — узловая оценка ошибки f (σ(M) = R|Γ|σ(Γ), σ(Γ) = σ(R′)/A). **C13:** каждое предупреждение в `status['warnings']` начинается с кода: `CENTER_IRREGULAR`, `M_INT_MISMATCH`, `NEGATIVE_MASS`, `REL_UNDEFINED`, `UNRESOLVED_POINTS`, `UNRESOLVED_INSIDE_AH`, `CELL_BALL_EXCLUDED`, `ALPHA_BETA` (прочие — `OTHER`), затем двоеточие и текст. Принято без изменения контракта: излом (кинк) даёт `VIOLATED`, а не `UNRESOLVED` (верификатор, вопрос К26) — ошибка в безопасную сторону; обнаружение негладкости надёжно только по сходимости на двух сетках (см. decision.md). ## 16. Изменение v1.4 (C14) **Проблема (матрица v2, U62, осталась после v1.3):** на гладких точных данных N = 100 в точке i = 1 оценка |D⁴M − D⁶M| случайно почти нулевая (3.5e-9 при 1e-6 у соседей и истинной ошибке 4.5e-7) → |X|/σ = 95, ложный `VIOLATED`. Разностная оценка ошибки имеет случайные нули. **Правило:** для каждой производной σ_trunc(f′)_i = max_{j ∈ {i−1, i, i+1}} |D⁴f − D⁶f|_j (в пределах сетки); остальные слагаемые σ (узловые, округление, шум) — без изменений.