Кейс: разработка продукта с ИИ от спеки до прода — cosmomap | m4ksi
cosmomap · постеры звёздного неба, зодиака и карты города

Разработка продукта с ИИ: от спеки до прода

Три постера, веб-конструктор и Telegram Mini App, оплата и PDF на почту и в чат. Конвейер агентов довёл конструктор карты города от движка до продакшена за 10 дней, навёл порядок в системе и построил аналитику из своей базы.

Гибридный подход

Данные — в PostgreSQL. Знание о том, как устроен продукт, — в LLM-wiki, по которой работает Claude. Поверх — конвейер: спека, план, сборка, проверка, живой оракул, деплой. Каждый прогон оставляет уроки в базе.

Не только ИИ

Как IT-команда держим бэкенд на .NET, конструктор на Next.js, рендер-сервис на Node, платежи, телеграм-бот, сервер с CI и мониторингом.

Клиент
cosmomap
cosmomap.ru
Масштаб
1 700+ заказов
за 2025 год, RU
Что сделали
Карта города за 10 дней
+ порядок в системе и аналитика
Технологии
Claude · Next.js · .NET
LLM-wiki · PostgreSQL · Telegram
02 · Карта

Весь продукт вокруг одних данных

Гибридный подход: данные — в PostgreSQL, знание о том, как устроен продукт, — в LLM-wiki для Claude. Вокруг — шесть сфер разработки и бизнеса, и все они читают один центр.

 
 
    03 · Продукт

    Три постера, один конструктор

    Клиент задаёт дату и место, город или знак зодиака, выбирает стиль и размер, платит и получает PDF на почту и в чат. Один и тот же конструктор открывается на сайте и внутри Telegram.

    Конструктор звёздной карты, мобильный экран
    Звёздная карта Небо над местом в заданную минуту. Считается в браузере, d3-celestial. 893 ₽.
    Конструктор постера зодиака, мобильный экран
    Постер зодиака Знак по дате рождения, планета, характеристики. Бесплатный вариант в боте как магнит. 490 ₽.
    Конструктор карты города, мобильный экран
    Карта города Живое превью MapLibre, символ перетаскивается по карте, шесть форматов. Постер строит сервер. 178 ₽.
    ЛендингКонструкторКорзинаОплатаPDF на почту и в чат
    Лендинг cosmomap.ru
    cosmomap.ru · лендинг статикой, ведёт в конструктор с UTM
    Лендинг карты города Point
    cosmomap.ru/point · лендинг карты города, собран вместе с продуктом
    • Сайт и Mini Appодин конструктор Next.js открывается в браузере и внутри Telegram; заказ из Mini App привязан к пользователю бота
    • Оплатакартой через Robokassa, резерв ЮKassa, в боте — Telegram Stars; статус платежа подтверждается вебхуком или опросом
    • ДоставкаPDF по размеру постера, с плашкой и подписью: письмо через Brevo и тот же файл в чат бота
    • Ботвход в конструктор, приветственный промокод, воронки с напоминаниями, админка с рассылками и статистикой
    04 · Схема системы

    Как устроен продукт: от конструктора до PDF

    Три продукта, два входа, три способа оплаты, рендер на сервере и доставка в письмо и в чат. Каждый узел на своей технологии, и всё это описано в одной базе знаний, поэтому агент видит систему целиком.

    Мелочей много. ИИ держит их в одной системе, поэтому работать легче.

      05 · Конвейер

      Как мы ведём разработку: от спеки до мониторинга

      Одна задача — один прогон. Человек пишет спеку с критериями приёмки, агенты планируют, собирают и проверяют, живой оракул подтверждает, выкладка идёт на сервер, уроки ложатся в базу. Каждый этап оставляет артефакт.

      Артефакты прогона
      человек агент-суждение детерминированная команда живой оракул возврат по rework_level
      01

      Спека

      человек
      Что делает

      Человек пишет намерение и критерии приёмки. Продуктовые решения закрыты заранее; то, что оставлено открытым, делегируется с явными границами.

      Что отдаёт

      spec.md — намерение, границы, критерии приёмки. Они становятся общим контрактом всего прогона.

      Чем проверяется

      Из критериев растут тесты, по ним принимает QA и по ним же принимает человек в конце.

      Пример из cosmomap

      Exp-2, MVP CityMap: решения были закрыты в спеке заранее — прогон прошёл 5 фаз без единой переделки.

      Ошибка идёт в тот поток, который ей владеет, не наверх

      Возврат несёт адрес: code — Сборщику, plan — Архитектору, spec — человеку. Примерно в девяти случаях из десяти это код.

      Зелёная проверка доказывает „не сломано“, оракул доказывает „правильно“

      Exp-3: 11 дефектов из 11 прошли мимо зелёной машины. Exp-11: шрифт 22,8 px при полностью зелёном гейте.

      Урок записывается один раз и читается каждым следующим прогоном

      Уроки и перенесённые риски приходят на вход Архитектору и живому оракулу — сами, без напоминания.

      Кто в прогоне

      Оркестратор

      ведёт прогон
      Читает
      бэклог, статусы артефактов, перенесённые риски зоны и каталог уроков — и раздаёт остальным только нужные срезы
      Пишет
      переходы состояний и журнал прогона; чужие артефакты — никогда
      Решает
      кого и когда запускать, маршрут возврата по rework_level, когда остановиться и позвать человека
      чистая база до старта дифф == отчёт гейт после каждой правки лимит итераций

      Архитектор

      суждение
      Читает
      спеку, срез уроков по зоне, код зоны только на чтение, риски прошлых задач
      Пишет
      plan.md — фазы, источник истины, границы сервисов, reuse-scan, риски
      Решает
      разбиение на фазы, взять готовое или писать своё, нужен ли спайк и техническая приёмка

      Сборщик

      суждение
      Читает
      намерение спеки, свою фазу плана, срез уроков, код своей зоны
      Пишет
      код фазы и build.md со всеми тронутыми и удалёнными файлами
      Решает
      тактику внутри утверждённой архитектуры; саму архитектуру — не решает

      QA

      суждение
      Читает
      спеку, план, отчёт сборки, дифф и зелёный лог проверки
      Пишет
      review.md — вердикт, находки и rework_level
      Решает
      принять фазу или вернуть — и в какой поток вернуть

      Летописец

      суждение
      Читает
      закрытые артефакты, находки и дословные правки человека
      Пишет
      канон, уроки, ретро прогона и риски, перенесённые в следующий
      Решает
      что становится уроком, а что — каноном продукта

      Проверка

      детерминированно
      Читает
      рабочее дерево, а не документы
      Пишет
      зелёный или красный и лог прогона проверок
      Решает
      ничего — красный автоматически возвращает Сборщику

      Выкат

      детерминированно
      Читает
      собранную версию и команду человека
      Пишет
      версию на сервере и запись о выкате
      Решает
      ничего — это команда, а не рассуждающий агент
      06 · Этапы

      Спека, дизайн, прототип, MVP, интерфейс, деплой

      Процесс разработки тот же, что у сильной команды. Меняется исполнитель: этапы ведут агенты, а человек пишет намерение, принимает решения и смотрит результат живьём.

      1. 31.05база знаний
      2. 01.06движок
      3. 03.06MVP на dev
      4. 04.06рендер-сервис
      5. 06.06фото-лаборатория
      6. 09.06мобилка, рефактор
      7. 10.06прод
      1

      Спека

      Человек пишет намерение и критерии приёмки по шаблону: цель, текущее состояние по коду, требования, что вне скоупа, открытые вопросы. Продуктовые решения закрыты до старта, спорное делегируется с границами.

      spec.md
      ## Goal вернуть выбор размера, починить поиск города, символ, первая загрузка ## Current state baseline 422a09a · SizeTab собран, не подключён · поиск по полному совпадению ## Requirements 1 [P0] размеры · 2 [P0] поиск · 3 [P1] символ в центр · 4 [P1] Москва по умолчанию ## Acceptance ☐ 4 печатных + 2 соцформата ☐ поиск по части имени ☐ verify зелёный
      2

      Дизайн

      UI-kit продукта: токены цвета, три шрифта, радиусы, тени, компоненты. Из него собран плагин для Figma и живая HTML-витрина. Для лендинга — фото-лаборатория: три варианта героя на песочницах, пять гейтов, выбор направления человеком.

      ui-kit · токены
      ШрифтыInstrument Sans · Bebas Neue · Spline Sans Mono
      Компонентыкнопки ×6 · инпуты · слайдер · тоггл · чипы · карточки · модал · bottom sheet · навигация
      Фото-лаборатория/h1 пара и место встречи · /h2 маршрут прогулок · /h3 марафон
      3

      Прототип

      Сначала спайк: выбрать движок карты и доказать, что он держит наш конструктор. Открытый движок Terraink вынут внутрь приложения, не iframe. Тайлы OpenFreeMap без ключа. Решение записано с причинами и отвергнутым вариантом.

      решение 01.06
      Выбралидвижок внутрь entities/cityMap, наш UI сверху
      Отверглиiframe: фокус, postMessage, два React, лицензия
      Спайк-firstрендер-сервис: движок выбран до архитектуры, ноль замен потом
      4

      MVP

      Прогон конвейера: архитектор проверил спеку против кода и живого API, разбил на пять фаз, сборщики и QA прошли их с первого раза, живая проверка нашла то, что не видит зелёная сборка. Через два дня после движка MVP на dev.

      прогон Exp-2 · 03.06
      5фаз
      0петель переделок
      11агентов-суждений
      19файлов в диффе
      5

      Интерфейс

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

      прогоны 6–11
      Exp-6форматы, тоггл ориентации, косметика конструктора
      Exp-8превью = живой вектор, финал = рендер на сервере
      Exp-11кадр города, жесты, символ на таче; оракул поймал шрифт 22.8px при зелёных проверках
      6

      Деплой

      dev и prod на одном сервере, CI по пушу в ветку. Перед продом чек-лист: рендер в общую сеть, кэш тайлов, цены, лишние трекеры. Три репозитория и сервер вышли на прод одним днём, откатов после не было.

      10.06 · production
      backend1ff5109 · рендер-URL, цены 178 / 893 / 490
      frontendbdd6b58 · символ, скидка, кэш тайлов
      landing9b96854 · только Метрика, /point
      07 · Прод и мониторинг

      Сервер, деплой и то, что происходит после

      Пуш в ветку собирает и выкатывает контейнер, сервер отчитывается в Telegram, ошибки приходят туда же. Всё это описано в базе знаний, поэтому агент чинит инфраструктуру по ранбуку, а не по памяти.

      git pushGitHub Actionsdocker buildcompose uphealthcheckTelegram ✅
      • CI на своём серверераннер GitHub Actions на VPS; dev и prod на одной машине, разные порты и compose-проекты, ветка = среда
      • nginx и TLSвход через nginx, сертификаты Let’s Encrypt, автопродление одним cron для обоих окружений; кэш тайлов карты на RU-сервере
      • Рендер-контейнерсервис Node с headless-картой в общей docker-сети; один контейнер на dev и prod, ручной ранбук пересборки
      • Прокси на Railwayисходящий трафик к Telegram и Brevo идёт через свой Caddy, чтобы не зависеть от блокировок с RU-сервера
      • Ошибки в TelegramSerilog пишет критичные ошибки в канал через отдельного бота; уведомления о деплое — в тот же чат
      • Задачи и их дашбордгенерация PDF, письма, воронки и уборка файлов — задачи Hangfire в PostgreSQL, дашборд под паролем
      • Платежи без потерьстатус приходит вебхуком; если не дошёл, его добирает опрос по расписанию; заказ идёт по машине статусов
      • Ранбуки на всёдеплой, префлайт прода, смена цены, пересборка рендера, кэш тайлов, локальный стенд, закрытие сессии: 13 ранбуков
      C
      Cosmomap CIуведомления о деплоях
      Deploy Backend · production
      1ff5109 · 3 мин 29 с · healthcheck 200
      Deploy Frontend · production
      bdd6b58 · 3 мин 32 с · /city-map 200
      Deploy Landing · production
      9b96854 · /point 200
      ⚠️ Serilog · production
      NotificationJob: письмо 24,5 МБ превысило лимит 20 МБ, заказ #… → RequiresAttention
      🔁 Fix · рендер 300 → 150 DPI для больших форматов, письмо снова проходит
      записано в changelog и урок в базу
      08 · Порядок в системе

      Продукт стал понятен ИИ

      Знание о том, как всё устроено и почему, легло в базу рядом с кодом. Агент входит в проект холодным и через минуты действует осмысленно: читает карту, решение, ранбук, а не переписку.

      Было
      • Три репозитория, документация разошлась: цена в трёх местах не совпадала, доки описывали снятые сервисы
      • Как меняется цена, где живут ключи, как деплоить — в голове и в чатах
      • Четыре трекера аналитики, часть мёртвых; ключи в коде
      • В корзину грузился движок карты даже для звёздных постеров
      Стало
      • База знаний как LLM-wiki: системы, решения с причинами, ранбуки, уроки, состояние
      • Дверь CLAUDE.md в каждом репозитории и карта архитектуры между ними
      • Одна аналитика — Яндекс.Метрика; секреты только по указателям
      • Рефактор: корзина 996 → 740 кБ, мёртвые модули и лишние зависимости сняты
      cosmomap-vault/
      HOME.mdединая точка входа
      status.mdчто сейчас живо и что сломано
      systems/14 систем: бэкенд, бот, платежи, рендер…
      decisions/26 решений с датой и причиной
      runbooks/13 ранбуков: деплой, цена, стенд…
      lessons/30 уроков: правило + триггер
      tasks/112 файлов прогонов: спека, план, сборка, ревью
      analytics/разборы по данным прода
      docs/архитектура, маршруты, рендер
      228файлов знания
      26решений
      13ранбуков
      30уроков
      4двери CLAUDE.md
      −26%вес корзины
      09 · Интерфейсы

      Агент поверх базы знаний и телеграм-бот

      Владелец говорит с агентом словами: спросить выручку, поменять цену, разобрать сбой. Агент читает базу знаний и данные и делает. Телеграм-бот принимает заказы и оплату, а в режиме админа показывает статистику и запускает воронки.

      Агент
      Claude · текст и голос
      А
      Агент cosmomap
      поверх базы знаний и данных
      Написать или 🎙 сказать агенту…
      Бот · режим админа
      /admin
      C
      cosmomap
      бот · режим админа
      /admin
      09:41✓✓
      📊 Статистика · август
      Заказов262
      Выручка155 400 ₽
      Звёздная карта168
      Карта города58
      Зодиак36
      Новых пользователей бота1 180
      Покупок из новых74 (6,3 %)
      09:41
      /admin
      Бот · клиент
      /start
      C
      cosmomap
      бот · заказ и оплата
      Постеры звёздного неба, зодиака и карты города.
      Выберите продукт 👇
      12:04
      /start
      10 · Дашборд

      Аналитика из своей базы: шесть отчётов

      Бэкенд считает метрики прямо из PostgreSQL: продажи по продуктам, новые пользователи бота, воронки, источники, промокоды. Без внешнего сервиса, каждый период сравнивается с предыдущим.

      admin.cosmomap.ru / analytics
      01.08 — 31.08.2026
      сравнение с 01.07 — 31.07.2026
      все площадки
      Europe/Moscow

      Обзор

      POST /api/analytics/dashboard
      Выручка
      155 400 ₽
      +9,6 % к июлю · 141 800 ₽
      Заказов
      262
      +8,7 % к июлю · 241
      Средний чек
      593 ₽
      +5 ₽ к июлю · 588 ₽
      Оплат в день
      8,5
      262 оплаты за 31 день
      Выручка по месяцам, тыс. ₽
      118,4 96,2 121,7 133,9 141,8 155,4 мар апр май июн июл авг
      Выручка по продуктам
      155 400 ₽ за август Звёздная карта 128 900 ₽ · 83 % Постер зодиака 16 200 ₽ · 10 % Карта города 10 300 ₽ · 7 %
      11 · Данные решают

      Ценовой эксперимент: решение из заказов, а не из кабинета

      Десять дней меняли цену звёздной карты и считали по реальным оплатам из своей базы. Итог: витрину не снижать, скидки давать адресно промокодами через бота, а рекламной площадке отдавать конверсии по полной цене.

      Три цены, десять дней

      01

      +34 % к цене обрушили продажи в четыре раза. Вдвое дешевле — объём ×2, но по прибыли в день 893 ₽ выигрывает при любой разумной цене привлечения.

      Кого видит реклама

      02
      Стоимость привлечения в кабинете 321 ₽ по своей базе 219 ₽

      Треть оплат площадка не видит. Реальная стоимость привлечения на 32 % ниже, чем показывает кабинет.

      Промокоды по времени

      03

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

      Что решили

      04
      • 1192 ₽ — убрать. Худшая точка: падают и объём, и прибыль.
      • Витрину держать около 893 ₽, к 477 не опускаться.
      • Скидки — адресно промокодами через бота, а не витриной.
      • Директу — конверсия по полной цене; покупки через бот и промокод не отдавать.
      Как это делается
      read-only SQL к боевой базе скрипт считает отчёт
      Следующий шаг — еженедельный отчёт автоматически.

      Окно 29.05–08.06.2026, только звёздная карта, выборка небольшая, направление устойчивое.

      12 · Что даёт конвейер

      Цифрами, из записей прогонов

      Каждый прогон оставляет ретро по одной схеме, поэтому цифры не по памяти. Окно 31.05–13.06.2026, конструктор карты города.

      10дней от движка до прода01.06 → 10.06
      177коммитов в четыре репозитория+ 69 в базу знаний
      11 / 11дефектов пойманы до продаревью, живой оракул, человек
      0откатов на проде с 10.06три репозитория
      0петель переделок в четырёх последних прогонахExp 8–11
      12ретро прогонов по одной схемесравнимы между собой
      30уроков в базе3 закодированы в гейты
      2сессии по устройству вместо шести правок наугадоракул живьём

      Зелёная сборка доказывает «не сломано». Правильность доказывает живая проверка: в прогоне 11 она поймала шрифт 22.8px вместо нужного при полностью зелёных типах, линте и сборке. Правило записано и читается каждым следующим прогоном.

      13 · Как внедряли

      Сначала база знаний, потом конвейер, потом продукт

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

      1. 1

        Система понятна ИИ

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

      2. 2

        Конвейер и уроки

        Одиннадцать прогонов по одной схеме: спека, план, фазы сборки с проверкой и ревью, живой оракул. Каждая ошибка стала уроком, а повторные уроки — гейтами оркестратора.

      3. 3

        Продукт на проде и аналитика

        Карта города вышла на прод вместе со стабилизацией остальных постеров. Дальше решения из данных: цена, реклама, воронки бота — по отчётам из своей базы.

      Две недели в коммитах код, 4 репобаза знаний
      177 коммитов в код и 69 в базу знаний за 12 дней. Пик 4 июня: рендер-сервис, подписи улиц, стабилизация превью.
      14 · Что получили

      Продукт, система и цифры в одном месте

      Черновик — этот блок дописываем последним

      Новый продукт на проде за десять дней

      Карта города от движка до продакшена, вместе со стабилизацией звёздной карты и зодиака.

      Система, в которую можно войти холодным

      Любой агент и любой новый человек читает базу и действует, а не расспрашивает.

      Решения из данных

      Цена, реклама и воронки считаются по своей базе, а не по кабинету площадки.

      15 · Стек

      Стек и IT-инфраструктура

      ИИ работает поверх нормальной инженерной основы. Её мы держим сами.

      • Claude + LLM-wikiагент и база знаний продукта
      • Агентный конвейерспека → план → фазы → оракул → деплой → уроки
      • Next.js 15конструктор, сайт и Telegram Mini App
      • ASP.NET Core 8API, бот, генерация PDF, задачи Hangfire
      • PostgreSQLзаказы, пользователи, промокоды, воронки
      • Node + maplibre-gl-nativeрендер карты города на сервере
      • MapLibre GL + OpenFreeMapживое превью, тайлы без ключа, кэш на своём nginx
      • SkiaSharp + iTextплашка и PDF по размеру, свой DPI на формат
      • Robokassa · ЮKassa · Telegram Starsтри способа оплаты, вебхук и опрос
      • Telegram Bot APIбот, Mini App, воронки, админка, уведомления
      • Brevo + Railway-проксиписьма с PDF, исходящий трафик через свой Caddy
      • GitHub Actions · Docker · nginx · TLSCI на VPS, dev и prod на одном сервере
      • Яндекс.Метрика + /api/analyticsклиентская аналитика и шесть отчётов из БД
      • d3-celestialкарта неба в браузере для звёздной карты
      • Terrainkоткрытый движок стиля карты, встроен в конструктор

      готовы начать сегодня

      Расскажи о своём продукте.

      Разберём систему, напишем спеку, соберём конвейером и выложим на сервер.

      Бесплатная консультация по бизнесу и ИИ Написать в Telegram