| 2026-09-21 |

Пачка 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>
root
committed
13 hours ago
|
Сад: реальный fullscreen на мобильных — вписывание по меньшей стороне
...
- fullscreen-бокс занимает весь экран (на вертикальном телефоне — всю высоту),
аспект сетки в fullscreen отключается
- рендерер вписывает сад по меньшей стороне и центрирует (базовый сдвиг
отделён от panOffset, учтён в зуме, панораме и клиентских координатах)
- земля/газон рисуются с запасом за края сетки — вокруг поля трава,
а не фон страницы
Co-Authored-By: Claude Code <noreply@anthropic.com>
root
committed
15 hours ago
|
Пачка UI: fullscreen сада, отступ empty-state, шапка задачи, форма на всю ширину
...
- fullscreen сада: резерв 64px в ширине бокса — кнопки зума и инвентарь не уезжают за экран
- «Всё спокойно» на главной не слипается с блоком быстрого ввода
- на экранах ≥641px действия шапки страницы не переносятся под длинный заголовок
- форма редактирования на весь контейнер (form-group кита растянута с 600px)
Co-Authored-By: Claude Code <noreply@anthropic.com>
root
committed
15 hours ago
|
Пачка UI + Ollama + SSE-реактивность (ТЗ 3.14)
...
- Бейдж приоритета с иконкой (PriorityBadge) во всех видах
- Фильтры страницы проекта запоминаются в localStorage (глубокий watch)
- DurationInput (ч/мин, шаг 5), ConfirmDialog, пагинация, иконки удаления
- Диалоги: «В архив» warning, кнопки поменяны местами
- Автодетализация на Ollama 192.168.1.130 (qwen3.5:2b, think:false)
- SSE /api/events: шина realtime, публикации после коммита, coarse-события + refetch
- Фронт: realtime.ts, удаление поллинга StackView, refetch по видам,
подавление во время drag сада, дедуп XP-тостов
- Тесты 93 passed, e2e двух вкладок; ТЗ 0.24
Co-Authored-By: Claude Code <noreply@anthropic.com>
root
committed
15 hours ago
|
| 2026-09-20 |
Сад: пиксель-арт сцена на PixiJS 8 — спрайты из кода, рендерер вне Vue-reactive
...
- PixiJS 8 (WebGL): nearest, roundPixels, нативный пиксель 16px×2 (клетка 32px),
динамический импорт — pixi в async-чанке (main не раздут, PWA в лимитах)
- src/game/pixelart.ts: пиксель-матрицы → canvas → CanvasSource(nearest) с кэшем
- src/game/sprites.ts: тайлы травы/дикой земли/изгороди, домик, 6 видов × 3
стадии растений, декорации, кольца rare/epic, блёстки — без внешних ассетов
- src/game/GardenRenderer.ts: слои terrain/house/items/fx, дифф items по id,
z-sort, drag на канвасе, grow-in/покачивание/блёстки, один тикер
- GardenScene.vue: renderer через shallowRef — deep-reactive-прокси Vue ломал
identity-проверку shared defaultScale в Pixi (TypeError при первом drag)
- ТЗ 0.16: 3.13 дополнен (отрисовка сцены), вопрос 8 закрыт
Co-Authored-By: Claude Code <noreply@anthropic.com>
root
committed
1 day ago
|
Сад: инвентарь декораций — покупка кладёт на склад, drag на карту и обратно
...
- Бэк: garden_items.x/y nullable; покупка декорации не размещает её,
а кладёт в инвентарь; PATCH с x/y null возвращает декорацию в инвентарь
(растениям — 400); авторазмещение учитывает только размещённые элементы.
- Фронт: полоса инвентаря под сценой с чипами, drag из инвентаря на карту
с призраком у курсора, drag размещённой декорации обратно в инвентарь,
GnAlert «Куплено…» в маркете. Фикс: убран pointer-events:none у декораций —
из-за него декорации нельзя было перетаскивать по карте.
- Миграция f2a3b4c5d6e7, локали ru/en/uk, ТЗ 0.15.
Co-Authored-By: Claude Code <noreply@anthropic.com>
root
committed
1 day ago
|
Сад-сцена: монеты, растения на карте, магазин декораций и расширений
...
Контент открывается за опыт, покупается за монеты: XP — ранг садовника
(только растёт), монеты — валюта сада. Монеты за закрытие = floor(xp/2)
(заголовок X-Earned-Coins) и бонус 25×L за уровень; журнал — coin_events.
- Бэкенд: CoinEvent/GardenItem + миграция с backfill монет; сервис сада
(баланс, авторазмещение спиралью вокруг домика, виды по уровням,
premium только у rare/epic); API /api/garden — сцена, перемещение,
апгрейд растений, магазин декораций и расширений карты.
- Фронт: SVG-сцена GardenScene (сетка 20px, домик, drag&drop, поповер
роста), кошелёк в шапке, маркет (расширения, декорации, каталог видов
с замками), тост «+XP • +N монет», локали ru/en/uk.
- Тесты сада (10), ТЗ 0.14 (3.13 + модель данных).
Co-Authored-By: Claude Code <noreply@anthropic.com>
root
committed
1 day ago
|