Капитанский журнал
Как открыто строится TinkerDice — капитанский журнал.
Отбор вместо починки — генерируем нескольких кандидатов и выбираем лучшего
Почему мы перестали пытаться чинить сломанные игровые графы и начали генерировать нескольких кандидатов — позволяя движку выбрать победителя.
Дескриптивный, прескриптивный, исторический — добавляем метки модальности в документацию
Как мы остановили расхождение доков с реальностью, пометив каждый документ модальностью — и определили чёткие правила арбитража при их расхождении.
Game-Logic IR — атомарные примитивы вместо свободного JavaScript
После нуля играбельных игр мы диагностировали настоящую проблему: просить LLM писать программы — неправильная абстракция. Вот что мы строим вместо этого.
Файл .td — портабельный формат игры для шаринга и дистрибуции
Как мы определили портабельный формат файла для игр Tinker Dice — чтобы можно было сохранить игру, отправить другу и запустить на любом инстансе.
Event-Sourced оркестратор задач — убиваем проблему двух истин
Как мы заменили два несогласованных источника состояния задач event-sourced оркестратором — и построили параллельные воркеры для независимых задач.
Разделяем сессионный слой — от одного God-плагина к четырём чистым модулям
Как мы декомпозировали 340-строчный плагин с 8 ответственностями на 4 сфокусированных модуля — и почему сделали это до добавления новых фич.
Одна тема, один канвас — объединяем четыре дизайн-системы в одну
Как мы свёрнули четыре несовместимые дизайн-системы и три ReactFlow-обёртки в единый theme-провайдер и один универсальный GraphCanvas.
Loom оживает — визуализация и управление с человеком в цикле
Почему мы вытащили визуализацию Loom и HITL-контролы из парковки — и построили два графа, которые Капитан хотел с самого начала.
Возвращаем Loom — вторая попытка визуализации и HITL
Спутник ADR-021: вытаскиваем LoomGraphCanvas и HITL-контролы из парковки с явными границами scope.
Prompt Lab — строим отладочный стенд прежде чем строить продукт
Почему мы перестали переписывать редактор и начали строить лабораторию отладки промптов — и что это говорит о приоритетах.
Loom — декомпозиция монолитного Builder'а на конвейер специалистов
Почему мы заменили одного перегруженного AI-агента пятью специализированными ролями — и назвали всё это ткацким станком.
Разделяем QA на два потока — PipelineFSM и разделение findings по правилам и графу
Почему мы разделили «правила неправильные» и «граф неправильный» — и построили конечный автомат для управления разницей.
Хирургия вместо кувалды — инструмент graph_patch
Почему мы дали AI скальпель вместо бульдозера для исправления игровых графов — и почему JSON Patch не подошёл.
Один источник правды на плагин — убиваем рассинхрон трёх файлов
Как мы свёрнули manifest.ts, definition.ts и core.ts в единый SSOT-дескриптор — и устранили целый класс AI-багов.
Играем в игры, которых ещё нет — Headless Runner и Inspector QA
Как мы построили headless-движок, который разыгрывает тестовые партии в памяти — чтобы AI мог проверить свою работу до того, как человек её увидит.
Сначала правила — разделяем дизайн и сборку игры
Почему мы разделили AI-пайплайн на Designer (с человеком в цикле) и Builder (компилятор) — и ввели Rules-Markdown как мост.
Game-First UX — от веб-форм к тактильному взаимодействию
Почему мы вырвали вкладку «Действия» и превратили каждый игровой объект в точку взаимодействия.
JavaScript-ноды в ActionFlow — даём AI лазейку
Почему мы разрешили AI писать JavaScript внутри игровых графов — и контролируемый контекст, который не даёт этому взорваться.
Сервер становится медиатором — AI-пайплайн через MemoDb и SSE
Как мы перестроили пайплайн AI-генерации так, что сервер — единственный писатель, AI — фоновый воркер, а редактор просто наблюдает.
Кому принадлежит AI? — расширение зоны QC на ai-service
Когда ai-service переехал в основной репозиторий, ему нужен был владелец. QC был естественным выбором.
Модели рассуждения — другие — адаптируем пайплайн под DeepSeek Reasoner
Что изменилось, когда мы переключились на модель, которая думает прежде чем говорить — и почему пришлось отключить половину наших инструментов.
Никаких прямых записей в базу — серверные действия через MemoDb-плагин
Как мы закрыли дыру в безопасности, направив все мутации данных через серверные сокет-действия.
Убивая цепочку HTTP-запросов — как AI Gateway взял тул-коллы на себя
Почему мы перенесли резолвинг AI-тулов с клиента на серверный шлюз — и сократим цепочку задержек с N раундтрипов до одного.
Плагин, которого не должно быть — почему мы запретили плагины под конкретные игры
TurtlePlugin был анти-паттерном, который научил нас: плагины — это универсальные механики, а не хаки под конкретную игру.
Плагины, которые могут исчезнуть бесследно — разделение manifest/definition/core/ui
Как мы спроектировали систему плагинов, где ни одна часть кода не знает ни одного плагина по имени — и почему это важно.
Путь C — AI создаёт, Telegram играет
Продуктовая ставка: AI генерирует настольные игры, люди играют через Telegram WebApp. Вот почему.
Одна библиотека чтобы править всемими — как MemoDb стал нашим хребтом
Почему мы перестали жонглировать REST-эндпоинтами и WebSocket-событиями — и заменили всё единым хранилищем, которое само синхронизируется.
Игровая логика как JSON — GraphDoc DSL и визуальное программирование через ActionFlow
Почему мы описываем настольные игры как графы состояний в JSON — и как AI научился генерировать их из обычного текста.
Ломай всё — почему у нас нет обратной совместимости
Освобождающее (и пугающее) решение никогда не поддерживать обратную совместимость на фазе проектирования.