Дизайн-пилларз

Выжимка constitution.md: миссия, три слоя пользователей, ключевые принципы продукта. Здесь — «почему мы делаем именно так». Конкретные технические реализации — в других статьях раздела.

Mother of Learning — бесплатный open-source фреймворк для кооперативных настольных RPG с фокусом на progression fantasy. Помогает группе друзей рассказывать историю, где персонажи растут через циклы. Строится на D&D 5e / 5.5e; адаптируем под любую систему. По духу — движок для RPG-рогалика: петля прогрессии как ядро, а не тактические карты.


Три слоя пользователей

Аудитория разворачивается от частного к общему:

  1. Наши друзья — удобно прямо сейчас, на ближайшей сессии. Первый приоритет при любом решении.
  2. Любая D&D-группа — фреймворк без трения для progression fantasy с петлями, сложным лором, множеством NPC.
  3. RPG-движок — фундамент для будущих систем и контент-паков.

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


Принципы продукта

I. Петля прогрессии — ядро

Петля — не фича, а центральная метафора. Персонаж существует во времени: Петля → День → Момент. Каждый цикл — рост, новые знания, новые способности. Система ДОЛЖНА различать персистентное (уровни, память, абилки) и вайпаемое (состояние мира) на уровне модели данных. «Что изменилось между петлёй 2 и петлёй 3» — один экран, а не ручная сверка.

loop-as-core.md, persistence-scope.md

II. Атомарность данных

Каждая сущность — нода с типом, полями и уникальным ID. Связи между нодами — рёбра с типом. Нода самодостаточна: можно открыть и понять без контекста. Поля типизированы, но расширяемы через JSONB. Одна нода участвует в разных контекстах через рёбра, не через дублирование.

node-graph.md

III. Перекрёстные ссылки и плоская навигация

Данные плоские. Структура — через фильтры и группировку в момент просмотра, а не через жёсткую иерархию в данных. «Академия → 3 курс → Группа 1» — три ноды с рёбрами contains, а не дерево. Группировка — конфигурация представления, не свойство данных. Один компонент (плоский список + конфигурируемая группировка) используется везде: каталог, сайдбар, ростер.

IV. Данные-первичны, UI — линза

Вся функциональность сначала работает как запрос к данным. UI — опциональный слой визуализации. Два режима (игрок / DM) — это два представления поверх одних данных, не два разных продукта.

two-modes.md

V. Event sourcing — история как данные

Каждое изменение в системе — событие. Текущее состояние = результат всех событий до «сейчас». Снапшоты — кэш для производительности, не источник правды. В проде event sourcing применён к транзакциям (transactions — append-only, баланс через SUM()). Цель — расширить до универсального events лога всех изменений мира.

event-sourcing.md

VI. Читалка, не дашборд

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

two-modes.md

VII–X. Ещё четыре принципа процесса

VII. Каждый релиз играбелен. Каждый шаг — что-то, чем уже можно пользоваться на сессии. Scope creep — главный враг; фича дольше двух недель = разбить.

VIII. Простота стека. Next.js + Supabase + Tailwind. Новый инструмент только если текущие доказано не справляются.

IX. Универсальность и open source. Ничего специфичного для конкретной кампании не захардкожено в ядре. Новый DM поднимает пустую кампанию без чтения исходников.

X. Конституция кампании = правила мира. У каждой кампании есть человекочитаемый документ с правилами мира, тоном, homebrew-механиками. Конституция + граф сущностей + текущий момент = полный контекст для AI-помощника DM'а.


Полная версия конституции — .specify/memory/constitution.md. Архитектурное видение — north-star.md.