Пачка 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>
1 parent 114bdc5 commit cb0db00ce0252915bd69ac2f65986abf030ea1d8
@root root authored 4 hours ago
Showing 13 changed files
View
backend/alembic/versions/e7f8a9b0c1d2_coin_event_uniques.py 0 → 100644
View
backend/app/api/tasks.py
View
backend/app/api/xp.py
View
backend/app/mcp_server.py
View
backend/app/models.py
View
backend/app/services/garden.py
View
backend/app/services/xp.py
View
backend/tests/test_detailing.py
View
frontend/src/game/GardenRenderer.ts
View
frontend/src/taskui.ts
View
frontend/src/views/GardenView.vue
View
frontend/src/views/ProjectView.vue
View
frontend/src/views/TaskView.vue