What is new on the ToRun platform, newest first.
June 2026 — 53 changes
В выборе моделей теперь доступны Google Imagen и Gemini для изображений, а также OpenAI Sora и Google Veo для видео — вдобавок к тем, что уже были. Выбирайте именно ту, что нужна, или доверьте подбор оптимального вариант…
Объединяйте несколько AI-шагов в Workflow и запускайте его, когда нужно, а затем публикуйте в Marketplace или изучайте то, чем поделились другие авторы. Workflow Editor, Runner и Marketplace теперь доступны прямо из меню…
Добавьте ToRun на главный экран и запускайте как обычное приложение — на весь экран и с собственной иконкой, чтобы он был всегда под рукой, пока готовится мобильное приложение.
Новый логотип и более чистый стиль во всём приложении — выверенный для светлой и тёмной тем.
Выбирайте, насколько глубоко AI размышляет — теперь даже в режиме Auto. При создании изображений система может ненавязчиво опираться на вашу сохранённую память, чтобы результаты соответствовали важным для вас людям и дет…
Прогресс генерации теперь отображается прямо рядом с результатом, а не под формой, каждая страница открывается чистой, а ваша последняя работа остаётся на виду, пока более ранние хранятся в Library.
История кошелька теперь разбита на страницы и показывает точные суммы вплоть до долей цента, а удаление элементов из Library больше не вызывает ошибку.
Создайте аккаунт рекламодателя и отправляйте кампании на проверку прямо из своего профиля — без ожидания ручной настройки.
За кулисами: более справедливый учёт бесплатных кредитов, усиленные проверки выплат авторам и прав доступа, более безопасная модерация контента и стабильнее работающие сценарии.
В живом переводе теперь можно выбирать между двумя движками и брать тот, что лучше подходит вашему разговору — включая новый вариант, говорящий на 77 языках, среди которых турецкий и русский. У каждого варианта цена видн…
Модели, которые не входят в ваш тариф, теперь помечены значком замка и кнопкой, позволяющей в одно касание перейти на другой тариф или пополнить кошелёк — а не получить ошибку уже после отправки. Мы также открыли более м…
Поделитесь картинкой один раз — и ассистент сохранит увиденное на весь разговор. Вы сможете спросить о ней даже спустя множество сообщений и после смены модели, а изображение не загрузится заново и не спишет деньги дважд…
Ответы в чате теперь рисуют диаграммы как настоящие диаграммы, оформляют таблицы с чёткими границами и подбирают размер заголовков под сообщение, а не на весь экран — так ответы читаются с первого взгляда.
Когда для модели нужен переход на другой тариф или баланс на исходе, вы увидите дружелюбную плашку с кнопками «Сменить тариф» и «Пополнить кошелёк» прямо здесь. Если ответ нельзя сформировать, мы объясним причину, а не о…
Записи о платежах, история и активность теперь отображаются по вашему местному времени, а не в UTC — так отметки времени совпадают с часами у вас на стене.
Новый чат теперь переиспользует уже пустой, а не плодит пустышки, чаты без единого ответа больше не засоряют список, а временные заголовки заменяются настоящим названием, как только вы напишете что-то значимое.
Компании теперь могут создать рекламный аккаунт и вести собственные кампании от и до — создавать кампании, добавлять к ним рекламные материалы и отправлять на быструю проверку перед публикацией.
Использование собственного ключа провайдера теперь распространяется и на голос в реальном времени, живой перевод и живую транскрипцию: вся работа ИИ идёт через ваш ключ, а мы берём лишь небольшую поминутную плату за плат…
Наши публичные страницы теперь работают на редактируемом контенте на множестве языков, загружаемые изображения проверяются на небезопасное содержимое перед сохранением, регистрация и письма с подтверждением работают надё…
Длинные ответы теперь выполняются на сервере и продолжаются, пока вы переключаетесь между чатами, открываете другую страницу или закрываете вкладку. Вернитесь в любой момент — ответ всё ещё генерируется или уже ждёт вас.
Чаты, начатые внутри проекта, автоматически подхватывают его инструкции, загруженные знания и память, показывают значок проекта с быстрой ссылкой назад и указывают название проекта в списке недавних чатов. К знаниям прое…
Память вашего ассистента теперь отслеживает, как быстро меняется каждый факт, и помечает те, что могут устареть, чтобы опираться на по-прежнему актуальное. Новый редактор позволяет вам самостоятельно просматривать, добав…
Мы добавили новейшие модели для изображений, видео, транскрипции и голоса в реальном времени, а также открыли отдельные страницы перевода и транскрипции, чтобы вы могли обращаться к этим инструментам прямо из меню.
Говорите, и ваши слова переводятся почти мгновенно: выберите два языка, поменяйте их местами одним касанием, и переводчик улавливает ваш голос и передаёт перевод прямо во время речи.
Страница видео теперь синхронно обновляет миниатюры при удалении из вашей библиотеки, позволяет задавать длительность клипа для каждой модели, удалять отдельные клипы и чётко помечает предварительные результаты, так что…
Встроенный ассистент теперь показывает аккуратно отформатированные ответы, удерживает в поле зрения последнее сообщение по мере набора текста, надёжно сохраняет готовый ответ и автоматически присваивает каждому разговору…
Ответы со ссылками, математическими формулами или денежными суммами больше не появляются пустыми или наполовину отрисованными, даже после обновления страницы, а ответы глубокого исследования всегда содержат итоговое резю…
Большой объём незаметной работы: более точный учёт использования и итоговых расходов, более справедливые автоматические возвраты, более устойчивый обмен сообщениями в реальном времени, усиленная защита конфиденциальности…
Публичные записи блога и обсуждения на форуме — вместе с их реакциями и ответами — теперь доступны и тем, кто не вошёл в систему.
Использование теперь тарифицируется с единой справедливой наценкой, шкалы месячных расходов и остатка бюджета показывают точные значения, а список моделей привели в порядок — устаревшие модели убрали, новые флагманские п…
Объявления о рабочих процессах и наборы могут отображать полноценную обложку, благодаря чему просматривать маркетплейс стало удобнее и приятнее.
Попросите ассистента — и он заполнит формы, нажмёт кнопки и проведёт вас по приложению, опираясь на расширенный набор инструментов, который теперь охватывает контакты, раздел FAQ, форум, память и создание рабочих процесс…
Ответы теперь появляются слово за словом, а не целиком сразу, а окошко ассистента можно перетащить в любое удобное место, причём вы видите подсказку о том, над чем он сейчас работает.
Создание проекта и запуск нового чата внутри него теперь работают плавно, так что вы можете держать связанные чаты, файлы и контекст вместе.
Видео воспроизводится без сбоев, приватные медиа загружаются через защищённый прокси, аватары авторов и персон теперь видны всем, а голосовые заметки расшифровываются без ошибок.
Когда часть сервиса испытывает проблемы, уведомление теперь проще для понимания и больше не раскрывает внутренние названия поставщиков.
Подключайте внешние приложения одним входом или с помощью ключа API, чтобы ассистент работал напрямую с инструментами, которыми вы уже пользуетесь.
Инструменты для изображений теперь подбирают модель под вашу задачу, мгновенно показывают встроенный предпросмотр результата, а редактирование снова работает после смены модели у провайдера.
Если изображение или вложение было удалено, история чатов, галерея медиа и редактор изображений теперь показывают аккуратную заглушку вместо того, чтобы прерываться с ошибкой.
В переводчике теперь есть список с поиском, охватывающий около 100 языков, каждый из которых показан под своим родным и английским названием.
Мы добавили подборку новых статей в блоге и тем на форуме — в том числе с отвеченными вопросами, — чтобы с первого дня было что почитать и изучить.
Теперь в чате можно искать по загруженным файлам, запускать Python в изолированной среде, редактировать изображения, транскрибировать и воспроизводить аудио, а также запускать рабочие процессы — всё это не покидая диалог…
Позвольте чату выполнять поиск в живом вебе, проводить многоисточниковые глубокие исследования, извлекать и читать полные страницы — каждый ответ сопровождается источниками.
Ваш ассистент теперь хранит лёгкую память между чатами, может перечислить, что помнит, и выполнит просьбу забыть на любом языке.
Генерируйте и редактируйте изображения, создавайте короткие фильмы и сочиняйте песни с текстом — с поддержкой новых движков для изображений, видео и музыки, единым медиавыбором и библиотекой в одном клике.
Говорите с ToRun вслух — новый режим голосового realtime открывает голосовые разговоры и живую транскрипцию прямо в чате.
Рабочие процессы теперь отдают предпочтение моделям премиального качества, приостанавливаются для вашего одобрения там, где это важно, и могут быть отменены, перегенерированы и возобновлены — при этом каждый результат ср…
Группируйте связанные чаты, файлы и контекст в Проекты, чтобы ассистент всегда имел нужный контекст под рукой.
Создавайте и дорабатывайте объёмный контент и код в специальной панели Canvas прямо рядом с чатом.
Скользящие резюме, более умные контекстные окна и быстрая прокрутка истории сохраняют длинные беседы связными и отзывчивыми, а понятные настройки срабатывают, когда разговор выходит за пределы окна модели.
Гуманное бесплатное пополнение, которое восстанавливается в скользящем окне, более понятные индикаторы расходов, автоматические возвраты при неудачной генерации изображений или видео, а также контроль усилий при рассужде…
Добавлены десятки моделей 2026 года, устаревшие выведены из оборота, плюс ежедневная автосинхронизация, которая поддерживает модели провайдеров и цены в актуальном состоянии — управляется из нового административного ката…
Публикуйте беседу по публичной ссылке и развивайте сообщество вокруг того, что вы создаёте.
May 2026 — 499 changes
Автономный консольный стенд .NET (test/ToRun.SmokeTests), который проходит аутентификацию на работающем Host (OpenIddict password grant) и проверяет каждую ключевую возможность сквозным образом через реальный HTTP API: a…
Медиафайлы платформы хранятся в ПРИВАТНОЙ зоне хранилища Bunny Storage, поэтому обычный
Завершает функцию управления памятью через чат поверх
memory_forget возвращал no_match для воспоминаний, которые существуют.
gemini-2.5-flash начал возвращать HTTP 400 при thinkingBudget=128 (нижний предел 52-N,
Две страницы хост-администратора (/admin/model-catalog, /admin/model-onboarding)
Обнаружение сопоставляло только по точному ProviderModelId/ModelKey, поэтому устаревшие снапшоты провайдеров
Ограничение на усилия при рассуждении теперь основано на финансировании, а не на тарифе.
Слияние по принципу «лучшее из двух» в уже сработавшую синхронизацию 52-Q-MODEL-SYNC-JOB: когда OpenRouter
Селектор усилий при рассуждении был жёстко заблокирован по уровню подписки плюс исключение для администраторов/хостов из более раннего, отклонённого подхода.
Результат фазы 1: инвентарь из 26-provider списка/источников ценообразования,
Мастер подключения (фазы A-D) только СОЗДАЁТ строки каталога; не было возможности
Бэкенд (torun.agent): SharedChat получает IsListed/ListedSlug/ListedAt + денормализованные поля карточки; PublicCommunityAppService + PublicCommunityController (анонимная лента /community + просмотр по слагу); CommunityL…
Аудиовложения в чате были сломаны; реальные первопричины отличались от
ЧАСТЬ 1 — выпадающий список «Обработка переполнения контекста» в заголовке чата был заморожен на
Удаление дневного лимита (84178afab) убрало DailyKey/MonthlyKey из BudgetBucketCacheItem
Часть 1 — устранение красных интеграционных тестов MongoDB.
Строки селектора усилий при рассуждении (Effort:Tooltip, Effort:Locked:Tooltip,
Канонический, не зависящий от провайдера контроль усилий при рассуждении в композере чата,
Финальный проход по мёртвому коду после переработки бюджета на основе окна сессии.
Индикатор месячных/дневных расходов читает телеметрию UserDailySummary (ScopeKey=userId,
Последующий аудит после переработки бюджета на основе окна сессии (2a33fd31f).
На домашней странице (/) и странице пользователя /me индикатор бюджета отображал "$0.00 / 0% / $0.00" всякий раз,
Бюджетный бакет бесплатного тарифа работал как капельный "$2 / 30d / 24h": пополнение = $2/720/ч, и
На домашней странице (/) и странице пользователя /me индикатор BUDGET BUCKET отображал "$0.00 (2% / $0.01)":
Баг в многоходовом vision.
Первая фиксация регрессий на уровне smoke.
Исправление первопричины повторяющихся 404-ошибок при генерации заголовков / публичном чате / vision: возможность
Пользователь подтвердил, что описание изображений теперь работает.
Область владельца выдавала 403 даже для легитимного владельца чата: вложения, созданные менеджером,
A3 РЕАЛЬНАЯ первопричина (обнаружена при живом тесте в браузере): изображение вложения чата
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Разрешение IQueuedRequestDispatcher вызывало StackOverflow при запуске (невозможно поймать — это
Как рабочий сток (appsettings.json), так и загрузочные логгеры
Повторяющаяся первопричина: ChangelogBackfillDataSeedContributor проверял идемпотентность по
Выполнены extract-sprint-changelog.py + propagate-changelog-locales.py из main:
QueuedRequestRunner.DoWorkAsync resolved IQueuedRequestDispatcher at the TOP of
The chat overrun check compared raw history tokens against the TIER budget (ctxBudget.MaxInputTokens) only, so when the tier budget exceeded the routed model's context window the trim was skipped: e.g.
Proactive "concern toast" (Honest-UX DNA pattern #3).
Translate the 16 Chat:Context:* (Agent resource) overrun-prompt/footer/toast keys and the 13 MySettings:ContextOverrun:* (ToRun resource) settings keys from en.json into all 28 sibling locales (en-GB verbatim).
Propagate the EN-only humane-error + status-banner keys (ErrorHumanizerService
Phase B surface for the chat-canvas (ChatGPT Canvas / Claude Artifacts
Honest-UX DNA pattern #3.
Completes the wallet-funded context-overrun feature.
Propagates LEARNING-LOOP Phase 2 keys (Admin:UserExperience:ComplaintLoop:{Tab,Title,Subtitle,FixedInWindow} + Admin:UserExperience:TimeToFix:Empty) plus 5 earlier EN-only Permission:UserExperience.* strings from the sam…
Four parallel 52-Q chips landed code referencing symbols their sibling chips
Closes the 29-locale parity gap for the CHAT-CANVAS / ChatSummaries slices,
Phase 2 Scope B of the honest-UX-DNA pattern #5 loop.
Honest UX DNA pattern #2 (Reversibility) — make the auto-refund VISIBLE.
Honest UX DNA pattern #2 (Reversibility) — wire the projection layer
Honest UX DNA pattern #2 (Reversibility) — refund the user when something
Honest UX DNA pattern #2 (Reversibility) — user-facing read API for the
EN-only this commit — the paired slice52-Q-AUTO-REFUND-LOCALE chip fans
Honest UX DNA pattern #2 (Reversibility) — append-only audit row for
Paired locale fan-out for the /me/projects feature (components landed in
EnBillingSource.RealtimeVoice + сид возможности voice-realtime + связь
Backend exception → frontend humane message + retry hint + status banner.
Consolidator landed both 52-Q-CHAT-CONTEXT-BUILDER's ChatSummaries
Зеркалирование ключей UI режима голосового realtime, добавленных в en.json в
Native translations of the 40-key User Sentiment / Privacy Policy v3 Section 11 block (legal text per GDPR Art.
Suite-managed file edits (Permissions+MongoDB+ChatPipeline)
land additional parallel-chip WIP
Consolidates the working-tree state stashed during the
Adds IChatSummarizationService + concrete impl that compresses the dropped
Third of the four P0 chat tools — ChatGPT File Search parity.
Why: backend tier-budget context builder (slice52-Q-CHAT-CONTEXT-BUILDER)
Adds ImageEditTool (mirror of ImageGenerateTool) so the LLM can edit user-
Fans out the 46 Agent WebSearch + Menu:WebSearch + Permission:WebSearch.*
Why: P1 voice tools listed in feedback_chat_context_management.md — text
Closes the user-complaint → shipped-fix loop automatically so we never make
Backend:
The /me/web-search slice landed almost entirely via Serkan's recent
Post-streaming runner that drives Pyodide in a Web Worker and feeds
MyMediaUploadAppService.PurposeChatAttachment validation extended to
Two-endpoint AppService that bridges the server-side code_interpreter
Ship the ADR-043 Pyodide v1 backend slice — the LLM-facing IAgentTool
Why: long chats (100+ turns) bloat browser memory + slow ngx-markdown re-renders
Fourth of 4 P0 chat tools per feedback_chat_context_management.md roadmap and
Phase 1 design spike for code_interpreter chat tool (second P0 tool after
Public-chat launcher now boots a Cloudflare Turnstile widget at view
Locale key for the new Cloudflare Turnstile rejection banner shipped
The [AllowAnonymous] PublicChatAppService now verifies a Cloudflare
Marketing landing's anon chat now streams the assistant reply
Surface the three new WebSearchOptions knobs in appsettings.json so the
Three tools wired to the canonical authoring-tier IWebSearchProviderFactory.
Catalog seed for the dual-tier chat web-search tooling.
Adds the second half of the provider contract needed by the dual-tier chat
User report 2026-05-27 — public chat marketing surface 60s+ bekleyip
User: "ana sayfada neden markdown renderer yok, direk markdown olarak
Bridges the gap between DeepResearchSession CRUD (sat at default state forever)
Propagate Public:Chat:Error:NoModel / CallFailed / EmptyPrompt
User report 2026-05-27: pricing sayfasındaki Partner card'ın
User: "burayı geçen gün yaptık sağlamdı, yine bozuldu.
Slice 452-fu already shipped first-class Brave + Tavily IWebSearchProvider
Replaces the stub web_search tool with a config-selectable provider:
User: "deepseek response geldi ekran 2'de, sayfayı refresh edince
Native-quality translations for "Action completed.
User şikayet: "gpt 4o mini response boş geldi.
User: "her sayfa refresh ettiğimde chatlerin yerleri ve sıraları
Önceki commit (e2a74db8) sadece relativeTime/fullTimestamp helper'ını
Sprint 50-S backend fix made the wire format emit `Z`-suffixed ISO
User direktif: "arkada iş kalmasın".
Önceki "fix" (a56449db) Opus 4.7 / Sonnet 4.6 için preemptive olarak
Pre-fix rendered the warning triangle as an inline <i> followed by
Önceki rev (a56449db) sadece ilk-mount fallback'i çözüyordu —
Third regression of the same bug class in three sessions.
User reported four issues in a single round of chat smoke-testing:
Atladığım şey buydu.
Three iterations of the same bug (Monthly Spend $0 → $0.33 → $0.15) had
Mic-capture via MediaRecorder (chat composer Whisper STT, Sprint 52-O)
OpenAI gpt-4.1 family (Deprecated → Retired, isActive:false, version 3→4):
Close 10 pricing rows for the 5 retired models:
Anthropic (DeprecatedAt 2025-09-29, RetiresAt 2026-05-01):
User reported a wide swath of dropdown rows error on send:
User report: "reason yapar gibi baya bekliyor ama hareket yok, reason
Audit continuation after slice52-Q-FINANCIAL-AUDIT-1.
- PROGRESS.md: Sprint 52-Q-USER-BILLING-DAILY entry with all 4 commits,
User report: "monthly spend 0.33 olamaz, burada bir hata var, muhtemelen
- New IDataSeedContributor: UserBillingDailyBackfillDataSeedContributor
- New IInboxConsumer: GroupId "torun-user-billing-daily-summary"
- Suite entity JSON: modules/torun.subscription/.suite/entities/UserBillingDailySummary.json
User: "TelemetryUserDailySummaries tablomuz var gördüğün gibi içide dolu.
User report (continued from slice 52-O-NIGHT-TODO-IMPL/home-spend-fallback):
User report: "monthly spend her gün sıfırlanıyor — redis recycle ettiğimden,
activity routes done + remaining TODO inventory
User feedback: "kod içerisine daha önce yazdığımız TODO lara hiç
TODO cleanup audit ledger
User directive: "TODO ve benzeri yorumları ara, sonraya bırakılmış iş
morning report for Serkan — overnight locale + changelog ledger
These four ad-hoc scripts drove the overnight locale recovery:
extract-sprint-changelog.py wrote 364 sprint rows to
Followed up the placeholder fill (commit a3834ea4) with native-language
Audit found 1311 missing keys spread across 27 sibling locales (en-GB
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Adds the 11 EN-master entries the new SourceContext chip strip
Surfaces the new SourceContext metadata as a user-facing filter so
Closes the chat-attachment data-loss bug: previously the composer
ChatTurn interface gains audioTranscripts[] with an expanded flag.
Add CapabilityKeys.AudioInput ("audio-input") so the fallback condition is
The chat composer's prior path inlined image attachments as base64 data
Pre-fix, the composer cost badge only sized the draft text via
`:streamGenerateContent` without `alt=sse` returns a JSON-array transport
GetActivePricingAsync now falls back to model-level pricing rows when the
Adds 9 new Chat:Continue:* keys (Button, Tooltip, Loading, Error, MaxReached,
Angular proxy: +wasTruncated/continuedFromMessageId/hasContinuation on both DTOs;
OpenAI Chat Completions silently consumes reasoning tokens for the
PersistAssistantMessageAsync now sets FinishReason/WasTruncated/ContinuedFromMessageId
Extend ChatMessage.Extended.cs with 4 new virtual properties (FinishReason,
User reported the "Daily free limit reached — Charge wallet" yellow
Propagate the new MediaRecorder + Whisper STT composer keys from en.json to all 28
Why: legacy Web Speech path produced transcript-only with no audio artifact
User reported two chat UX papercuts after the chat-footer fix landed:
User-reported chat composer trio:
Propagated Changelog:Sprint:<slug>:Title and :Body keys for the 38 new sprints
Minor bump for the Phase 1 feature wave summarized in the changelog backfill
Ran extract-sprint-changelog.py against HEAD.
- New IChatPipelineAppService.GenerateTextAsync endpoint (creative-writer
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Comment introduced in 57c15021 used backticks around '/marketplace' which
**Bug 1 — Card titles render raw `WorkflowTemplate:foo:Title` keys:**
Per-step output variable snapshot so the resume-aware wave loop can
In-memory wait loop in WorkflowExecutorAppService.RunWaveLoopOnRowAsync (line 1797) is
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Inject HumanApproval (kind=12) node into all three birthday catalog
WorkflowTemplate:BirthdayCinema:Title + :Description propagated to all 26
User wanted the third leg of the birthday trio: "isteyen kullanıcı video
Birthday workflows expose a textarea field 'provided_lyrics'; when filled
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
THE photo-binding bug.
User observation: "library bakınca sadece image görüyroum ne ses var ne
User report: merge step "Succeeded" but composite_url_duration_seconds
User report: "succeeded yazıyor da bunlar success degil ki hata veriyor
User directive 2026-05-25 — region prefix produced 401 Unauthorized on
Root cause (from Note column added in 0a9e941f):
Root cause: ImageCapabilityRunner with n>1 packs all generated URLs as a
Adds an "Or pick from your library" link/button beneath the workflow-wizard
Replaces the /me/audio direct file input (audio.component.html line 17 —
Replaces the /me/image Edit-tab mask widget (bespoke library-only modal +
Replaces the inline "Drop an image or click to upload" widget for character
Universal two-tab picker that replaces PC-only uploads across /me/* surfaces.
Pre-fix VideoPipelineAppService.GetCapabilitiesAsync (commit 5e39d434)
Pre-fix /me/video catalog query returned only sora-2 + sora-2-pro because no
Native translation per locale (prefix only; the numeric seconds cap
Pre-fix the duration slider on /me/music was hardcoded max=120s.
Pre-fix VideoPipelineAppService.GetCapabilitiesAsync returned a single
User generated music with `requestedDuration=120s` against Riffusion
User got
User got the UFE
User got HTTP 401 from Replicate after triggering musicgen and the
User reported the /me/music model dropdown stayed empty even with
Console showed:
Carry-forward from 05999c1c.
User reported video + music menus missing from My Account sidebar even
Mirrors fc625886 EN seeding into ar/cs/de/de-DE/en-GB/es/fi/fr/hi/hr/
Angular standalone component mirrors /me/voice + /me/image shape:
User-facing music generation pipeline mirroring ImagePipeline pattern:
The AuthoringPermissions.VideoPipeline.MyGenerate comment says the
Second-pass merge failure after b9dm94er4 + 21983ef0 still surfacing
Adds the Sprint 52-Q ModelOnboarding admin UI strings (Menu:ModelOnboarding +
Fans out the 32 EN keys added in commit be0190b2 (admin /cost-markup
39 MR keys (Menu:Admin:MarginReconciliation, Permission:MarginReconciliation, MarginReconciliation:*) added to every sibling locale under src/ToRun.Domain.Shared/Localization/ToRun/.
Sprint 52-Q-MODEL-ONBOARDING Phase D — round-trip bulk-import / bulk-export
Sprint 52-Q-MODEL-ONBOARDING Phase C — host-admin Angular UI at
Guardrail sweep finding from Phase D of the 52-O-MARGIN-AUDIT sprint.
Sprint 52-Q-MODEL-ONBOARDING Phase B.2 — adds the GenericRestClient that
Phase C UI of the 52-O-MARGIN-AUDIT sprint.
Sprint 52-O-REAL-COST-AUDIT phase C — each pipeline AppService that wraps
Sprint 52-Q-MODEL-ONBOARDING Phase B.1 — scaffolds the AiProviderClientStub
Phase C of the 52-O-MARGIN-AUDIT sprint.
Sprint 52-Q-MODEL-ONBOARDING Phase A — adds AdminModelOnboardingAppService
Sprint 52-O-REAL-COST-AUDIT phase B — every IAi*Client now stamps a
Sprint 52-O-REAL-COST-AUDIT phase A — parallel server-side-only ledger so
Phase B of the 52-O-MARGIN-AUDIT sprint.
Phase A of the 52-O-MARGIN-AUDIT sprint.
Error from DbMigrator on every restart:
Carry-forward from b4ab9daf music_v1 seed bump + feedback_pricing_
User feedback after 21983ef0 landed: looked at ElevenLabs analytics
- ToRun resource: 36 keys (Library:Share:* dialog + SharedMedia:* public page)
Pre-fix: workflow ArtifactSave nodes uploaded blobs to Bunny and stuffed
Sprint 51-M-fu2 completion pass.
Birthday-song-video template's `photos` multiphoto field reached Bunny CDN
Drops native v2.0 About/Terms/Privacy/Contact for 10 brand-new locales
EnhancePromptAsync wrote a BillingRecord and settled the budget but never
Root cause (two layers, one bug):
LoadHistoryAsync previously walked the leaf → ancestor chain by issuing one
По правилу 10 CLAUDE.md.
Вывод команды `python platform-plan/scripts/_validate-29-locales.py` после того, как осели все 27 батчей от переводчиков-аналогов + проход по зачистке BOM:
Батчи от 6 параллельных агентов-переводчиков Sonnet (все закоммичены в репозиторий из предыдущих итераций + финальная группа, сброшенная сейчас):
Serkan caught this — the Generate tab on /me/image has a card-shaped progress bar that walks through Preparing → Requesting → Generating → Fetching with a striped animated `progress-bar bg-info`, phase-specific icon + la…
The bug Serkan surfaced from /me/workflow-runs (Detail click on a Failed run): every workflow step that delegates to an ApplicationService with class-level [Authorize] (ImagePipelineAppService, all the pipelines) termina…
Completes the locale-fanout begun in 0da3c077 (Sprint 52-O-12-locale).
Проверочный проход в режиме только для чтения по ChatPipelineAppService + InAppAssistant + клиентам провайдеров + ProviderFallbackChain.
7 of 19 stub locales populated; 12 remaining (cs, sk, hu, ro-RO, hr, sl, ko, zh-Hans, zh-Hant, hi, ar, vi).
Sprint 52-O-18 added ModelLifecycleStatus.LegacyAvailable (used to mark Claude 4.5/4.1/Opus 4.6/Sonnet 4.5 etc.
Sprint 52-O-19 (provider runtime hardening) complete — 7 commits land:
Concrete unblock: AiModel rows whose ProviderKey was set to "musicgen" / "ltx-video" / "flux-1.1-pro" / "hunyuan-video" / "sd3.5-large" / "xtts-v2" / "bark" all route credential lookups through "replicate" when no per-mo…
New IProviderCircuitBreaker (Application.Contracts/AiClient/Resilience/) + default ProviderCircuitBreaker impl backed by IDistributedCache<CircuitState,string> keyed by torun:byok:circuit:{providerKey}:{capabilityKey} wi…
# Conflicts:
ProviderKey="elevenlabs".
ProviderKey=\"replicate\".
PayloadGrammarJson column declared on AiModelCapability.Extended.cs — backports the Sprint 52-O-17 chip's column that the worktree branched off main without (worktree base is 16 commits behind local main, so 52-O-17 wasn…
Adds ~60 new pricing rows in the 520180XX-...
ResolvedAiProvider DTO carries the read-only snapshot that generic adapters consume at request time — protocol drives which adapter class handles the request, BaseUrl is forwarded into the outbound HttpRequestMessage so…
SeedSlice52O18Async() runs at the end of SeedAsync regardless of count gate (idempotent EnsureCapabilityRowAsync calls, deterministic XOR-based GUIDs so reruns are no-ops).
Existing 108 rows: status / deprecatedAt / retiresAt patched per the deprecation calendar in 00-MASTER-SUMMARY.md §"Major Deprecation Calendar" — gpt-4o / 4.1 / 4.1-mini / 4.1-nano / o1 / o3-mini / gpt-image-1 land 2026-…
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
New shared enum EnWireProtocol (11 named + Custom catch-all) covers the realistic provider population: OpenAiCompat (OpenAI/xAI/DeepSeek/Mistral/Groq/Cerebras/Together/Perplexity/Azure-OpenAI/Fireworks/DeepInfra/OpenRout…
EnqueueRawSpecAsync inserts a Pending WorkflowExecution row, stamps QueuedAt + Activity Center row, emits torun.authoring.workflowexecution.queued.v1 via transactional outbox (Rule 8), and returns the DTO so the wizard n…
Claude 4.5 / Opus 4.1 / Sonnet 4.5 / earlier Gemini 2.0 / xAI Grok 3 are all examples of models that stay on the API surface but the provider is steering new traffic to a newer release.
EnPricingUnit grows 12 → 15 to model 2026 billing meters the legacy enum couldn't represent.
The 2026 model generation introduced capabilities that the old 18-key vocabulary couldn't address: Claude's adaptive vs.
23 → 25 providers (stability re-introduced after slice 4xx removal, two OSS-serving newcomers fireworks + deepinfra added).
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Pre-52-O-15-fu the OpenAiImageClient hand-coded every model-specific quirk inline.
Backend (fu1): new POST /api/subscription/budget-preview/preview wraps IBudgetGuard.CheckAsync read-only.
OpenAI image API rejects unknown sizes outright with HTTP 400 + "Invalid size 'WxH'.
WorkflowSelectOptionsDataSeedContributor now does an idempotent per-(option, locale)
User feedback on Sprint 52-O-13: "tabi bunun için kullanıcıyı bi popup ile uyarmalıyoz." Letting the wallet bypass the daily cap is the right behaviour for paid credit (52-O-13 fixed the silent reject), but the user stil…
The Free-tier $0.10/day cap exists to spread $2/month allowance across days so a single user can't front-load the host's AI-cost reimbursement.
Sprint 52-O-12d completes the catalog story started by 52-O-12a (entity)
Hygiene-only follow-up to 52-O-12a/b.
User added a per-locale enrichment block to
Sprint 52-O-12a follow-up — DI bootstrap fail
Phase B (Angular wizard) for the 52-O-12a data-driven dropdowns.
Phase 1 backend stack for data-driven workflow wizard dropdowns.
Backend bug — Cache Manager shows 3 categories of ~10+, every Browse empty
UX bug — cryptic exception copy on /media/video-stream
Backend bug — empty Recent transactions list with non-zero balance
UI bug — multi-theme breakage
Backend bug — entire workflow editor surface ships raw keys
Backend bug — every workflow template run failed
Exception screenshot from Serkan (2026-05-23):
Serkan's motto (2026-05-23): "biz 25 farklı AI provider destekliyoruz...
THE ACTUAL ROOT CAUSE of the seven "title-gen yine bozdun" reports —
52-I excluded DeepSeek V4 from cheap-model picks, but on a deployment
50-LLL-2 added an ExcludeReasoningModels filter so the cost-saving
User reported VS Error List showing CS1501 "No overload for method
F15 (root cause: AgentAuditEntry table unused for the bubble's
Four backend regressions in InAppAssistantTurnAppService surfaced
Audit #14 — confirm Sprint 51-A's reasoning opt-in path is per-request,
Two more console warnings flagged in /me/chat after 52-E:
Bundles four small chat-pipeline polish fixes from the audit (#10, #11,
F10 (root cause: bare WriteSseEventAsync in the controller's outer
Three UX / a11y polish items from the sprint 52-D code-review pass.
Two DOM-side hygiene fixes from the sprint 52-D code-review pass:
Three concurrency / state-coherence regressions in the bubble component
Three SSE-stream regressions in the InAppAssistant bubble shipped with
Three chat-pipeline surfaces were emitting hardcoded strings in violation
Serkan flagged ~148 identical "The localization source separator (::)
C5: ResolveFallbackProviderKey returned the literal string "google"
Every state write in chat-pipeline.component.ts goes through a Signal
Three lifecycle / concurrency defects in the chat-pipeline component, all
Serkan flagged a visible dead band between the composer card and the
ChangelogBackfillDataSeedContributor reads from the embedded resource
> "bu contact formunda bütün maillerimizi açık açık yazdık spammerlara mail
Follow-up to Sprint 51-V (commit 373d84d9) which rewrote en.json only.
Smoke at 2026-05-22 showed `/personas` listing "Echo the Storyteller"
Three compounding bugs from 51-S → 51-U all visible in the same screenshot:
51-S / 51-T drifted from the catalog-first vocabulary and shipped a
Cleanup of regressions introduced by 51-S.
Sprint 51-S (28e76a7d) shipped lib-pricing-grid with a contact-sales price cell that
ONE pricing surface for all 6 plans (Free / Starter / Pro / Business /
User mandate (2026-05-22): "Bu description'ları biraz zenginleştir.
User mandate (2026-05-22): public surfaces leaked the visitor to a new
User report (2026-05-22): "Login durumdayken pricing geliyor, public
Two user-flagged issues on the same screenshot (2026-05-22, anon
User report (2026-05-22): "Login durumdayken pricing geliyor ama public
User report after 51-N landed: "DbMigrator çalıştırdım, proje yeniden
User report (2026-05-22): "ABP bunu hala 20 dil görüyor ve dilleri açtığımızda 20 dil çıkıyor.
User correction (2026-05-22): "bizim platformumuz 29 dilde." Legal seeds
User directive (2026-05-22): About too thin, Terms must hold up against
Three connected anasayfa bugs landed in the same commit because they all
User mandate from 2026-05-22: "release çıkmadan önce change loglarının seed
Three connected bugs from the anasayfa list (platform-plan/BUG_LIST_ANASAYFA_2026-05-22.md):
BUG-3+4+5 from anasayfa list closed.
Follow-up to 51-C — my own mistake.
BUG-1 closeout from anasayfa bug list (platform-plan/BUG_LIST_ANASAYFA_2026-05-22.md).
BUG-2 closeout (3-part user report + 1 rule refinement):
BUG-1 part 2.
- Workflow editor, wizard, templates, validation, preview, run history strings
- Workflow editor, wizard, templates, validation, preview, run history strings
- Workflow editor, wizard, templates, validation, preview, run history strings
- Workflow editor, wizard, templates, validation, preview, run history strings
- Workflow editor, wizard, templates, validation, preview, run history strings
- Workflow editor, wizard, templates, validation, preview, run history strings
- Workflow editor, wizard, templates, validation, preview, run history strings
- Workflow editor, wizard, templates, validation, preview, run history strings
Closes ADR-042 — previously Proposed, now Accepted.
`col-md-1 text-end` clipped the localized "Clear all" label at
Sprint 50-PPPP audit — most MessageKey expressions across the codebase
TEST_PLAN §4 deferred — capability key string literals (text-chat,
- persona-profile.component.ts: drop outer `lpx-content-container py-4` wrapper
Three deferred items landed (or were dismissed) since the previous closeout
Completes the slice50-workflow-engine audit pass for the QualityGate
Continues the slice50-media Phase1Note translation pass started by
Replaces 8 [en] placeholder Admin:StorageProviders:Phase1Note:* and
Sweeps the torun.media Localization resource for the 12 non-EN locales
Replaces ~110 [en] placeholder values in the Authoring resource's
[Cursor-aware var insert (slice50-S)]
Closes the loop on slice50-I's per-node budgetUsd intent layer with
User-driven polish on the /media/storage-providers surface:
Adds OptimizerOptions sub-block under BunnyCdnOptions for Pull-Zone-level
Closes chip #118 last deferred item:
Backend (modules/torun.persona):
Closes the deferred item from chip #118 wrap doc:
Two inspector enhancements that close the gap between author intent
WorkflowGraphComponent:
Closes the deferred item from chip #118 wrap doc:
Closes the deferred item from the workflow-editor wrap (chip #118):
Two related extensions to the advanced editor surface:
Rule 8 (transactional outbox) — after the executor's RunSpecAsync returns
StorageBrowse and UploadAsset landing card descriptions had leftover
The existing executor's QualityGate node (Slice 449/449b) already implements
Single AppService surfaces three endpoints:
Workflow-node-shaped wrapper over Sprint 50-LLL's IModelRoutingService.
User-facing wizard-catalogue endpoint.
Captures what landed this sprint (library landing + simple-mode wizard
Auto-propagated from the en.json additions in 9b95c79c (admin panel
Replaces the existing add-node dropdown with a permanent left-rail
Replaces the /me/workflow-editor entry that dropped users straight into
Idempotent host-pass DataSeedContributor that materialises the three wizard
Foundation for the six host-admin /media surfaces.
Catalog entity for wizard-surfaced workflow presets.
Public-site MVC Razor pages were rendering hardcoded fixture data
DbMigrator hit E11000 on BlogPostsDataSeedContributor: the legacy
BlogPostsDataSeedContributor adds the initial public marketing blog catalog
PublicWebsite layout header override:
- Anonymous browse for /marketplace (paged listings)
- Pages/Sitemap.cshtml (route /sitemap.xml) — returns sitemaps.org urlset
- Pages/Legal/Detail.cshtml (route /legal/{slug}) — Markdig-rendered long
- Pages/Pricing/Index.cshtml (route /pricing) — Monthly/Yearly toggle (real
- Pages/Docs/Index.cshtml (route /docs) — section grid landing + sidebar
- Anonymous browse for /personas (paged catalog)
Pull landing data from IPublicLandingAppService stub + pricing teaser from
- ToRun.Web.Public.csproj — add Markdig 0.37.0 for markdown rendering
- Anonymous read for /legal/{slug} — Terms, Privacy, Cookie, Refund,
- Anonymous read for /faq
- Anonymous read for /docs (tree + by-slug)
- Anonymous read for /changelog (paged, PublishedAt DESC)
- Threads list (paged, optional CategoryKey tag match against ForumThread.Tags)
- Anonymous read surface for /blog (list + by-slug)
smoke-backend.py обнаружил VERB_MISMATCH: Angular отправляет PUT без суффикса маршрута.
Backend-половина Sprint 50-F: анонимный демо-чат на лендинге с ограничением запросов по IP.
Словарь `Dictionary<(DateTime Date, Guid? TenantId), BillingDailySummary>` требовал явного указания типов при деконструкции.
Закрывает единственное окно гонки в KeywordSettlementJob, которое могло привести к дублированию расчётов.
Продолжение task #67 (сканирование 50-SS).
Закрывает основу 50-RRR (коммиты A/B/C), подключая фактический составной путь редактирования.
Заполнены Toggle / Heading / New / Untitled / Empty / Load:Failed / JustNow / MinAgo / HourAgo / DayAgo во всех 28 не-английских локалях (en.json уже содержал полный набор из Sprint 50-CCC-2).
Зеркалирует Sprint 50-LL (Post.CreatorProfileId) + Sprint 50-VV-2 (AdAuction FK-колонки).
Pipeline теперь определяет ключ возможности из топологии входных данных и использует соответствующий адаптер.
Контракт адаптера для пути составного редактирования с несколькими входными данными.
Базовый коммит для рефакторинга многоизображённого редактирования (Option C — модель возможностей).
Вывод по области: привязка в ChatPipelineAppService.cs:1415 уже вызывает метод сохранения.
5 новых структурированных записей лога для полного отображения контекста при сбоях в продакшене.
Двусторонняя правка для избавления пузырька от накопления пустых / ненужных сессий.
Закрывает отложенную задачу -2 из 50-YY (подключение микрофона было вынесено отдельно).
Закрывает межпайплайновый пробел, оставленный 50-AAA.
Пользователь сообщил, что диалоги "Pick a source image" и "Pick a mask image" не работали.
Лог продакшена: DALL-E 3 вернул 400 из-за устаревшего параметра `style`.
Пользователь сообщил, что source-upload и mask-upload на /me/image Edit возвращали 401.
Финальный срез модуля библиотеки.
Обратная связь: зелёный баннер "Upload complete." мерцал для каждого файла по отдельности.
Sprint 50-CCCC пытался исправить ObjectDisposedException в pipeline загрузки.
Причина постоянного тоста "Upload failed" — несмотря на то что файлы фактически загружались.
Пользователь сообщил о пяти отдельных проблемах.
Пользователь сообщил, что part_001.wav / part_002.wav удалены из библиотеки, но остаются доступными по CDN URL.
50-YYY оставил регресс: openAssetDetail запускал предзагрузку текста только для определённых типов.
Пользователь сообщил, что вкладка Documents пуста после загрузки .md / .txt файлов.
Паттерн публичного URL CDN был некорректен для /me/library — контент является персональным.
Две ошибки в одном пакете — обе проявились в тесте: зелёный баннер сообщал об успешной загрузке 4 файлов, но страница библиотеки оставалась пустой.
Пользователь: добавь прогресс-бар для загрузки, показывай время и статус каждого файла — сейчас всё выглядит слишком скучно.
Две блокирующие проблемы из тестирования /me/library:
Пользователь получил ошибку 400 'Only image/* MIME types are accepted' при загрузке не-изображения с вкладки All.
Пользователь сообщил об ошибке 500 'Internal error' в администрировании Message Citations.
Пользователь сообщил об ошибке загрузки: 'Bunny storage upload failed with HTTP 401'.
Пользователь сообщил, что генерация изображений в /me/image не работает: "Image generation provider error".
Пользователь сообщил, что рефакторинг позиции панели из Sprint 50-III всё ещё не работает корректно.
Причина (вариант B): `openSession()` вызывает `messages.set(mapped)` после сброса состояния.
Пользователь: для заголовков не обязательно использовать ту же модель — выбирай самую дешёвую.
Пользователь сообщал, что панель открывалась отдельно от FAB несмотря на Sprint 50-N.
Sprint 50-CCC поднял MaxOutputTokens с 24 до 128, ожидая ~100 токенов для заголовков.
Пользователь сообщил, что /me/activity-history пуст после часов работы с чатом/изображениями/голосом и т.д.
Выявлены и устранены два регресса пользовательского тестирования; третья проблема отложена.
| # | Меню | Группа | Angular path | Backend route | Статус | Причина |
Пользователь: почему нужно добавлять файлы в библиотеку по одному — нужна мультивыборка.
Пользователь: в Source есть загрузка с ПК, но в Mask её нет — нужна симметрия.
Критическая ошибка пользователя: каждая попытка загрузки с ПК вызывала исключение.
Пользователь неоднократно сообщал, что /me/notifications/ возвращает 404.
Список последних чатов в /agent/chat-pipeline имел выпадающие меню Rename/Delete, обрезаемые разделителями дней.
Тестирование выявило 5 проблем; 4 устранены в этом коммите, 1 отложена.
Ежедневный AsyncPeriodicBackgroundWorker (цикл 24ч) обрабатывает оплаченные покупки и распределяет роялти.
Sprint 47-O создал плоские сущности AdAuction без FK-связей; теперь добавлены типизированные колонки.
Ежедневный ABP AsyncPeriodicBackgroundWorker (цикл 24ч) обрабатывает ожидающие расчёты.
Sprint 50-TT был отправлен для этой задачи, но отклонился от плана.
Пользователь запросил: индикатор заполнения хранилища, загрузку с ПК, квоту тарифного плана.
Расширяет паттерн 50-RR (VideoJobPollingWorker IAbpDistributedLock) на все периодические воркеры.
Sprint 50-P отложил загрузку с ПК из-за отсутствия endpoint предзагрузки Bunny.
50-AA прерван во время полного сканирования; это возобновлённая пакетная обработка.
Sprint 50-U + 50-EE настроил polling и возвраты, но предполагал единственный под.
Директива пользователя (ход Sprint 50-E): иконки bell и activity перемещены к иконкам меню справа.
Backend недоступен по адресу https://localhost:44304 во время этого спринта; регенерация прокси отложена.
Sprint 47-H создал деградированный составной индекс для ленты Creator/Post.
Sprint 47-H создал деградированный скан по (TenantId, CreationTime) для PersonaPost.
BillingReconciliationJob из Sprint 50-W обнаружил дыры (Paddle-транзакции без записей в billing).
Файлы angular.json в modules/torun.*/angular/ содержали устаревшие ссылки на сборщик.
Тесты изоляции тенантов Sprint 50-CC выявили существующий дефект: недопустимые значения в сидировании.
Sprint 47-A..47-P добавил составные индексы с префиксом TenantId, сделав устаревшие индексы избыточными.
Завершение серии Sprint 49.
Риск R2 перед запуском: Sprint 47-A..47-P охватил 219+ сущностей, требующих обратного заполнения.
Sprint 50-U выявил пробел: IBillingRecorder имел только RecordAsync без поддержки возвратов.
Plan §2.3 / аудит R1 — Sprint 47-A...47-P охватил 219+ сущностей для проверки MT-изоляции.
Бэклог Plan §2.5: распространено 22 ключа pipeline редактирования изображений.
Sprint 50-K выявил одну коллизию (Paddle-конфигурация плана подписки); выполнено полное сканирование.
Phase 1.5 §2.1 #3 — третий фоновый воркер.
Phase 1.5 §2.1 #4 — четвёртый и последний фоновый воркер перед запуском.
/api/app/run-input-upload возвращал 404, так как AppService не был зарегистрирован.
Sprint 50-P добавил UI вкладки Edit в /me/image + привязку к backend, но не включал сидирование.
Frontend (Angular | date pipe + конструктор Date) обрабатывает преобразование UTC → local.
Phase 1.5 §2.1 — фоновый воркер высшего приоритета.
Phase 1.5 §2.1 #2 — второй фоновый воркер.
Пользователь сообщил, что повторный запрос при заполнении формы возвращал ошибку "Message failed".
Ошибка A: composer чата игнорировал Ctrl+V для изображений из буфера обмена.
Страница просмотра Marketplace имела двойной wrapper lpx-content-container.
На вкладке Edit отсутствовал выбор модели (Auto/Manual), Quality и другие параметры.
Пользователь сообщил, что положение по умолчанию из Sprint 50-I (bottom:96 right:24) перекрывает контент.
Тестирование: /me/notifications возвращал 404.
PaddleOptions.WalletTopUpPriceIds был Dictionary<string,string>, теперь замёнен встроенной ценой.
Пользователь сообщил, что popup paddle.js не открывается и выдаёт ошибку.
Sprint 50-I устраняет два UX-регресса, выявленных после Sprint 50-B + 50-E.
Администратор сохранял Paddle-конфигурацию SubscriptionPlan; первое сохранение проходило успешно.
Таблица детализации затрат на /me/billing некорректно добавляла символ $ ко всем строкам.
Sprint 49-B оставил два захардкоженных URL /api/app/* в chat-pipeline.
- 50-B (InAppAssistant:Bubble:Dock/Undock/DragHint): добавлено в en.json + все 28 остальных локалей с нативными переводами.
Пользователь: при удалении на странице памяти появлялся нативный js confirm вместо LeptonX.
Исправление A (критическая ошибка сервера): упорядочение tool_calls.
Пользователь сообщил: выпадающий список SourceKind отображал некорректные розово-синие блоки (сломанный стиль).
Обратная связь: две плавающие иконки (notification-bell + activity-center) перекрывали метку администратора.
Применение паттерна Sprint 47-I + 45-M.
Sprint 46-A внёс межмодульный IBillingRecorder + генерацию BillingRecord.
Sprint 46-F выполнил структурную нормализацию lowercase→PascalCase, но оставил 4 локали с английскими заглушками Suite.
Применение паттерна Sprint 45-M + 47-A по 47-N.
Применение паттерна Sprint 47-M.
Применение паттерна Sprint 45-M + 47-K.
Применение паттерна Sprint 45-M + 47-A по 47-K.
Применение паттерна Sprint 45-M + 47-A по 47-H.
Применение паттерна Sprint 45-M + 47-A/B/C/D/E/F/G/O.
Применение паттерна Sprint 45-M + 47-G.
Применение паттерна Sprint 45-M + 47-A/B/C/D/E/F.
Применение паттерна Sprint 45-M + 47-A/B/C/D/E.
Применение паттерна Sprint 45-M + 47-A/B/C/E.
Применение паттерна Sprint 45-M + 47-A + 47-B.
Применение паттерна Sprint 45-M + 47-A/B/C.
Применение паттерна Sprint 45-M + 47-A/B.
Применение паттерна Sprint 45-M + 47-A.
Применение паттерна Sprint 45-M: Suite не генерировал IMultiTenant для базовых классов, несмотря на IsMultiTenant: true в JSON.
Slice 56 — IModelRoutingService (ByokVault.Application + Contracts):