exchanger-themes/docs/PROJECT_CONTEXT.md
Danil Iarosh ca52efbedc Initial commit: Exchanger Theme DLC Builder
Godot 4.7 project for authoring, previewing, validating, and building Exchanger PCK themes. Includes the example and space-pixel themes, binding contracts, editor tooling, validation/build scripts, and project documentation.
2026-09-22 11:43:13 +03:00

80 KiB
Raw Permalink Blame History

Контекст проекта и handoff

Дата актуализации: 14 сентября 2026 года.

Текущее состояние

  • Builder работает на Godot 4.7.1, главное preview — tools/preview/preview.tscn, размер 720×1280.
  • Реализован полный формат ExchangerThemeDlc v2: 9 production-сцен, 481 обязательный immutable element-binding из JSON и 24 обязательных supplemental runtime-binding, проверяемых Builder отдельно. Четыре optional ID (тексты баннеров, выбор промо-изображения и переключатель питомца) сохраняют обратную совместимость; полностью обновлённая тема содержит 509 element-binding; metadata корней экранов и навигации питомца считаются отдельно.
  • themes/example — валидная тема-шаблон; themes/space-pixel — текущая оформленная тема.
  • В SETTINGS space-pixel кнопка добавления промо-ролика использует явный кегль 17 px. Благодаря этому её минимальная ширина равна 365 px, панель списка промо не расширяет общий VBoxContainer, а все видимые панели раздела «ПРОМО» занимают стандартную ширину 664 px в viewport 720×1280. Актуальные build/space-pixel.pck и build/active_theme.pck совпадают: 1700400 bytes, SHA-256 8082656B3F8DBAA74D6FC55659FDE99D636BF4A626BCECA99F93BA8C9123ECF7.
  • space-pixel содержит самостоятельный компонент интерактивного питомца package/components/interactive_pet.tscn: 22 анимации, 414 кадров, Nearest-фильтрация и публичный GDScript-API с прямыми именами анимаций/runtime-профилем. Обычное перемещение исполняет host по отдельному theme-owned navigation v1 активного экрана; составной interact остаётся в теме и управляет экранной anchor-точкой только через scoped runtime host.
  • Optional composite contract позволяет теме задавать последовательность клипов, scale и временные политики навигации, контактов с опорами, границ и ввода. space-pixel выполняет условный поворот, come_closer ×2, повторы action, вычисляемый falling через низ/верх экрана, landing на самой высокой доступной опоре и idle. Любая отмена инвалидирует run-scoped bridge; старые темы сохраняют одиночный semantic fallback.
  • Для автора темы добавлен отдельный дизайнерский гайд docs/COMPOSITE_PET_ANIMATIONS.md: от подготовки клипов и pivot VisualRoot до раскадровки policy, работы с anchor, отмены и QA.
  • Non-sitting состояния питомца используют нулевую локальную поправку дочернего AnimatedSprite2D. Только sitting имеет поправку (0,24), которая опускает его на 20,28 экранного пикселя при scale 0.845; root, hit box и GROUND_OFFSET не меняются.
  • Все восемь non-settings сцен space-pixel содержат невидимые metadata-графы питомца: всего 54 поверхности верхних граней пола/кнопок/окон и 49 climb edges. Settings намеренно остаётся без графа. Визуальные Control не менялись; координаты являются реальными contact points в 720×1280.
  • Exchanger вызывает прямую анимацию dancing темы space-pixel при начале клиентской выдачи и явно проигрывает четыре полных цикла после посадки на Success.
  • Обычное падение питомца использует последовательность прямых анимаций falling → landing → idle: это относится и к отпусканию после drag, и к падению со старой позиции при смене экрана. landing является необязательным для старых тем: при отсутствии анимации host сразу включает idle. Запрос celebrate во время приземления ждёт завершения landing, после чего запускаются четыре праздничных цикла.
  • 7 сентября обновлённый набор исходников питомца синхронизирован в package: добавлены девять состояний (come_closer, idle, landing, turn_left/right, action и три climbing_action*), обновлён dancing, а home/cross включены как runtime-пиктограммы. Клип walking_finish_right переименован в walking_right_stop, walking_finish — в walking_left_stop, а walking_start — в walking_left_start; имена файлов синхронизированы в архиве, source и package. Актуальные space-pixel.pck и Builder active_theme.pck совпадают: 1658512 bytes, SHA-256 76518563591159EC4B8087911D2BB29924BC29C12AAA4FF1544D97ED01648E91.
  • Preview показывает реальные production-сцены, переключает все экраны, отображает binding overlay первой кнопкой слева и поддерживает live reload с сохранением текущей вкладки. Он не назначает сценам Theme/фон/decoration и не добавляет демонстрационные дочерние узлы.
  • Кнопка PET основной галереи открывает отдельный tools/preview/interactive_pet_preview.tscn: viewer динамически загружает InteractivePetScene активной темы, строит кнопки из её API и автоматически вписывает персонажа в stage с масштабом до 4×. Отдельная кнопка запускает составной interact через тестовый runtime с viewport и верхней опорой. Preview tooling не входит в PCK.
  • Все 18 production-сцен example и space-pixel самодостаточны: root применяет package Theme, содержит ThemeBackground/BackgroundDecoration и metadata exchanger_self_contained_visuals = true.
  • Home, CardAmount и Settings содержат готовые theme-owned runtime-узлы: 16 кнопок сумм, 16 строк бонусов, 16 строк готовых сумм и 12 строк промо. Host не должен изменять визуальное дерево ThemeView.
  • Итоговые панели CashPayment, CardAmount и CardCustomAmount имеют общий заголовок «К ВЫДАЧЕ» и раздельные theme-owned Label базовых жетонов слева и бонуса справа. В CardAmount исходный immutable-binding ...reward_panel.content.value сохранён для базы, а отдельный Bonus использует supplemental runtime-binding card_amount.content.reward_panel.content.bonus; старые темы без него поддерживаются host legacy fallback.
  • В SETTINGS обеих тем заранее находятся скрытые theme-owned текстовая и цифровая клавиатуры: 33 буквенных слота, переключатели языка/символов/регистра, действия редактирования и цифры 0–9.
  • SETTINGS обеих тем содержит готовый раздел «Сервис» для учёта жетонов и скрытый диалог пересчёта/ручного добавления. Их 14 binding-id входят в неизменяемый контракт, включая отдельные Label точного остатка hopper 1/2. Три обязательных supplemental binding не входят в JSON-каталог 481 элемента: Label ...service_inventory_panel.margin.content.description позволяет host менять описание по режиму учёта, а CheckButton ...service_inventory_panel.margin.content.inventory_enabled включает учёт остатка по умолчанию, а CheckButton ...service_inventory_panel.margin.content.purchase_limit_enabled по умолчанию запрещает продажу сверх учтённого остатка; host только обновляет готовые theme-owned узлы и подписывает сигналы.
  • Полный supplemental-срез состоит из 24 обязательных ID: 6 Home, 7 кнопок навигации «Главная», 1 CardAmount и 10 Settings. Кнопки навигации добавлены на все экраны, кроме Home и Settings: на экранах с Back они находятся справа от неё, а на Success/Error/ServiceAccess занимают её стандартную позицию. Возврат отменяет незавершённую оплату; на Success кнопка недоступна во время выдачи. Основа кнопки — KeypadButton: в space-pixel это готовый assets/ui/button_square.png с наложенной interactive_pet/home.png, а example рисует встроенную пиктограмму дома без дополнительного ассета. Optional home.decoration.custom_text_block объединяет готовые речевую плашку и персонажа справа, когда они есть в дизайне; home.decoration.right_character сохранён как legacy fallback для старых тем. Канонический перечень типов и ID находится в docs/BINDING_CONTRACT.md.
  • Встроенный EditorPlugin Exchanger Theme Manager добавляет в меню Редактор команды Выбрать тему, Создать тему, Экспортировать тему и Применить тему к Exchanger. Экспорт сначала предлагает любую валидную тему по ID, затем открывает стандартный save-dialog и асинхронно собирает её в выбранный PCK без переключения preview и установки. Выбор, создание, экспорт и применение показывают этапы и процент в общем окне прогресса; применение устанавливает активную тему в стандартный пользовательский каталог. Все каталоги тем постоянно видны в Godot FileSystem и не содержат .gdignore.
  • Сборка создаёт build/<theme-id>.pck и build/active_theme.pck; установка в Exchanger выполняется только явным -InstallToDefaultUserPath.
  • Постоянного exchanger_theme_dlc/ в корне больше нет. Preview читает активный package напрямую по build/active-theme.json; каноническая папка создаётся только во временном изолированном workspace на время validator/export и затем удаляется.

Последняя подтверждённая проверка

Актуальные подтверждённые проверки:

  • 11 сентября 2026 года после проверки исправленного PCK в Exchanger только сидящий питомец оставался выше нужной позиции. sitting получил отдельный visual offset (0,24), который опускает его на 20,28 экранного пикселя при scale 0.845; non-sitting offset остаётся нулевым. GROUND_OFFSET=(64,96), VisualRoot, навигационные точки, Exchanger host и binding-контракт не менялись. Contract check, validator, pet verifier, preview smoke и build прошли; живой PET-preview 720×1280 подтвердил current offset (0,24) и отсутствие clipping. build/space-pixel.pck и build/active_theme.pck совпадают: 1700352 bytes, SHA-256 931A2EAA118722B95E49EA097C8CE41CE9E655F2CF7248CCA050B28A9AF50357;

  • 11 сентября 2026 года устранено завышенное положение питомца на поверхностях: в interactive_pet.gd non-sitting visual offset изменён с (0,-24) на (0,0). При runtime scale 0.845 прежняя поправка поднимала видимый спрайт на 20,28 экранного пикселя, хотя host сохранял корректный anchor. GROUND_OFFSET=(64,96), VisualRoot, навигационные точки и binding-контракт не менялись. Contract check, validator, pet verifier, preview smoke и build прошли; build/space-pixel.pck и build/active_theme.pck совпадают: 1700256 bytes, SHA-256 C1872763DA443190FA3CA2D281E1599B8C4F772CF290A19F3E4E580CAFE2336F;

  • 10 сентября 2026 года composite-действие interact в space-pixel синхронизировано по финальной фазе приближения: VisualRoot достигает масштаба ×2 за первые 75% клипа come_closer, сохраняет его на заключительной четверти клипа и ещё 0.15 секунды после последнего кадра, и только затем запускает action. Точечный runtime-тест PET-preview зафиксировал scale 2.0 уже на кадре 27, на финальном кадре 35 и в начале action;

  • 10 сентября 2026 года устранена линейная фильтрация содержимого space-pixel в Exchanger при физическом разрешении 1080×1920: корни всех девяти self-contained production-сцен теперь явно задают texture_filter = 1 (Nearest). Раньше nearest был задан фону и отдельным изображениям, а Builder дополнительно маскировал проблему глобальной настройкой проекта; текст и прочие наследующие элементы в host могли получать линейный фильтр. Binding-каталог и host-контракт не изменялись. Валидатор теперь требует Nearest на каждом production-root, если manifest задаёт UseNearestTextureFilter: true. Все девять вкладок с binding overlay проверены в живом preview 720×1280; contract check, validator/preview smoke и build прошли. Итоговые build/space-pixel.pck и build/active_theme.pck после финальной composite-правки имеют размер 1698608 bytes и SHA-256 4F65DA0758C4234BA752F112C50830010D0914E1EC5FCD76FD70D913614B45A3;

  • 9 сентября 2026 года экранные заголовки space-pixel уменьшены: общий ScreenTitle использует 36 px вместо 42 px, а заголовок ServiceAccess — 30 px вместо 34 px. Блок техподдержки в собственном footer Home и общем components/footer.tscn сдвинут на 32 px влево (x = 341 px) без изменения размеров, binding-id и runtime-форматирования телефона. Все девять вкладок просмотрены в живом preview 720×1280: заголовки и номер не обрезаются, блок поддержки не пересекается с логотипом. Contract check, validator/preview smoke и build прошли; build/space-pixel.pck и build/active_theme.pck совпадают: 1697968 bytes, SHA-256 628A7D5BDFFB03DF1DEAF835069C243FCC1FFF8D6AA39850B937A336EB0F6417;

  • 9 сентября 2026 года добавлены четыре compatible optional supplemental binding: cash_payment.content.banner_text (Label) для подписи нижней анимированной плашки CashPayment и settings.scroll.content.animated_banner_texts_panel (Control) для готовой панели настройки всех четырёх нижних баннеров. Immutable JSON-каталог сохраняет 481 binding и прежний SHA-256; полностью обновлённая тема содержит 509 element-binding, но старый PCK валиден и получает отсутствующие optional-узлы из встроенной темы. Добавлены также settings.scroll.content.advertisement_poster_panel.margin.content.select_button (Button) для системного выбора изображения промо и settings.scroll.content.menu_visibility_panel.margin.content.show_interactive_pet (CheckButton) для отключения theme-owned интерактивного питомца. Sync-HostBindingContract -Check, packaged contract для example/space-pixel и test-theme обеих тем прошли.

  • 9 сентября 2026 года добавлена supplemental-навигация home_navigation_button для CashPayment, CardAmount, CardCustomAmount, CardTerminal, Success, Error и ServiceAccess. Immutable JSON-каталог не менялся: по-прежнему 481 binding и SHA-256 DDDC89118BEEA78A820561464001656136ED42AC1AD5710FB109D25ADAF44143; с supplemental-слоем на момент этой поставки каждая новая тема содержала 505 обязательных binding. В space-pixel расширены верхние поверхности Back и добавлены три поверхности/перехода навигации, поэтому граф теперь имеет 54 поверхности и 49 climb edges. Sync-HostBindingContract -Check, Test-PackagedBindingContract.ps1, test-theme example, test-theme space-pixel и build/install прошли. Установленный PCK Exchanger: 1664336 bytes, SHA-256 E2CCD76C0374CE3B6285371DF4113511C39C22BCB131D4D3A10F5B391AFBA0A1.

  • 8 сентября 2026 года настройка Home «ПОКАЗЫВАТЬ ПОЛЬЗОВАТЕЛЬСКИЙ ТЕКСТ» получила optional binding home.decoration.custom_text_block: в space-pixel это готовая группа речевой плашки и правого персонажа, поэтому host может скрыть её целиком вместе с обязательным Label текста, не перестраивая ThemeView. Старый optional home.decoration.right_character сохранён для выпущенных тем. Визуальные координаты и ассеты не изменялись; скрипт покачивания использует новый вложенный путь персонажа. Contract copies (481 immutable binding) не менялись; Test-PackagedBindingContract.ps1, test-theme example, test-theme space-pixel, packaged pet verifier (22 анимации, 414 кадров, 51 поверхность, 46 переходов) и build/install прошли. Установленный PCK Exchanger: 1658288 bytes, SHA-256 4DD492DA3B181B86B291D7930F400B1F8B660658EC1AECBC519266C4EFD6B642;

  • 8 сентября 2026 года документация и валидируемый semantic action list синхронизированы с обычным host-flow drop → landing → idle. landing добавлен в generic Theme Validator и PCK/source pet verifier: если тема возвращает для него непустое имя, оно обязано входить в get_pet_animation_names(), при этом старые темы с пустым mapping остаются допустимыми. Документы фиксируют одинаковое поведение после drag и смены экрана, а также очередь celebrate до завершения landing. space-pixel уже содержал корректные ресурсы и mapping: landing — one-shot на 11 кадров при 24 fps, idle — зацикленный на 19 кадров при 24 fps; production-сцены, sprite-sheet, биндинги и PCK не изменялись. Contract check, test-theme для example и space-pixel, а также verifier существующего PCK прошли; verifier подтвердил 22 анимации, 414 кадров, неподвижный root, 51 поверхность и 46 climb edges. Builder PCK-копии остались байт-в-байт одинаковыми: 1658512 bytes, SHA-256 76518563591159EC4B8087911D2BB29924BC29C12AAA4FF1544D97ED01648E91;

  • 7 сентября 2026 года синхронизация с текущим Exchanger исправлена без изменения immutable контракта: Sync-HostBindingContract.ps1 явно исключает все 17 supplemental runtime-binding из генерации JSON, даже когда host обращается к их каноническому пути через буквальный GetNode. Test-PackagedBindingContract.ps1 защищает от попадания в каталог полный набор 17 ID, а не только прежние четыре. Sync-HostBindingContract -Check и проверка package-копий проходят: 9 экранов, 481 binding, SHA-256 DDDC89118BEEA78A820561464001656136ED42AC1AD5710FB109D25ADAF44143; production-сцены и PCK этой правкой не изменялись. Свежий PCK отдельно прошёл в Exchanger полный pet-smoke и исправленный payment-format smoke на mock-оборудовании без сохранения пользовательских Settings.

  • 7 сентября 2026 года три клипа ходьбы space-pixel переименованы сквозным образом: walking_finish_right → walking_right_stop, walking_finish → walking_left_stop и walking_start → walking_left_start. Обновлены sprite-sheet в themes_src, theme source и package, SpriteFrames, export-поля, списки кадров/FPS/one-shot, facing-наборы, preview enum, документация и semantic mapping walk_start_left/walk_finish_left/walk_finish_right. walking_start_right завершает симметричную пару стартовых клипов. Старые четыре имени и файла отсутствуют. Принудительный Godot import, contract check, Theme Validator, pet verifier (22 анимации, 414 кадров, 51 поверхность, 46 climb edges), preview smoke, build и PCK smoke (9 экранов, 23 scripted instances) прошли. build/space-pixel.pck и build/active_theme.pck совпадают: 1658512 bytes, SHA-256 76518563591159EC4B8087911D2BB29924BC29C12AAA4FF1544D97ED01648E91. Пользовательская копия Exchanger не перезаписывалась;

  • 7 сентября 2026 года реализован optional composite contract интерактивного питомца между space-pixel и Exchanger. Theme-owned interact выполняет условный поворот, come_closer со scale VisualRoot до ×2, заданное число action, вычисляет полный путь falling через нижнюю и верхнюю границы, игнорирует опоры до wrap, приземляется на самую высокую доступную поверхность, проигрывает landing и возвращается в idle. Exchanger предоставляет только scoped runtime для anchor/viewport/поверхностей и политик, автоматически отзывает его при смене экрана/темы, drag и конфликтующих действиях; прежний semantic fallback сохранён. PET-preview получил отдельную кнопку и реальный запуск Godot завершил сценарий в idle без ошибок. Contract-синхронизация подтвердила 2 темы/481 binding и SHA-256 каталога DDDC89118BEEA78A820561464001656136ED42AC1AD5710FB109D25ADAF44143; test-theme, validator, preview smoke, PCK smoke (9 экранов, 23 scripted instances), Release-сборка без предупреждений, NUnit 488/488 (18 аппаратных пропущены) и полный Exchanger InteractivePetBehaviorSmoke с явным PCK/mock прошли. Итоговые build/space-pixel.pck и Builder build/active_theme.pck: 1658436 bytes, SHA-256 37E86765C7F8DE542F799AF8523241A6EDE3F4DC4C481E28CCAC76D52C807AC6. Пользовательский каталог Exchanger не перезаписывался;

  • 7 сентября 2026 года верхняя плашка CardAmount темы space-pixel приведена к точной визуальной копии плашки CashPayment/Summary: обе используют цельный atlas-region panel_medium.png, PanelContainer размером 649×125 в позиции (36,148) и одинаковые трансформации заголовка, базовых жетонов и бонуса. Runtime-инспекция Godot 4.7.1 подтвердила совпадение global rect всех четырёх видимых элементов; binding-id и канонические пути Value и Bonus сохранены. Contract check, validator, interactive-pet verifier, preview smoke, сборка и PCK smoke (9 экранов, 23 scripted instances) прошли. build/space-pixel.pck и build/active_theme.pck совпадают: 1435772 bytes, SHA-256 F505882620719F154319A9CD93208F42ECB59FCC615410827A44DADED8F61404;

  • 7 сентября 2026 года итоговые панели CashPayment, CardAmount и CardCustomAmount обеих тем синхронизированы по композиции. Caption CashPayment изменён с «БАЛАНС ЖЕТОНОВ» на «К ВЫДАЧЕ». CardAmount сохраняет обязательный Label Value с ID card_amount.content.reward_panel.content.value по пути SafeMargin/Content/RewardPanel/Content/Value для базовых жетонов слева и содержит отдельный theme-owned Label Bonus справа с supplemental ID card_amount.content.reward_panel.content.bonus по пути SafeMargin/Content/RewardPanel/Content/Bonus; его default — БЕЗ БОНУСА, а runtime-формат — + N ЖЕТОНОВ\nВ ПОДАРОК или БЕЗ БОНУСА. CardCustomAmount сохранил контрактные Label Amount и Tokens на прежних путях, но теперь также размещает базу слева и бонус справа; sample бонуса имеет явный перенос перед «В ПОДАРОК». Validator проверяет точные типы/пути, порядок, размещение, default-тексты и CashPayment caption, а contract-test подтверждает сохранность Value и отсутствие нового supplemental ID в JSON. Visual QA всех трёх экранов обеих production-тем в отдельной Builder-сессии Godot 4.7.1 при 720×1280 подтвердил полную читаемость, отсутствие визуального столкновения, clipping и перекрытия соседних панелей/footer. Contract check, test-theme, validator/preview smoke, сборка с -PreserveActiveTheme и отдельный PCK smoke прошли; PCK содержат 9 экранов и 9/23 scripted instances. JSON-контракт остался байт-в-байт прежним: 481 binding, SHA-256 DDDC89118BEEA78A820561464001656136ED42AC1AD5710FB109D25ADAF44143. Новые PCK: example.pck — 464876 bytes, SHA-256 02B8505FB7F0EF4F4E9C2905D97E8F8751A1DDE86DDF460AFC958CCE6AF51994; space-pixel.pck — 1436988 bytes, SHA-256 4D9AA00FE2096794331B348916D1766B47A45D9EDFEE60BEAB0E424ED4761A67. active-theme.json, Builder active_theme.pck и пользовательский active_theme.pck не изменились; тема не устанавливалась;

  • 7 сентября 2026 года в SETTINGS → «Сервис» обеих тем Label Description получил supplemental binding-id settings.scroll.content.service_inventory_panel.margin.content.description, чтобы host мог менять описание по режиму учёта. Сразу после него добавлен theme-owned CheckButton «УЧИТЫВАТЬ ОСТАТОК ЖЕТОНОВ» с supplemental binding-id settings.scroll.content.service_inventory_panel.margin.content.inventory_enabled и включённым состоянием по умолчанию. Сразу после него добавлен второй theme-owned CheckButton «НЕ ПРОДАВАТЬ БОЛЬШЕ ОСТАТКА» с supplemental binding-id settings.scroll.content.service_inventory_panel.margin.content.purchase_limit_enabled, также включённый по умолчанию. Он позволяет host ограничивать продажу доступным учтённым остатком. Минимальная высота ServiceInventoryPanel увеличена только на высоту новой строки и штатный отступ VBox: с 696 до 772 px. Validator проверяет ID, типы, точные пути, порядок обоих переключателей, тексты и начальные состояния; contract-test отдельно гарантирует, что все три supplemental ID не попали в immutable JSON. Visual QA обеих production-сцен в отдельной Builder-сессии Godot 4.7.1 при 720×1280 подтвердил полную видимость обоих переключателей, hopper-полей и статуса, отсутствие clipping/перекрытий и корректное отделение footer: у example панель имеет фактическую высоту 773 px и зазор до footer 20 px, у space-pixel — 817 px и 47 px соответственно. Contract check, test-theme, validator/preview smoke, сборка с -PreserveActiveTheme и PCK smoke обеих тем прошли; PCK содержат 9 экранов и 9/23 scripted instances. JSON-контракт остался байт-в-байт прежним: 481 binding, SHA-256 DDDC89118BEEA78A820561464001656136ED42AC1AD5710FB109D25ADAF44143. Новые PCK: example.pck — 464268 bytes, SHA-256 AC03334354D285E36A25BFB81D60880F829700F083AF5D728F10AB15C764B63D; space-pixel.pck — 1436492 bytes, SHA-256 166660916913E4766FC91437155BB8B78A405150B3A599CF401CD78A83DFB727. active-theme.json, Builder active_theme.pck и пользовательский active_theme.pck не изменились; тема не устанавливалась;

  • 7 сентября 2026 года Exchanger Theme Manager обновлён до 1.3.3: результат JSON.parse_string() явно объявлен как Variant, а результат Array.pop_back() приведён к Node. В theme_manager_plugin.gd больше нет небезопасного вывода типа из Variant;

  • 7 сентября 2026 года в SETTINGS → «Общие» обеих тем визуально удалены строка названия приложения и панель предпросмотра, а подпись поля покупательской фразы изменена на «СВОЙ ТЕКСТ • ДО 48 ЗНАКОВ». Все существующие application_name и branding_preview_panel binding-узлы сохранены с прежними ID/типами и скрыты; лимит поля short_text остался равен 48. Пояснение раздела больше не упоминает название или предпросмотр. Visual QA обеих production-сцен в отдельной Builder-сессии Godot 4.7.1 при 720×1280 подтвердил отсутствие пустых строк, обрезания и перекрытий, а также сохранность фиксированного footer. Contract check, validator/preview smoke, test-theme и build обеих тем с сохранением active state прошли; PCK smoke подтвердил 9 экранов и 9/23 scripted instances. Контракт остался байт-в-байт прежним: 481 binding, SHA-256 DDDC89118BEEA78A820561464001656136ED42AC1AD5710FB109D25ADAF44143, поэтому обязательное правило обновления docs/BINDING_CONTRACT.md не применяется. Новые PCK: example.pck — 463324 bytes, SHA-256 25E90059652EC26BD1779F7D6761F1CD1248A458F8C93F8E242596D3988FDE9F; space-pixel.pck — 1435548 bytes, SHA-256 E5941A4E7437BA996945E85551714F8B6E11F77A64808C68B29A8B88F66629AB. active_theme.pck в Builder и пользовательском каталоге Exchanger не изменялись и не устанавливались;

  • 4 сентября 2026 года runtime scale интерактивного питомца space-pixel увеличен ровно на 30% (0.65 → 0.845), а сниженная высота оставлена только для sitting: все остальные анимации получили локальную поправку (0,-24). Contract check, test/validator с переходом sitting → non-sitting → sitting, preview smoke, build, PCK verifier и host InteractivePetBehaviorSmoke с явным PCK прошли. PCK имеет размер 1435452 bytes и SHA-256 390C9E3F83B026304F0E75E5A6AAD4458684BBCDFC847FFB542B6CFB1AC278E9. Visual QA preview 720×1280 подтвердил crisp Nearest, отсутствие clipping и пересечения с заголовком для обеих высот. Пользовательский active_theme.pck не устанавливался.

  • 3 сентября 2026 года Exchanger Theme Manager обновлён до 1.3.1: JSON-протокол прогресса между Windows PowerShell 5.1 и Godot использует только ASCII-сообщения и стабильные stage-id, а все видимые русские названия этапов формируются внутри GDScript. Это исключает mojibake вида РџС... независимо от системной кодовой страницы. Контрольная сборка example через powershell.exe завершилась с Stage=complete, Percent=100, сохранила активной тему space-pixel; package binding contract синхронизирован для обеих тем, SHA-256 DDDC89118BEEA78A820561464001656136ED42AC1AD5710FB109D25ADAF44143. После editor filesystem scan Godot 4.7.1 новых parser/runtime errors не зарегистрировал;

  • 3 сентября 2026 года Exchanger Theme Manager обновлён до 1.3.0: диалоги выбора, создания, экспорта и применения получили сведения о теме и этапах, операции показывают общий progress bar, а экспорт позволяет выбрать любой валидный ThemeId независимо от активного preview. Скрипт build-theme.ps1 принимает -ProgressPath и публикует JSON-состояние стадий сборки; режим -PreserveActiveTheme не даёт редакторскому экспорту менять активное состояние и его PCK-копию. Контрольный экспорт неактивной example завершился complete/100% и сохранил хэши active state и active_theme.pck; PCK smoke подтвердил 9 экранов/9 scripted instances. Повторные contract, validator, pet verifier, preview smoke и сборка space-pixel прошли; её PCK сохранил размер 1431068 bytes и SHA-256 5756191317B0318F1833657573B75A5240E96E3B4B063A7E6012C7165B9A2B7D. Headless Godot 4.7.1 подтвердил загрузку плагина и регистрацию команд меню без parser/runtime errors;

  • 3 сентября 2026 года Exchanger Theme Manager обновлён до 1.2.0: добавлена команда Редактор → Экспортировать тему со стандартным FileDialog, выбором произвольного .pck и фоновой общей build-задачей. Экспорт не устанавливает тему; команда применения сохранена отдельно. Аддон загружен в Godot 4.7.1 без parser/runtime errors. Экспорт space-pixel через произвольный -OutputPath, validator, pet verifier, общий PCK smoke, preview smoke и contract check прошли; тестовый PCK содержит 9 экранов/23 scripted instances, имеет размер 1431068 bytes и SHA-256 5756191317B0318F1833657573B75A5240E96E3B4B063A7E6012C7165B9A2B7D;

  • 3 сентября 2026 года space-pixel получил theme-owned navigation v1 для интерактивного питомца во всех восьми non-settings сценах. Невидимые metadata-графы содержат 51 горизонтальную contact surface и 46 связанных climb edges; Settings намеренно исключён. Визуальные Control и 285 кадров не менялись. Component API сопоставляет semantic actions с существующими анимациями (drag = hanging, drop = falling, совместимый climb_finish = sitting) и сообщает scale 0.65, walk/climb speeds 88/72 px/s, hit size 128×128, ground offset (64,96). Generic validator/verifier требуют граф у каждой non-settings сцены темы с питомцем и проверяют уникальность IDs, конечность/границы координат, sit points, ссылки и стыковку climb edges с поверхностями. Contract SHA-256 DDDC89118BEEA78A820561464001656136ED42AC1AD5710FB109D25ADAF44143 не изменился. test-theme space-pixel, validator, preview smoke, export и pet verifier прошли: 13 анимаций, 285 кадров, 51 поверхность, 46 climb edges. Текущие build/space-pixel.pck, build/active_theme.pck и установленная Exchanger-копия совпадают: 1431068 bytes, SHA-256 5756191317B0318F1833657573B75A5240E96E3B4B063A7E6012C7165B9A2B7D. Расширенный host runtime-smoke с mock-оборудованием подтвердил touch/LMB drag, подъём на Home/CashPayment, активацию индивидуального графа каждой сцены, сохранение позиции и falling-падение при переходе, скрытие в Settings и возврат с падением. После добавления celebrate smoke также подтвердил очередь до посадки, ровно четыре запуска dancing и возврат в Sitting; Exchanger unit-тесты: 419/419;

  • 3 сентября 2026 года feature-level контракт интерактивного питомца нейтрализован: optional manifest field InteractivePetScene указывает на произвольную theme-owned Node2D-сцену внутри package; canonical space-pixel компонент/скрипт и builder tooling переименованы в interactive_pet.*. Viewer больше не инстанцирует space-pixel статически: он загружает компонент активной темы, строит кнопки из get_pet_animation_names() и не обращается к папкам текстур. Generic verifier используется в test-theme.ps1 и build-theme.ps1, проверяет API, сигналы, анимации и неподвижность root как в package, так и в PCK. Существующие каталоги source/alien_animation и package/assets/animations/alien_pet сохранены без переименования как внутренняя структура конкретной темы. Legacy components/alien_pet.tscn распознаётся только discovery fallback для старых packages. Contract check, test-theme example (pet SKIP), test-theme space-pixel, живой viewer 720×1280, validator, preview smoke, export и общий PCK smoke прошли; viewer показал 13 динамических кнопок и 285 кадров без parser/runtime errors. build/space-pixel.pck и build/active_theme.pck совпадают: 1388444 bytes, SHA-256 BECBD72EDA68B67C5744B4BE642756186876A6D9754E6DF3B025FC78FD0D3C16;

  • 2 сентября 2026 года Exchanger Theme Manager обновлён до 1.1.0: команда Редактор → Применить тему к Exchanger запускает validator/export/install активной темы в фоновом Thread, показывает компактные состояния выполнения/ошибки и не блокирует UI редактора. Аддон успешно загружен Godot 4.7.1 в editor mode. Для space-pixel прошли byte-identical contract check, validator, preview smoke и PCK smoke (9 сцен, 23 scripted instances). build/space-pixel.pck, build/active_theme.pck и установленная пользовательская копия имеют размер 1388536 bytes и SHA-256 D2D4BCF640374B76D8EFF48919EA7CD9A46AC7059DA42A73A630BE73B39C12D4;

  • 2 сентября 2026 года исходные sprite-sheet из alien_animation перенесены в theme-specific themes/space-pixel/source/alien_animation и package/assets/animations/alien_pet. Компонент, позднее переименованный в interactive_pet.tscn, реализует 13 состояний без движения корня. Отдельный viewer всех состояний проверен живым запуском при 720×1280; он использует тот же production-компонент и стартует с sitting. Contract check, validator, preview smoke, общий PCK smoke и отдельный pet-PCK smoke прошли. Viewer также проверен переходами PET → viewer и Esc → галерея; parser-ошибка вывода типа initial_name устранена явным StringName. Package-копия binding-контракта синхронизирована с авторитетным JSON. Собранные space-pixel.pck и active_theme.pck совпадают: 1389432 bytes, SHA-256 1392F51A12014EB1653F976B252FA55DCC5EFDE53B18563858DEF878CA2ADF3C; установка в Exchanger не выполнялась.

  • 1 сентября 2026 года обе Home-сцены получили theme-owned Label home.scroll.content.stock_status.approximate_count: состояние расположено слева, полоска по центру, приблизительный остаток справа. Builder проверяет этот Label и четыре состояния полоски как supplemental runtime bindings, не меняя JSON-контракт 477;

  • template/example дополнительно приведён к актуальной двуххопперной сервисной панели контракта; contract check, validator и preview smoke прошли для example и space-pixel;

  • package-копии example и space-pixel совпали с авторитетным контрактом SHA-256 7ABC98D7770782D0EB658E6EC8CD8FA4F504B0F61862C84FD5E3580341FE73F2;

  • каталог содержит 473 биндинга, включая 57 keyboard bindings, 4 short_text bindings, 12 сервисных bindings и отдельное поле введённой суммы CardCustomAmount;

  • обе темы прошли Godot import, validator и headless preview smoke после переноса визуального chrome внутрь всех production-сцен;

  • SETTINGS preview получил диагностическое состояние KEYBOARD: OFF/TEXT/NUM, которое меняет только Visible двух уже существующих панелей и позволяет проверить их binding overlay;

  • валидатор подтвердил уникальность всех 473 ID, допустимые типы и наличие всех 57 keyboard bindings в example и space-pixel;

  • Godot EditorFileSystem индексирует themes/example и themes/space-pixel без .gdignore и без duplicate UID; package-сцены открываются напрямую из themes/<id>/package/scenes/;

  • space-pixel успешно собран в PCK; export включил вложенную components/on_screen_keyboards.tscn и прошёл предварительный validator;

  • validator требует пустой suffix у всех 16 полей количества дополнительных жетонов, чтобы тема не могла снова отнять у многозначного числа место припиской;

  • служебные ряды текстовой клавиатуры example и space-pixel выровнены по единой высоте 76 px и зазорам 12 px; в space-pixel отдельный стиль обрезает прозрачные края button_long.png, стрелки имеют touch-target 88×76 px, а длинные действия не сжимают текст;

  • кнопки скрытия обеих экранных клавиатур сохраняют тип Button, прежние binding ID и логику, но используют крупную центрированную стрелку вниз вместо надписи «СКРЫТЬ»; touch-target каждой кнопки равен 64×64 px. space-pixel переиспользует button_down.png, а шаблон example — собственный кодовый SVG assets/ui/keyboard_hide.svg;

  • описание приложения subtitle остаётся удалённым. Отдельная настройка «Короткий текст» использует новые ID home.scroll.content.speech_text и три settings...short_text binding: HOME bubble переносит и центрирует до 48 символов, SETTINGS содержит поле, ошибку и предпросмотр;

  • живой preview через godot-ai загрузил 9 вкладок, переключил каждую из них, включил/выключил binding overlay и не записал ошибок в game/editor logs;

  • визуально подтверждены прямое открытие example/space-pixel scene-файлов, все девять space-pixel вкладок без overlay, портретные 720×1280 и отсутствие внешнего preview chrome;

  • через godot-ai подтверждены готовые Home stock/promo visuals и восемь видимых CardAmount preset-кнопок; скрытые слоты 08–15 не создают пустых ячеек;

  • в шаблоне example экран ручного ввода сохраняет полноразмерную панель 652×768 px и клавиши 152×152 px; в space-pixel этот экран приведён к отдельному JPG-референсу: панель занимает 646×466 px, цифровые клавиши квадратные 46×46 px, длинные действия находятся в нижнем ряду;

  • на экране сервисного входа обеих тем PIN-клавиатура центрирована, а все двенадцать клавиш имеют одинаковый квадратный размер 112×112 px; действия и footer не перекрываются;

  • space-pixel использует пользовательские tumbler_on.png и tumbler_off.png для всех CheckButton; ON/OFF проверены в живом SETTINGS при исходном размере 128×64 px, а все 12 строк имеют одинаковые внутренние отступы слева и справа по 24 px;

  • все 57 SpinBox темы space-pixel используют пользовательские стрелки вверх/вниз; runtime-копии 32×32 px сохраняют пиксельный вид, отделены от поля промежутком 10 px и проверены действием цены 10 → 11 → 10; у 16 бонусных полей удалён суффикс «жет.», чтобы многозначное количество помещалось в поле целиком;

  • все LineEdit (normal/focus/read-only), внутренние текстовые поля SpinBox и OptionButton используют растягиваемый фон из видимой области 290×64 px исходного summa_bar.png;

  • обе полосы HSlider в SETTINGS → «ЗВУК» темы space-pixel увеличены по высоте с 14 до 36 px, видимый круглый grabber отключён, а заполнение 100% доходит до правого края; живой Exchanger подтвердил отсутствие обрезания и наложений в обоих блоках громкости;

  • установленный %APPDATA%/Godot/app_userdata/Exchanger/theme_dlc/active_theme.pck сверён со сборкой по SHA-256; после полного перезапуска Exchanger экран «ОПЛАТА» показал новые тумблеры ON/OFF и квадратные стрелки SpinBox, а runtime-журнал подтвердил активацию space-pixel;

  • прямой preview и обе команды test/build подтверждены при физически отсутствующем корневом exchanger_theme_dlc/; временные workspaces после завершения команд пусты;

  • после пересохранения открытых ui_theme.tres и screen_home.tscn Godot Editor заменил переносимые ссылки на builder-only res://themes/space-pixel/package/...; относительные пути восстановлены, после чего изолированный validator снова загрузил все ресурсы без ошибок;

  • build/example.pck пересобран из актуального package после обновления Home/Settings и контракта: размер 437356 bytes, SHA-256 38C23A7593082462E58F7DE2354013A9E548E2C45D58ACEDD8FC09CA82E38E95; validator, preview smoke и PCK smoke прошли, последний инстанцировал 9 экранов и подтвердил 9 scripted node instances;

  • Test-PackagedBindingContract.ps1, test-theme example, test-theme space-pixel и build-theme space-pixel прошли после удаления короткого описания. Импорт, полный validator, headless preview smoke и export PCK завершились без ошибок;

  • Theme DLC не является самостоятельным приложением и намеренно не содержит main scene, поэтому запуск --main-pack не применяется для QA. Готовность пакета подтверждают validator/export и последующая интеграционная проверка в Exchanger;

  • Exchanger переведён на full-trust theme runtime: host больше не отклоняет GDScript, runtime-узлы, размер PCK или прежний decoration budget; 263 unit-теста прошли, 17 hardware-тестов пропущены из-за отсутствия оборудования.

  • Home темы space-pixel приведён к референсу themes_src/space_pixel/references/photo_2026-08-20_14-09-56.jpg в исходном 720×1280: восстановлены белые bubble-плашки, исходный масштаб и позиции НЛО, панели на y=338/490, билборд, логотип и блок поддержки; обязательные пути и binding-id сохранены.

  • Контрольный Godot-render снизил среднюю абсолютную RGB-разницу Home с референсом с 75,81 до 6,84; полученная на том этапе сборка имела размер 684216 bytes и SHA-256 CD1AB4B914997A369874F7F1E01FCE44B71EEF0BD2297E544D3C3701D809B13B.

  • CashPayment, CardCustomAmount, CardAmount и CardTerminal темы space-pixel приведены к photo_2026-08-20_14-10-27/36/40/43.jpg прямым редактированием production-сцен. Сохранены все обязательные bindings, скрытые CardAmount-слоты 08–15 и исходные bill/coin/card-анимации. Повторная строгая сверка CardCustomAmount/CardAmount заменила приблизительный panel chrome на трёхчастные исходные текстуры и локальные StyleBox с раздельной геометрией фона и текста. Средняя RGB-разница внутри двух основных панелей снизилась с 13,28 до 7,64 и с 15,31 до 10,88 соответственно; финальные кадры вручную сверены по геометрии, заголовкам, кнопкам, CTA, bubble и footer. CashPayment сохраняет MAD 13,66, CardTerminal — MAD 11,58.

  • Runtime CashPayment в Exchanger исправлен под уже существующий тройной binding-контракт: balance получает только рубли, tokens — базовое количество жетонов, bonus — бонус в формате + N ЖЕТОНОВ\nВ ПОДАРОК либо БЕЗ БОНУСА. Поэтому host больше не стирает pixel-perfect значения production-сцены и не объединяет рубли с жетонами в одной строке. Форматирование покрыто отдельными тестами для нулевого баланса и двух бонусных порогов; на этом этапе полный набор Exchanger прошёл 272 unit-теста, 17 hardware-тестов штатно пропущены. Production Windows export успешно запустился, загрузил установленную space-pixel и завершился без theme/binding/fallback-ошибок. PCK осталась байт-в-байт прежней: 718536 bytes, SHA-256 AEB8DD1199F71F1114D523CF9928FA6743383746A9DE689755131E8CE9F16BAA.

  • CardCustomAmount получил отдельный обязательный binding card_custom_amount.content.keypad_panel.content.input_value: введённая сумма обновляется внутри summa_bar, а верхние два Label показывают только базовые и бонусные жетоны через общий PricingPolicy. Контракт содержит 461 ID и имеет SHA-256 EF5C75B467C87107DF070C3885693D69BF57434259EF3F54DB82E5F074172753. После расширения контракта прошли 276 unit-тестов, 17 hardware-тестов штатно пропущены; production export с mock-hardware загрузил внешнюю тему без theme/binding/fallback-ошибок. Новая установленная PCK: 721192 bytes, SHA-256 30A8806709BCA315E1F455FED1F438C5CD377B9ACEC35A249BABDFF12F1888C4.

  • Отдельная настройка «Короткий текст» добавила обязательный HOME Label home.scroll.content.speech_text и три SETTINGS binding с сегментом short_text; deprecated subtitle ID не возвращены. Поле ограничено 48 символами, а Label речевой плашки переносит, центрирует и обрезает текст в пределах авторской композиции. После включения строгого Nearest кегль HOME bubble увеличен с 12 до 16 px, межстрочный интервал равен -2 px, а область Label сужена до реальной белой части спрайта (x=408..590, y=62..135), поэтому короткая фраза читается крупно и переносится внутри облака.

  • После изменения Test-PackagedBindingContract.ps1, test-theme example, test-theme space-pixel, build-theme space-pixel и штатный verify_theme_pck.gd прошли. PCK smoke смонтировал пакет, инстанцировал 9 экранов и нашёл 3 scripted node instances.

  • Footer из референса Home с логотипом Robotic Retailers и двухстрочным номером техподдержки присутствует на восьми production-экранах. Семь экранов используют общий themes/space-pixel/package/components/footer.tscn, Home сохраняет собственные обязательные footer bindings, SETTINGS намеренно остаётся без footer. В CardCustomAmount подтверждение поднято на 12 px, поэтому его область не пересекается с footer.

  • Актуальные build/space-pixel.pck, build/active_theme.pck и установленный %APPDATA%/Godot/app_userdata/Exchanger/theme_dlc/active_theme.pck байт-в-байт совпадают: размер 721192 bytes, SHA-256 30A8806709BCA315E1F455FED1F438C5CD377B9ACEC35A249BABDFF12F1888C4. 27 августа 2026 года после установки выполнен полный перезапуск Exchanger в 720×1280: runtime-журнал подтвердил активацию space-pixel, theme/resource/fallback-ошибок не было, актуальные контрольные кадр и видео сохранены как build/exchanger-speech-bubble-runtime.png и build/exchanger-speech-bubble-runtime.avi. Корни всех девяти сцен наследуют texture_filter = 1, а production TTF импортируется без antialiasing, hinting и subpixel positioning, с oversampling 1.0. Contract, validator/preview smoke и PCK smoke прошли; последний инстанцировал 9 экранов и нашёл 10 scripted node instances.

Зафиксированные решения

  • Внешняя тема владеет визуальным деревом экранов; Exchanger владеет логикой и безопасностью.
  • Интерактивный питомец является optional theme-owned компонентом из InteractivePetScene. Публичный контракт использует только нейтральные pet-методы/сигналы; расположение и имена текстурных каталогов не входят в контракт и определяются ссылками самой сцены.
  • Навигация питомца также theme-owned: обязательные для темы с питомцем v1 Node2D-маркеры во всех non-settings сценах объявляют bounds, горизонтальные поверхности, точки сидения и связанные вертикальные края только через metadata. Settings намеренно исключён. Host не вычисляет маршруты из имён/геометрии Control; component API сопоставляет semantic actions с анимациями и сообщает scale 0.845, скорости 88/72 px/s, hit size 128×128 и ground offset (64,96). GROUND_OFFSET=(64,96) остаётся host-точкой контакта для всех состояний; non-sitting анимации используют нулевую поправку дочернего визуала, а sitting — (0,24). Root, navigation и hit box при переключении состояний не меняются.
  • Exchanger не добавляет, не удаляет, не переносит и не стилизует Control внутри ThemeView; коллекции реализованы заранее созданными theme-owned слотами.
  • Экранные клавиатуры являются теми же theme-owned слотами: host меняет только значения, Visible/Disabled и подключает сигналы; создание или перестройка клавиш в runtime запрещены.
  • Сервисная панель и её диалог также являются theme-owned слотами. Preview-переключатель INVENTORY: OFF/PANEL/DIALOG меняет только видимость готовых узлов для диагностики.
  • 28 августа 2026 года сервисный интерфейс добавлен в example и space-pixel: 12 новых binding-слотов довели контракт до 473 элементов (373 на экране Settings), SHA-256 контракта 7ABC98D7770782D0EB658E6EC8CD8FA4F504B0F61862C84FD5E3580341FE73F2. Contract check, validator и preview smoke прошли для обеих тем. Итоговые build/space-pixel.pck и build/active_theme.pck имеют размер 730888 bytes и одинаковый SHA-256 AD665F4FFC840091E670407D4ADC82463AA269A91D54E181E3639BC8AB8BEF68.
  • 1 сентября 2026 года space-pixel использует проектный button_cancel.png для всех действий «ОТМЕНА»/«УДАЛИТЬ». Пролёты НЛО главного экрана пересобраны по interface.mp4: большая композиция проходит экран на 0–4 секундах, малая — на 9,75–13 секундах 14-секундного цикла; координаты хранятся в системе 1080×1920 и один раз масштабируются production-сценой до 720×1280. Оба набора используют AnimatedSprite2D с двумя кадрами: большой — 1 fps, малый — 1,5 fps. Старые одиночные пролёты и двойное уменьшение масштаба удалены. Godot preview визуально проверен на t=1/2/3/10,5/12/12,5; contract check, validator и preview smoke прошли. build/space-pixel.pck, build/active_theme.pck и установленная пользовательская копия совпадают: 741032 bytes, SHA-256 E97F95F544BC257CB309789FD67585F93FFD1569F5662FE78ACCE7E7D0193D8A.
  • 2 сентября 2026 года фиксированный 14-секундный AnimationPlayer пролётов заменён на scripts/ufo_flight_controller.gd. Большой и малый AnimatedSprite2D независимо проходят экран, после случайной паузы разворачиваются через flip_h и летят обратно; высота каждого нового прохода случайна в диапазоне 260–1660 координат исходной сцены и привязана к шагу 3 px. Покадровые циклы из двух кадров продолжают работать параллельно с Tween-движением. Runtime-проверка подтвердила смену направления/высоты и работающий flip_h; contract check, validator, preview smoke и PCK smoke прошли. PCK smoke инстанцировал 9 экранов и 18 scripted node instances. Собранная, активная и установленная PCK совпадают: 741708 bytes, SHA-256 5034C3DB1DA44565ED45F682757C03E44D238ABDB1A0B2947F371A98C80C10BB. В запущенном Exchanger скрипт загружен из res://exchanger_theme_dlc/ во всех девяти decoration-инстансах; Home runtime подтвердил смену направления -1 → 1, высоты 1632 → 885 и активную смену кадров.
  • Два референсных НЛО вокруг ценового блока Home получили отдельный theme-owned скрипт scripts/home_ufo_bobbing.gd: левый движется с амплитудой 4 px и периодом 3,2 с, правый — 5 px и 3,8 с, в противофазе. Каждый кадр смещения округлён до целого пикселя; базовые позиции AlienLeft y=130 и AlienRight y=83 не изменены. Contract check, validator, preview smoke и PCK smoke прошли; PCK smoke подтвердил 9 экранов и 19 scripted node instances. Exchanger runtime загрузил res://exchanger_theme_dlc/scripts/home_ufo_bobbing.gd и подтвердил изменение обеих Y-позиций при Nearest-фильтрации. PCK-копии совпадают: 743376 bytes, SHA-256 1646AA10C8DD5EA9AE70FA21040507889FC1719FF26E122464E105E9D2012AFE.
  • Двухкадровый нижний Banner экрана Cash больше не меняет видимый размер при переключении. Исходные PNG 1024×256 сохранены; scripts/stable_banner_animation.gd компенсирует различие их цветных bounds (263×167 против 257×163) масштабом и смещением второго кадра. В builder runtime и в установленной PCK внутри Exchanger оба кадра получили одинаковый экранный Rect2 (34.996, 1000.8, 175.421, 111.389), autoplay 1 fps продолжает работать. Contract check, validator, preview smoke и PCK smoke прошли; PCK smoke подтвердил 9 экранов и 20 scripted node instances. Собранная, активная и установленная PCK совпадают: 744728 bytes, SHA-256 FAD047504C95D14CFB8E999B7F5E4EA800BD3EE5AB4E95F3FA7F2836A4E3E8D5.
  • На экране CardAmount отдельные ReferenceAlien и SelectionBubble заменены тем же цельным двухкадровым НЛО-баннером. Обязательный Label card_amount.content.selection_label сохранён поверх белой части баннера, поэтому Exchanger продолжает подставлять runtime-подсказку без изменения host-контракта. Нормализация кадров выполняется scripts/stable_banner_animation.gd; preview, validator, contract check и PCK smoke прошли, PCK smoke подтвердил 9 экранов и 21 scripted node instance. Установленный Exchanger загрузил Banner и скрипт из res://exchanger_theme_dlc/. Собранная, активная и установленная PCK совпадают: 744984 bytes, SHA-256 29A3386FB186415A5A2B30F6B9DFFF42BEBC532A8A43FA8809274F3F927B3784.
  • На CardCustomAmount пары PromoAlien + PromoBubble, а на CardTerminal ReferenceUfo + StatusBubble заменены цельными двухкадровыми НЛО-баннерами. Обязательные card_custom_amount.content.hint и card_terminal.content.countdown сохранены поверх белой части. Оба экрана визуально проверены отдельно в 720×1280; contract check, validator, preview smoke и PCK smoke прошли, PCK smoke подтвердил 9 экранов и 23 scripted node instances. PCK-копии совпадают: 745864 bytes, SHA-256 44E36EBBA126BADC34FD65FFEF78F8E4C7A280D4F56704EBBDCC0F2C63C479B1.
  • 2 сентября 2026 года host-контракт синхронизирован до 479 биндингов: добавлены card_terminal.content.top_bar.back_button, наличный и безналичный таймауты Settings вместо прежнего общего поля. example и space-pixel содержат готовые theme-owned элементы; contract check, validator и preview smoke обеих тем прошли. Новый space-pixel.pck установлен в Exchanger: 747192 bytes, SHA-256 9C42625A26B7620662392FD06F681529157EC129E5BB85BF4990254896A877A1. Headless runtime Exchanger с mock-оборудованием загрузил тему без binding-ошибок.
  • 2 сентября 2026 года сервисные подписи Hopper1Label и Hopper2Label получили отдельные binding-id точного остатка. Контракт синхронизирован до 481 биндинга, SHA-256 — DDDC89118BEEA78A820561464001656136ED42AC1AD5710FB109D25ADAF44143. example и space-pixel прошли contract check, validator и preview smoke. Панель space-pixel визуально проверена в preview при 720×1280: обе подписи целиком помещаются в существующие theme-owned Label и не перекрывают кнопки. Собранные space-pixel.pck и active_theme.pck совпадают: 748120 bytes, SHA-256 B83FBB273588DA450C5A206BFC69C13517048DFD9D2861A2BEB2190BE4239E32. Host runtime-smoke с явным путём к PCK и mock-оборудованием прошёл без binding-ошибок; пакет в пользовательский каталог не устанавливался.
  • Preview и Exchanger инстанцируют те же готовые ScreenScenes; optional manifest-пути общего фона/decoration пусты, чтобы host не дублировал встроенные слои сцены.
  • Production-тема является доверенной и может исполнять GDScript и содержать собственные runtime-узлы; manifest и 481 app-binding остаются обязательными.
  • Host ищет элементы по metadata, а не NodePath, и сверяет SHA-256 каталога контракта.
  • Основной фон статический. Покадровые анимации и НЛО — отдельные спрайты, не живой фон.
  • Внутренние зависимости package задаются относительными путями, чтобы исходники всех тем безопасно индексировались и открывались одновременно.
  • Русская терминология интерфейса: «промо» и «промо-ролик».
  • Автономная память проекта использует project: exchanger-theme-dlc-builder.
  • 10 сентября 2026 года причина отсутствия последних визуальных изменений в Exchanger оказалась не в новой сборке, а в устаревшей установленной копии PCK от 9 сентября. После повторной сборки и установки build/active_theme.pck и пользовательский %APPDATA%/Godot/app_userdata/Exchanger/theme_dlc/active_theme.pck после финальной composite-правки совпадают: 1698608 bytes, SHA-256 4F65DA0758C4234BA752F112C50830010D0914E1EC5FCD76FD70D913614B45A3. Exchanger монтирует PCK при запуске, поэтому для применения заменённого файла требуется полностью закрыть и снова запустить приложение.

Известные ограничения

  • Preview не запускает настоящую оплату, выдачу, COM-контроллер и сохранение настроек. Он показывает начальные значения готовых theme-owned узлов; их реакцию на runtime-данные проверяют в Exchanger.
  • Обновление binding-контракта требует доступного исходника совместимой версии Exchanger и синхронного изменения host hash/tests.
  • themes_src/ и preview_scenes/ сохранены как архив ранней модели и могут путать поиск; новые изменения туда не вносятся.
  • Фактический TTF идентифицирует себя как VCR OSD Mono [RUS by Daymarius], версия от 17 августа 2018 года, designer MrManet; поля copyright/license/license URL пусты. Оригинальный автор VCR OSD Mono публично разрешил коммерческое использование, но отдельное разрешение автора кириллической модификации из первичного источника не найдено. Для внутреннего использования файл сохранён ради pixel-perfect метрик; перед публичной поставкой нужно получить письменное подтверждение Daymarius либо заменить шрифт.
  • Финальное визуальное совпадение всегда требует ручного просмотра всех экранов; headless smoke не оценивает композицию.

Последнее изменение: переключатель интерактивного питомца

17 сентября 2026 года готовый ShowInteractivePet в Settings обеих production-тем (example, space-pixel) получил краткую подпись «ИНТЕРАКТИВНЫЙ ПИТОМЕЦ». Его supplemental binding ID и тип не менялись. Exchanger делает переключатель недоступным, если активный manifest не содержит InteractivePetScene; сохранённое предпочтение при этом не стирается и применяется при следующей теме с питомцем. Контракт BINDING_CONTRACT.md уточнён; PCK требуется пересобрать перед установкой в приложение.

Ближайшие разумные задачи

  1. Перед публичной поставкой получить письменное разрешение на кириллическую модификацию шрифта либо заменить её на лицензированную альтернативу; для внутренней установки это не блокирует QA.
  2. При изменениях host-контракта выполнить документированную миграцию и повторить runtime QA.
  3. Для каждой новой темы начать с example, добавить её собственный source/README.md и документировать отличия/лицензии.
  4. После визуальных изменений сравнивать preview и реальный Exchanger на одинаковом 720×1280.

Старт для нового ИИ-агента

  1. Полностью прочитать корневой AGENTS.md.
  2. Выполнить agentmemory recall с project id exchanger-theme-dlc-builder по текущей задаче.
  3. Проверить git status, если папка уже подключена к Git; на момент создания handoff локальная папка могла ещё не быть инициализирована как отдельный репозиторий.
  4. Прочитать профильный документ и contracts/screen_bindings.v2.json до изменения сцен.
  5. Активировать конкретную тему и работать только в её source//package/.
  6. Завершить contract check, validator, preview smoke, визуальный QA и сохранение memory.

Ziva-Godot запрещён. Для Editor используется только godot-ai.