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,71 @@
pyasn1-0.6.4.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4
pyasn1-0.6.4.dist-info/METADATA,sha256=oJLZn60eN0TWqibu8lmOjuI0PqQDE3ynPQbczvGdcOI,8411
pyasn1-0.6.4.dist-info/RECORD,,
pyasn1-0.6.4.dist-info/WHEEL,sha256=K260EYznzXsJYBQGqmI8VTxEdiZYNvDZwW9cBh9-_MA,91
pyasn1-0.6.4.dist-info/licenses/LICENSE.rst,sha256=Kq1fwA9wXEoa3bg-7RCmp10oajd58M-FGdh-YrxHNf0,1334
pyasn1-0.6.4.dist-info/top_level.txt,sha256=dnNEQt3nIDIO5mSCCOB5obQHrjDOUsRycdBujc2vrWE,7
pyasn1-0.6.4.dist-info/zip-safe,sha256=AbpHGcgLb-kRsJGnwFEktk7uzpZOCcBY74-YBdrKVGs,1
pyasn1/__init__.py,sha256=oxwp-n9Hk2dKvO2Dwjk2L-icbpp0gGjPIC2dOyihtdM,66
pyasn1/__pycache__/__init__.cpython-312.pyc,,
pyasn1/__pycache__/debug.cpython-312.pyc,,
pyasn1/__pycache__/error.cpython-312.pyc,,
pyasn1/codec/__init__.py,sha256=EEDlJYS172EH39GUidN_8FbkNcWY9OVV8e30AV58pn0,59
pyasn1/codec/__pycache__/__init__.cpython-312.pyc,,
pyasn1/codec/__pycache__/streaming.cpython-312.pyc,,
pyasn1/codec/ber/__init__.py,sha256=EEDlJYS172EH39GUidN_8FbkNcWY9OVV8e30AV58pn0,59
pyasn1/codec/ber/__pycache__/__init__.cpython-312.pyc,,
pyasn1/codec/ber/__pycache__/decoder.cpython-312.pyc,,
pyasn1/codec/ber/__pycache__/encoder.cpython-312.pyc,,
pyasn1/codec/ber/__pycache__/eoo.cpython-312.pyc,,
pyasn1/codec/ber/decoder.py,sha256=MBYFXHETpdM-YwjV9aaYYpBCZ5uBJvt7M2evPBmeyMs,81248
pyasn1/codec/ber/encoder.py,sha256=lktVv9FIkVHh9PRdzI9bRMXwiQCRnlaQ-52y_ZU4Fas,29850
pyasn1/codec/ber/eoo.py,sha256=dspLKc2xr_W5Tbcr2WcfLd_bJLhOjotq1YxKn3DCQNI,639
pyasn1/codec/cer/__init__.py,sha256=EEDlJYS172EH39GUidN_8FbkNcWY9OVV8e30AV58pn0,59
pyasn1/codec/cer/__pycache__/__init__.cpython-312.pyc,,
pyasn1/codec/cer/__pycache__/decoder.cpython-312.pyc,,
pyasn1/codec/cer/__pycache__/encoder.cpython-312.pyc,,
pyasn1/codec/cer/decoder.py,sha256=-mX9lPevt5ErPHSF_OWdJDk9gctKUyFPntaFBees7Zg,4603
pyasn1/codec/cer/encoder.py,sha256=R_6zLWVDqQQdSR6DrlXQcpb7VVa0t8g2XqYDyT9RvXE,9852
pyasn1/codec/der/__init__.py,sha256=EEDlJYS172EH39GUidN_8FbkNcWY9OVV8e30AV58pn0,59
pyasn1/codec/der/__pycache__/__init__.cpython-312.pyc,,
pyasn1/codec/der/__pycache__/decoder.cpython-312.pyc,,
pyasn1/codec/der/__pycache__/encoder.cpython-312.pyc,,
pyasn1/codec/der/decoder.py,sha256=hqAxJ6tI4f80B67Oq5mMoUptyDH_iryVQZ8MEGV_FfU,3442
pyasn1/codec/der/encoder.py,sha256=Ms2hqkhbpPPj-CK6XdD0ZpZX1ZJSsA-0GPKXHogI3zg,3493
pyasn1/codec/native/__init__.py,sha256=EEDlJYS172EH39GUidN_8FbkNcWY9OVV8e30AV58pn0,59
pyasn1/codec/native/__pycache__/__init__.cpython-312.pyc,,
pyasn1/codec/native/__pycache__/decoder.cpython-312.pyc,,
pyasn1/codec/native/__pycache__/encoder.cpython-312.pyc,,
pyasn1/codec/native/decoder.py,sha256=ZQXHXu30asaueFC97S39hvwQnJnpirTv-_inffDx0j4,9132
pyasn1/codec/native/encoder.py,sha256=YD2UzkVVUNCwiy4eM06dehe383xm9hMqTFpY_83vocg,9198
pyasn1/codec/streaming.py,sha256=Vp-VDh0SlA5h7T133rne9UNlJlqv2ohpUzVlSCGjq24,6377
pyasn1/compat/__init__.py,sha256=-9FOJV1STFBatf2pVRiOYn14GmCKC8RY3TYCxOqfRXY,112
pyasn1/compat/__pycache__/__init__.cpython-312.pyc,,
pyasn1/compat/__pycache__/integer.cpython-312.pyc,,
pyasn1/compat/integer.py,sha256=lMXqbJBTyjg34Rhx6JlFcXyoQxDaeXGxhaIIab86hX8,404
pyasn1/debug.py,sha256=u-WmIFfewqp0041ezvtTjvhZcU9K14OI6p00ArXZ63g,3494
pyasn1/error.py,sha256=e352oqW33seeh2MbIF27sFSgpiegjstabCMFx2piR0M,3258
pyasn1/type/__init__.py,sha256=EEDlJYS172EH39GUidN_8FbkNcWY9OVV8e30AV58pn0,59
pyasn1/type/__pycache__/__init__.cpython-312.pyc,,
pyasn1/type/__pycache__/base.cpython-312.pyc,,
pyasn1/type/__pycache__/char.cpython-312.pyc,,
pyasn1/type/__pycache__/constraint.cpython-312.pyc,,
pyasn1/type/__pycache__/error.cpython-312.pyc,,
pyasn1/type/__pycache__/namedtype.cpython-312.pyc,,
pyasn1/type/__pycache__/namedval.cpython-312.pyc,,
pyasn1/type/__pycache__/opentype.cpython-312.pyc,,
pyasn1/type/__pycache__/tag.cpython-312.pyc,,
pyasn1/type/__pycache__/tagmap.cpython-312.pyc,,
pyasn1/type/__pycache__/univ.cpython-312.pyc,,
pyasn1/type/__pycache__/useful.cpython-312.pyc,,
pyasn1/type/base.py,sha256=tjBRvXIQSiHES5-e5rBbsnn5CtIvBgCuflujDbdrtkM,22050
pyasn1/type/char.py,sha256=Rvj5ypQLPNXcdHkfUV8nul1XX66R_Akn0g2HUyLj1qY,9438
pyasn1/type/constraint.py,sha256=jmrt5esLa095XdfS0beqaoRuUjnuHiTKdkTdCcKx1FI,21915
pyasn1/type/error.py,sha256=2kwYYkbd2jXIVEE56ThLRmBEOGZfafwogEOo-9RV_GY,259
pyasn1/type/namedtype.py,sha256=jnTClIUoRZi025GTY9GlMlMI-j5dqEcv_ilzZ7i0hUQ,16179
pyasn1/type/namedval.py,sha256=84u6wKOfte7U47aWrFqIZRM3tO2ryivpsBqVblPezuc,4899
pyasn1/type/opentype.py,sha256=jjqSbTgAaCxlSHSf66YcLbrxtfh_98nAx2v8wzW35MU,2861
pyasn1/type/tag.py,sha256=S8mt-viyumzggnB9O1880Rh8XWGUXBKT_ygAazUTBkE,9865
pyasn1/type/tagmap.py,sha256=alJ9ZfDGTAsPeygHT6yONTagUkCjlgij82YXpPaQ_-8,3000
pyasn1/type/univ.py,sha256=mwJbH74vcT8nSIfaSS_4aEJEzd2MqV6kqHYoFSpymPM,109578
pyasn1/type/useful.py,sha256=waqrYyKvH31rdRYvPnSLxAN3R03nFqxcD5ZOmbRXjbI,5389