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