workflow-studio · техническое задание v2

Студия · техническое задание v2

Веб-студия производства faceless-роликов: стиль, мастер-ассеты, кадры, шоты.

17.08.2026 · источник: projects/workflow-studio/TZ.md · при расхождении кода с этим документом прав документ

О документе

Веб-студия производства faceless-роликов: стиль → мастер-ассеты → сцены и кадры → видеошоты. Документ написан 17.08.2026 после двух раундов брифа с Тимуром и шести направлений ресёрча. При расхождении кода с этим документом прав документ.

Исходники, на которых он стоит: research/R1-gemini-image.md, R2-veo.md, R3a-krea.md, R3b-scenario.md, R4-canvas-ux.md, R5-consistency.md, JTBD.md, конспекты справочника Magnific Spaces (spaces-docs-*.md).

Оглавление

24 раздела

Раздел 0

Как читать

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

Три вещи, которые определяют эту версию и которых в текущей системе нет вообще:

  1. Доводка результата. Взять понравившийся вариант и убрать в нём изъян, а не крутить рулетку заново.
  2. Приёмка по-настоящему видной картинке. Решение принимается глазами, а не по миниатюре 120 пикселей.
  3. Честное поведение на пределах модели. Референсов больше, чем модель держит, режим несовместим с входом, разрешение диктует длительность: система говорит это до траты денег и предлагает выход.
Раздел 1

Задача и ценность

Ролик делается не «генерацией картинок», а удержанием одного и того же героя, места и манеры через десятки кадров. У диффузионной модели нет персистентного представления персонажа: каждый вызов это новая выборка, и лицо уплывает. Держат только два механизма: пиксельный якорь (утверждённая картинка, которая идёт референсом) и единый лексикон признаков (одна и та же формулировка во всех промптах). Оба подтверждены ресёрчем, оба ложатся в основу архитектуры.

Поэтому студия это не генератор картинок, а база знаний канала, из которой промпт собирается сам:

стиль канала ──┐
персонаж       ├──→ промпт кадра ──→ кадр ──→ клип ──→ шот ролика
локация        │
предмет      ──┘

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

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

Раздел 2

Границы версии 2

ВходитНе входит (следующими заходами)
Стили канала: библиотека, разбор референсов, фиксация, копииСценарий и автораскадровка сцен
Мастер-ассеты трёх типов, их состояния и инстансыОбложки для YouTube
Мастер-листы: персонаж, предмет, локацияОзвучка, музыка, звук
Сцены, ключевые кадры, роли A и B, дополнительные ракурсыМонтаж, склейка, экспорт готового ролика
Оживление кадров в клипы, дубли, выбор лучшегоПубликация и аналитика
Доводка любого результата, дерево итерацийКисть-маска при доводке
Полная прозрачная экономикаПереиспользуемые рецепты цепочек (аналог Flows)
Просмотр и приёмка, библиотека канала, поискСовместная работа, шаринг, публичные шаблоны

Решение о границах принято Тимуром в первом раунде брифа: сначала ядро создания ассетов и шотов, остальное после. Каркас под невходящее закладывается там, где это ничего не стоит (типы этапов как данные, слой драйверов моделей), но код под него не пишется.

Движок генерации: только Vertex AI

Gemini 3 Pro Image, Gemini 3.1 Flash Image, Gemini 2.5 Flash Image для картинок, Veo 3.1 в трёх вариантах для видео. Расширение на других вендоров предусмотрено архитектурой (слой драйверов), но в этой версии не подключается.

Раздел 3

Понятия и модель данных

3.1 Объекты

Система устроена как библиотека компонентов, поэтому аналогия с Figma точная и её стоит держать в голове: мастер-ассет это компонент, состояние это вариант компонента, инстанс это размещённая копия, которая наследует мастера.

ОбъектЧто этоЧем удерживается
Каналконтейнер: формат кадра по умолчанию, свои стили, свои ассеты, свои ролики—
Стильманера канала: техника, палитра, свет, оптика, эпоха, анти-признакизалоченная версия неизменяема навсегда
Мастер-ассетперсонаж, локация или предмет с алиасом @heroякорной картинкой плюс списком признаков
Состояниевариант мастер-ассета: старше, ранен, ночь, зимассылкой на родителя, его якорь идёт первым референсом
Инстансиспользование ассета в конкретном кадреживой ссылкой на ассет и выбранное состояние
Сценамомент истории: место, участники, время суток, описаниезаводится руками, кадры внутри наследуют её
Кадродин ключевой кадр сцены с ролью A, B или дополнительный ракурспромптом, якорями и параметрами съёмки
Шотклип, полученный оживлением кадра или пары кадровкадрами-концами и motion-промптом
Роликпоследовательность сцен и шотовформатом и выбранными стилями
Генерацияодин факт вызова модели: настройки, входы, результат, ценанеизменяема, в историю только добавляется
Итерациягенерация, у которой родителем стоит другая генерацияссылкой на родителя

Правила атомарности

1. Ассет это объект первого класса. Промпт ссылается на @alias, а не переписывает описание. Поправил ассет один раз, поправилось везде, где он снят.

2. Медиа на диске это источник правды, база это индекс. База обязана пересобираться с диска без потери связей.

3. Этапы производства это данные, а не код. Появился новый этап, добавляется запись в каталог, а не ветка if в интерфейсе. На обратном умер video-cabinet.

4. Холст это представление. Он не хранит ничего, кроме раскладки. Ассет, заведённый любым способом, обязан появиться на холсте. Узел, удалённый с холста, не удаляет ассет.

3.2 Стиль: библиотека, а не настройка

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

3.3 Наследование

Стиль (залочен)
  └─ Мастер-ассет ── собран на стиле S1, якорь A1, признаки T1
       ├─ Состояние «старше» ── родитель = мастер, референс = A1, признаки = T1 + дельта
       └─ Инстанс в кадре ── живая ссылка на (ассет, состояние по выбору)

Три правила, которые нельзя нарушать:

  1. Состояние всегда генерируется от якоря родителя, а не от предыдущего состояния. Иначе состояния сами превращаются в цепочку с накапливающимся дрейфом. Подтверждено ресёрчем: у практиков рабочая формула это «тот же персонаж, что на референсе» плюс описание изменения плюс повтор двух-трёх структурных признаков лица, которые меняться не должны.
  2. Инстанс это живая ссылка, а не копия. Поменялся якорь ассета или актуальное состояние, все кадры, где стоит инстанс, помечаются «референс обновился, стоит пересобрать». Автоматической перегенерации нет никогда: это деньги, решение за человеком.
  3. Стиль наследуется вниз, но не переписывается вверх. Кадр берёт стиль, выбранный на нём, а не стиль ассетов. Если ассеты в кадре собраны на другом стиле, система предупреждает.

3.4 Разрешение конфликтов

Таблица обязательна к реализации: это ответ на требование «не должно быть конфликтов».

СитуацияПоведение системы
Кадр собран на стиле S2, ассет в нём собран на S1Предупреждение на карточке до запуска: «герой собран на стиле v1, кадр идёт на v2, манера может разойтись». Запуск разрешён
Промпт кадра противоречит стиль-блоку (просит другую технику)Стиль-блок главнее и вклеивается дословно. Конфликтующая фраза в промпте подсвечивается
Изменился якорь ассетаВсе кадры с его инстансами помечаются «устарело». Пиксели не трогаются, деньги не тратятся
Изменилось актуальное состояние ассетаТо же: пометка, не перегенерация
Два героя назначены в один слот референсаБлокировка запуска: модель не выберет, чьё лицо брать
Референсов больше, чем держит выбранная модельПредупреждение с выбором способа сборки (см. 5.4). Молчаливое отбрасывание запрещено
Промпт кадра без стиль-блокаБлокировка: кадры разъедутся по манере
Пустое описание сценыБлокировка: генерировать нечего
У персонажа нет профильного ракурса в мастер-листеПредупреждение: главная причина «лицо плывёт на повороте»
Референс взят из предыдущего клипа, цепочка длиннее пяти шаговПредупреждение о ре-якорении на мастер-лист
Выбран режим оживления, несовместимый с модельюВход гаснет с объяснением, запуск невозможен
Разрешение видео требует фиксированной длительностиДлительность фиксируется автоматически, показывается причина
Алиас в промпте не найден среди ассетов каналаПредупреждение: в промпт уйдёт как есть, модель его не поймёт

3.5 Схема базы

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

channel(id, slug, name, aspect_default, format, created_at, meta_json)

-- СТИЛЬ: библиотека, лок неизменяем
style(id, channel_id, title, status, guide_json, prompt_en, prompt_ru, negatives,
      copied_from_style_id, is_primary, created_at, locked_at)
      -- status: draft | locked

-- АССЕТЫ: мастер, состояние как вариант, оба в одной таблице через parent
asset(id, channel_id, kind, alias, name, summary, status,
      parent_asset_id,          -- NULL у мастера, у состояния = мастер
      style_id,                 -- на каком стиле собран
      anchor_image_id,          -- утверждённый якорь
      sheet_image_id,           -- утверждённый мастер-лист
      traits_json,              -- лексикон признаков, до 4 опорных
      created_at)
      -- kind: character | location | prop
      -- status: draft | anchored | sheeted | stale

-- ГЕНЕРАЦИИ: неизменяемый факт, дерево через parent
generation(id, target_kind, target_id, kind, model, params_json,
           prompt_en, prompt_ru, prompt_layers_json, refs_json,
           parent_generation_id,     -- NULL у корневой, иначе доводка
           status, cost_usd_est, cost_usd_real, similarity_score,
           error_text, created_at, finished_at)
           -- kind: image | image_edit | video | style_extract | prompt_build

image(id, generation_id, path, preview_path, role, width, height, meta_json, created_at)
      -- role: ref | candidate | anchor | sheet | keyframe | plate | template
clip(id, generation_id, path, poster_path, duration_sec, resolution, mode, meta_json)

-- РОЛИК, СЦЕНЫ, КАДРЫ, ШОТЫ
video(id, channel_id, slug, title, aspect, status, target_sec, created_at)
scene(id, video_id, idx, title, location_asset_id, time_of_day, summary, style_id)
frame(id, scene_id, role, idx, code, shot_size, camera_angle, camera_move, composition,
      lighting, lens, prompt_en, prompt_ru, negatives, model, aspect, quality,
      anchor_image_id, status)
      -- role: A | B | alt
shot(id, scene_id, frame_a_id, frame_b_id, motion_en, motion_ru, model, duration_sec,
     resolution, chosen_clip_id, anchor_distance, status)

-- ИНСТАНСЫ: связь кадра с ассетом, живая ссылка
frame_asset(id, frame_id, asset_id, state_asset_id, role, slot, use_sheet_panel)
      -- role: hero | prop | location | style

-- ГРАФ И ХОЛСТ
node(id, scope_kind, scope_id, type, ref_kind, ref_id, x, y, w, h, collapsed, config_json, state)
edge(id, source_node, source_port, target_node, target_port, data_type)
canvas_version(id, scope_kind, scope_id, title, snapshot_json, is_auto, created_at)

-- СПРАВОЧНИКИ И СЛУЖЕБНОЕ
knowledge(id, category, key, name_ru, name_en, fragment_en, description_ru, tags, sort)
model_card(id, model, family, capabilities_json, prices_json, checked_at)
job(id, kind, target_kind, target_id, status, payload_json, progress_json, cost_est,
    cost_real, result_json, created_at, started_at, finished_at)
trash(id, object_kind, object_id, payload_json, deleted_at, purge_after)
event(id, at, kind, payload_json)

Данные текущих трёх каналов не переносятся: Тимур разрешил чистый старт. Старая база и медиа остаются на диске нетронутыми, новая пишется рядом.

Раздел 4

Паспорт возможностей модели

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

4.1 Схема паспорта

model: gemini-3-pro-image          # ключ в системе
vertex_id: gemini-3-pro-image      # реальный id в Vertex
name_ru: Gemini 3 Pro Image        # что видит человек
family: image | video | vision
tier: draft | final
location: global | us-central1
modes: [text_to_image, edit, sheet]          # какие операции доступны
refs:
  slots_object: 6                  # предметы
  slots_character: 5               # персонажи
  slots_style: 0                   # стилевые референсы
  recommended_total: 3             # практический предел качества
  exclusive_with: []               # с чем несовместимы референсы
params:
  aspect: [1:1, 3:2, 2:3, 3:4, 4:3, 4:5, 5:4, 9:16, 16:9, 21:9]
  quality: [1K, 2K, 4K]
  negative_prompt: false           # отдельного поля нет, только текстом
  seed: unverified
  thinking_level: false
constraints:
  - quality=4K → cost×2
prices:
  per_image: {1K: 0.134, 2K: 0.134, 4K: 0.24}
  per_reference: 0.0011
timing:
  seconds_per_call: 25
checked_at: 2026-08-17

Интерфейс читает паспорт и гасит недоступные входы и настройки, а рядом пишет причину: не «поле неактивно», а «эта модель не принимает конечный кадр, выбери другую или другой режим». Смета берёт цены оттуда же. Дата проверки видна человеку: цифры стареют.

4.2 Картиночные модели: факты на 17.08.2026

ВозможностьGemini 3 Pro ImageGemini 3.1 Flash ImageGemini 2.5 Flash Image
Слоты референсов6 предметов и 5 персонажейдо 14 всего: 10 предметов, 4 персонажа, 3 стиляданных нет, держим 2
Практический предел качества3, мягкое предупреждение с 43, мягкое предупреждение с 42
Разрешения1K, 2K, 4K0.5K, 1K, 2K, 4K1K
Цена за изображение0.134 / 0.134 / 0.240.067 / 0.101 / 0.1510.039 (1K)
Отдельное поле негативанет, вернёт ошибку 400нетнет
Маскатолько смысловая, словамито жето же
Многошаговая доводкада, через идентификатор предыдущего шагадада
Ручка качества рассуждениянетесть, minimal и highнет
Форматы входаPNG, JPEG, WEBP, HEIC, HEIFте жете же

Найденная ошибка в прайсе

Прайс проекта занижал стоимость черновой модели: 1K и 2K стояли одинаково по 0.06 при реальных 0.067 и 0.101, то есть кнопка показывала цену на 40 процентов ниже факта на разрешении по умолчанию. Правится в первую очередь: без этого обещание прозрачной экономики пустое. Цены дорогой модели совпали точно.

Дисциплина форматов

Отдельный факт для дисциплины: формат .gif в маппинге типов есть, а в списке поддерживаемых форматов Gemini его нет. Убрать, чтобы не получать тихий отказ.

4.3 Видеомодели: факты на 17.08.2026

Возможностьveo-3.1veo-3.1-fastveo-3.1-lite
Оживление первого кадрададада
Первый плюс последний кадрдадапроверить
Референсы-ингредиенты (ASSET)до 3до 3проверить, возможно нет
Стилевой референсскорее нет на всём семействе 3.1нетнет
Продление клипада, в API естьдапроверить
Длительности4, 6, 8 секундте жете же
Разрешения720p, 1080p, 4Kте же720p, 1080p
Цена за секунду 720p / 1080p / 4K0.40 / 0.40 / 0.600.10 / 0.12 / 0.300.05 / 0.08 / нет
Негатив отдельным полемдадада
Звукгенерируется, отключаемость проверитьто жето же

Взаимоисключение режимов — подтверждено кодом SDK дословно

Если переданы референсы-ингредиенты, то поля первого кадра, последнего кадра и продления не поддерживаются. Последний кадр невозможен без первого. Продление начинается от видео, а не от кадра. Отсюда прямое требование к интерфейсу: на карточке оживления явный переключатель режима (кадры или ингредиенты или продление), при котором входы других режимов гаснут. Пять входов, из которых половина молча игнорируется, недопустимы.

Разрешение диктует длительность: 1080p и 4K требуют восьми секунд. Значение проверить одним вызовом, но заложить в паспорт сразу.

Раздел 5

Сборка промпта

5.1 Слои картинки

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

[1] стиль-блок        залоченная версия, вклеивается дословно
[2] сцена и действие   что происходит, с раскрытыми алиасами
[3] ремесло            крупность, ракурс, композиция, свет, оптика из справочника
[4] референсы          ролевые обращения: герой с рефа 1, реквизит с рефа 2
[5] идентичность       до четырёх опорных признаков каждого участника
[6] негативы           текстом, потому что отдельного поля у модели нет

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

Найденная нестыковка

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

5.2 Слои видео

[1] движение          что именно движется в кадре
[2] камера             одно основное движение, не смесь
[3] настроение и свет  из гайда стиля и параметров кадра
[4] идентичность      постоянная клауза против морфинга и лишних людей
негативы уходят отдельным полем API, в текст не вклеиваются

Официальная формула Google для Veo: кинематография, субъект, действие, контекст, стиль и атмосфера. Отдельно сказано: определить крупность, ракурс и одно основное движение камеры, не смешивать несколько. Негативы формулировать через то, что должно быть в кадре, а не через «нет» и «без».

Найденная неточность в комментарии кода

Комментарий в текущем коде утверждает, что порядок блоков «так требует Veo». Подтверждения для Veo нет, правило пришло из опыта с другим движком в другом проекте. Переформулировать как нашу практику.

5.3 Роли референсов

Структурного поля роли у API нет. Роль передаётся текстовой подписью перед каждой картинкой, и это согласуется с официальными примерами Google, где роли называются естественным языком. Требования:

5.4 Когда референсов больше, чем держит модель

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

СпособКак работаетЦенаКогда брать
Поэтапная сборка (по умолчанию для двух и более героев)первый вызов ставит героя А, результат фиксируется и идёт основой во второй вызов с героем Бвызовов столько, сколько героевкогда важна узнаваемость лиц
Композитный якорьякоря склеиваются на нашей стороне в одну картинку с подписями и уходят одним слотомодин вызовкогда героев много, а лица не крупным планом
Урезание по приоритетуоставляем героев, отбрасываем второстепенный реквизит, честно показывая что отброшеноодин вызовбыстрые черновые пробы

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

Раздел 6

Стиль канала: как работает

  1. На холсте канала есть узел Стиль. Референсы кидаются на карточку файлами, перетаскиванием и через Ctrl+V. Превью появляются на карточке сразу, до всякой генерации.
  2. Кнопка Разобрать запускает бесплатную агентную задачу: vision-модель смотрит картинки и пишет карту стиля — техника исполнения, палитра, свет, материал, характер линии, оптика, эпоха, анти-признаки. Плюс готовый стиль-блок на английском и его перевод.
  3. Карта правится руками. Это черновик: можно жечь пробные картинки прямо из карточки, чтобы увидеть манеру на реальном кадре. Пробы остаются в истории карточки и ассетами не становятся.
  4. Кнопка Зафиксировать. После неё стиль неизменяем. Кнопка правки исчезает, появляется Сделать копию для доработки.
  5. Стилей в канале сколько нужно. Один помечен основным. На каждом узле генерации виден выбранный стиль и его можно сменить.

Требование

Стиль-блок вклеивается в промпты дословно, без перефразирования агентом. Любая переформулировка на ходу это дрейф манеры.

Раздел 7

Мастер-ассеты

7.1 Общий путь, два этапа

описание словами ──→ [Создать промпт] ──→ ПРОМПТ (узел, правится)
                                              │
                                              ▼
                                        ВАРИАНТЫ (по умолчанию 1)
                                              │ выбрал
                                              ▼
                                          ЯКОРЬ ассета
                                              │
                                              ▼
                                        МАСТЕР-ЛИСТ (по типу ассета)

Правила этапа промпта:

Правила этапа вариантов:

7.2 Мастер-лист персонажа

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

Состав пересматривается по итогам ресёрча. Утверждённый 17.08 эталон даёт четыре панели: полный рост спереди и сзади, голова крупно спереди и сзади. Индустрия сходится на четырёх ракурсах (фронт, левый профиль, спина, правый профиль) с обоснованием «четырёхугловая система убирает анатомические ошибки», и во всех рекомендациях по составу отдельно стоит строгий профиль, которого у нас нет. Профиль это ровно то, что держит лицо на поворотах.

Предлагается шесть панелей 3×2: полный рост три четверти спереди, полный рост строгий профиль, полный рост сзади, голова спереди, голова в профиль, голова сзади. Эталон компоновки на зелёном манекене перегенерируется под новую сетку один раз и утверждается Тимуром. Решение за ним: если он оставляет четыре панели, профиль добавляется отдельной панелью пятой.

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

Если одна панель вышла плохой: две кнопки, по умолчанию доснять эту панель отдельным вызовом и подменить её в листе на нашей стороне, второй вариант перегенерировать лист целиком. Досъёмка дешевле и не ломает остальные панели.

7.3 Мастер-лист предмета

Проблема, названная Тимуром: шаблон не должен навязывать силуэт, предметы не должны плыть в ракурсах, а форма должна наследоваться. Болванка на эталоне работает для человека, но меч и кресло в одну болванку не влезают, а персонажный шаблон индустрии прямо завязан на слова «полный рост, позы».

Решение: форма от якоря, компоновка от шаблона

  1. Генерируется якорь предмета в одном ракурсе, три четверти, целиком в кадре, серый фон.
  2. Остальные ракурсы снимаются от этого якоря по одному: строгий бок, три четверти сзади, деталь материала крупно. Референс каждого вызова это якорь, а не предыдущий ракурс.
  3. Панели собираются в лист на нашей стороне, в единой сетке и масштабе. Шаблон при этом задаёт только рамки панелей и порядок ракурсов, никакого силуэта в нём нет.

Так форма гарантированно наследуется от утверждённой картинки, а не от чужой болванки. Проверяется на двух заведомо разных формах: вытянутой (меч, посох) и объёмной (кресло, сундук).

7.4 Паспорт локации

Turnaround для места бессмыслен. Вместо него четыре вида:

  1. Главный фон: пустой кадр с уровня глаз, без персонажей. Это якорь локации.
  2. Широкий общий вид места.
  3. Вид с оси, повёрнутой на девяносто градусов.
  4. Деталь материала и фактуры крупно.

Требование

Практика «снять место пустым и переиспользовать» задокументирована под именем background plate и подтверждена ресёрчем. Шаг «снять локацию пустой» это первый шаг мастера локации, а не побочный продукт первого сюжетного кадра. Иначе якорем случайно станет кадр с героем, и герой полезет во все следующие кадры этого места.

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

7.5 Состояния

Состояние это полноценный вариант со своим якорем и, если нужно, своим мастер-листом, но растущий из родителя. Реализация:

Что ломает узнаваемость

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

7.6 Инстансы

Инстанс это использование ассета в кадре. Он хранит ссылку на ассет, выбранное состояние (или пометку «актуальное»), роль в кадре и слот референса. Инстанс не хранит копию описания и не может «отвязаться» от мастера, кроме явной операции «сделать самостоятельный ассет из этого инстанса» (создаёт копию).

Раздел 8

Доводка результата

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

ПутьЧто делаетКак устроено
Сгенерировать зановотот же промпт, другая выборкановый вызов, новая корневая генерация в истории
Доработать этотправится именно этот результатрезультат идёт входной картинкой, промптом уходит только правка

Правила доводки:

Кисть-маска

Пиксельной маски у моделей Gemini нет вообще, ни в каком виде: маска только смысловая, словами. Значит «обвести область» реализуется одним из двух способов, и оба идут после ядра: либо формулировкой правки по смыслу («только левая бровь»), либо нашей обработкой на бэкенде — вырезать область, догенерировать отдельно, вклеить обратно с растушёвкой. Второе честнее и точнее, но это своя инженерия, а не кнопка в API. В этой версии не делаем, в архитектуру закладываем место.

Как показывается дерево

Ресёрч дал важное предупреждение: ни Midjourney, ни Krea, ни Figma не рисуют историю графом ветвления на основном экране, все используют линейную ленту или сетку плюс явную ссылку на родителя. Поэтому:

Раздел 9

Ракурсы

Ответ на пункт, который Тимур оставил открытым.

Жёсткий факт ресёрча

Числовое управление камерой существует только у моделей, специально обученных под это (у одного из конкурентов горизонталь ноль-360 градусов, вертикаль минус тридцать плюс девяносто, зум ноль-десять). У наших моделей, ни у Gemini, ни у Veo, параметра камеры нет вообще. Значит числа передавать некуда, и любой виджет с градусами будет имитацией.

Поэтому три инструмента, работающие вместе:

  1. Компас-словарь. Виджет: схема сверху, субъект в центре, восемь позиций камеры по кругу плюс три высоты (ниже уровня глаз, уровень глаз, выше) плюс крупность ползунком от общего до макро. Каждое положение это не градус, а термин из справочника режиссуры: «три четверти спереди», «строгий профиль», «нижний ракурс». Виджет собирает фразу промпта и показывает её текстом. Человек выбирает мышью, модель получает язык, который понимает.
  2. Панель мастер-листа как референс ракурса. Если у ассета есть лист, система подставляет референсом ту панель, что ближе к выбранному повороту. Это самый сильный из трёх инструментов, потому что работает пикселями, а не словами.
  3. Свой референс ракурса. Любая картинка с явной ролью «только композиция и ракурс, содержание не брать». Занимает слот референса, поэтому система показывает, сколько слотов осталось.

Обязателен пункт 1. Пункт 2 включается автоматически при наличии листа. Пункт 3 по желанию.

Термины живут в справочнике режиссуры как данные: крупность, ракурс, движение камеры, композиция, свет, оптика. Русское название для человека, английский фрагмент в промпт, описание «когда применять». Единый лексикон это не украшение: расплывчатые формулировки дрейфуют между генерациями, точные нет.

Раздел 10

Сцены и кадры

Сцена заводится руками (автосоздание появится вместе с автопилотом по сценарию). Сцена хранит место, участников, время суток, короткое описание момента и выбранный стиль. Кадры внутри это наследуют, поэтому дополнительный ракурс не приходится описывать заново.

Кадр имеет явную роль, видную на карточке:

РольСмысл
Aначальный кадр шота
Bконечный кадр шота
altтот же момент другой камерой, вне пары A и B

Операции с кадра:

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

Планировщик покрытия предупреждает, если пропорции планов в ролике перекошены (общие пятнадцать-двадцать процентов, средние тридцать-сорок, крупные двадцать-двадцать пять, макро десять-пятнадцать) и если два одинаковых плана идут подряд. Это предупреждение, не блокировка.

Раздел 11

Оживление

На карточке шота явный переключатель режима, потому что режимы взаимоисключающие на уровне API:

РежимВходыКогда
По одному кадрукадр Aоживить статичный кадр
По двум кадрамкадр A и кадр Bсамый предсказуемый результат, полный контроль начала и конца
По ингредиентамдо трёх референсов, без кадровсобрать движение из ассетов без готового кадра
Продлениеготовый клиппродолжить с последней секунды

При выборе режима входы других гаснут с объяснением. Длительность и разрешение берутся из паспорта модели: 1080p и 4K требуют восьми секунд, у самой дешёвой модели 4K нет.

Motion-промпт пишется отдельно от промпта кадра, слоями из раздела 5.2, с одним основным движением камеры. Негатив уходит отдельным полем: у видеомоделей это официальный параметр, в отличие от картинок.

Предсказуемая деградация

Дублей столько, сколько запрошено, все лежат в истории, лучший помечается рабочим шотом, остальные не удаляются. У клипа есть выходы «первый кадр» и «последний кадр», чтобы сцеплять сцены, но система считает расстояние от якоря и после трёх-пяти шагов требует ре-якорения на мастер-лист. Первые три шага почти незаметны, четвёртый-пятый дают сдвиг цвета, дальше плывут черты лица и фон.

Звук по умолчанию выключен, если отключаемость подтвердится тестом. Звук делается отдельным трактом, и лишняя дорожка в клипе только мешает монтажу.

Раздел 12

Каталог узлов

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

УзелВходыВыходЧто на карточке
Заметка——текст на полотне, в генерации не участвует
Текст—текстполе, форматирование, цвет карточки, упоминания других узлов
Картинка—картинкапревью, загрузка файлом, перетаскиванием и Ctrl+V
Стиль каналареференсы, пожелания текстомстиль-блокпревью референсов, карта стиля, «Разобрать», «Зафиксировать», «Копия», пробы
Промптстиль, описание, ассетыпромптсобранный промпт целиком EN и RU, правка руками, версии
Генерация картинкипромпт, референсыкартинкамодель, количество, формат, разрешение, запуск с ценой, лента истории, шорт-лист
Мастер-ассетстиль, промпт, референсыякорь, паспорталиас, тип, накопленные картинки, «Сделать якорем», статус
Состояниемастер-ассет, описание правкиякорь состоянияродитель виден, дельта признаков
Мастер-листякорь ассета, эталон компоновкилистпанели, досъёмка отдельной панели, «Утвердить»
Сценалокация, участникиконтекст сценыместо, время суток, участники, стиль
Кадрсцена, промпт, референсыкартинкароль A/B/alt, компас ракурса, крупность, свет, лента истории
Оживлениекадр A, кадр B, референсы, движениевидеопереключатель режима, модель, длительность, разрешение, запуск с ценой, дубли
Роликсцены—обложка, число сцен и шотов, переход внутрь
Группа—динамические, по содержимомурамка, двигается вместе с содержимым, цвет

Типы данных и цвета связей: текст синий, картинка фиолетовая, видео зелёное. Соединяются только одинаковые типы, несовместимое физически не прилипает.

Правила связей

  1. Только выход в вход, никаких петель и циклов.
  2. Обычный вход держит одну связь (новая заменяет старую).
  3. Вход референсов держит несколько.
  4. Один выход раздаётся в любое число входов.
Раздел 13

Холст

13.1 Два уровня

Холст канала: стили, ассеты, состояния, мастер-листы, ролики как узлы-входы. Холст ролика: сцены рамками-группами, кадры внутри, шоты. Переход внутрь ролика двойным кликом, возврат по хлебным крошкам. Причина разделения: ролик на тридцать пять кадров это сто пятьдесят узлов, и в одном полотне со стилями и кастом это каша. У Magnific Spaces для того же придуманы страницы внутри пространства.

13.2 Жесты: режим Figma по умолчанию

Дефолт библиотеки холста это поведение карты: драг двигает полотно, колесо зумит. Для дизайнера с двенадцатью годами Figma это ломает мышечную память в первый же час. У библиотеки есть официальный рецепт режима Figma, его и включаем по умолчанию:

ДействиеКак
Панорамаколесо или трекпад двумя пальцами, средняя кнопка, пробел с драгом
ЗумCmd/Ctrl с колесом, пинч на трекпаде
Выделение рамкойобычный левый драг по пустому месту, частичное пересечение выделяет
Вписать всё в экранCmd/Ctrl+0
Множественный выборCmd/Ctrl с кликом

Задокументированный урок

Режим переключаемый в настройках. В ComfyUI однажды сменили жесты между версиями молча и получили волну откатов и жалоб. Жест меняется только явным выбором человека.

13.3 Добавление узлов и навигация

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

Карточка живёт в двух состояниях: свёрнутом (превью, имя, статус, цена последней генерации) и развёрнутом (промпт, настройки, лента истории). Размер тянется за угол, позиция и размер запоминаются. Узлы имеют иконку типа и цветовой код: признанная проблема ComfyUI это узлы, отличающиеся только подписью, их не читает глаз.

13.4 Запуск

Три режима на каждой запускаемой карточке:

РежимЧто делает
Только этот узелпересчитать один шаг на готовых входах
Всю цепочкуот начала до конца
Отсюда и дальшеэтот узел и всё после него, готовое выше не трогаем

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

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

13.5 Отмена действий: три слоя, а не один Ctrl+Z

Прямая находка ресёрча и главное отличие от наивной реализации. Смешивать в одну очередь отмены бесплатные правки и платные генерации нельзя: это источник вопроса «а что вообще делает эта кнопка».

СлойЧто внутриОтменяемо
A. Правки холстапозиции узлов, связи, тексты промптов до запуска, настройки, состав группыда, Cmd/Ctrl+Z, паттерн команд, не снимки
B. Версии холстаименованные снимки структуры целиком, автоснимки между вехами схлопываютсявосстановление версии, как история версий Figma
C. История генерацийфакты вызовов с результатами и ценойнет. Деньги потрачены, результат остаётся навсегда

Отмена во время выполнения это не отмена действия, а отдельная операция «стоп»: готовые шаги сохраняют результат, отменяются текущий и ожидающие.

Раздел 14

Просмотр и приёмка

Требование Тимура: по миниатюрам решение принимать невозможно.

  1. Лента на карточке. Все генерации узла миниатюрами под основным результатом, раскрываются и схлопываются, листаются стрелками. Каждая помнит настройки и цену.
  2. Полный экран. Любая открывается на весь экран: зум один к одному по клику, стрелки листают соседние, Esc закрывает. Отметки «в шорт-лист» и «сделать якорем» доступны прямо оттуда.
  3. Сравнение пары шторкой. Для двух картинок: вертикальная шторка, зум и панорама синхронные для обеих половин. Несинхронный зум делает сравнение бессмысленным, глаз не удержит одну точку.
  4. Сравнение сеткой. Для трёх и более вариантов сетка рядом, шторка физически работает только для пары.
  5. Клавиатура целиком: стрелки листают, цифры назначают шорт-лист, пробел открывает полный экран, Enter делает якорем.

Второй режим просмотра канала это библиотека: таблица всех ассетов и кадров с превью, фильтром по типу, статусу и стилю, сортировкой и поиском. На пятидесяти ассетах холст плохо ищет, и это нормально: у холста другая работа.

Раздел 15

Долгие операции и надёжность

Генерация идёт от тридцати секунд до двух минут. Отсюда жёсткие требования:

Раздел 16

Экономика

Лимита трат нет, это решение Тимура. Взамен полная прозрачность:

ГдеЧто видно
Кнопка запускацена до запуска, пересчитывается вживую при смене модели, количества, разрешения
Подтверждение платного запускаразбивка: модель, число вызовов, разрешение, референсы, сумма, ожидаемое время
Карточка генерациисколько стоила именно она
Карточка ассетасумма по всем его генерациям
Холст роликасумма по ролику
Каналсумма по каналу и за месяц
Панель сессиисколько потрачено за текущую сессию работы
Журнал тратсписок всех генераций с фильтром по дате, модели, объекту, разбивкой по моделям
Отдельная строкасожжено на невыбранное: сумма генераций, которые не стали якорем и не попали в шорт-лист

Правила денег — не подлежат обсуждению

  1. Обойти смету невозможно by design. Появился способ обойти, это баг.
  2. Все модели по умолчанию дешёвые. Дорогая выбирается вручную, когда нужен финал.
  3. Прайс это единственное место, где живут цены, с датой проверки на виду. Первым делом исправляется занижение по черновой картиночной модели (см. раздел 4.2).
  4. Черновой режим без трат существует только для разработки, в интерфейсе Тимура его нет.
  5. Упавшая генерация не тарифицируется и в статистику трат не попадает, но попадает в журнал ошибок.
Раздел 17

Автопроверка похожести

Возможность, найденная ресёрчем и стоящая ноль: сравнение лиц через локальные эмбеддинги (DeepFace или InsightFace, обе библиотеки открытые, работают офлайн, порог берётся из их собственных таблиц).

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

Раздел 18

Производительность

Требование Тимура: система должна летать. Чек-лист, обязательный к реализации, собран из официальной документации холста и замеров:

  1. Типы узлов и связей объявлены вне компонента, не пересоздаются на каждый рендер. Это порог между работающим и неработающим холстом, а не оптимизация.
  2. Все обработчики и объекты-пропы мемоизированы.
  3. Компоненты карточек обёрнуты в мемоизацию: без неё сто узлов дают два-десять кадров в секунду, с ней тридцать пять-шестьдесят.
  4. У контейнера холста явная высота по всей цепочке родителей.
  5. Доступ к узлам и связям только через узкие селекторы стора, не деструктуризация всего массива.
  6. Отрисовка только видимых узлов включается, но проверяется бенчмарком на реальных карточках: на средних графах она может вредить.
  7. CSS карточек простой: без тяжёлых теней, градиентов и анимаций на масштабе.
  8. Свёрнутые ветви не держатся в DOM.
  9. В карточках только превью в webp, оригинал только в полном экране.
  10. Ленивая загрузка превью с отменой загрузок за пределами экрана.
  11. Рабочая нагрузка держится в районе трёхсот-шестисот узлов на полотне. Тысяча это край возможностей библиотеки, а не комфортная зона: холст ролика на этом основании и разделён с холстом канала.
  12. Автораскладка вынесена в отдельную функцию, начинаем с лёгкого движка, точка подмены оставлена.

Целевые числа приёмки

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

Раздел 19

Архитектура и стек

┌───────────────────────── браузер ──────────────────────────┐
│ React 19 + Vite + Tailwind + @xyflow/react                 │
│ холст канала · холст ролика · библиотека · просмотр         │
│ стор Zustand с узкими селекторами, паттерн команд для undo  │
└───────────────┬────────────────────────────────────────────┘
                │ REST + подписка на состояние (поллинг состояния графа)
┌───────────────▼────────────────────────────────────────────┐
│ FastAPI (порт 8310)                                        │
│ api/    граф, ассеты, стили, сцены, кадры, шоты, экономика  │
│ media/  стрим картинок и клипов с Range, превью             │
│ models/ паспорта возможностей моделей и прайс               │
│ compose/ сборка промптов по слоям                           │
└──────┬───────────────────────────────┬─────────────────────┘
       │                               │
┌──────▼─────────┐          ┌──────────▼───────────┐
│ воркер gen     │          │ воркер agent         │
│ Vertex image   │          │ headless claude -p   │
│ Vertex veo     │          │ разбор стиля, промпты│
│ тратит деньги  │          │ бесплатно, подписка  │
│ конкурентность │          │ конкурентность 1     │
│ 2 карт / 1 вид │          └──────────────────────┘
└──────┬─────────┘
       │                    ┌──────────────────────┐
       └───────────────────▶│ SQLite (индекс)      │
                            │ файлы медиа (правда) │
                            │ локальная проверка   │
                            │ похожести лиц        │
                            └──────────────────────┘

Что переиспользуется из версии 1 без переписывания: сборка промпта по слоям с проверками дисциплины, прайс и смета (после исправления цифр), адаптер Vertex с ретраями, генерация превью, справочник режиссуры, эталон компоновки мастер-листа, паттерн «кнопка в вебе, headless-агент работает, статусы live», отработанный в кабинете ревью chronicles.

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

Развёртывание. Новая версия поднимается на отдельном адресе, старая продолжает работать. Переключение на studio.obahoba.com только после приёмки Тимуром. Basic auth, systemd с автоперезапуском, данные и медиа вне git, логи с ротацией.

Раздел 20

Что проверить дешёвыми тестами до боевых прогонов

Ресёрч оставил семь фактов, которые документация не подтверждает. Каждый закрывается одним-двумя вызовами на дешёвой модели, и все они делаются до первого боевого прогона.

Что проверяемПочему важноКак
Отключается ли звук у Veoлишняя дорожка мешает монтажуодин клип с флагом выключения
Работают ли референсы у самой дешёвой видеомоделипрайс считает, что да, документация молчитодин вызов с одним референсом
Стилевой референс на Veo 3.1код умеет его отправлять, источники говорят, что модель его не берётодин вызов, ловим ошибку
Требуют ли 1080p и 4K ровно восьми секундиначе непонятная ошибка от API вместо честного объяснениядва вызова, четыре и восемь секунд
Регистр значения разрешения 4Kнаш ключ с большой буквы, примеры с маленькойодин вызов
Детерминизм seed у картинокесли работает, экономит перебордва вызова с одним seed и промптом
Сколько референсов реально держит дорогая модельдокументация говорит шесть, анонс четырнадцатьсерия: три, шесть, девять референсов, смотрим где ломается

Результаты пишутся в паспорта моделей с датой. Паспорт с непроверенным полем помечается явно.

Раздел 21

Критерии приёмки

Проверяются мышью на живом сервисе, а не зелёными тестами. Зелёный прогон тестов ничего не доказывает. Каждый пункт привязан к работе из research/JTBD.md.

  1. На чистом канале за один проход получен залоченный стиль из пяти приложенных картинок (J1).
  2. У канала три стиля, любой выбирается на генерации, залоченный не правится, копия создаётся кнопкой (J2, J3).
  3. Референсы цепляются файлом, перетаскиванием и через Ctrl+V и к стилю, и к ассету (J1).
  4. Персонаж доведён от описания словами до утверждённого якоря, вся цепочка видна связями (J4).
  5. Понравившийся вариант доработан правкой словами, исходный не потерян, дерево видно (J5).
  6. Состояние персонажа собрано из мастера, на карточке видно родителя, лицо узнаваемо (J6).
  7. Локация снята пустой первым шагом и переиспользована в двух кадрах без расхождения места (J7).
  8. Предмет получил четыре ракурса, форма во всех совпадает с якорем (J8).
  9. Кадр с героем и локацией собран перетаскиванием связей, промпт виден целиком и правится (J11).
  10. При трёх и более референсах система предложила способы сборки с ценой каждого (J12).
  11. Парный кадр и дополнительный ракурс создаются одной кнопкой и наследуют сцену (J13, J14).
  12. Клип получен по двум кадрам, дубли не потеряны, лучший помечен (J15).
  13. Выбор из шести вариантов сделан без ухода с холста, сравнение шторкой синхронно (J16).
  14. По любой генерации видно, из чего она собралась: слои промпта, референсы с ролями, настройки (J17).
  15. Правка описания и запуск «отсюда и дальше» не тронули стиль и якорь, деньги не потрачены зря (J18).
  16. После дня работы видно расход за сессию, по ассету, по ролику, по каналу и сумму невыбранного (J19).
  17. Закрытие вкладки во время генерации не потеряло результат, уведомление пришло (J20).
  18. Возврат к каналу показывает всё накопленное и место остановки без пересборки (J21).
  19. Любой объект удаляется, удаление обратимо тридцать дней, узел с холста ассет не удаляет (J22).
  20. Холст канала с двадцатью узлами открывается меньше секунды, превью лёгкие (раздел 18).
  21. Боковой панели нет, отдельных страниц стиля и ассета нет, вся работа на карточках.
  22. Смета обязательна перед каждой тратой, цена на кнопке совпадает с фактическим списанием.
Раздел 22

План работ

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

ВолнаЧто делаетсяРезультат
0. Фундаментисправление прайса, паспорта моделей, семь дешёвых тестов из раздела 20, схема базы, каталог типов узлов, контракт APIдокумент контракта и зелёная схема
1. Ядро графахранилище графа, валидация связей, движок выполнения с тремя режимами, очередь, состояния, история генераций как деревосквозной прогон в черновом режиме
2. Холстполотно с портами и связями, режим жестов Figma, поиск узлов, карточки узлов, панель действий, группы и заметки, производительность по чек-листухолст, на котором можно работать
3. Ассетыстили с библиотекой и локом, мастер-ассеты в два этапа, мастер-листы трёх типов, состояния, доводка, просмотр и приёмка, библиотека каналазакрыты работы J1-J10, J16
4. Кадры и шотысцены, кадры с ролями, компас ракурса, поэтапная сборка, оживление с режимами, дублизакрыты работы J11-J15
5. Экономика и надёжностьсрезы трат, журнал, невыбранное, durable-сессии, уведомления, корзина, автопроверка похожестизакрыты работы J17-J22
6. Приёмкапрогон всех двадцати двух критериев мышью, переключение адресаверсия сдана

Внутри волн Тимур контролирует каждый шаг сам, по факту работы: промпты, варианты, мастер-листы. Любой шаг обязан быть остановимым, правимым и повторяемым без потери сделанного. Отдельных гейтов между волнами нет, но и промежуточных отчётов «фаза готова» тоже: показывается работающее.

Раздел 23

Приложения

А. Работы по JTBD — research/JTBD.md, двадцать две работы с критериями закрытия.

Б. Фактическая база с источниками — research/R1-gemini-image.md (референсы, доводка, параметры, цены картинок), R2-veo.md (матрица видеомоделей, взаимоисключения, промпт движения, паспорт), R3a-krea.md и R3b-scenario.md (как решают ракурсы и мастер-листы живые продукты), R4-canvas-ux.md (производительность холста, жесты, отмена, просмотр, антипаттерны), R5-consistency.md (якоря, лексикон, ре-якорение, локации, два героя, автопроверка), spaces-docs-*.md (конспект справочника Magnific Spaces).

В. Правки в сборку промпта — десять пунктов в конце R5-consistency.md: кап признаков в слое идентичности, фраза против подмены лиц при двух героях, ссылка состояния на канон родителя, поэтапный режим, переформулировка комментария про порядок блоков видео, тест формулировки негативов, автопроверка похожести, снятие непроверенной цифры попадания.

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

Д. Антипаттерны, которых избегаем (из R4-canvas-ux.md): молчаливая смена жестов между версиями; смешение бесплатных правок и платных генераций в одной очереди отмены; снимки всего холста на каждое действие; дерево итераций как основной режим холста; зависимость длинной операции от открытой вкладки; узлы без визуального языка, отличающиеся только подписью; цепочки без группировки; несинхронный зум при сравнении.

workflow-studio · техническое задание v2 · документ актуален на 17.08.2026
При расхождении кода с этим документом прав документ. Источник: projects/workflow-studio/TZ.md · наверх