(low) JobSettingsPanel/handleSave: очистка max_concurrency/max_retries молча шлёт 0 → 422 #1430

Closed
opened 2026-06-15 05:54:45 +00:00 by bot-backend · 0 comments
Collaborator

Severity: low · Категория: frontend · Файл: frontend/src/components/admin/JobSettingsPanel.tsx:199-200

JobSettingsPanel.tsx:199-200 — max_retries: Number(draft.max_retries), max_concurrency: Number(draft.max_concurrency). draft.* хранятся как строки controlled-инпутов (RowDraft, строки 38-41). При очистке поля Number('')===0. Для max_concurrency инпут имеет min={1} (строка 410), для max_retries min={0} (строка 395) — но это лишь нативные подсказки, в state и в body уходит 0 без клиентской валидации. Backend JobSettingUpdate: max_concurrency: int|None = Field(None, ge=1, le=20) (backend/app/schemas/job_settings.py:33) — 0 отвергается с 422 (для max_retries ge=0 — 0 проходит, проблема только у max_concurrency). Импакт: очистка max_concurrency (валидное намерение перенабрать) → toast «ошибка 422», апдейт не применяется. Чинить: при пустой строке отправлять прежнее серверное значение / не включать поле в update, либо клиентская валидация min перед mutate.

Почему баг: Очистка поля max_concurrency (валидное действие при намерении перенабрать) приводит к отправке max_concurrency=0 на бэкенд без какого-либо предупреждения. Для конкуррентности воркера 0 — это бессмысленный/опасный апдейт (job может перестать обрабатываться). Никакой клиентской валидации min на отправку нет, ошибка проглатывается до бэкенда.

Как чинить: Перед mutate валидировать: если draft.max_concurrency === '' или Number < 1 — показать ошибку и не отправлять; аналогично для max_retries (>=0). Либо подставлять предыдущее серверное значение вместо молчаливого 0.


deep-audit «армия ботов 2» · verify+harden, confidence 0.85 · unit U85

**Severity:** low · **Категория:** frontend · **Файл:** `frontend/src/components/admin/JobSettingsPanel.tsx:199-200` JobSettingsPanel.tsx:199-200 — max_retries: Number(draft.max_retries), max_concurrency: Number(draft.max_concurrency). draft.* хранятся как строки controlled-инпутов (RowDraft, строки 38-41). При очистке поля Number('')===0. Для max_concurrency инпут имеет min={1} (строка 410), для max_retries min={0} (строка 395) — но это лишь нативные подсказки, в state и в body уходит 0 без клиентской валидации. Backend JobSettingUpdate: max_concurrency: int|None = Field(None, ge=1, le=20) (backend/app/schemas/job_settings.py:33) — 0 отвергается с 422 (для max_retries ge=0 — 0 проходит, проблема только у max_concurrency). Импакт: очистка max_concurrency (валидное намерение перенабрать) → toast «ошибка 422», апдейт не применяется. Чинить: при пустой строке отправлять прежнее серверное значение / не включать поле в update, либо клиентская валидация min перед mutate. **Почему баг:** Очистка поля max_concurrency (валидное действие при намерении перенабрать) приводит к отправке max_concurrency=0 на бэкенд без какого-либо предупреждения. Для конкуррентности воркера 0 — это бессмысленный/опасный апдейт (job может перестать обрабатываться). Никакой клиентской валидации min на отправку нет, ошибка проглатывается до бэкенда. **Как чинить:** Перед mutate валидировать: если draft.max_concurrency === '' или Number < 1 — показать ошибку и не отправлять; аналогично для max_retries (>=0). Либо подставлять предыдущее серверное значение вместо молчаливого 0. --- <sub>deep-audit «армия ботов 2» · verify+harden, confidence 0.85 · unit U85</sub>
bot-backend added the
week ревью 1
label 2026-06-15 05:54:45 +00:00
bot-backend added the
scope/backend
label 2026-06-15 11:02:03 +00:00
Sign in to join this conversation.
No milestone
No project
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set.

Reference: lekss361/gendesign#1430
No description provided.