Обновление 2026-05-04 · Week 1 OPS

Главное в одной фразе: теперь ты узнаешь о падениях из Telegram, а не от звонка клуба, и панель деплоится сама на push в main.

1. Появились публичные страницы для команды

  • errors.recore.su — все ошибки из panel-api / desktop-client / billing / rebornapi (GlitchTip — open-source Sentry).
  • status.recore.su — живой мониторинг 6 ключевых URL'ов (GitLab, panel, billing, CRM). Обновляется каждую минуту (Uptime Kuma).
  • reborndev.ru/ops — runbook: куда смотреть и что нажимать когда что-то происходит.

2. Алерты в Telegram

Когда любой из мониторов падает (URL не отвечает > 2 минут, panel-api ловит exception, GitLab отдаёт > 5s) — приходит сообщение в Telegram. Делать ничего не надо, оно уже работает.

3. Авто-деплой panel.recore.su

Раньше после merge в main кто-то заходил по SSH и руками делал git pull + docker compose up. Теперь — CI делает это сам за ≤5 минут. Миграции БД остались с ручным подтверждением (кнопка deploy:panel:migrate в pipeline UI) — чтобы сломать ничего нельзя случайно.

4. Manual update flow для desktop-client

  • В карточке клуба в panel.recore.su появилась кнопка «Обновить весь клуб» — даёт NATS-команду на все ПК клуба.
  • Чекбокс «Авто-обновление» — opt-in. По умолчанию выключен. Заблокирован для production-клубов и канала stable.
  • Можно закрепить версию на конкретном ПК для smoke-теста — POST /api/computers/:id/version-override.

5. DORA метрики

GitLab пушит события (MR opened/merged, pipeline succeeded/failed) на panel — будут считаться cycle_time, deploy_freq, change_fail_rate за последние 30 дней. Открой GET /api/dora/metrics?days=30 или дашборд в Grafana. Пока данные накапливаются.

6. Ветка develop теперь read-only

Все 5 репо: recore-team-assistant-new, billing, club-client-pc-image, desktop-client, recore-team-assistant. Push и merge в develop запрещены. Через ~7 дней (~10.05) ветку удалю окончательно. Делай feature от test:

git fetch && git checkout test && git pull
git checkout -b feature/your-thing

7. Что от тебя сейчас требуется

  • Если есть открытые MR в develop — переориентируй их на test (в UI MR'а: Edit → Target branch).
  • В IDE: git fetch && git checkout test && git pull.
  • Если знаешь что в твоём приложении надо ловить ошибки — попроси чтобы добавили Sentry SDK (DSN'ы лежат в .env panel-сервера, имена GLITCHTIP_DSN_*).

Главное в одной фразе: ветка develop теперь называется test, и для попадания в прод (main) обязательны 48 часов в beta.

1. Новый процесс веток

  • Было: develop → beta → main
  • Стало: test → beta → main
  • Свои feature-ветки делаешь от test и MR-ишь в test. Дальше test → beta и через 48 часов beta → main.
  • Если CI ругается «Merge в main допустим только из ветки beta» — значит ты пытаешься перепрыгнуть стадию. Сначала в beta.
  • В main и beta мержить могут только Maintainer'ы. Если у тебя кнопка Merge в MR серая — попроси Maintainer'а нажать.

2. Канал релизов dev переименован в test

  • Было три канала: stable / beta / dev
  • Стало: stable / beta / test
  • Если в твоём коде или скрипте захардкожена строка "dev" — пока работает (API временно принимает оба), но лучше поменяй на "test".

3. Канал клуба теперь выбирается в panel.recore.su

  • В карточке клуба три кнопки: stable, beta, test. Что выбрано — то и катится на ПК клуба автоматически при следующем апдейте.
  • Раньше канал передавался самим клиентом (?channel=...) и его было легко перепутать. Теперь источник правды один — БД панели.
  • Флаг «production-клуб» жёстко фиксирует канал stable и блокирует переключение на test/beta пока флаг включён. Снимай флаг только осознанно.

4. 48 часов в beta — теперь реальное правило, а не текст

  • Версия не уйдёт в stable, пока не пролежала в beta минимум 48 часов и не отработала на тестовых клубах без падений.
  • Проверка работает в двух местах: в CI (gate:check-beta) и на стороне панели при кнопке «Promote → stable».
  • Раньше можно было гнать в main мимо beta — теперь нет.

5. Что от тебя сейчас требуется

  • В рабочих копиях своих репо: git fetch && git checkout test && git pull (если у тебя был чекаут на develop).
  • В CI-шаблонах своих репо: проверь не осталось ли $CI_COMMIT_BRANCH == "develop" — если есть, замени на "test".
  • Если что-то твоё (скрипт, конфиг, шпаргалка) ссылается на канал dev — переименуй в test.
  • Ветки переименованы: developtest в репо recore-team-assistant-new, billing, club-client-pc-image, desktop-client, recore-team-assistant. Старая develop ещё существует как backward-compat — будет удалена через неделю когда все переключатся.
  • Канал релизов devtest. Везде в коде, в БД (миграция 014), в CI шаблонах, в этом документе. API временно принимает оба значения и переписывает dev в test.
  • Новый flow: test → beta → main. Текстовое описание в разделе про ветки.
  • 48ч cooldown beta → stable — теперь реально работает (не только описано). Проверка в:
    • CI (gate:check-beta в pipeline на MR в main)
    • Panel API: новый POST /api/clients/promote применяет правило promotion_rules.min_hours_in_from
  • Per-club канал из панели. GET /api/clients/latest?clubSlug=X теперь читает канал из clubs.release_channel по slug, а не из query-параметра. Клуб переключаешь в panel.recore.su (кнопки stable/beta/test в карточке клуба). Если slug не найден — 404 (раньше был fallback на query, маскировал тайпы).
  • Production-флаг у клуба теперь принудительно ставит канал stable и блокирует переключение на test/beta пока флаг включён.
  • Защита веток ужесточена в recore/recore-team-assistant (старый billing): merge в main и beta теперь только Maintainer (раньше Developer мог).
  • В группу recore добавлены: Чернорай Владислав (Developer), Названцев Андрей (Maintainer).
  • Maintainer-список (могут мержить в protected-ветки): Гвоздев Дмитрий, Корешов Артём, Названцев Андрей.
  • Токен GITLAB_TOKEN ротирован — личный PAT nik45114 в .env.production на CRM- и panel-серверах. CI пуши в GitLab, как и раньше, идут через CI runners (отдельные runner-токены).

Что ещё нужно знать: если CI ругается «Merge в main допустим только из ветки beta» — это новый gate:check-beta, выполняй test → beta → main через MR. Если desktop-client (sever/rio) пишет «Update check failed» — подожди или дёрни panel-разработчика, идёт деплой.

INFO v2 · апрель 2026 · для вайбкодеров

RE:CORE — как устроена наша разработка

Подробный справочник по системе RE:CORE для людей которые пишут код через AI-чаты (Claude Code, Codex CLI). Читай сверху вниз — к концу документа ты сможешь сам принять свою первую фичу, понять почему упал CI и настроить рабочее место за один промпт.

Для кого: вся команда, вне зависимости от опыта Язык: человеческий Редакция: v2

0Кому этот документ

Если тебе приходится гуглить слова вроде «git merge» или «docker compose» — ты по адресу. Этот документ специально написан так, чтобы каждый термин объяснялся простым языком прямо в тексте. Ничего специально не пропускаем.

«Вайбкодер» — это кто?
Человек, который пишет код не руками, а диктует нейросети что сделать. Вы говорите Claude Code «почини этот баг», он правит файлы и коммитит. Ваша задача — понимать что хорошо а что плохо, читать ошибки, принимать решения. Код можно не уметь писать — это делает AI.
Что тебе нужно уметь
  • Открывать терминал (консоль)
  • Копипастить команды
  • Читать сообщения об ошибках (хоть ты и не программист — красный текст не значит катастрофа)
  • Описывать задачу нейросети по-человечески
Что будет делать AI
  • Писать и править код
  • Запускать тесты
  • Коммитить и пушить в Git
  • Объяснять что она сделала и почему

1Основы за 10 минут

Если ты никогда не работал с кодом — прочти этот раздел. Без него дальше будет непонятно.

1.1 Git — «машина времени для файлов»

Git — программа, которая запоминает каждое изменение в проекте. Если что-то сломалось, ты возвращаешься к предыдущей версии за 2 секунды.

Репозиторий (repo)

Папка проекта под надзором Git. У каждого нашего продукта есть свой репо — например, recore/rebornapi-backend. Лежит на нашем сервере reborndev.ru/git.

Коммит (commit)

Одно сохранение в машине времени. Содержит: какие файлы изменились, кто изменил, когда, и подпись: «что именно тут сделано». Пример: fix: починил кнопку логина.

Ветка (branch)

Параллельная вселенная проекта. Основная ветка — main (то что у клиентов). Ты делаешь свою — feature/fix-login — работаешь там, а когда готово, вливаешь в main. Тогда клиенты видят твой фикс.

Push / Pull

push — отправить свои коммиты на сервер. pull — забрать чужие коммиты себе. Работает как облако для файлов.

твой компьютер GitLab (reborndev.ru/git) ┌──────────────┐ ┌──────────────────────┐ │ │ git push ──► │ │ │ локальная │ │ главный репозиторий │ │ копия │ git pull ◄── │ (main, test…) │ │ │ │ │ └──────────────┘ └──────────────────────┘

1.2 CI/CD — «робот-проверяльщик»

CI/CD (Continuous Integration / Continuous Deployment) — автоматический робот, который просыпается каждый раз, когда ты что-то запушил. Он:

  1. Берёт твой код
  2. Собирает из него программу (билдит)
  3. Запускает тесты (проверяет что ничего не сломано)
  4. Если всё ок — отправляет результат на сервер / в магазин приложений / в панель
  5. Если плохо — пишет тебе «всё, дальше не пущу, смотри ошибку»
ты пишешь код робот CI делает проверку результат ────────────── ───────────────────────── ───────── ┌──────────────────────┐ git push ───────► │ build → test → deploy│ ───────► ✓ зелёный pipeline └──────────────────────┘ версия в панели │ ▼ если что-то падает ───────► ✗ красный pipeline код не доедет до клубов

У нас CI называется GitLab CI. Он настроен в файле .gitlab-ci.yml в корне каждого репо. Тебе редактировать его обычно не надо — Никита уже всё настроил.

1.3 Pipeline, Job, Stage, Artifact

Это термины которые ты увидишь в логах и в GitLab-интерфейсе.

Pipeline

Весь процесс «собрать и проверить» от начала до конца. Один pipeline = один ваш пуш в ветку.

Stage (этап)

Группа работ. Пример: build, validate, publish. Следующий этап не начнётся, пока не закончится предыдущий.

Job (задача)

Конкретное действие внутри этапа. Например, build:docker собирает Docker-образ, validate:rebornapi проверяет endpoint /health.

Artifact (артефакт)

Файл, который job оставил после себя (например, manifest.json, image.tar). Следующий job может его взять и использовать.

1.4 Docker — «виртуалка для программы»

Docker упаковывает программу вместе со всем, что ей нужно для работы (Node.js, Python, библиотеки, env-переменные) в один контейнер. Получается коробка которую можно запустить где угодно и она будет работать одинаково — на ноуте разработчика, на сервере, в CI.

Image (образ)

Рецепт / архив программы. Пример: reborndev.ru:5050/recore/rebornapi:v1.2.3 (когда GitLab Container Registry будет подключён; сейчас образы живут локально на сервере). Сам по себе не работает — это заготовка.

Container (контейнер)

Запущенный экземпляр образа. Как процесс Word когда ты открыл документ. Контейнеров из одного образа можно запустить хоть 100.

Dockerfile

Текстовый файл-рецепт: «возьми Node.js, скопируй мой код, запусти npm install, стартуй на порту 3000». Из него CI собирает image.

Registry

Хранилище образов. GitLab Container Registry пока не включён глобально — образы собираются в CI и лежат на сервере как файлы; в будущем подключим через reborndev.ru:5050 с авторизацией по GitLab-токену.

1.5 Manifest — «паспорт программы»

Каждая наша сборка отдаёт JSON-файл со своей «биографией»: какая версия, какой коммит, какие endpoint-ы она открывает, какая версия базы данных нужна. Это и есть manifest.

{
  "version": "1.2.3",
  "channel": "stable",
  "gitCommit": "abc1234",
  "builtAt": "2026-04-22T10:00:00Z",
  "compatibility": {
    "dbSchemaVersion": 42,
    "breakingChanges": false,
    "minPanelVersion": "1.0.0"
  },
  "endpoints": {
    "health":   "/health",
    "manifest": "/api/manifest"
  },
  "required": {
    "env":   ["DATABASE_URL", "JWT_KEY"],
    "ports": [5000]
  },
  "migrations": ["001_InitialCreate.sql", "002_AddUsers.sql"]
}
Зачем это надо. Панель клубов смотрит на manifest перед тем как применить новую версию. Если в нём сказано «мне нужна БД версии 42», а в клубе БД версии 41 — панель не пустит версию и предложит сначала мигрировать. Это защита от того, что ИИ что-то сломал и не заметил.

1.6 Merge Request (MR) — «заявка на слияние веток»

Когда ты закончил работу в своей ветке, ты хочешь её содержимое влить в test или main. Для этого в GitLab создаётся Merge Request (в GitHub это называется Pull Request, но суть та же).

  • MR — это страница в GitLab где видны все твои изменения построчно
  • Там же проходит CI — если упал, кнопка «merge» неактивна
  • Другой член команды делает code review — читает диффы и оставляет комментарии
  • Когда все довольны — нажимается кнопка «Merge», и твой код попадает в целевую ветку

1.7 Зачем всё это

Потому что мы работаем в команде и с нейросетями. Нейросеть может что-то сломать в тихаря: починить одно, сломать другое. Без CI мы этого не заметим до жалобы клуба. С CI — машина проверит за нас: код не попадёт в прод, пока не пройдёт все проверки.

2Глоссарий терминов

Если встретишь в тексте или в логах непонятное слово — ищи тут.

Api (API)
Программный интерфейс. У нас чаще всего — HTTP endpoint на бэке, к которому стучатся мобилки, админка и клиенты. Пример: POST /api/auth/login.
Artifact (артефакт)
Файл, который один CI-job передаёт следующему. Обычно лежит 30 дней в GitLab и его можно скачать.
Backend / Frontend
Backend — программа на сервере (API, обработка данных). Frontend — то что пользователь видит (сайт, мобилка, десктоп).
Branch (ветка)
Параллельная версия репозитория. У нас используются: test (самое свежее), beta (проверка), main (то что у клиентов), feature/* (твоё рабочее).
Build (сборка)
Процесс превращения исходного кода в запускаемую программу. Для Docker — docker build, для Android — сборка APK, для сайта — npm run build.
CI/CD
Continuous Integration / Continuous Deployment. Робот-автоматизатор проверок и выкладок.
Channel (канал)
Уровень «зрелости» версии. У нас три: test (экспериментальное), beta (проверяется 2-3 клубами), stable (идёт всем).
Commit (коммит)
Сохранение изменений в Git. Имеет уникальный id (SHA) и подпись.
Container (контейнер)
Запущенная программа внутри Docker. Изолирована от системы как песочница.
Dockerfile
Рецепт сборки Docker-образа.
Endpoint
Конкретный адрес у API. Пример: GET /health, POST /api/clubs/new.
Env (environment variable)

Переменная окружения — настройка программы, которую задают снаружи, а не хардкодят в коде. Нужна чтобы одна и та же программа на ноуте разработчика, в CI и в проде подключалась к разным БД/серверам/ключам без правки исходников.

Что там обычно лежит:

  • DATABASE_URL — строка подключения к БД: postgres://user:password@host:5432/dbname
  • JWT_SECRET, JWT_KEY — секретный ключ для подписи токенов авторизации
  • REDIS_URL — адрес кэша
  • TELEGRAM_BOT_TOKEN, GITLAB_TOKEN, OPENAI_API_KEY — токены внешних API
  • APP_VERSION, APP_CHANNEL, APP_GIT_COMMIT — CI прокидывает сюда версию и SHA коммита, программа печатает их в /api/manifest
  • NODE_ENV, ASPNETCORE_ENVIRONMENTdevelopment / production, меняет логирование и оптимизации
  • PORT — на каком порту слушать

Где хранятся: локально в файле .env (который никогда не коммитится в git — он в .gitignore). В проде — в docker-compose.yml через env_file, в CI — в Settings → CI/CD → Variables. Правило: если ты видишь токен или пароль в коде напрямую — это баг, переноси в env.

В коде читаются так: process.env.DATABASE_URL (Node.js), os.environ["DATABASE_URL"] (Python), Environment.GetEnvironmentVariable("DATABASE_URL") (.NET).

Health (health-check)
Специальный endpoint (обычно /health) который возвращает 200 OK если программа жива.
Image (Docker image)
Сохранённый образ программы в Docker. Из него создают контейнеры.
Job / Stage / Pipeline
Pipeline — один запуск CI целиком. Stage — этап внутри pipeline (build, validate, publish). Job — конкретная команда в этапе. Подробно: раздел 1.3.
Manifest
Паспорт версии в JSON: какая версия, какой коммит, какие endpoints открывает, какая схема БД нужна. Панель читает его перед применением. Подробно: раздел 1.5, рантайм-вариант: раздел 19.
Merge (слияние)
Объединение веток. «Merge ветки feature/X в test» = взять все коммиты из feature/X и применить к test.
Merge Request (MR)
Заявка на merge в GitLab. В GitHub это Pull Request (PR).
Migration (миграция БД)
Скрипт для изменения структуры базы данных (добавить колонку, таблицу). Применяется автоматически при деплое.
Pipeline
Один запуск CI (весь набор jobs). Зелёный = всё ок, красный = что-то упало.
Protected branch
Ветка которую нельзя случайно сломать. В main/beta нельзя пушить напрямую — только через MR.
Pull / Push
Pull = забрать свежее с сервера, push = отправить своё на сервер.
Registry
Хранилище Docker-образов. У нас пока локально на сервере; планируется GitLab Container Registry на reborndev.ru:5050.
Regression test
Тест который проверяет что старая починенная функциональность не сломалась снова. У нас хранятся в panel.recore.su.
Rollback (откат)
Возврат к предыдущей версии программы. Панель делает авто-rollback если новая версия падает 5 минут подряд.
Runner (GitLab runner)
Исполнитель CI-задач. Отдельный компьютер на котором крутится твой pipeline.
SHA (commit hash)
Уникальный id коммита. Длинный — 40 символов, короткий — 7. Пример: a1b2c3d.
SSH
Протокол удалённого доступа. ssh root@46.37.123.214 = «зайти в чужой компьютер через терминал».
Tag
Метка на коммите. У нас версии помечаются тегами: v1.2.3.
Webview
Встроенный браузер внутри нативного приложения. В десктоп-клиенте у Андрея так показывается веб-контент.

3Как общаться с AI-чатом

Главный инструмент вайбкодера — Claude Code (основной) или Codex CLI (для оркестратора). Оба работают в терминале в папке проекта: видят файлы, правят код, запускают команды, коммитят. От того насколько точно ты формулируешь задачу зависит качество результата.

3.1 Как дать AI контекст проекта

Первое что обеспечит хороший результат — правильный контекст. Три вещи которые надо сказать AI в начале сессии:

  1. Путь к проекту — в какой папке ты работаешь.
  2. Краткое описание — что это за продукт и кто с ним работает.
  3. Текущая задача — что именно сейчас надо сделать.
Пример стартового промпта
Я работаю в проекте recore-team-assistant-new, репо лежит по пути
d:\2\REBORN_client\codexrebornhub.

Это CRM + AI-агент платформа для команды. Backend — Fastify
на TypeScript, frontend — Next.js. Я пишу код только через тебя,
я не программист.

Сейчас нужно: починить баг что на странице /projects не
открывается модалка «Новый проект» — нажимаю кнопку, ничего
не происходит.

Сначала изучи репо, потом предложи план, потом реализуй.
В проекте есть файл CLAUDE.md в корне — туда ИИ смотрит автоматически. Там уже описан стек, команды сборки, конвенции. Тебе не надо каждый раз объяснять «что у нас Fastify + TypeScript» — это уже в CLAUDE.md.

3.2 Хорошие принципы запросов

Пиши так
  • Конкретно: «кнопка «Сохранить» на странице /settings»
  • Одна задача — один запрос (не мешай всё в кучу)
  • Говори что должно получиться, не как реализовать
  • Прилагай скриншот если описать сложно
  • Проси план до кода: «сначала расскажи план, потом начнём»
  • Проси тест: «напиши тест который проверит что фикс работает»
Не пиши так
  • «Почини всё» — AI не знает что именно
  • «Сделай лучше» — без критерия «лучше» ничего не выйдет
  • «Добавь фичу X и заодно перепиши auth» — две задачи
  • «Сделай как у Apple» — нейронка не знает как у Apple
  • «Не делай ничего странного» — да, такие отрицания хуже работают

3.3 Режим планирования (Plan Mode) и суперсилы

Claude Code — не просто автодополнение. В нём есть режимы и встроенные «скиллы» (суперсилы), которые радикально меняют поведение AI. Пользуйся ими — это разница между «генерит первый попавшийся код» и «сначала думает, потом делает».

Plan Mode (режим планирования)

Нажми Shift+Tab дважды в Claude Code — попадёшь в Plan Mode. В этом режиме AI не трогает файлы, только исследует код и пишет пошаговый план. Ты читаешь план, одобряешь его кнопкой «Accept» — и только тогда он начинает править.

Когда включать Plan Mode
  • Большая фича с неочевидной архитектурой
  • Рефакторинг в нескольких файлах
  • Когда сам плохо понимаешь что надо — пусть AI сначала разберётся
  • Перед любой правкой в деньгах/авторизации/миграциях
Когда можно без него
  • Опечатка в тексте, маленький фикс в одном файле
  • Добавить простой endpoint по образцу существующих
  • Когда уже третий раз просишь одно и то же

Суперсилы (superpowers)

У Claude Code есть набор встроенных «скиллов» — это заготовленные процедуры которые AI знает как выполнять идеально. Они активируются когда AI видит что задача подходит, либо когда ты напрямую просишь.

СуперсилаКогда срабатываетЧто делает
brainstorming «давай подумаем», «какие варианты», «как лучше» Задаёт уточняющие вопросы по одному, не кодит пока не ясен дизайн
systematic-debugging «починить баг», «тест упал», «непонятно что не так» Ищет корневую причину, не маскирует ошибку, воспроизводит баг локально
test-driven-development «напиши фичу», «реализуй логику» Сначала пишет падающий тест, потом код, потом проверяет что тест зелёный
writing-plans «план», «как будем делать», «разбей на задачи» Создаёт пошаговый план с чекпоинтами и точками проверки
verification-before-completion перед тем как сказать «готово» Запускает тесты/сборку/линт и показывает реальный вывод — не объявляет победу без доказательств
code-review «проверь мой код», «сделай ревью» Прицельно ищет баги, security-дыры, нарушения конвенций проекта
Как вызвать явно. Напиши в чате /brainstorming, /debug, /review или скажи прямо: «используй навык test-driven-development». Claude Code прочитает нужный скилл и пойдёт по нему шаг за шагом.

Полезные режимы и команды

  • /clear — очистить контекст если AI «залип» или пошёл не туда
  • /compact — сжать историю разговора, освободить контекст, не теряя сути
  • /review — попросить ревью текущих изменений перед коммитом
  • /fast — переключиться на Opus 4.6 с ускоренным выводом (меньше задержка, та же модель)
  • /help — список всех команд
  • Ctrl+C — прервать текущее действие (если AI начал делать не то)
  • Shift+Tab (дважды) — в Plan Mode, (ещё раз) — обратно
Совет для вайбкодера. Когда AI делает не то что ты хочешь — не пиши «нет, не так, попробуй по-другому». Это плохой сигнал. Лучше: «стоп. остановись. объясни что ты понял из задачи, и скажи где ты можешь ошибаться». AI сам найдёт где не понял — и ты сэкономишь 10 минут метаний.

4Примеры запросов к AI

Эти примеры можно копировать прямо в Claude Code или Codex CLI. Замени {переменные} на свои.

4.1 Старт работы над задачей

Склонировать репо и завести ветку
Склонируй https://reborndev.ru/git/recore/rebornapi-backend.git в папку
d:\2\REBORN_client\rebornapi-backend, создай новую ветку
feature/fix-login-button от ветки test, и покажи что внутри проекта.
Мне нужно понять структуру.
Добавить новый endpoint
В проекте rebornapi-backend добавь endpoint POST /api/clubs/new,
который принимает JSON { "name": "строка", "city": "строка" },
валидирует что оба поля непустые и длиной от 2 до 120 символов,
и возвращает 201 с id созданного клуба или 400 с текстом ошибки.

Используй стиль который уже есть в других контроллерах проекта.
Не забудь обновить .recore-project.yml если добавляется endpoint.
Написать тест
Напиши регрессионный тест который проверяет что
POST /api/auth/login с body {"login":"admin","password":"test"}
возвращает 200 и в ответе есть поле "token".

Тест добавь в формате который панель RE:CORE принимает
через /api/regression-tests. Покажи итоговый JSON который
я могу вставить в панель руками.

4.2 Разбор ошибки

CI упал — разобраться почему
У меня упал pipeline в GitLab CI, job называется validate:rebornapi.
Вот последние строки лога (прикрепляю). Объясни простыми словами
что пошло не так, и предложи что сделать. Не правь код пока я не
одобрю план.
Красный тест
Один из регрессионных тестов упал: имя "Логин админа клуба работает".
Ошибка: ожидали 200, получили 500.

Изучи последние изменения в ветке test, найди что именно могло
сломать логин, покажи мне предполагаемую причину и план починки.

4.3 Локальная проверка

Запустить CI локально
Установи gitlab-runner локально и покажи как запустить наш
.gitlab-ci.yml на моём ноуте. Я хочу проверить pipeline
не пушая пока в GitLab.

Сервер у меня Windows, WSL есть. Пиши команды по шагам, я буду
запускать и показывать вывод.
Поднять проект локально
Я склонировал recore/rebornapi-backend. Помоги запустить проект
локально: что установить, какие env-переменные задать, какие порты
откроются. После запуска мы должны увидеть ответ 200 от /health.

У меня Windows 11, Docker Desktop установлен.

4.4 Создание MR

Коммит + пуш + MR
Сделай коммит всех текущих изменений с понятным сообщением,
запушь ветку в origin, и создай Merge Request в GitLab
(reborndev.ru/git) с целевой веткой test.

В описании MR напиши:
- что именно было сделано (bullet list)
- что нужно проверить ревьюверу
- ссылка на задачу (если есть номер — спроси у меня)

В конце дай мне ссылку на созданный MR.

4.5 Просьба объяснить код

Разжевать для вайбкодера
Объясни мне файл src/routes/auth.ts простыми словами. Я не
программист. Для каждой функции — что она делает и когда вызывается.
Если что-то кажется странным или потенциально багованным — тоже
подсвети.

5Чего НЕ делать с AI

Не проси AI пушить в main / beta

Эти ветки защищены. Даже если скажешь «запушь в main» — CI не пустит. Ты получишь красную ошибку и потратишь время. Правильно: пуш в feature/* → создать MR в test → через 48 часов MR в main.

Не давай AI пароли, токены, ключи

Никогда не пиши в чат пароли от серверов, API-ключи, приватные JSON-ключи Firebase. Если нужен доступ — дай AI название переменной (CI_PANEL_TOKEN), а значение возьмут из GitLab Variables. В коде — только process.env.ИМЯ, никогда не хардкодь.

Не проси AI «удалить всё лишнее»

Такие неконкретные просьбы опасны. AI может удалить нужное. Правильно: «удали файл X», «удали неиспользуемые импорты в src/routes/auth.ts».

Не делай больших прыжков без коммитов

Если AI уже 5 раз подряд правил код, а коммита не было — останови и сделай коммит. Иначе при ошибке придётся откатывать всё разом.

Не верь «всё починил» на слово

AI склонен к оптимизму. После «готово!» — всегда запусти тесты или попроси запустить: «прогони npm test и покажи вывод». Слова «должно работать» ничего не значат, пока тест не зелёный.

Не проси git reset --hard не подумав

Эта команда безвозвратно удаляет твои локальные изменения. Если попросил AI откатиться — убедись что всё что нужно закоммичено или запушено. Без этого работа пропадёт.

6Как читать ошибки CI

Когда в GitLab pipeline загорелся красным — не паникуй. Вот как смотреть что случилось.

6.1 Где смотреть

  1. Открой https://reborndev.ru/git → свой репо → вкладка CI/CD → Pipelines
  2. Найди красный pipeline (недавний, твоё имя в авторе)
  3. Кликни на красный кружок — увидишь список jobs
  4. Клик по красному job → откроется лог выполнения
  5. В логе ищи строки со словами ERROR, FAILED, Error:

6.2 Типовые ошибки и что они значат

ERROR: Merge в main допустим только из ветки beta.
Ты сделал MR не из beta в main. Правильно: test → beta → main. Вернись на шаг назад и мержи в beta сначала.
ERROR: Не заданы переменные CI_PANEL_URL или CI_PANEL_TOKEN
В GitLab не настроены переменные. Попроси Никиту зайти в Settings → CI/CD → Variables и добавить. Ты сам их трогать не должен.
/health не отвечает 200 (job: validate)
Твоё приложение упало при запуске. Частые причины: не хватает env-переменной, упал migrate БД, порт занят. В логе выше будет docker logs с настоящей ошибкой.
В канале beta не найдено passed-версии с коммитом X
Ты пытаешься мержить beta → main, но версия в beta ещё не прошла validate, или pipeline в beta упал. Сначала почини beta, дождись зелёного, потом мержи.
Версия должна пробыть в beta минимум 48ч (сейчас Xч)
Это не ошибка, это правило безопасности. Подожди. Если срочный hotfix — отдельный процесс с двумя апрувами, попроси Никиту.

6.3 Как скормить ошибку AI

Не копируй весь лог — копируй последние 50-100 строк, там самое важное. В Claude Code просто скажи: «прочти лог последнего pipeline и объясни что не так».

Шаблон запроса при красном CI
Pipeline упал на этапе {build|validate|publish|regression}.
Последние 100 строк лога:

---
[сюда вставь лог]
---

Объясни простыми словами что произошло, есть ли решение,
и если да — какие файлы тебе нужно поправить. План покажи
до того как править.

7Первый день: общая подготовка

Это надо сделать всем, вне зависимости от роли. Дальше — индивидуальные инструкции по проектам.

7.1 Программы которые надо установить

Обязательно
  • Githttps://git-scm.com/download/win (Windows) или brew install git (Mac)
  • Node.js 20 LTShttps://nodejs.org (нужен почти везде)
  • Docker Desktophttps://www.docker.com/products/docker-desktop
  • IDE — VS Code (https://code.visualstudio.com)
  • Claude Code (основной) — npm install -g @anthropic-ai/claude-code
  • Codex CLI (для оркестратора/параллельной работы) — npm install -g @openai/codex
По ситуации
  • .NET 8 SDK — если ты работаешь с ReBornAPI (Гвоздев Дмитрий)
  • Android Studio — Теплов Влад, Скоков Денис
  • Xcode (только на Mac) — Теплов Влад для iOS
  • Python 3.11+ — Радаев Влад для видеоаналитики
  • WSL2 — Windows-разработчикам полезно для bash-скриптов

7.2 Ссылки — сохрани в закладки

СервисURLЛогин
GitLabhttps://reborndev.ru/gitсвой логин, выдаст Никита
CRMhttps://reborndev.ruсвой email, выдаст Никита
Панель клубовhttps://panel.recore.suадминский логин
Documentationhttps://reborndev.ru/info/этот документ

7.3 Настройка рабочего места — одним промптом

Не настраивай Git/GitLab руками — запусти Claude Code в папке где будут проекты, и вставь этот промпт. ИИ сам проверит что стоит, что не стоит, установит недостающее, поставит git config, подскажет где брать токен GitLab и склонирует первый репо.

Аналог MCP-промпта. Точно так же работает панель установки MCP (CRM → Настройки → MCP) — там одна кнопка «скопировать промпт», ты вставляешь в Claude Code, и он сам всё делает. Здесь — то же самое, но для первоначальной настройки компа.
Промпт — настрой мне рабочее место (вставь в Claude Code)
Настрой мне рабочее место разработчика RE:CORE с нуля. Я вайбкодер,
я не программист — делай сам, не проси меня копировать команды.

МОИ ДАННЫЕ:
- Имя: {Моё Имя}
- GitLab email: {my@email.com}
- GitLab логин: {выданный Никитой}
- Рабочая папка: d:\2\REBORN_client  (Windows) или ~/recore (macOS/Linux)
- Моя роль: {мобилка / админка / бэкенд / CRM / биллинг / CCTV / техпанель / десктоп}

ЧТО ПРОВЕРИТЬ И ПОСТАВИТЬ (в этом порядке, пропускай если уже стоит):

1. Git — git --version
   Windows: winget install Git.Git --silent --accept-package-agreements --accept-source-agreements
   macOS: xcode-select --install
   Linux: sudo apt-get install -y git

2. Node.js 20 LTS — node --version
   Windows: winget install OpenJS.NodeJS.LTS --accept-source-agreements
   macOS: brew install node@20
   Linux: curl -fsSL https://deb.nodesource.com/setup_20.x | sudo bash && sudo apt install -y nodejs

3. Docker Desktop — docker --version
   Windows: winget install Docker.DockerDesktop
   macOS: brew install --cask docker
   Linux: curl -fsSL https://get.docker.com | sh

4. Claude Code — claude --version
   Если нет: npm install -g @anthropic-ai/claude-code

5. Codex CLI (для AI-оркестратора) — codex --version
   Если нет: npm install -g @openai/codex

6. Git config (если ещё не задан):
   git config --global user.name "{Моё Имя}"
   git config --global user.email "{my@email.com}"
   git config --global core.autocrlf true  # только Windows
   git config --global init.defaultBranch main

ЛОГИН В GITLAB:
7. Открой в браузере https://reborndev.ru/git, залогинься.
8. Настрой 2FA (Settings → Account → Enable 2FA) — обязательно.
9. Создай Personal Access Token: User Settings → Access Tokens
   scope: api, read_repository, write_repository.
   Скопируй токен (показывается только один раз).
10. Сохрани токен в gh-кеш чтобы git не спрашивал пароль:
    echo "https://{gitlab-login}:{token}@reborndev.ru" >> ~/.git-credentials
    git config --global credential.helper store

КЛОНИРУЙ МОИ РЕПО ПО МОЕЙ РОЛИ:
11. На основе поля «роль» выше выбери нужные репо из раздела
    «Первый день» документа https://reborndev.ru/info/ и склонируй.
    Для каждого: cd папка → git checkout test.

ПОСЛЕ УСТАНОВКИ:
12. Покажи мне список что установил, что уже стояло, что пропустил.
13. Проверь что в каждом склонированном репо git remote -v
    указывает на reborndev.ru/git.
14. В конце выведи единую короткую инструкцию «что делать дальше»
    (открой такой-то репо, прочитай CLAUDE.md, следующий шаг — прочитать
    раздел про твою роль в https://reborndev.ru/info/).

Если какой-то шаг требует моего ввода (пароль, 2FA код, токен) —
остановись и напиши чего тебе не хватает. Всё остальное делай сам.
Что внутри. Промпт ссылается на этот INFO-документ — ИИ заглянет в раздел «Первый день» и подберёт тебе репо по роли. Если ты добавил роль в CRM — можешь попросить «прочитай мою роль в CRM и склонируй мне только то что нужно».

7.4 Первый тестовый коммит

После настройки открой любой из склонированных репо, запусти Claude Code и попроси:

Создай новую ветку feature/{моё-имя}-hello от test, сделай
в README.md пометку «{Моё Имя} подключился {сегодняшняя дата}»,
закоммить, запушь в origin и создай MR в test через GitLab API
(reborndev.ru/git). В описании MR — одна строка «первый коммит
нового участника команды».

Через 2-3 минуты CI прогонится, MR появится на https://reborndev.ru/git → твой репо → Merge Requests. Никита увидит, одобрит, смерджит. Это подтверждение что связка ноут → git → GitLab → CI → панель работает у тебя end-to-end.

8Первый день — Гвоздев Дмитрий

Гвоздев Дмитрий
ReBornAPI + админская панель клубов

Ты отвечаешь за бэкенд на .NET 8 и админ-панель клуба (веб-фронт). Это центральные продукты — от тебя зависит больше всего.

8.1 Твои репозитории

  • https://reborndev.ru/git/recore/rebornapi-backend.git — основной API
  • https://reborndev.ru/git/recore/reborn-admin-frontend.git — админ-панель клуба

8.2 Пошаговая подготовка

Установи общие программы
См. раздел 7.1. Обязательно Git, Node 20, Docker Desktop, Claude Code, + .NET 8 SDK (https://dotnet.microsoft.com/download).
Склонируй оба репо
git clone https://reborndev.ru/git/recore/rebornapi-backend.git и git clone https://reborndev.ru/git/recore/reborn-admin-frontend.git. Оба в d:\2\REBORN_client\.
Переключись на test
В каждом репо: git checkout test && git pull.
Запусти API локально
Попроси Claude Code: «Я открыл rebornapi-backend. Помоги запустить локально с Docker Compose, покажи что /health отвечает 200». У тебя должен заработать http://localhost:5000/health.
Первый тестовый commit
Создай ветку: git checkout -b feature/dima-first-commit test
Открой README.md, добавь строку «Гвоздев Дмитрий был тут, 2026-04-22», сохрани.
Закоммить: git add README.md && git commit -m "chore: test commit to verify CI"
Пушни: git push origin feature/dima-first-commit
Создай MR в test через GitLab UI. CI должен стать passed через 5-10 минут.
Проверь что версия дошла до панели
Открой https://panel.recore.su/versions, найди новую dev-версию с твоим коммитом. Если не видно — значит CI не долетел до publish. См. раздел «Частые проблемы».
Добавь endpoint /api/manifest
Если его ещё нет в твоём API — попроси Claude Code добавить. Панель будет его дёргать для валидации. Пример кода в ci-templates/README.md в этом репо.

8.3 Типичные задачи Димы

  • Новый endpoint в API → ветка feature/api-{short-name} → MR в test
  • Изменение схемы БД → обязательно миграция + бамп dbSchemaVersion в .recore-project.yml
  • Баг в админке → ветка fix/admin-{short-name} → MR с регрессионным тестом
  • Hotfix в проде → отдельный процесс: ветка hotfix/* → MR в main с меткой «hotfix» + два апрува

8.4 Что тебе важно помнить

Любое изменение схемы БД = новая миграция. Не правь существующие миграции — создавай новые. Иначе клубы с уже применённой старой версией получат конфликт.
Endpoint /api/manifest — обязательный. Если его нет или он возвращает неправильную структуру — validate:rebornapi в CI упадёт.

9Первый день — Теплов Влад

Теплов Влад
Мобильное приложение для пользователей (Android + iOS)

Ты делаешь мобилку, в которой клиент клуба бронирует ПК, видит баланс, читает уведомления.

9.1 Твои репозитории

  • recore/mobile-client-android (PID=63) — Android (native Kotlin + Jetpack Compose, в папке native-android/)
  • recore/mobile-client-ios (PID=64) — iOS (Swift)

Обе ветки test → beta → main уже настроены. main и beta protected (Maintainer-only merge), test доступен для пуша всем разработчикам репо.

9.2 Как собрать AAB через GitLab CI (рекомендуется)

Pipeline сам подписывает релизный AAB production-ключом (без debug-key). Триггерится на каждый push в test, beta, main.

Сделай ветку от test и закодь
git checkout test && git pull
git checkout -b feature/my-thing
# правки в native-android/
git push origin feature/my-thing
Создай MR feature/* → test
В GitLab UI или: https://reborndev.ru/git/recore/mobile-client-android/-/merge_requests/new. Pipeline автоматом запустит build_android.
Дождись зелёного pipeline
Открой pipeline page. Зелёный = AAB готов и подписан production-ключом.
Скачай AAB
В pipeline UI справа кнопка «Browse» или «Download». Файл лежит в output/app-release.aab. Прямая ссылка вида: https://reborndev.ru/git/recore/mobile-client-android/-/jobs/<JOB_ID>/artifacts/file/output/app-release.aab

9.3 Как собрать AAB локально (если CI лежит или нужно отладить)

Понадобится JDK 17 + Android SDK (через Android Studio).

# 1. Клон репо
git clone https://reborndev.ru/git/recore/mobile-client-android.git
cd mobile-client-android

# 2. Переключись на нужную ветку
git checkout test  # или beta / main / feature/your-branch

# 3. Получи production keystore у Никиты (.jks файл) и пароли
#    Положи keystore в безопасное место, например ~/.keystores/recore-upload-key.jks

# 4. Экспортируй переменные окружения (под Linux/Mac)
export ANDROID_KEYSTORE=$HOME/.keystores/recore-upload-key.jks
export ANDROID_KEYSTORE_PASS='ПАРОЛЬ_KEYSTORE'
export ANDROID_KEY_ALIAS='reborngg-recore-upload'
export ANDROID_KEY_PASS='ПАРОЛЬ_КЛЮЧА'

# (Windows PowerShell)
# $env:ANDROID_KEYSTORE = "$HOME\.keystores
ecore-upload-key.jks"
# $env:ANDROID_KEYSTORE_PASS = 'ПАРОЛЬ'
# $env:ANDROID_KEY_ALIAS = 'reborngg-recore-upload'
# $env:ANDROID_KEY_PASS = 'ПАРОЛЬ'

# 5. Собрать AAB
cd native-android
./gradlew :app:bundleRelease

# 6. Файл будет здесь:
#    native-android/app/build/outputs/bundle/release/app-release.aab
Без ANDROID_KEYSTORE переменных :app:bundleRelease подпишет debug-ключом — Play Store такой AAB отклонит. Это норм для локальной отладки, не норм для публикации.

9.4 Как залить AAB в Google Play

Открой Play Console
play.google.com/console → твоё приложение «RE:CORE Mobile»
Выбери дорожку (track)
  • Internal testing — для своих тестеров (до 100 человек), доступно через час после загрузки
  • Closed testing — beta-тестеры по списку email/группам
  • Production — все пользователи в Play Store
Соответствие каналам RE:CORE: test → Internal, beta → Closed, main → Production.
Создай новый релиз
«Create new release» → загрузи app-release.aab → впиши release notes (changelog) → «Save» → «Review release» → «Start rollout».
После аппрува — обнови статус в panel
Когда Play Review одобрит → в panel.recore.su → раздел Versions → найти твою версию → выставить storeReviewStatus = approved. Без этого gate-mobile-promotion.yml не пропустит MR в main.

9.5 Как залить AAB в RuStore

RuStore Console
console.rustore.ru → твоё приложение → Releases.
RuStore принимает APK, не AAB
Нужно дополнительно собрать APK:
./gradlew :app:assembleRelease
# Файл: native-android/app/build/outputs/apk/release/app-release.apk
В CI шаблон уже встроен и AAB и APK сборки — спроси Никиту если нужен отдельный pipeline-job для APK.
Загрузи APK + changelog
Releases → New version → загрузи .apk → опиши что изменилось → отправь на модерацию. RuStore проверяет 1-3 дня.
Не путай keystore
Один и тот же production keystore используется для Google Play И для RuStore. Подписи должны совпадать, иначе при следующем апдейте ни Play, ни RuStore не примут. Keystore и пароли — у Никиты. Не теряй и не пересобирай: новый keystore = новое приложение в Play.

9.6 Что важно знать

  • Каждый push в test/beta/main → CI собирает signed AAB → артефакт лежит в pipeline 1 неделю
  • versionCode в native-android/app/build.gradle.kts увеличивай вручную перед каждым релизом — Play не примет AAB с тем же versionCode что предыдущий
  • На production-сборке ProGuard выключен (isMinifyEnabled = false). Если будут жалобы на размер AAB — включай R8/ProGuard, но тестируй прежде чем релизить
  • iOS отдельный репо recore/mobile-client-ios — там нужен ApplicationVerifier через Apple Developer + сертификаты подписи. Подключение Codemagic для CI обсуждай с Никитой

10Первый день — Скоков Денис

Скоков Денис
Мобильное приложение для админов клуба (Android + iOS)

Ты делаешь админскую мобилку — администратор клуба видит статус ПК, брони, заявки в бар, выручку. Один логин = список всех клубов где админ работает.

10.1 Твой репозиторий

  • recore/admin-mobile (PID=69) — Capacitor 6 monorepo: один репо собирает и Android (.aab), и iOS (.ipa) из общего React/TypeScript кода.
Старые репо recore/admin-mobile-android и recore/admin-mobile-ios архивированы — не используй, работа только в monorepo.

Структура репо:

admin-mobile/
├── src/                  ← React + TypeScript + Radix UI
├── android/              ← Capacitor-сгенерированный Android-проект (трогать редко)
├── ios/                  ← Capacitor iOS
├── ios-native/           ← переход на native iOS (в процессе)
├── public/               ← статика
├── scripts/              ← билд-скрипты
├── deploy-configs/       ← per-club appsettings
├── capacitor.config.ts   ← главный конфиг Capacitor
├── package.json
└── .gitlab-ci.yml        ← CI

Ветки test → beta → main уже настроены, main/beta protected (Maintainer-only).

10.2 Как собрать AAB локально (главный способ пока)

В CI build:android job для admin-mobile пока не подключён (есть только gate). Поэтому пока собираешь локально.

Понадобится: Node.js 20+, JDK 17, Android SDK через Android Studio.

# 1. Клон
git clone https://reborndev.ru/git/recore/admin-mobile.git
cd admin-mobile
git checkout test

# 2. Установить зависимости
npm install

# 3. Собрать Web (Vite билд React/TS в dist/)
npm run build

# 4. Синхронизировать собранный web в Android-проект
npx cap sync android

# 5. Получи у Никиты production keystore (.jks) и пароли.
#    Положи безопасно, например ~/.keystores/admin-mobile-key.jks
export ANDROID_KEYSTORE=$HOME/.keystores/admin-mobile-key.jks
export ANDROID_KEYSTORE_PASS='ПАРОЛЬ_KEYSTORE'
export ANDROID_KEY_ALIAS='alias-name'
export ANDROID_KEY_PASS='ПАРОЛЬ_КЛЮЧА'

# 6. Собрать AAB через Gradle
cd android
./gradlew :app:bundleRelease

# 7. Готовый файл:
#    android/app/build/outputs/bundle/release/app-release.aab

Если в android/app/build.gradle ещё нет signingConfigs.release читающий env-переменные — спроси Никиту, добавит по образцу mobile-client-android (см. раздел 9.3).

10.3 Как собрать IPA для iOS

Понадобится macOS, Xcode 15+, Apple Developer аккаунт.

# 1-3 как для Android (npm install, npm run build)
npx cap sync ios

# 4. Открыть в Xcode
npx cap open ios
# или: open ios/App/App.xcworkspace

# 5. В Xcode: Product → Archive → Distribute App → App Store Connect → Upload
# Подписи и provisioning profiles настраивает Никита через Apple Developer аккаунт
В ios-native/ идёт миграция на native iOS — там может появиться отдельный Xcode-проект. Спроси у Никиты что собирать прямо сейчас (Capacitor ios/ или ios-native/).

10.4 Как залить AAB в Google Play

Play Console → твоё приложение «RE:CORE Admin»
Выбери дорожку
  • Internal testing — для своих тестеров (до 100 человек), доступно через час
  • Closed testing — beta-тестеры по списку
  • Production — публикация всем
Соответствие веткам: test → Internal, beta → Closed, main → Production.
Create new release → AAB → release notes → Rollout
Загружаешь app-release.aab, описываешь changelog, отправляешь на ревью.
После одобрения — обнови статус в panel
panel.recore.su → Versions → найти твою версию admin-mobilestoreReviewStatus = approved. Без этого gate-mobile-promotion не пропустит MR в main.

10.5 Как залить APK в RuStore

RuStore Console
console.rustore.ru → твоё приложение «RE:CORE Admin» → Releases.
Собери APK (RuStore не принимает AAB)
cd android
./gradlew :app:assembleRelease
# Файл: android/app/build/outputs/apk/release/app-release.apk
Releases → New version → загрузи .apk + changelog
Модерация RuStore 1-3 дня.
Один и тот же keystore для Play и RuStore
Если потеряешь — новое приложение придётся регистрировать с нуля. Ключи и пароли — у Никиты.

10.6 Что важно знать

  • Web-only HMR в разработке: npm run dev запускает Vite на http://localhost:5173 для быстрой итерации UI без пересборки нативного слоя
  • Изменил web-код → нужен npx cap sync перед сборкой Android/iOS, иначе native-приложение увидит старую версию
  • Изменил capacitor.config.ts или плагины (npm install @capacitor/...) → обязательно npx cap sync + проверка native-проектов
  • versionCode в android/app/build.gradle увеличивай вручную перед каждым релизом — Play не примет AAB с тем же versionCode
  • Push-уведомления: используется @capacitor/push-notifications. APNs-ключ для iOS лежит на panel-сервере (не в репо)
  • SignalR: подключение к real-time через @microsoft/signalr — если падает, проверь сертификаты SSL для конкретного клуба
  • Центральный логин: один админ → много клубов. Аутентификация через https://panel.recore.su/api/auth/admin, потом выбирается клуб из списка
  • Не храни токены в коде. На Capacitor: @capacitor/preferences с шифрованием, либо нативные SharedPreferences/Keychain через bridge

11Первый день — Чернорай Влад

Чернорай Влад
Биллинг (расчёты, тарифы, деньги)

Ты отвечаешь за логику денег: как рассчитывается стоимость сеанса, как списываются средства, как работают скидки и бонусы. Критически важная зона — ошибка в расчёте = потеря денег или жалоба клиента.

11.1 Твой репозиторий

TBD: репо recore/billing ещё не создан. Обсуди с Никитой будет ли это отдельный микросервис или модуль внутри ReBornAPI.

11.2 Шаги подготовки

Общий инструментарий
Раздел 7.1 + зависит от выбранного стека (скорее всего Node.js или .NET, уточни у Никиты).
Изучи домен
Запроси доступ к текущей логике биллинга в ReBornAPI. Все тарифы, скидки, способы оплаты — там. Тебе надо понять как было, прежде чем переписывать.
Пиши тесты раньше кода
На каждую формулу расчёта — сразу юнит-тест с пограничными случаями (0 минут, 100 часов, отрицательная скидка). Нейросеть должна сгенерить минимум 10 тестов на формулу.
Первый тестовый commit
Ветка feature/chernoray-first, простая функция расчёта стоимости часа, 3-5 тестов, MR в test. CI должен прогнать тесты зелёными.

11.3 Особые требования к твоей зоне

ВСЁ что касается денег — с двойной проверкой. Каждая новая формула биллинга обязана иметь:
  • Юнит-тесты (минимум 10 кейсов, включая пограничные)
  • Регрессионный тест в panel.recore.su
  • Ручной QA-чеклист перед promote в main
  • Флаг breakingChanges: true в манифесте если меняется порядок расчётов
Деньги — не AI-зона вайбкодинга. Каждый твой MR с изменениями биллинга читает минимум один человек (Никита). Не мержь сам даже если CI зелёный.

12Первый день — Радаев Влад

Радаев Влад
CCTV Analytics + CRM для заявок

Ты отвечаешь за видеоаналитику (распознавание лиц, подсчёт людей, детекция событий) и за модуль заявок в CRM (где команда ведёт тикеты от клубов).

12.1 Твои репозитории

  • https://reborndev.ru/git/recore/cctv-analytics.git — видеоаналитика (Python, Docker)
  • https://reborndev.ru/git/recore/recore-crm.git — CRM модуль заявок (часть большой CRM)

12.2 Пошаговая подготовка

Установи стек
Общее (раздел 7.1) + Python 3.11+. Для локальной разработки — pip install uv для быстрого менеджера пакетов.
Склонируй cctv-analytics
git clone https://reborndev.ru/git/recore/cctv-analytics.git. Там уже есть Dockerfile и .gitlab-ci.yml из шаблона docker-image.gitlab-ci.yml.
Подними в Docker
docker build -t cctv-local .docker run --rm -p 8080:8080 cctv-local. Проверь http://localhost:8080/health.
Первый тестовый commit
Ветка feature/radaev-first, небольшая правка в README, MR в test. После pipeline версия с тегом cctv-analytics должна появиться в панели.
Модуль заявок в CRM
Склонируй recore-crm, склонируй codexrebornhub локально (или работай в основной CRM-ветке). Свои изменения — в feature/radaev-tickets-*.

12.3 Чек-поинты

  • CCTV — тяжёлые модели, собирай в Docker с GPU-runtime где нужно (обсуди с Никитой)
  • Заявки CRM — обязательно миграция БД + регрессионный тест на создание тикета
  • Видеоаналитика имеет feature flags на клуб (не все клубы хотят распознавание лиц — комплаенс)

13Первый день — Корешов Артём

Корешов Артём
TechPanel + TrueNAS + инженерия клубов

Ты отвечаешь за техпанель на роутерах клубов (статический сайт с мониторингом железа) и за TrueNAS (файловое хранилище клуба). Работа больше с инфраструктурой чем с кодом.

13.1 Твои репозитории

  • https://reborndev.ru/git/recore/tech-panel.git — статический сайт для роутера клуба
  • https://reborndev.ru/git/recore/truenas-config.git — Ansible playbook для TrueNAS

13.2 Пошаговая подготовка

Общий инструментарий
Раздел 7.1 + Ansible (pip install ansible) для работы с TrueNAS.
Склонируй tech-panel
Это статический сайт. CI-шаблон — static-site.gitlab-ci.yml. После пуша версия публикуется как архив, админ клуба заливает на роутер.
Запусти tech-panel локально
npm install && npm run dev. Открой http://localhost:5173. Увидишь техпанель.
TrueNAS — Ansible
В truenas-config лежит playbook. Применяется панелью по SSH с автоматическим откатом если что-то сломалось. Твоя задача — редактировать playbook.yml и добавлять новые роли.
Первый тестовый commit
В tech-panel: ветка feature/artem-first, правка шапки, MR в test. Версия должна появиться как tech-panel в panel.recore.su.

13.3 Особенности зоны

  • Роутеры клубов отрезаны от интернета — TechPanel заливается локально. Панель это учитывает и отдаёт zip-архив
  • TrueNAS — playbook с auto-rollback: если что-то сломалось, откатывается за 5 минут на прошлый снапшот
  • Для TechPanel нет E2E-тестов в обычном смысле (нет сервера), только visual-regression через Playwright screenshot compare

14Первый день — Названцев Андрей

Названцев Андрей
Windows клиентский софт (десктоп с webview)

Ты поддерживаешь десктоп-клиент — windows-приложение которое запускается на каждом игровом ПК. Внутри — Electron/WPF с webview, который показывает меню клуба, авторизацию клиента, запуск игр.

14.1 Твой репозиторий

  • https://reborndev.ru/git/recore/desktop-client.git

14.2 Пошаговая подготовка

Общий инструментарий
Раздел 7.1 (Windows обязателен, этот продукт только под неё). Доп: Visual Studio 2022 или JetBrains Rider если у нас WPF.
Склонируй репо
git clone https://reborndev.ru/git/recore/desktop-client.gitgit checkout test.
Собери локально
В зависимости от стека: npm install && npm run electron:dev (Electron) или dotnet build && dotnet run (WPF). Должно открыться окно клиента.
CI-шаблон
Использует win-installer.gitlab-ci.yml. Собирает .exe-установщик, подписывает (Authenticode), публикует в панель.
Первый тестовый commit
Ветка feature/nazvantsev-first, мелкая правка версии в about-окне, MR в test. В панели должен появиться desktop-client версия dev-{sha}.

14.3 Баг правой кнопки мыши (история)

История из прошлого. В десктоп-клиенте был баг: правый клик внутри webview открывал меню браузера («Обновить», «Сохранить страницу») — клиенты подумали что это «пасхалка» и пытались переходить по ссылкам. Фикс: в webview выключить контекстное меню.
Готовый промпт для Claude Code если правая кнопка снова открывает меню
В webview десктоп-клиента правый клик открывает родное меню браузера.
Это баг, так было уже — нашли и пофиксили, но могло вернуться.

Найди в коде место где инициализируется webview (Electron BrowserWindow
или WebView2 control). Отключи контекстное меню. Добавь unit-тест
который проверяет что right-click не вызывает menu.

Перед правкой — покажи план и текущее место в коде.

14.4 Специфика зоны

  • Подпись .exe обязательна — иначе Windows SmartScreen блокирует запуск. CI переменные: WIN_PFX_BASE64, WIN_PFX_PASS
  • Деплой на ПК клуба — через автообновление: клиент сам скачивает новую версию из панели
  • Клиент всегда работает с API своего клуба (panel.recore.su/club/{id}/api), никогда не напрямую с облаком

14.5Первый день — Плужникова Катя

Плужникова Катя
Investor Dashboard (отчётность для инвесторов)

Ты делаешь отдельный продукт — investor-dashboard: закрытая страница для инвесторов с метриками компании (DAU, MRR, churn, roadmap). Это не клиентский продукт, а внутренний инструмент для инвесторов и учредителей.

14.5.1 Твой репозиторий

  • https://reborndev.ru/git/recore/investor-dashboard.git — отдельный repo, твой личный «песочник»
  • Stack на твой выбор (обсуди с Никитой). Типичный — Next.js + Tailwind, или чистый статический сайт
  • productType: static-site в манифесте

14.5.2 Шаги подготовки

Общий инструментарий
См. раздел 7.1 и запусти промпт «настрой мне рабочее место» из 7.3. Укажи роль: «Investor Dashboard».
Склонируй репо
git clone https://reborndev.ru/git/recore/investor-dashboard.git. Там уже есть .recore-project.yml и .gitlab-ci.yml из шаблона static-site.gitlab-ci.yml.
Первый экран
Сделай лендинг «Добро пожаловать, инвестор» с защитой по паролю (простая middleware либо Basic Auth на уровне nginx — обсуди с Никитой). Запушь в test.
Доступ для инвесторов
Никита настроит отдельный поддомен / путь и выдаст инвесторам логин. Твоя задача — UI и данные, не инфра.

14.5.3 Откуда брать данные

  • Метрики из CRM — через API reborndev.ru/api/metrics/investor (Никита подготовит отдельный endpoint с агрегатами)
  • Метрики клубов — через panel.recore.su/api/public-status (публичные статусы без персональных данных)
  • Roadmap — можно вручную в коде или из CRM (обсуди с Никитой что проще)
Внимание к данным. Это инвесторский дашборд — показываем агрегаты, никогда не выводим персональные данные пользователей, телефоны, адреса клубов. Если сомневаешься — спроси.

15Инфраструктура

15.1 Главные адреса

АдресЧто там живётДоступ
reborndev.ruCRM (команда, задачи, чаты)логин от Никиты
reborndev.ru/gitGitLab — все репозиторииGitLab аккаунт
reborndev.ru/info/Этот документпубличный
panel.recore.suПанель клубов — версии, тесты, деплойадминский логин
panel.recore.su/club/{id}/apiAPI каждого клуба (роутинг по пути, не по субдомену)ключи админа клуба
reborndev.ru:5050 планDocker Registry (GitLab Container Registry — пока не включён)GitLab токен

15.2 Как устроены клубы

Один сервер → одно API → много клубов ════════════════════════════════════════════════════════════════════ клиент из клуба 42 реестр клубов (ПК, мобилка, админка) (клубы и их БД) │ │ ▼ https://panel.recore.su/club/42/api/... ▼ ┌─────────────────────────────────────────────────────────────┐ │ одно приложение ReBornAPI │ │ узнаёт по пути /club/42/: "а, это клуб 42" │ │ подключается к reborn_club_42 в Postgres │ └─────────────────────────────────────────────────────────────┘ │ ▼ ┌──────────────┬──────────────┬──────────────┐ │ БД клуба 1 │ БД клуба 42 │ БД клуба 99 │ │ reborn_club_1│reborn_club_42│reborn_club_99│ └──────────────┴──────────────┴──────────────┘

Одно API = экономия ресурсов. Отдельные БД = юридическая изоляция данных (каждый клуб — свой контур персональных данных).

15.5Справочник системы — общие endpoints и адреса

Совместная «база знаний»: куда ходят программы, какие endpoints у каждого сервиса, с чем совместимо. Если пишешь новый клиент (мобилку, десктоп, интеграцию) — сначала посмотри сюда, потом иди кодить. Эта таблица — единая правда на всю команду. Если у тебя другие адреса — значит таблица устарела, поправь.

15.5.1 Адреса — откуда что взять

СервисБазовый URLЧто отдаётАвторизация
CRM командыhttps://reborndev.ruзадачи, проекты, зоны ответственности, чатыcookie (login), Bearer-token для API
CRM APIhttps://reborndev.ru/apiбэк CRM (Fastify)Authorization: Bearer <токен> из логина
MCP Serverhttps://reborndev.ru/mcpинструменты для AI (список задач, проектов, чатов)RECORE_MCP_ACCESS_TOKEN
GitLabhttps://reborndev.ru/gitвсе репо командыPersonal Access Token (scope: api, write_repository)
GitLab APIhttps://reborndev.ru/git/api/v4программный доступ к GitLab (MR, issues, CI)PRIVATE-TOKEN: <glpat-...>
Панель клубовhttps://panel.recore.suверсии, промоушены, регрессионные тесты, статус клубовадминский логин
Панель APIhttps://panel.recore.su/apiбэк панели (Fastify + Drizzle)Authorization: Bearer <panel-jwt>
API клубаhttps://panel.recore.su/club/{id}/apiReBornAPI, роутинг по пути /club/{id}/токен админа клуба
Info-документhttps://reborndev.ru/info/этот документпублично

15.5.2 Эндпоинты которые должны быть у каждого сервиса

Если пишешь новый бэкенд — добавь эти три endpoint сразу. Без них CI не пустит, а панель клубов не покажет версию.

EndpointМетодЧто должен вернутьЗачем
/healthGET200 OK с телом {"ok": true}Мониторинг проверяет что жив. Если висит > 5 мин — авто-rollback.
/api/manifestGETJSON с version, gitCommit, builtAt, compatibility, endpoints (см. раздел 19)Панель читает перед apply — проверяет совместимость схемы БД.
/api/regression/{testId}POST200 если тест прошёл, иначе 4xx с текстомCI job regression дёргает это для прогона регрессионных тестов.

15.5.3 Общие контракты данных

Версии (api_versions)

Каждая сборка регистрируется в panel.recore.su таблицей api_versions. Поля: version, channel (dev/beta/stable), gitCommitSha, manifest, breakingChanges, validationStatus.

Клубы (clubs)

Таблица клубов в reborn_platform. Ключевые поля: id, name, subdomain (для пути), dbName (reborn_club_{id}), channel, isProduction, features (JSON с feature-flags).

Токены

Все внешние токены — только в env. Формат: GITLAB_TOKEN=glpat-xxxxxx, PANEL_JWT_SECRET=..., RECORE_MCP_ACCESS_TOKEN=.... Никогда не коммить токены.

Миграции

Файлы в packages/core/migrations/ (CRM) или panel/api/migrations/ (панель). Нумерация 001_, 002_... После добавления — бампни compatibility.dbSchemaVersion в манифесте.

Где это живое состояние. Эта таблица — редактируемый кусок INFO-документа. Если добавил новый общий endpoint — правь через PR в recore-platform/docs/INFO.html и дай знать команде. Другие способы «совместной базы знаний» мы обсуждаем — пока это место.

16Три канала релизов

КаналОткуда берётсяКто его получаетКак попасть
dev ветка test клубы-тестеры, внутренние энвы любой git push в test
beta ветка beta 2-3 клуба-канарейки MR из test в beta (через 2ч обкатки в test)
stable ветка main + git tag все production клубы MR из beta в main (через 48ч в beta)
Production клубы = только stable. Если попробуешь применить dev/beta версию на клуб с флагом isProduction, панель вернёт 400 Bad Request. Это защита.

16.1 Что такое «обкатка в beta 48 часов»

Версия, которая только-только опубликовалась в beta, не может прыгнуть в main. Нужно подождать — за 48 часов бета-клубы успеют обнаружить баги. Если что-то найдено — ты откатываешь, а не распространяешь дальше.

Это правило зашито в CI — job gate:check-beta. Обойти нельзя.

17Ветки и Merge Request

17.1 Структура веток

  • mainprotected — что сейчас у клиентов. Пушить напрямую нельзя.
  • betaprotected — версии в обкатке. Пушить напрямую нельзя.
  • testсвободная — самое свежее. Сюда сначала попадает весь код.
  • feature/*, fix/*, hotfix/* — твои рабочие ветки. Живут пока не мерж, потом удаляются.

17.2 Формат имён веток

# Новая фича
feature/billing-hourly-rate
feature/add-club-dashboard

# Багфикс
fix/login-button-does-not-respond

# Срочный фикс в проде
hotfix/payment-double-charge

# Твой эксперимент / pet-project
experiment/try-new-ui-library

17.3 Формат коммитов

feat: добавил endpoint POST /api/clubs/new
fix: починил логин в админке клуба
chore: обновил зависимости
docs: дописал README для модуля biller
refactor: разбил auth.ts на части
test: добавил юнит-тесты для calculate-session-cost
[breaking] feat: изменил формат ответа /api/sessions

Префикс [breaking] обязателен если твой коммит ломает совместимость — например, удалил endpoint или поменял структуру JSON.

17.4 Жизненный цикл фичи

1. git checkout test && git pull 2. git checkout -b feature/my-feature 3. [пишешь код / говоришь AI что сделать] 4. git add . && git commit -m "feat: описание" 5. git push origin feature/my-feature 6. [GitLab создаёт MR страницу — открываешь её] 7. [CI прогоняется — ждёшь зелёного] 8. [code review от коллеги] 9. [нажимаешь Merge] 10. ветка автоматически удаляется

17.5GitLab — приёмы на каждый день

Практические трюки которые решают частые вопросы: «как прогнать CI но не мержить», «как не спамить код-ревьюерам пока сам не уверен», «как посмотреть что будет если смержим».

17.5.1 Прогнать проверки без пуша в main — Draft MR

Проблема: ты сделал изменения, хочешь убедиться что CI проходит и посмотреть «как эти правки сольются с main» — но пушать в main ещё рано, ревью не было, да и сам не уверен.

Решение — Draft Merge Request: MR у которого в названии префикс Draft: (или нажата галочка «Mark as draft»). Всё как у обычного MR — CI гоняется, ты видишь диффы, можешь смотреть conflicts, — но кнопка Merge отключена. Никакие случайные клики не вольют код.

Способ 1 — галочка в UI
При создании MR в GitLab есть чекбокс «Mark as draft». Поставь — и MR создаётся со статусом Draft. Merge отключён до снятия галочки.
Способ 2 — префикс в названии
Начни название MR с Draft: — GitLab автоматически распознает и включит защиту. Пример: Draft: feat: новая админка для зон.
Способ 3 — коммит с [skip ci]
Если вообще не хочешь гонять CI (например, правка только в README) — добавь в сообщение коммита [skip ci] или [ci skip]. Тогда этот конкретный pipeline не запустится.
Когда готов — убери Draft
Открой MR → кнопка «Mark as ready» (или удали префикс Draft: из названия). С этого момента кнопка Merge активируется, ревьюверы получают уведомление.
Зачем Draft если можно просто ветку. Потому что в Draft MR видно: (1) что именно поменяется при слиянии — построчный дифф, (2) зелёный/красный CI, (3) есть ли конфликты, (4) какие тесты упали. В отдельной ветке без MR — ничего из этого не видно, пока не создашь MR.

17.5.2 Прогнать CI без create MR — Merge Results Pipeline

GitLab умеет запускать pipeline на временном слиянии твоей ветки с target branch (test/main) — это показывает, что будет после merge, а не что в твоей ветке сейчас.

Как включить: это настройка проекта (Settings → Merge requests → «Pipelines for merge results»). Никита включает её на ключевых репо. Тогда в каждом MR появляется дополнительный pipeline с тегом detached или merge request — это и есть прогон на «условном merge».

17.5.3 Merge train — очередь мержей

Проблема: Петя смержил свою фичу, через 2 минуты ты хочешь смержить свою. У тебя CI был зелёный, но он гнался против старого main, а теперь main изменился — и твой код уже ломается.

Решение — Merge train: ты жмёшь «Add to merge train» вместо «Merge». GitLab становит тебя в очередь: ждёт пока Петя смержится, перезапускает твой CI на обновлённом main, и только если снова зелёный — мержит. Если упал — не мержит и говорит «твой код конфликтует с недавними изменениями».

Когда нужен: если в проекте часто параллельные MR от нескольких человек (CRM, ReBornAPI). Для единоличных репо — не обязательно.

17.5.4 Pipeline против произвольной пары веток — /compare

Если хочется просто посмотреть «что будет если влить ветку X в ветку Y», не создавая MR — открой https://reborndev.ru/git/recore/{repo}/-/compare и задай from/to. Покажет дифф без создания MR и без запуска CI.

Промпт — посмотреть что вольётся в main
Покажи через GitLab API (reborndev.ru/git, проект {id}), что изменится
если смерджить ветку test в main. Нужен summary по файлам —
сколько строк добавилось/удалилось, какие файлы затронуты, есть ли
конфликты. Используй endpoint /repository/compare?from=main&to=test.

17.7Вкладки проекта в CRM

В разделе «Проекты» каждого проекта — 8 вкладок. Это витрина над GitLab для не-девов: Никита, менеджеры и ответственные видят состояние продукта на одном экране, не блуждая по репам. Ниже — что за каждой вкладкой стоит.

Зачем отдельно от GitLab. GitLab-UI (reborndev.ru/git) — для инженеров: технические названия репо (mobile-client-android), английский интерфейс, всё подряд. Раздел «Проекты» в CRM — для owner/admin/менеджеров: человеческие названия (Mobile Client (Android)), только то что важно (сколько MR висит, зелёный ли CI), кнопка «продвинуть в beta» в один клик, привязка к задачам и зонам ответственности.

17.7.1 Что делает каждая вкладка

ВкладкаЧто показываетОткуда данные
ОбзорСводка: открытые MR, коммитов за 7 дней, последние события, статус последнего пайплайнаGET /api/gitlab/projects/:id/summary
ВерсииВетки testbetamain со статусом + кнопка «Продвинуть» (создаёт MR между ветками)GET /api/projects/:id/branches + POST /api/projects/:id/promote
MR (Запросы на слияние)Открытые и недавно смерженные MR, можно создать и смержить прямо из CRMGET/POST /api/gitlab/projects/:id/merge-requests
ПайплайныИстория CI-запусков (зелёные/красные), клик → лог в GitLabGET /api/gitlab/projects/:id/pipelines
КоммитыПоследние коммиты по веткам, автор, время, сообщениеGET /api/gitlab/projects/:id/commits
Участники
в работе
Кто имеет доступ к репо и с какой ролью (Guest/Reporter/Developer/Maintainer/Owner)GET /api/gitlab/projects/:id/members — backend не реализован
Журнал
в работе
Аудит действий: кто когда кого добавил, убрал, дал доступGET /api/gitlab/audit — backend не реализован
Настройка
в работе
Protected branches (main/beta только через MR, кто может мержить)GET /api/gitlab/projects/:id/protected-branches — backend не реализован
Если видишь «Not Found» на Участниках/Журнале/Настройке. Это не баг UI, а просто не дописан backend. Клиентская кнопка есть, серверной ручки — нет. Никита допилит. Остальные 5 вкладок работают полностью.

17.7.2 Форма «Новый проект»

Кнопка «Создать проект» в списке проектов открывает форму, которая за один запрос делает:

  1. Создаёт GitLab-репо под reborndev.ru/git/recore/{path}
  2. Пишет базовый .recore-project.yml (раздел 18)
  3. Пишет .gitlab-ci.yml из шаблона по productType
  4. Создаёт ветки test и beta
  5. Ставит protected branches на main и beta (push=0, merge=Maintainers)
  6. Добавляет owner-а как Maintainer
  7. Регистрирует проект в CRM с человеческим именем

Поля формы: path, name (в GitLab), displayName (в CRM), description, category, platform, productType, owner, tags, qaChecklist. После создания — сразу можно клонировать и начинать работу.

17.8Автор коммита в CI — почему «Claude AI» и как вернуть своё имя

В пайплайнах иногда вместо твоего имени стоит «Claude», «AI Assistant» или пустое. Это не баг и не «ИИ украл авторство» — это про настройки git config, которые нейросеть задала себе. Объясню и дам фикс.

17.8.1 Кто кого подписывает

В каждом коммите два поля: Author (кто написал код) и Committer (кто применил коммит). Git берёт их из git config user.name и user.email. GitLab показывает в UI — Author. Пайплайн в поле CI_COMMIT_AUTHOR тоже использует Author.

17.8.2 Почему AI подписывается собой

  • Claude Code при коммите иногда добавляет Co-Authored-By: Claude ... — это дополнительный «со-автор», основной остаётся твоим
  • Но если ИИ запустил git config user.name "Claude" (например, в первичной настройке, когда пользователь ещё не задал свои данные) — все следующие коммиты пойдут от имени Claude
  • В CI такое видно сразу: pipeline «triggered by Claude AI» вместо «triggered by vanch»

17.8.3 Починить — три команды

# 1. Проверь кто сейчас подписан
git config --global user.name
git config --global user.email

# 2. Если видишь "Claude", "AI Assistant" или что-то не твоё — переопредели
git config --global user.name "Моё Имя"
git config --global user.email "my@email.com"

# 3. Для текущего репо отдельно (если работают несколько репо с разными email):
git config user.name "Моё Имя"
git config user.email "my@email.com"

17.8.4 Что делать с уже запушенными коммитами

Свежие коммиты, ещё не смержены
Перепиши автора одной командой и force-push в свою ветку (только в свою feature-ветку, не в test/main):
git rebase -i HEAD~N  # N = сколько коммитов поправить
# Для каждого замени "pick" на "edit", сохрани
# Для каждого остановка:
git commit --amend --author="Моё Имя <my@email.com>" --no-edit
git rebase --continue
git push --force-with-lease origin feature/my-branch
Автомат — одной командой
Если весь бранч — твой:
git rebase --exec 'git commit --amend --author="Моё Имя <my@email.com>" --no-edit' origin/test
git push --force-with-lease
Уже смержено в test/main
Не трогай. Перезапись истории в защищённых ветках ломает работу всем. Просто настрой git config правильно для будущих коммитов — и всё.
Правило. Раз в неделю в начале сессии выполни git config --global user.name — проверь что там твоё имя. Если ИИ перезаписал — поправь. Один раз в месяц Никита проверит пайплайны по проектам на «странных авторов» — если увидит Claude, напишет виновнику.

18Файл .recore-project.yml

«Паспорт проекта» — один YAML-файл в корне репо, описывающий что это за продукт, кому он принадлежит, какие у него требования. Панель читает его каждый раз при релизе.

18.1 Минимальный пример

# .recore-project.yml — паспорт проекта
displayName: "ReBorn API"
description: "Бэкенд клубов (.NET 8)"
category: "club-service"
platform: "backend"
productType: "docker-image"
owner: "dima"

18.2 Все поля подробно

ПолеЗачемПример
displayName
обяз.
Как продукт называется в панели"ReBorn API"
descriptionЧто он делает. Человеческим языком."API для клубов, .NET 8"
category
обяз.
Группировка в панели. Значения: crm, panel, club-service, club-static, mobile, desktop, tool, game, site, core, otherclub-service
platform
обяз.
Тип runtime. Значения: backend, web, android, ios, desktop, configbackend
productType
обяз.
Какой артефакт билдим. Значения: docker-image, static-site, mobile-android, mobile-ios, win-installer, ansible-configdocker-image
owner
обяз.
GitLab логин ответственногоdima
tagsМетки для фильтра[api, dotnet, docker]
compatibility.dbSchemaVersionВерсия схемы БД. Каждый раз как добавляешь миграцию — увеличиваешь на 142
compatibility.breakingChangestrue если эта версия ломает совместимость и требует ручного апдейтаfalse
compatibility.minPanelVersionМинимальная версия panel.recore.su которая понимает этот манифест"1.0.0"
compatibility.minSupportedApiVersionМобилка/клиент: минимальная версия API с которой работает"2.1.0"
required.envОбязательные env-переменные. Без них CI не пустит[DATABASE_URL, JWT_KEY]
required.portsПорты которые открывает сервис[5000]
required.featuresФиче-флаги которые должны быть включены в клубе[cctv, pos-integration]
endpointsИменованные URL. CI проверяет каждый в validate{ health: /health, manifest: /api/manifest }
migrationsСписок SQL-скриптов в релизе["001_init.sql", "007_add_zones.sql"]
qaChecklistРучные QA-шаги перед promote в stable["логин админа работает", "бронь создаётся"]
uiContractsКонтракты UI (экраны с обязательными/запрещёнными элементами)см. 18.4

18.3 Примеры по типам продукта

Docker image (ReBornAPI)

displayName: "ReBorn API"
description: "Бэкенд-сервер каждого клуба (.NET 8)"
category: "club-service"
platform: "backend"
productType: "docker-image"
owner: "dima"
tags: ["api", "dotnet", "docker"]
compatibility:
  dbSchemaVersion: 42
  breakingChanges: false
  minPanelVersion: "1.0.0"
required:
  env: ["DATABASE_URL", "JWT_KEY", "REDIS_URL"]
  ports: [5000]
endpoints:
  health: "/health"
  manifest: "/api/manifest"
  auth: "/api/auth"
migrations:
  - "001_InitialCreate.sql"
  - "042_AddLoginField.sql"
qaChecklist:
  - "логин админа возвращает 200 и токен"
  - "клуб 42 открывается на /api/clubs/42"

Static site (TechPanel)

displayName: "Tech Panel"
description: "Техпанель для роутера клуба"
category: "club-static"
platform: "web"
productType: "static-site"
owner: "artem"
tags: ["static", "router"]
qaChecklist:
  - "главная страница открывается"
  - "мониторинг показывает статус всех ПК"

Mobile Android (клиентская мобилка)

displayName: "Reborn Client (Android)"
description: "Мобилка для клиентов клуба"
category: "mobile"
platform: "android"
productType: "mobile-android"
owner: "vladteplov"
tags: ["mobile", "android", "client"]
compatibility:
  minSupportedApiVersion: "2.1.0"
  targetReBornApiVersion: "2.5.0"
qaChecklist:
  - "логин по коду из SMS работает"
  - "бронь на завтра создаётся"
  - "оплата успешно проходит"

Desktop (Windows клиент)

displayName: "Reborn Desktop Client"
description: "Клиентское ПО для игровых ПК"
category: "desktop"
platform: "desktop"
productType: "win-installer"
owner: "nazvantsev"
tags: ["desktop", "windows", "webview"]
required:
  features: ["auto-update"]
qaChecklist:
  - "правый клик в webview НЕ открывает меню браузера"
  - "автообновление подхватывает новую версию"
  - "запуск игры работает"

Ansible config (TrueNAS)

displayName: "TrueNAS Config"
description: "Ansible playbook для файлового хранилища клубов"
category: "tool"
platform: "config"
productType: "ansible-config"
owner: "artem"
tags: ["ansible", "truenas", "infrastructure"]

18.4 uiContracts — защита UI от регрессий

uiContracts:
  - screen: "LoginScreen"
    url: "/login"
    mustHave:
      - "input[name=login]"
      - "input[name=password]"
      - "button[type=submit]"
    mustNotHave:
      - "text:error"   # не должно быть ошибки по дефолту
    interactions:
      - action: "input login=admin, password=test"
        expect: "redirect to /dashboard"

18.5 Что править руками, а что отдать AI

Отдай нейросети
  • Генерацию начального .recore-project.yml по типу продукта
  • Список endpoints — AI прочитает твои контроллеры и заполнит сам
  • Список миграций — AI глянет папку migrations/ и перечислит
  • Бамп dbSchemaVersion после добавления миграции
Меняй сам (или с подтверждением)
  • owner — критично, кто отвечает
  • breakingChanges: true — последствия серьёзные
  • minPanelVersion — согласуй с Никитой
  • qaChecklist — знание домена, AI часто пропускает важные пункты
Готовый промпт для генерации .recore-project.yml
Сгенерируй .recore-project.yml для моего проекта.

Путь к репо: {путь}
Тип: {docker-image | static-site | mobile-android | ...}
Кто я: {owner}

Изучи структуру проекта, найди endpoint-ы, миграции, env-переменные.
Составь полный файл. Поле breakingChanges оставь false, если не уверен.
Поле qaChecklist — предложи 3-5 пунктов, а я добавлю ещё.

18.6 Когда и как обновлять .recore-project.yml

Это не файл «написал и забыл». Манифест обязан отражать реальное состояние проекта — иначе панель примет несовместимую версию и клуб сломается.

Правило. Любое изменение контракта проекта = коммит одновременно с правкой .recore-project.yml. Если забыл — CI в идеале должен это поймать (job validate:manifest), но не всегда.

Триггеры — когда точно обновлять

Что ты сделал в кодеЧто надо поправить в манифестеПочему
Добавил миграцию БД (новая колонка, таблица) compatibility.dbSchemaVersion += 1 · добавь файл в migrations Панель поймёт что требуется миграция перед apply
Удалил или переименовал endpoint, поменял формат ответа compatibility.breakingChanges = true · префикс коммита [breaking] Старые клиенты упадут — rollback должен быть осознанным
Добавил новый endpoint Впиши в endpoints: под именем CI job validate проверит что endpoint реально отвечает 200
Добавил обязательную env-переменную Добавь в required.env: [...] Без неё панель не применит версию и сразу покажет ошибку
Открыл новый порт required.ports: [...] Оркестратор клуба пробросит порт при деплое
Сменился ответственный owner: "new-gitlab-login" CRM покажет правильного ответственного, нотификации пойдут куда надо
Добавил новую фичу требующую feature-flag required.features: [...] Панель применит версию только к клубам где фича включена
Повысил минимальную версию мобилки/клиента compatibility.minSupportedApiVersion Старые клиенты получат «обнови приложение» вместо 500 ошибки
Хочешь добавить QA-шаг в чеклист Добавь пункт в qaChecklist: [...] Тестер увидит пункт в панели перед promote в stable

Рабочий цикл — что идёт вместе в один MR

Код + манифест
Правь код и .recore-project.yml в одном MR. Если ревьюер видит «новый endpoint без обновления endpoints:» — это тоже красный флаг.
Миграция + бамп dbSchemaVersion
Никогда не пушь миграцию без бампа dbSchemaVersion. Иначе старая версия приложения попадёт на новую БД — будут странные ошибки.
Breaking change — коммит с префиксом
Если breakingChanges: true — сообщение коммита начинай с [breaking]. Промоушен такой версии в stable требует двух апрувов, это правило зашито.
Не забудь про qaChecklist
Если фича пользовательская (логин, оплата, бронь) — добавь один пункт в qaChecklist. Даже если «всё протестил». Следующему релизу поможет не забыть.
Промпт — обнови мой .recore-project.yml
Я внёс изменения в ветку {branch}. Проанализируй diff (git diff
test..{branch}) и скажи что из .recore-project.yml нуждается
в обновлении. Предложи патч. Следуй таблице из
https://reborndev.ru/info/#project-yml раздел 18.6.

Особо внимательно посмотри: миграции, новые/изменённые endpoints,
новые env-переменные, breaking changes в API.

19manifest.json в рантайме

Помимо .recore-project.yml (который лежит в репо), твой работающий продукт должен отдавать свой manifest в рантайме на endpoint /api/manifest. Это то, что панель дёргает когда проверяет конкретный запущенный контейнер.

19.1 Пример ответа

{
  "version": "1.2.3",
  "channel": "stable",
  "gitCommit": "abc1234",
  "builtAt": "2026-04-22T10:00:00Z",
  "compatibility": { "dbSchemaVersion": 42, "breakingChanges": false },
  "endpoints": { "health": "/health", "manifest": "/api/manifest" }
}

19.2 Где брать значения

CI прокидывает их через build-args в Dockerfile, ты читаешь из env:

// .NET пример
app.MapGet("/api/manifest", () => new {
    version    = Environment.GetEnvironmentVariable("APP_VERSION"),
    channel    = Environment.GetEnvironmentVariable("APP_CHANNEL"),
    gitCommit  = Environment.GetEnvironmentVariable("APP_GIT_COMMIT"),
    builtAt    = Environment.GetEnvironmentVariable("APP_BUILT_AT"),
    compatibility = new { dbSchemaVersion = 42, breakingChanges = false },
    endpoints = new Dictionary<string,string> {
        { "health",   "/health" },
        { "manifest", "/api/manifest" }
    }
});
Гвоздев Дмитрий — для тебя. Этот endpoint — обязательный в ReBornAPI. Без него validate-job в CI падает. Если ещё не добавлен — попроси Claude Code: «добавь endpoint /api/manifest в ReBornAPI по шаблону из recore-platform/ci-templates/README.md».

206 слоёв защиты от поломок

Чтобы нейросеть (или уставший человек) не сломал прод. Каждый слой ловит свой класс багов.

20.1 Слой 1: Protected branches

Что делает: запрещает пуш в main и beta напрямую.

Пример реального бага: AI-агент по привычке делает git push origin main с исправленным кодом. Без защиты — код попал бы клиентам без ревью. С защитой — GitLab отвергает push, ты получаешь ошибку: «main is protected».

20.2 Слой 2: Manifest-валидация (CI)

Что делает: CI перед публикацией проверяет что манифест корректный (схема, dbSchemaVersion, endpoints).

Пример реального бага: Нейросеть добавила миграцию 043_add_zones.sql, но забыла обновить dbSchemaVersion: 42 → 43. Validate ловит: «в папке migrations есть 043, а в manifest sdbSchemaVersion всё ещё 42». Блок.

20.3 Слой 3: Health + endpoints probe (CI)

Что делает: CI поднимает контейнер в песочнице и пробует обратиться к каждому endpoint из манифеста.

Пример реального бага: Нейросеть переименовала endpoint /api/auth/login в /api/login, а в манифесте оставила старое имя. Probe: «в manifest указан /api/auth/login, но он отвечает 404». Блок.

20.4 Слой 4: Regression tests

Что делает: прогон реестра регрессионных тестов (хранятся в panel.recore.su) против только что собранного контейнера.

Пример реального бага: Нейросеть рефакторила auth, случайно сломала логин админа. Регресс-тест «Логин админа клуба работает» падает. Версия помечается как failed, кнопка «применить» в панели неактивна. См. раздел 21.

20.5 Слой 5: E2E Playwright

Что делает: эмулирует реального пользователя в браузере. Заходит на страницу, жмёт кнопки, проверяет результат.

Пример реального бага: В админке кнопка «Сохранить» вроде бы есть, API вроде отвечает 200, но onClick не подключён. Unit-тесты зелёные. E2E — ловит: «кликнул "Сохранить", не видел "Успешно"». См. раздел 22.

20.6 Слой 6: QA чеклист + ручной review

Что делает: перед promote в stable человек глазами проходит чеклист из .recore-project.yml.

Пример реального бага: Визуально в админке всплывающее окно открывается за кнопкой «Отмена», не увидеть. Автотесты не ловят (DOM-элементы на месте, CSS z-index). Ручной review: «ой, модалка за кнопкой». См. раздел 23.

20.7 Что если все 6 прошли, но всё равно упало

Auto-rollback. Панель мониторит клубы 5 минут после применения новой версии. Если /health падает или error rate вырастает — автоматически откатывается на предыдущую. Downtime — 0.

21Регрессионные тесты

Реестр коротких API-тестов, хранящийся в panel.recore.su. Прогоняются CI против каждой сборки.

21.1 Правило

Нашли баг → починили → добавили регресс-тест. Без исключений. Иначе AI повторно сломает то же самое через неделю.

21.2 Как добавить тест через UI

  1. Открой https://panel.recore.su/regression-tests
  2. Жми + Добавить
  3. Заполни поля:
    • Имя: «Логин админа клуба работает»
    • HTTP метод + endpoint: POST /api/auth/login
    • Body: {"login":"admin","password":"test"}
    • Ожидаемый статус: 200
    • Ожидаемые поля: {"success": true}
    • Severity: critical / error / warning
    • isRequired: если включено — failed тест блокирует publish
  4. Сохрани. С этого момента каждый новый pipeline прогоняет его.

21.3 Промпт для AI: сгенерировать тест

Автогенерация регресс-теста по багу
Я только что починил баг: при пустом пароле API возвращал 500
вместо 400 "invalid credentials".

Сформируй регрессионный тест для этого бага в формате который
принимает panel.recore.su. Я скопирую JSON в форму добавления.

Формат как в этом примере:
{
  "name": "...",
  "method": "POST",
  "endpoint": "...",
  "body": {...},
  "expectedStatus": 400,
  "expectedFields": {...},
  "severity": "critical",
  "isRequired": true
}

22E2E Playwright — тесты как пользователь

E2E = End-to-End. Тесты которые эмулируют реального человека в браузере. Отличаются от unit-тестов тем что проверяют всю цепочку: клик → API → ответ → отображение.

22.1 Что такое Playwright простыми словами

Это как робот который сидит за компьютером, открывает ваш сайт и пытается им пользоваться. Если не получилось (кнопка не нажалась, страница не загрузилась, текст не появился) — тест красный.

22.2 Пример простого теста

import { test, expect } from '@playwright/test';

test('админ может войти в панель', async ({ page }) => {
  // 1. Открываем логин
  await page.goto('https://panel.recore.su/club/42/admin/login');

  // 2. Вводим данные
  await page.fill('input[name=login]', 'admin');
  await page.fill('input[name=password]', 'test');

  // 3. Жмём "Войти"
  await page.click('button[type=submit]');

  // 4. Ждём что окажемся на дашборде
  await expect(page).toHaveURL(/\/admin\/dashboard/);

  // 5. Проверяем что видно приветствие
  await expect(page.locator('h1')).toContainText('Добро пожаловать');
});

22.3 Как написать свой тест через AI

Promтр для создания E2E
Напиши E2E-тест на Playwright который проверяет сценарий:

1. Админ открывает https://panel.recore.su/club/42/admin/login
2. Вводит login=admin, password=test
3. Жмёт "Войти"
4. Должен попасть на /admin/dashboard
5. На дашборде должна быть кнопка "Новая бронь"
6. Клик по ней открывает модалку с заголовком "Новая бронь"
7. В модалке есть поле "Имя клиента" и кнопка "Сохранить"

Используй стиль и хелперы которые уже есть в моём репо
(посмотри существующие тесты в папке tests/).
Если хелпера на логин ещё нет — создай его в tests/helpers/auth.ts.

22.4 Как запустить локально

# Установить Playwright (один раз)
npm install -D @playwright/test
npx playwright install

# Запустить все тесты
npx playwright test

# Запустить один файл
npx playwright test tests/admin-login.spec.ts

# С браузером вживую (чтобы посмотреть глазами)
npx playwright test --headed

# Открыть HTML-отчёт после запуска
npx playwright show-report
Скриншот на падении. Playwright автоматически сохраняет скриншот и видео при падении теста. Путь в логе CI-job: test-results/имя-теста/. Скачай артефакты и посмотри глазами.

23QA-чеклист

Ручные проверки которые делает человек перед promote в stable. Хранятся в .recore-project.yml в поле qaChecklist, отображаются в панели.

23.1 Пример хорошего пункта

Хорошо
  • «Логин админа клуба возвращает редирект на /dashboard»
  • «В разделе "Брони" кнопка "+ Новая" открывает модалку»
  • «Оплата картой 4242... через Stripe sandbox → 200 и чек в email»
Плохо
  • «Всё работает» ← непроверяемо
  • «UI красивый» ← субъективно
  • «Нет багов» ← не чеклист, а мечта

23.2 Как добавить пункт в CRM

  1. Открой репо, отредактируй .recore-project.yml:
    qaChecklist:
      - "логин админа: admin/test → /dashboard"
      - "бронь завтра на 2 часа создаётся"
      - "КАССА → Z-отчёт скачивается PDF"
      # <-- добавь новый пункт сюда
  2. Закоммить + пуш
  3. CI-job sync-metadata синхронизирует в панель автоматически
  4. Проверь: https://panel.recore.su/products/{твой-ключ} — в блоке «QA Checklist» пункт появился

23.3 Промпт для AI: предложить чеклист

Сгенерить стартовый qaChecklist
Посмотри мой продукт {название}, изучи его функционал
(основные страницы / endpoints / фичи) и предложи 10 пунктов
для qaChecklist в .recore-project.yml.

Каждый пункт — конкретное проверяемое действие с ожидаемым
результатом. Избегай абстракций вроде "всё работает".

24Частые проблемы

24.1 «CI красный, что делать»

Открой pipeline
GitLab → CI/CD → Pipelines → найди свой (верхний, с твоим email)
Клик на красный job
Увидишь какой именно этап упал (build, validate, regression)
Прочитай последние 100 строк лога
Там обычно строчка со словом ERROR или FAILED
Скопируй в Claude Code и спроси
Промпт в разделе 6.3. AI разберёт и предложит фикс.
Если упал gate:check-beta
Ты пытаешься мержить в main из не-беты, или не прошло 48ч, или beta-пайплайн не дошёл до passed. См. ошибки в разделе 6.2.
Если AI не помогает
Пиши Никите в Telegram или в CRM, приложи ссылку на pipeline

24.2 «Не могу запушить в main»

remote: GitLab: You are not allowed to push code to protected branches on this project.

Это не баг, это защита. В main пушить напрямую нельзя. Правильная последовательность:

# Создай ветку от test
git checkout test && git pull
git checkout -b feature/my-change

# Работай
git add . && git commit -m "feat: описание"
git push origin feature/my-change

# В GitLab UI создай MR в test. Через CI и review оно смержится.

24.3 «Мой MR не мержится — there is a conflict»

Это значит что между твоей веткой и целевой (test) кто-то уже изменил те же строки в том же файле. Нужно разрулить.

# У себя локально:
git checkout feature/my-change
git pull origin test     # или git merge origin/test
# Git отметит конфликты <<< >>> в файлах

# Проще всего — позови Claude Code:
# "у меня git merge conflict в файлах X, Y. Разреши их сохранив смысл
#  обеих версий, объясни каждое решение."

# После разрешения:
git add .
git commit -m "chore: resolve conflicts with test"
git push
Типовые ошибки при конфликтах: удалить не то, оставить маркеры <<<<<<< в коде. После разрешения всегда запускай сборку локально — если собирается, значит конфликт разрулен правильно.

24.4 «Новая версия не появилась в панели»

Проверь что pipeline дошёл до publish
В GitLab → CI/CD → Pipelines, найди свой, посмотри что job publish:version зелёный
Посмотри лог publish
В конце лога должна быть строка типа Published version id=XXX to panel
Проверь CI_PANEL_TOKEN
Если в логе 401 Unauthorized — токен протух. Попроси Никиту обновить в GitLab Variables
Посмотри метаданные в .recore-project.yml
Если не указан category или platform — продукт не зарегистрируется, версия "повиснет". Добавь поля, пушни.

24.5 «Потерял работу локально после git reset»

Не всё потеряно. Git хранит все коммиты ещё 30+ дней, даже если они вроде бы удалены.

# Покажи все движения HEAD за последние дни
git reflog

# Увидишь список, например:
#  a1b2c3d HEAD@{0}: reset: moving to HEAD~3
#  e4f5g6h HEAD@{1}: commit: фикс логина
#  i7j8k9l HEAD@{2}: commit: добавил endpoint

# Возвращаемся на нужный коммит (берём SHA)
git checkout e4f5g6h

# Если хочешь вернуть как ветку
git checkout -b recovery-branch e4f5g6h

# Всё, работа вернулась
Ограничение: работают только с закоммиченными изменениями. Если ты редактировал файл и не закоммитил, а потом сделал git checkout . — эта работа потеряна безвозвратно. Коммить часто, даже мусорные коммиты потом почистишь через rebase.

24.6 «Docker падает: "no space left on device"»

# Почисти старые образы и контейнеры
docker system prune -a -f --volumes

# Если мало помогло — рестарт Docker Desktop (Windows/Mac)
# На Linux: sudo systemctl restart docker

24.7 «Не могу склонировать репо — permission denied»

  1. Убедись что ты залогинен в GitLab (открой https://reborndev.ru/git)
  2. Создай Personal Access Token (Settings → Access Tokens → scope read_repository, write_repository)
  3. Используй токен как пароль при клонировании:
    git clone https://username:TOKEN@reborndev.ru/git/recore/repo.git

25Шпаргалка команд

Минимум который реально пригодится. Распечатай или сохрани в закладки.

25.1 Git — базовые

git statusчто сейчас изменено, на какой ветке
git branch --show-currentв какой ветке ты
git checkout -b feature/X testсоздать новую ветку от test
git add .добавить все изменения к коммиту
git commit -m "feat: описание"зафиксировать коммит с сообщением
git push origin feature/Xотправить ветку на сервер
git pullзабрать свежее с сервера
git log --oneline -10последние 10 коммитов в компактном виде
git diffчто именно изменил но не закоммитил
git reflogистория всех перемещений, чтобы восстановить потерянное

25.2 Docker — базовые

docker psкакие контейнеры запущены
docker ps -aвсе контейнеры, включая остановленные
docker logs -f container_nameлоги контейнера в реальном времени
docker stop container_nameостановить
docker rm container_nameудалить
docker build -t image-name .собрать образ из текущего Dockerfile
docker run --rm -p 5000:5000 image-nameзапустить образ, пробросить порт
docker system prune -aпочистить мусор (осторожно, удаляет неиспользуемые образы)
docker compose up -dподнять стек из docker-compose.yml в фоне
docker compose downостановить весь стек

25.3 curl — проверить API

curl https://panel.recore.su/club/42/healthпростой GET, проверить жив ли сервис
curl -s https://panel.recore.su/club/42/api/manifest | jqполучить JSON и отформатировать
curl -X POST -H "Content-Type: application/json" -d '{"login":"a","password":"b"}' URLPOST с JSON
curl -H "Authorization: Bearer TOKEN" URLзапрос с токеном
curl -v URLverbose — видно заголовки и коды

25.4 Что чаще нужно Гвоздеву Дмитрию

dotnet buildсобрать .NET проект
dotnet testпрогнать тесты
dotnet ef migrations add ИмяМиграциисоздать новую миграцию БД
dotnet ef database updateприменить миграции к локальной БД
docker compose up postgres -dподнять только Postgres локально

25.5 Что чаще нужно Теплову Владу / Скокову Денису (мобильные)

./gradlew assembleDebugсобрать debug APK (Android)
./gradlew assembleReleaserelease APK (Android)
adb devicesкакие устройства подключены
adb install -r app-debug.apkпоставить APK на устройство
adb logcat | grep ReCoreлоги приложения по тегу
xcodebuild -scheme App -configuration Releaseсборка iOS

25.6 Что чаще нужно Радаеву Владу / Корешову Артёму

python -m venv .venv && .venv\Scripts\activateсоздать виртуальное окружение (Windows)
pip install -r requirements.txtпоставить зависимости
pytestпрогнать тесты
ansible-playbook playbook.yml -i inventoryприменить Ansible playbook
ansible-playbook playbook.yml --checkdry-run, не применять

25.7 Claude Code (всем)

claudeзапустить Claude Code в текущей папке
/helpсписок встроенных команд
/clearочистить контекст беседы
/reviewпопросить ревью текущих изменений
/compactсжать историю диалога, освободить контекст

26FAQ

Я вообще не программист. Я правда смогу?
Да. Твоя задача не писать код, а объяснять нейросети что нужно, проверять результат, принимать решения. Этот документ + Claude Code покрывают 80% работы.
Что если AI сделал не то?
Отмени коммит (git reset --soft HEAD~1 — сохранит изменения, но уберёт коммит) или попроси AI откатиться. Если уже запушил — создай новый коммит-revert: git revert HEAD && git push.
Нужно срочно починить прод. Ждать 48 часов в beta?
Нет. Есть отдельный процесс hotfix: ветка hotfix/* → MR в main с меткой hotfix + два апрува (Никита + любой из команды). Обходит правило 48ч, но требует двух пар глаз.
Могу ли я выложить версию без CI?
Нет. Панель принимает версии только от CI с подписанным токеном. Ручная загрузка запрещена.
Хочу попробовать новую фичу только в одном клубе
Этот клуб переключается на канал beta, применяется новая версия. Если нужно, чтобы у разных клубов были разные фичи — это feature flags: включаются/выключаются в таблице clubs. Обсуди с Никитой.
Мне надо передать кому-то свой рабочий компьютер на пару дней
Запушь всю текущую работу в feature/* ветку. На новом ноуте склонируй и продолжай. Никогда не передавай токены/ключи — пусть коллега сделает свои.
В каком канале я сейчас работаю?
На любой ветке работай — коммиты автоматом идут в dev. Когда захочешь в beta/main — делаешь MR. «Текущий канал» определяется той веткой, где лежит твой коммит.
Как понять кто мой ревьюер
По дефолту — Никита. Для зон: Влад ревьюит мобилки друг другу и Скокову, Дима — изменения в ReBornAPI. При создании MR GitLab предлагает автодобавление review — соглашайся.
AI написал странный код, я не понимаю что он делает
Правило: не мержь того, что не понимаешь. Попроси AI объяснить: «расскажи построчно что делает этот файл, простыми словами». Если после объяснения непонятно — перепиши запрос или спроси Никиту.
Сколько времени занимает один pipeline?
Обычно 5-10 минут. Build — 2-3 мин, Validate — 2 мин, Regression — 3-5 мин. Если висит дольше получаса — что-то застряло, пиши Никите.
Где искать помощь если стало страшно?
Telegram Никиты → чат команды в CRM → этот документ (перечитай раздел по своей роли) → Claude Code: «я запутался, вот контекст, предложи план». В таком порядке.

27Обновление софта на ПК клубов (v9+)

После MR #28 (май 2026) появилась полноценная система управления версиями десктоп-клиента и rebornapi. Эта секция — для вайбкодеров: что делать, как работает, куда смотреть когда что-то идёт не так.

Главное в трёх абзацах

1. Каналы. Любая собранная версия попадает на канал, привязанный к git-ветке: testbetamain (=stable). Production-клубы видят только stable. Promote из канала в канал — кнопка [Promote → beta] в панели, между beta и stable обязательны 48 часов обкатки.

2. Где решается какую версию ставить. Каждый ПК клуба периодически дёргает GET /api/clients/latest?clubSlug=…&pcId=… — сервер возвращает целевую версию по приоритету: (1) pin на ПК → (2) target на клуб → (3) последняя в канале клуба. Клиент ставит то что вернулось — даже если это даунгрейд.

3. Push «обновись сейчас». Кнопка [Перепроверить обновления] в карточке клуба публикует NATS-команду recore.cmd.<club>.<pc>.RecheckUpdates — десктоп-клиент v9.2.4+ сразу опрашивает /latest и обновляется. Без push'а — обновляется при следующем плановом poll'е.

Как делать обычные операции

Раскатить новую версию на конкретный клуб
Открой panel.recore.su/clubs/<id> → секция «Клиент ПО (ReBornClient)»[Применить версию] → выбери версию из списка → [Применить]. Если хочешь чтобы ПК обновились прямо сейчас (а не через ~10 минут polling) — отметь «push RecheckUpdates сейчас». Backend проверит производственный флаг — на production-клубе можно ставить только версии канала stable.
Откатить отдельный ПК на старую версию
В таблице ПК внутри клуба — кнопка [Pin ▾] → выбираешь любую активную версию из списка → [Pin & Push]. ПК сразу получит NATS-команду и переустановит указанную версию. Чтобы снять pin — кнопка [Очистить] в той же строке.
Поменять канал клуба test ↔ beta ↔ stable
В карточке клуба — селект «Канал релиза». Сменил → следующий polling клиента подхватит новую версию из этого канала. На production-клубе селект жёстко stable, изменить нельзя пока не снять флаг is_production.
Понять что вообще установлено на ПК-12 RIO
В таблице ПК колонка «Текущая» показывает last_reported_version от heartbeat'а. Если стоит --- — клиент старый и не шлёт installedClientVersion в heartbeat'е (нужен v9.2.4+). Альтернатива: GET /api/computers/<pcId>/effective-version — diagnostic endpoint показывает что должно стоять и что фактически прилетало.
Promote версию test → beta или beta → stable
Страница /versions в панели → найти строку с версией → кнопка [Promote → beta] или [Promote → stable]. Backend проверит min_hours_in_from (для beta→stable это 48 часов). Если кнопка серая или возвращает 409 — значит cooldown ещё не прошёл, посмотри в audit_log когда версия попала в текущий канал.

Инструкция для CI продукта (если делаешь новый репозиторий)

Чтобы новый продукт публиковал версии в панель, в .gitlab-ci.yml подключи стандартный шаблон:

include:
  - project: 'root/recore-platform'
    file: '/ci-templates/standard-version-manifest.gitlab-ci.yml'
    ref: main

variables:
  PRODUCT_KEY: "my-product"
  ARTIFACT_TYPE: "docker-image"   # или win-installer, static-site, mobile-android, mobile-ios, ansible-config

stages:
  - build
  - publish

В job-е сборки положи в $CI_PROJECT_DIR/manifest.json type-specific блок (для docker-image — imageRegistryUrl, для win-installer — объект installer.{url,sha256,sizeBytes}). Шаблон сам добавит tag, channel, gitCommitSha, publishedAt и POST в панель. Нужны переменные окружения CI_PANEL_URL + CI_PANEL_TOKEN — берутся из Group-level CI/CD variables в GitLab.

Эндпоинты, которые ты можешь дёргать руками

МетодПутьЗачем
GET/api/clients/latest?clubSlug=&pcId=&productKey=То же что и десктоп-клиент. Без auth. Полезно отладить: «что моему ПК должны прислать»
POST/api/clubs/:id/apply-client-versionБамп target-версии всего клуба + push RecheckUpdates
DELETE/api/clubs/:id/apply-client-versionСбросить target — клуб вернётся на channel-latest
POST/api/computers/:id/version-overridePin ПК на конкретную версию
DELETE/api/computers/:id/version-overrideСнять pin
POST/api/clubs/:id/recheck-updatesТолько pushнуть RecheckUpdates без смены target. Body {"pcIds":[...]} — фильтр
GET/api/computers/:id/effective-versionDiagnostic: что target / что installed
GET/api/clients/versions?productKey=…Список версий с counters клубов/ПК

Все mutating endpoints требуют JWT (получи через POST /api/auth/login).

Что лежит в БД (для дебага)

База reborn_platform на panel-сервере (176.114.85.85:5432 через docker exec):

  • clubs — добавились release_channel, client_target_version_id, is_production.
  • computers — отдельная таблица в platform-DB (синкается из клубных reborn_club_*.Computers). Поля: club_id, pc_number, client_version_override, last_reported_version, last_reported_at.
  • client_versions — версии десктоп-клиента, выпущенные через CI. Колонка club_slug='*' — глобальная версия для всех клубов; конкретный slug — переопределение для одного клуба.
  • api_versions — то же самое для rebornapi (docker-image).
  • audit_log — все админские действия с версиями. Если кто-то жалуется «сама обновилась» — смотри сюда.

NATS subjects (полезно знать)

SubjectКто публикуетЧто внутри
recore.cmd.<club>.<pc>.RecheckUpdatespanel-apiКоманда «опроси /latest сейчас»
recore.status.<club>.<pc>desktop-clientHeartbeat с installedClientVersion
recore.ack.<club>.<pc>.<commandId>desktop-clientAck на cmd

Тестовый листенер прямо на сервере:

docker logs recore-transport-nats --tail 50 | grep "RecheckUpdates"

Если что-то сломалось

/api/clients/latest возвращает 404 «No version available»
В client_versions нет ряда matching productKey + channel + (slug OR '*'). Либо версии ещё не опубликованы для этого канала, либо slug клуба написан неправильно. Проверь: SELECT slug, release_channel FROM clubs; + SELECT product_key, channel, club_slug FROM client_versions WHERE is_active=true;.
/api/clients/latest возвращает 404 «Club not found»
clubSlug такого нет в БД. После MR #27 это strict — раньше был fallback на ?channel=, который маскировал тайпы. Это правильное поведение.
Нажал [Перепроверить] — НИЧЕГО не происходит
Проверь по очереди: (1) ПК вообще онлайн? — docker logs --since 5m recore-transport-nats | grep recore.status.<club>.<pc>, должны быть heartbeat'ы. (2) ПК на NATS-транспорте? — если в логах нет heartbeat'ов от этого ПК, значит он ещё на legacy SignalR; RecheckUpdates его не достанет, нужен polling /latest. (3) ПК на v9.2.4+? — handler для RecheckUpdates появился только в этой версии (companion MR #20 в recore/desktop-client). Старые клиенты не падают, просто игнорируют.
Counters в /versions показывают 0/0 везде
Это нормально, если ни один клуб не использовал apply-client-version и ни один ПК не запинен. Counters считают прямые ссылки (clubs.client_target_version_id + computers.client_version_override), не «эффективные» через channel-latest.
Запинил ПК на удалённую версию — что будет
Backend всё равно отдаст эту версию (override priority выше всего), даже если is_active=false. UI показывает ⚠ предупреждение. Если версия действительно битая — сними pin и клуб вернётся на channel-latest. В будущем планируем возвращать 410 Gone на deactivated версии — клиент будет фоллбечиться сам.
drizzle-kit migrate ругается на pgbouncer
Drizzle-kit не работает через transaction-mode pooler. Прямой postgres URL обязателен:
docker compose exec -e DATABASE_URL=postgresql://${PG_USER}:${PG_PASSWORD}@postgres:5432/reborn_platform panel-api npm run db:migrate

Связанные документы

  • Полный runbook в репозитории: recore-platform/docs/UPDATE-SYSTEM.md
  • Спека дизайна: docs/superpowers/specs/2026-05-03-update-system-design.md
  • Implementation plan: docs/superpowers/plans/2026-05-03-update-system-mr28.md
  • MR #28 — recore-platform, добавил всё что выше
  • MR #20 в recore/desktop-client — companion с RecheckUpdates handler в .NET клиенте