feat: ж/д слой + cant_swim в скоринг + профили вне модели

Определение специфических рекомендаций (матрица профилей §8):

1. Ж/д слой (закрыт мёртвый railway ×2.5 у РАС):
   - /api/v1/water/{case_id} отдаёт railway=rail как LineString
     (без service/industrial/military веток), кэш общий v2;
   - railway_warning «перекрыть/проверить немедленно» по профилям;
   - SearchMap: Polyline слой ж/д (тёмно-красный), счётчики 💧/🚂.

2. cant_swim → профиль не_умеет_плавать (water ×3.0, без изменения
   радиуса, critical_warning «обследовать водоёмы НЕМЕДЛЕННО»):
   - раньше чекбокс влиял только на текст, в скоринге был пробел;
   - derive в analyze._derive_profiles — работает и для closed_cases.

3. unmodeled_profiles: ДЦП/слабое зрение/слух — честная пометка
   «вне поведенческой модели» с пояснением (vector_tasks B12:
   профили без аналога не выдавать за учтённые); блок на фронте
   в карточке здоровья.

Площадь воды: сферический эксцесс, проверен на квадрате 53° (744017 м²
vs 743272 точного). Тесты: 202 passed (новый test_cant_swim_profile).
This commit is contained in:
2026-09-09 13:12:55 +03:00
parent 98e8e58023
commit f20080305d
2069 changed files with 803865 additions and 97 deletions
@@ -0,0 +1,44 @@
"""Experimental module exposing a function to generate a core schema that validates callable arguments."""
from __future__ import annotations
from collections.abc import Callable
from typing import Any, Literal
from pydantic_core import CoreSchema
from pydantic import ConfigDict
from pydantic._internal import _config, _generate_schema, _namespace_utils
def generate_arguments_schema(
func: Callable[..., Any],
schema_type: Literal['arguments', 'arguments-v3'] = 'arguments-v3',
parameters_callback: Callable[[int, str, Any], Literal['skip'] | None] | None = None,
config: ConfigDict | None = None,
) -> CoreSchema:
"""Generate the schema for the arguments of a function.
Args:
func: The function to generate the schema for.
schema_type: The type of schema to generate.
parameters_callback: A callable that will be invoked for each parameter. The callback
should take three required arguments: the index, the name and the type annotation
(or [`Parameter.empty`][inspect.Parameter.empty] if not annotated) of the parameter.
The callback can optionally return `'skip'`, so that the parameter gets excluded
from the resulting schema.
config: The configuration to use.
Returns:
The generated schema.
"""
generate_schema = _generate_schema.GenerateSchema(
_config.ConfigWrapper(config),
ns_resolver=_namespace_utils.NsResolver(namespaces_tuple=_namespace_utils.ns_for_function(func)),
)
if schema_type == 'arguments':
schema = generate_schema._arguments_schema(func, parameters_callback) # pyright: ignore[reportArgumentType]
else:
schema = generate_schema._arguments_v3_schema(func, parameters_callback) # pyright: ignore[reportArgumentType]
return generate_schema.clean_schema(schema)