# Чистка: удалён мёртвый legacy-код загрузки напрямую (2026-08-26) ## Контекст При разборе стресс-тестов выяснилось: я (AI) гонял HTTP-стресс через `POST /upload` (прямой multipart), тогда как реальная загрузка в проде идёт через **ВМ-буфер** (`PUT` на ВМ WebDAV → `POST /api/upload_refs` → `contracts_upload_sink`). Прямой `/upload` — мёртвый legacy-эндпоинт, который фронт не вызывает. ## Что удалено (коммит `aa58522`, −176 строк) - `site/routes/upload_bp.py`: - эндпоинты `POST /upload` и `POST /unzip-upload`; - функции `_check_ext`, `_unzip`, константа `ALLOWED`; - пустой blueprint `upload_bp`. - `site/routes/__init__.py`: регистрация `upload_bp`. - `site/static/app.js`: мёртвые константы `UPLOAD_URL`, `CONVERT_URL`, `UNZIP_URL`. - `tests/test_upload_security.py` — целиком (тестировал удалённые `_check_ext`/`_unzip`). - `tests/test_routes.py`: классы `TestUpload`, `TestUnzipUpload`. ## Что оставлено (рабочее) - `contracts_upload_sink` + `_store_and_parse` + `_convert` — sink для `/api/upload_refs` (VM-буфер). - `pages_bp /upload/` — отдача ES-модулей `upload/frontend` (клиентский ZIP). ## Почему ревью Sonnet не заметило Ревью искало сломанное (трассировки ошибок), а не мёртвый код. `/upload`/`/unzip-upload` не падали и не давали 500 — просто не вызывались. Обнаруживаются только аудитом «какие эндпоинты фронт реально дёргает». ## Проверки - `py_compile` + `node -c app.js` — OK. - `import app` — OK, 24 роута; `/upload` (POST) и `/unzip-upload` отсутствуют, `/api/upload_refs` и `/upload/` на месте. - Юнит-тесты: 92 passed (было 102). ## Хвост `tests/load/stress_http.py` всё ещё бьёт по удалённому `/upload` — нужен переписывание на `/api/upload_refs` (PUT на ВМ → refs).