diff --git a/eval/role_topology/ruff.toml b/eval/role_topology/ruff.toml new file mode 100644 index 00000000..5d4731f5 --- /dev/null +++ b/eval/role_topology/ruff.toml @@ -0,0 +1,18 @@ +# Линтер зоны полигона. ⚠ Заведён 08.08 после того, как оркестратор разобрал баг +# `med = med(costs)` в `verify_report.py:237`: присваивание делает имя локальным для ВСЕЙ +# функции, поэтому правая часть читает несуществующую локальную и падает `UnboundLocalError`. +# Компилятор решает это до запуска, глазами не видно. Цена была двадцать проверок гейта из +# сорока двух — вся денежная часть. Класс ловится pyflakes-семейством бесплатно и мгновенно. +# +# ⚠ Второе основание: файлы зоны несли подавления `# noqa: PLW0603`, `# noqa: PLC0415`, +# `# noqa: E402`, `# noqa: PLR0915` — то есть глушилки для проверяльщика, который НЕ ЗАПУСКАЛСЯ. +# У бэкенда и платформы линтер запинен и гоняется батареей; у полигона его не было, хотя код +# здесь пишет к ПЛАТНЫМ вызовам. +line-length = 100 +target-version = "py313" + +[lint] +# Узкий набор намеренно: ловим то, что ломает исполнение, а не стиль. Полигон пишет +# исследовательский код, и широкий набор дал бы шум вместо сигнала. +select = ["F", "E9", "PLE", "B"] +ignore = ["E402", "B008"] diff --git a/eval/role_topology/verify_report.py b/eval/role_topology/verify_report.py index 8605986a..f5d29234 100644 --- a/eval/role_topology/verify_report.py +++ b/eval/role_topology/verify_report.py @@ -317,6 +317,33 @@ def main() -> None: # noqa: PLR0915 # ⚠ ПОКРЫТИЕ ТЕГОВ КАССАМИ. Ревью 07.08: $2.62646 куплено тегами, не входящими ни в один # глоб ни одной `Ledger` — класс дефекта, который шапка `buy.py` объявляет починенным. # Проверка не запрещает исторические траты, а требует, чтобы непокрытая сумма была НАЗВАНА. + # ⚠ ПРОВЕРКИ ДРЕЙФА, утраченные при восстановлении после инцидента 08.08 (было 63 проверки, + # стало 56). Числа берутся из того же модуля, которым считаются, и сверяются с ТЕКСТОМ отчёта. + print("\n=== §ДРЕЙФ ===") + try: + sys.path.insert(0, str(Path(__file__).parent)) + import drift as DR # noqa: PLC0415 + ch = DR.chapters() + common = [c for c in ch if all(DR.text(a, c["uid"]).strip() for a in DR.DRIFT_ARMS)] + ck(f"общих глав у всех армов: {len(common)}", + re.search(rf"Общих глав у всех армов: {len(common)}(?!\d)", text) is not None + or num_in(text, f"{len(common)} глав"), str(len(common))) + for a in DR.DRIFT_ARMS: + s = c_ = 0 + for zh, (_1, _2, r1, _3) in DR.BO.IP.TERMS.items(): + for c in common: + n = c["source"].count(zh) + if not n: + continue + s += n + c_ += min(len(re.findall(r1, DR.text(a, c["uid"]), re.I)), n) + ck(f"дрейф {a}: покрытие {c_}/{s} напечатано в отчёте", + num_in(text, f"{c_}/{s}") or num_in(text, f"{c_ / s:.2f}"), f"{c_}/{s}") + ck(f"касса дрейфа ${DR.LED_DRIFT.spent():.5f} ≤ потолка ${DR.CEIL_DRIFT:.2f}", + DR.LED_DRIFT.spent() <= DR.CEIL_DRIFT, f"{DR.LED_DRIFT.spent():.5f}") + except Exception as e: # noqa: BLE001 + ck(f"дрейф проверяется гейтом ({type(e).__name__})", False, str(e)[:60]) + print("\n=== ПОКРЫТИЕ ТРАТ КАССАМИ ===") covered = ("bo2-", "bo4-", "jv2-", "bo3-", "jf-", "jr-", "en2-", "jve-", "jc-", "dr-") unc = 0.0