Отлично, поехали. Сначала приборка:

PR #78 открыт. Ставлю фоновое наблюдение за CI и ботами:

Статус по всем трём фронтам:

1. Деплой Scala-бэкенда — PR #78 готов (issue #77):

  • Dockerfile: sbt-стадия через sbt-native-packager на нативной платформе билдера (байткод JVM платформонезависим — тот же приём, что спас CI-время в UI), тонкий JRE-рантайм, non-root пользователь, токен для Maven-артефакта движка — BuildKit-секретом.
  • CD-workflow: публикует ghcr.io/rabestro/dicechess-analytics-api под amd64+arm64 — после этого и stack:up на вашем Mac заработает целиком.
  • compose: сервис api переведён с локальной Python-сборки на образ; переменные не тронуты.
  • Проверено локально: arm64-образ собран и отдал /, /api/games, /api/players (с вычисленным рейтингом) против локальной базы; backend:check зелёный. CI и боты — под фоновым наблюдением.

После вашего merge: workflow опубликует образ, и я выкачу на сервер (git pull && docker compose pull api && up -d api в ~/dicechess-analytics — путь уже разведал) со смоук-проверкой, включая поиск игроков через серверный UI.

2. Sonnet-агенты отработали параллельно, оба PR с честной верификацией:

  • #75 — lefthook: pre-commit заменён, хуки делегируют существующим инструментам (gitleaks по staged-диффу, ruff по py-файлам, backend:check на pre-push только при изменениях в backend/), агент прогнал хуки вживую.
  • #76 — Starlight: сайт документации на Astro/Starlight по образцу движка, 6 страниц собираются, mkdocs удалён.

Напоминание про порядок: оба трогают docs/development.md — вливайте #75 → #76; конфликт во втором, если появится, разрулю. И мелкое следствие работы агента: lefthook уже установлен как git-хук локально, а его конфиг пока живёт только в ветке #75 — до merge при коммитах в этом репо будет безвредное предупреждение «config not found».

Итого на вашем ревью три PR: #75, #76, #78. Как вольёте #78 — продолжаю деплой.

Замечания разобраны, фикс запушен в PR #78:

  1. Применил: UID/GID закреплены на 10001 — проверил в пересобранном образе (iduid=10001(app)). Предсказуемые идентификаторы пригодятся при любых будущих security-политиках.
  2. Отклонил с обоснованием: chown файлов приложения на рантайм-пользователя ослабил бы контейнер, а не укрепил. Файлы, принадлежащие root и доступные app только на чтение — это иммутабельность: процесс не может переписать собственные бинарники. Писать в /app сервису нечего — логи в stdout, кэшей на диске нет.

Оба треда отвечены и зарезолвлены. PR #78 в финальном виде ждёт вашего merge — после него CI опубликует образ, и я сразу выкатываю на ASUS. Напомню и про 76 от Sonnet-агентов (порядок: #75 → #76).