Пачка 1 ревью: безопасность + порча данных (находки 1-5)
Бэкенд:
- DELETE /api/tags/{id} требовал сессии только фактически — добавлен UserDep;
  регрессия-тест проверяет require_user на каждом /api-роуте (не пройдёт для
  любого нового эндпоинта без UserDep).
- Вложения: SVG отклоняется (скриптуемый формат — inline-отдача = stored XSS),
  лимит 10 МБ на файл, X-Content-Type-Options: nosniff на отдаче.
- Open redirect закрыт: return_to только внутренние пути (не //, не внешние).
- MCP-токен сравнивается constant-time (hmac.compare_digest).
- Дефолтный SESSION_SECRET валит старт валидатором — молчаливо подделываемая
  кука вместо этого даёт явную ошибку конфигурации.
- backend/data/ (runtime-вложения) в .gitignore.

Фронтенд:
- Черновик инлайн-правки больше не переезжает между задачами: при смене
  /tasks/:id сбрасываются descEditing/draft, заголовочный InlineField
  перемонтируется по key=taskId (PATCH старого текста в новую задачу).
- Утечка SSE-подписок: onRealtime сам отписывается при dispose scope —
  N визитов на страницу больше не оставляют N load() на мёртвых инстансах.
- Out-of-order: токен запроса в load() TaskView/ProjectView — поздний ответ
  старого id не перетирает данные нового; ListView — то же на фильтрах.
- Смена фильтра сбрасывает пагинацию: watch(filters, {deep}) (ТЗ 3.6).
- Двойной submit не создаёт дубликаты: busy в TaskForm и quickAdd стека.
- Утечка Pixi: unmount во время init уничтожает рендерер после резолва.
- Оффлайн-старт PWA: /auth/me без сети не роняет onMounted молча.

Тесты: 103 passed (+6: auth-все-роуты, SVG, oversize, nosniff, return_to,
дефолтный секрет). ruff/mypy чисты.

Co-Authored-By: Claude Code <noreply@anthropic.com>
1 parent b830f8d commit 75371931f622219b18def1c0ce998536b8a2d47d
@root root authored 4 hours ago
Showing 17 changed files
View
.gitignore
View
backend/app/api/attachments.py
View
backend/app/api/tags.py
View
backend/app/auth/routes.py
View
backend/app/config.py
View
backend/app/main.py
View
backend/tests/conftest.py
View
backend/tests/test_auth.py
View
backend/tests/test_detailing.py
View
frontend/src/App.vue
View
frontend/src/components/GardenScene.vue
View
frontend/src/components/TaskForm.vue
View
frontend/src/realtime.ts
View
frontend/src/views/ListView.vue
View
frontend/src/views/ProjectView.vue
View
frontend/src/views/StackView.vue
View
frontend/src/views/TaskView.vue