# Ревью Gemini 3.8 Flash — 2026-09-05 ## Контекст Ревью ограничивалось проектом `upload-platform`. Проверены frontend-модули универсального browser-only picker-а, Flask-обёртка, конфигурация и структура проекта. Ниже зафиксированы findings ревью; исправления по этим пунктам в рамках данной записи не выполнялись. ## Критические ошибки и логические баги (High) 1. **Не сбрасывается `fileInputEl.value` при выборе файлов.** **Файл:** `upload/frontend/table/on_files_change.js`. После удаления файла повторный выбор того же файла может не вызвать событие `change`, если значение input не сброшено. 2. **Распаковка лишних файлов и преждевременный OOM в ZIP-фильтре.** **Файл:** `upload/frontend/zip/list_zip_files.js`. Callback `filter` проверяет размер и бюджет, но до декомпрессии не отбрасывает записи с неразрешёнными расширениями. Бинарные файлы могут быть распакованы в память, хотя затем будут отброшены. 3. **Синхронная блокировка UI при распаковке архивов.** **Файл:** `upload/frontend/zip/list_zip_files.js`. `unzipSync` выполняется в главном потоке браузера и может замораживать UI на больших архивах. Предложенное направление: async unzip с чанками или Web Worker. ## Архитектурные недочёты и надёжность (Medium) 4. **Нарушается семантика `File.name` для файлов из папок и ZIP.** **Файлы:** `upload/frontend/table/rebase_tree.js`, `upload/frontend/zip/list_zip_files.js`. При создании нового `File` полный логический путь может попасть в `file.name`, хотя путь должен храниться отдельно в метаданных узла. 5. **Не выполняется слияние папок с одинаковыми путями.** **Файл:** `upload/frontend/table/add_file_with_dedup.js`. Повторное добавление корневого узла с тем же путём может создать два отдельных узла вместо объединения их дочерних элементов. 6. **Потенциально небезопасная вставка HTML в статус.** **Файл:** `upload/frontend/table/set_status.js`. Прямое присваивание `innerHTML` требует гарантировать экранирование всех передаваемых значений либо заменить его на безопасную работу с текстом. 7. **Молчаливый пропуск ошибок ZIP без `cfg.onError`.** **Файлы:** `upload/frontend/table/on_files_change.js`, `upload/frontend/table/on_folder_change.js`. При отсутствии callback интегратор может не получить индикацию ошибки повреждённого архива или превышения лимита. 8. **Падение `app.py` при отсутствии или повреждении `config.json`.** **Файл:** `site/app.py`. Чтение конфигурации выполняется на уровне импорта без обработки исключений; при ошибке Flask-приложение не запускается. ## Мёртвый код и гигиена (Low) 9. **Дубликат `init_upload_table.js`.** Файл выглядит неиспользуемым и дублирует логику текущего picker API. Предложенное направление: удалить либо явно пометить как deprecated после проверки всех импортов. 10. **Пустые служебные каталоги backend.** Каталоги `session` и `upload_refs` содержат только старые `__pycache__`. Требуется отдельное решение о сохранении или очистке структуры. 11. **Недостаточная обработка ошибок сборки в `build.mjs`.** **Файл:** `build.mjs`. Предложено добавить явную обработку ошибки сборки с `process.exit(1)` и определить поведение каталога `dist/` перед сборкой. ## Итог Gemini 3.8 Flash создал 4 задачи: три high/medium направления по ZIP и событиям выбора, а также дополнительный набор архитектурных и гигиенических проверок. Эта запись фиксирует результаты ревью как backlog. Код проекта и рабочая реализация picker-а в рамках документирования не изменялись. ## Проверка записи - Файл ревью создан в `HISTORY/`. - Исходники проекта не изменялись. - Findings сохранены в исходной классификации High, Medium и Low.