|
Пачка 3 ревью: гонки наград и остатки фронтенда
- Гонка дейли: уникальный частичный индекс (source, day) + колонка coin_events.day; параллельные POST /api/xp/daily отдают granted=False вместо 500 (IntegrityError ловится молча). - Гонка ensure_garden (параллельные GET /api/garden): работа в savepoint, при нарушении уникальности (uq_coin_level, kind+ref_id) — откат и выход; дубли бонусов уровня и растений исключены. - Параллельное закрытие: PATCH и MCP update_task берут задачу с FOR UPDATE OF tasks (Postgres; SQLite игнорирует) — двойных наград/спавнов нет. - redetail утверждённой задачи — no-op: ai_proposal больше не стирается, фоновая LLM не будится (worker и так работает только с raw). - Фронт: ProjectView подписан на SSE (task/project changed/deleted); SSE-refetch на странице задачи не затирает начатый ввод тега; просрочка дедлайна считается по локальной дате, а не UTC; бросок предмета мимо сада игнорируется (не прилипает к краю); пауза refetch'а сада держится до конца своего move-запроса, а не фиксированные 300 мс. - Тест: redetail no-op для approved. 110 passed. Co-Authored-By: Claude Code <noreply@anthropic.com> |
|---|
|
|
| backend/alembic/versions/e7f8a9b0c1d2_coin_event_uniques.py 0 → 100644 |
|---|
| backend/app/api/tasks.py |
|---|
| backend/app/api/xp.py |
|---|
| backend/app/mcp_server.py |
|---|
| backend/app/models.py |
|---|
| backend/app/services/garden.py |
|---|
| backend/app/services/xp.py |
|---|
| backend/tests/test_detailing.py |
|---|
| frontend/src/game/GardenRenderer.ts |
|---|
| frontend/src/taskui.ts |
|---|
| frontend/src/views/GardenView.vue |
|---|
| frontend/src/views/ProjectView.vue |
|---|
| frontend/src/views/TaskView.vue |
|---|