What is new on the ToRun platform, newest first.
June 2026 — 53 changes
El selector de modelos ahora incluye Google Imagen y Gemini para imágenes, y OpenAI Sora y Google Veo para vídeo, junto a los modelos que ya tenías. Elige exactamente el que quieras o deja que Auto escoja el más adecuado…
Encadena varios pasos de IA en un Workflow que puedes ejecutar cuando quieras y, luego, publícalo en el Marketplace o explora lo que han compartido otros creadores. El Workflow Editor, el Runner y el Marketplace ya están…
Añade ToRun a tu pantalla de inicio y ábrelo como una app nativa, a pantalla completa y con su propio icono, para tenerlo a un toque mientras llega la app móvil.
Un nuevo logo y una identidad más limpia en toda la app, ajustada tanto para el tema claro como para el oscuro.
Elige cuánto se esfuerza la IA al pensar, ahora también en el modo Auto. Tus prompts de imagen pueden aprovechar discretamente tu memoria guardada para que los resultados encajen con las personas y los detalles que te im…
El progreso de la generación ahora aparece justo al lado del resultado en lugar de debajo del formulario, cada página se abre limpia y tu última creación se mantiene en primer plano mientras las anteriores quedan en tu L…
El historial de tu cartera ahora está paginado y muestra importes exactos por debajo del céntimo, y eliminar elementos de tu Library ya no genera ningún error.
Crea tu cuenta de anunciante y envía tus campañas a revisión directamente desde tu cuenta, sin esperar a una configuración manual.
Entre bastidores: un cálculo más justo de los créditos gratuitos, controles más estrictos en los pagos y permisos de los creadores, una moderación de contenido multimedia más segura y ejecuciones de Workflow más fiables.
La Traducción en Vivo ahora te permite elegir entre dos motores y quedarte con el que mejor encaje en tu conversación, incluida una nueva opción que habla 77 idiomas, entre ellos el turco y el ruso. Cada opción muestra s…
Los modelos que tu plan no cubre ahora aparecen con un pequeño candado y una forma de mejorar tu plan o recargar tu monedero con un solo toque, en lugar de fallar solo después de enviar. También abrimos modelos más poten…
Comparte una imagen una sola vez y el asistente conserva lo que vio durante el resto de la conversación, así puedes preguntarle al respecto muchos mensajes después, incluso tras cambiar de modelo, y nunca vuelve a subir…
Las respuestas del chat ahora dibujan los diagramas como diagramas de verdad, presentan las tablas con bordes claros y ajustan el tamaño de los títulos al mensaje en lugar de llenar la pantalla, para que las respuestas s…
Cuando un modelo requiere mejorar tu plan o tu saldo se queda corto, ahora recibes un aviso amable con botones de Mejorar plan y Recargar monedero ahí mismo. Las respuestas que no se pueden generar te explican por qué en…
Los registros de facturación, el historial y la actividad ahora se muestran en tu hora local en vez de en UTC, para que las marcas de tiempo coincidan con el reloj que tienes delante.
Iniciar un nuevo chat ahora reutiliza uno vacío en lugar de acumular chats en blanco, los chats que nunca recibieron respuesta ya no llenan tu lista, y los títulos provisionales se reemplazan por un nombre real en cuanto…
Las empresas ahora pueden crear una cuenta de anunciante y gestionar sus propias campañas publicitarias de principio a fin: crear campañas, añadir los creativos que las acompañan y enviarlas para una revisión rápida ante…
Usar tu propia clave de proveedor ahora también cubre la voz en tiempo real, la traducción en vivo y la transcripción en vivo: el uso de la IA pasa por tu propia clave y solo te cobramos la pequeña tarifa de plataforma p…
Nuestras páginas públicas ahora se nutren de contenido editable en muchos idiomas, las imágenes subidas se analizan en busca de contenido inseguro antes de guardarse, el registro de cuentas y los correos de confirmación…
Las respuestas largas ahora se ejecutan en el servidor y continúan mientras cambias de chat, abres otra página o cierras la pestaña. Vuelve cuando quieras: la respuesta seguirá generándose o ya estará lista para ti.
Los chats iniciados dentro de un proyecto adoptan automáticamente sus instrucciones, conocimiento subido y memoria, muestran una etiqueta del proyecto con un enlace rápido de vuelta e indican el nombre del proyecto en tu…
La memoria de tu asistente ahora sigue la rapidez con la que cambia cada dato y señala los que podrían estar desactualizados, para apoyarse en lo que sigue siendo cierto. Un nuevo editor te permite revisar, añadir y elim…
Hemos añadido los últimos modelos de imagen, vídeo, transcripción y voz en tiempo real, y hemos estrenado páginas independientes de Traducir y Transcribir para que llegues a esas herramientas directamente desde el menú.
Habla y deja que tus palabras se traduzcan casi al instante: elige dos idiomas, intercámbialos con un solo toque y el traductor capta tu voz y transmite la traducción mientras hablas.
La página de vídeo ahora mantiene sus miniaturas sincronizadas cuando borras algo desde tu biblioteca, te permite ajustar la duración del clip por modelo, eliminar clips concretos y marca con claridad los resultados de v…
El asistente integrado ahora muestra respuestas bien formateadas, mantiene a la vista el último mensaje mientras escribe, guarda de forma fiable la respuesta terminada y asigna a cada conversación un título automático.
Las respuestas que contienen enlaces, fórmulas matemáticas o importes en divisas ya no aparecen en blanco ni a medio mostrar, ni siquiera tras recargar la página, y las respuestas de investigación a fondo siempre incluye…
Una amplia ronda de trabajo entre bastidores: medición de uso y totales de gasto más precisos, reembolsos automáticos más justos, mensajería en tiempo real más robusta, mayores garantías de privacidad y seguridad, y mens…
Las entradas públicas del blog y los debates del foro — incluidas sus reacciones y respuestas — ahora son visibles para los visitantes sin sesión iniciada.
El uso ahora se cobra con un único recargo justo, tus indicadores de gasto mensual y presupuesto restante son precisos, y la lista de modelos se ha depurado — se retiraron los modelos obsoletos y se incorporaron los nuev…
Los anuncios de flujos de trabajo y los paquetes pueden mostrar una imagen de portada como es debido, lo que hace que el marketplace sea más fácil y agradable de explorar.
Pídeselo al asistente y rellenará formularios, pulsará botones y se moverá por la aplicación en tu lugar — todo ello respaldado por un conjunto de herramientas más amplio que ahora llega al contacto, las preguntas frecue…
Las respuestas ahora aparecen palabra por palabra en lugar de todas a la vez, y la burbuja del asistente se puede arrastrar a donde más te convenga, con una pista en directo de aquello en lo que está trabajando.
Crear un proyecto e iniciar un nuevo chat dentro de él ahora funciona sin problemas, para que puedas mantener juntos los chats, archivos y contexto relacionados.
Los vídeos se reproducen de forma fiable, el contenido multimedia privado se carga a través de un proxy seguro, los avatares de creadores y personas ahora se ven para todos y las notas de voz se transcriben sin errores.
Cuando una parte del servicio tiene problemas, el aviso ahora es más fácil de entender y ya no revela los nombres internos de los proveedores.
Vincula aplicaciones externas con un solo inicio de sesión o una clave de API, para que el asistente pueda trabajar directamente con las herramientas que ya usas.
Las herramientas de imagen ahora eligen un modelo acorde a lo que estás haciendo, muestran una vista previa instantánea del resultado y la edición vuelve a funcionar tras un cambio de modelo del proveedor.
Cuando se ha quitado una imagen o un adjunto, tu historial de chats, la galería multimedia y el editor de imágenes ahora muestran un marcador de posición claro en lugar de detenerse con un error.
El traductor ahora ofrece un selector con búsqueda entre unos 100 idiomas, cada uno indicado con su nombre nativo y en inglés.
Hemos añadido un conjunto de nuevos artículos de blog e hilos del foro — incluidas preguntas respondidas — para que haya más que leer y explorar desde el primer día.
El chat ahora puede buscar en tus archivos subidos, ejecutar Python en un entorno aislado, editar imágenes, transcribir y reproducir audio, y activar tus flujos de trabajo — todo sin salir de la conversación.
Permite que el chat busque en la web en vivo, ejecute investigaciones profundas multifuente y obtenga y lea páginas completas — cada respuesta incluye las fuentes que utilizó.
Tu asistente ahora conserva una memoria ligera entre conversaciones, puede listar lo que recuerda y acepta solicitudes de olvido en cualquier idioma.
Genera y edita imágenes, produce cortometrajes y compón canciones con letra — impulsado por nuevos motores de imagen, vídeo y música, con un selector de medios compartido y tu biblioteca a un clic.
Habla con ToRun en voz alta — una nueva capacidad de voz en tiempo real lleva las conversaciones habladas y la transcripción en directo al chat.
Las ejecuciones de flujos de trabajo ahora prefieren modelos de mayor calidad, hacen una pausa para tu aprobación cuando es importante, y pueden cancelarse, regenerarse y reanudarse — con cada resultado guardado directam…
Agrupa conversaciones, archivos y contexto relacionados en Proyectos para que tu asistente siempre tenga el contexto adecuado para la tarea en cuestión.
Redacta e itera contenido extenso y código en un panel de lienzo dedicado, justo junto a tu conversación.
Los resúmenes continuos, las ventanas de contexto más inteligentes y el desplazamiento más rápido por el historial mantienen las conversaciones largas coherentes y ágiles, con controles claros cuando una conversación sup…
Una asignación gratuita humanizada que se recarga en una ventana continua, indicadores de gasto más claros, reembolsos automáticos cuando falla la generación de una imagen o vídeo, y controles de esfuerzo de razonamiento…
Decenas de modelos de 2026 añadidos y los obsoletos retirados, además de una sincronización automática diaria que mantiene actualizados los modelos y precios de los proveedores — gestionado desde un nuevo catálogo de adm…
Publica una conversación con un enlace público y haz crecer la comunidad alrededor de lo que creas.
May 2026 — 499 changes
Arnés de consola .NET independiente (test/ToRun.SmokeTests) que se autentica contra el Host en ejecución (concesión de contraseña OpenIddict) y ejerce todas las capacidades principales de extremo a extremo a través de la…
Los medios de la plataforma residen en una zona de almacenamiento PRIVADA de Bunny Storage, por lo que una solicitud
Completa la función de gestión de memoria basada en chat sobre
memory_forget devolvía no_match para recuerdos que sí existen.
gemini-2.5-flash comenzó a devolver HTTP 400 con thinkingBudget=128 (el valor bajo de 52-N
Las dos páginas de administración del host (/admin/model-catalog, /admin/model-onboarding)
El descubrimiento coincidía únicamente por ProviderModelId/ModelKey exacto, por lo que las versiones antiguas del proveedor
La barrera de esfuerzo de razonamiento ahora se basa en financiación, no en el nivel de suscripción.
Fusión de lo mejor de ambos en la sincronización ya aterrizada de 52-Q-MODEL-SYNC-JOB: cuando OpenRouter
El selector de esfuerzo de razonamiento estaba bloqueado en el nivel de suscripción más una exención de administrador/host proveniente de un enfoque anterior rechazado.
Entregable de la Fase 1: inventario de lista de 26-provider y fuentes de precios, el
El asistente de incorporación (fases A-D) solo CREA filas en el catálogo; no había
Backend (torun.agent): SharedChat incorpora IsListed/ListedSlug/ListedAt + campos de tarjeta desnormalizados; PublicCommunityAppService + PublicCommunityController (feed /community anónimo + visor por slug); CommunityLis…
Los archivos adjuntos de audio en el chat estaban rotos; las causas raíz reales diferían de
PARTE 1 — el desplegable "Gestión del desbordamiento de contexto" en el encabezado del chat estaba bloqueado en
La eliminación del límite diario (84178afab) eliminó DailyKey/MonthlyKey de BudgetBucketCacheItem
Parte 1 — eliminar los rojos del suelo de pruebas de integración de MongoDB.
Las cadenas del selector de esfuerzo de razonamiento (Effort:Tooltip, Effort:Locked:Tooltip,
Control de esfuerzo de razonamiento canónico e independiente del proveedor en el compositor del chat,
Paso final de eliminación de código muerto tras la reescritura del presupuesto de ventana de sesión.
El indicador de Gasto Mensual/Diario lee la telemetría UserDailySummary (ScopeKey=userId,
Seguimiento de auditoría tras la reescritura del presupuesto de ventana de sesión (2a33fd31f).
El indicador de cubo de presupuesto en Home (/) + me-home mostraba "$0.00 / 0% / $0.00" cuando
El cubo de presupuesto del nivel gratuito era un goteo "$2 / 30d / 24h": recarga = $2/720/h y
El indicador del CUBO DE PRESUPUESTO en Home (/) y me-home (/me) mostraba "$0.00 (2% / $0.01)":
Error de visión en conversaciones multipaso.
Primer bloqueo de regresión en la capa de humo.
Corrección de la causa raíz de los 404 recurrentes en generación de títulos / chat público / visión: la capacidad
El usuario confirmó que la descripción de imágenes ahora funciona.
El ámbito del propietario devolvía 403 incluso para el propietario legítimo del chat: los adjuntos creados por el gestor
A3 CAUSA RAÍZ REAL (encontrada en prueba con navegador en vivo): imagen del adjunto del chat
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Al resolver IQueuedRequestDispatcher se producía un StackOverflow en el inicio (no capturable — un
Tanto el sumidero de registro en tiempo de ejecución del Host (appsettings.json) como los registradores de arranque
Causa raíz recurrente: ChangelogBackfillDataSeedContributor verificaba la idempotencia en
Se ejecutó extract-sprint-changelog.py + propagate-changelog-locales.py desde 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 + semilla de capacidad de voice-realtime + unión
Backend exception → frontend humane message + retry hint + status banner.
Consolidator landed both 52-Q-CHAT-CONTEXT-BUILDER's ChatSummaries
Réplica de las claves UI del modo de voz en tiempo real añadidas a en.json en
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
Según la Regla 10 de CLAUDE.md.
Salida de `python platform-plan/scripts/_validate-29-locales.py` tras la llegada de todos los 27 lotes de traductores de idiomas hermanos + el paso de eliminación de BOM:
Lotes de 6 agentes traductores Sonnet en paralelo (todos confirmados en el repositorio desde turnos anteriores + el grupo final ahora volcado):
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).
Revisión de auditoría de solo lectura de ChatPipelineAppService + InAppAssistant + clientes de proveedor + 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 detectó un VERB_MISMATCH: Angular llama a PUT sin decorador
Mitad backend de Sprint 50-F: chat de demo anónimo en la página de aterrizaje con tasa por IP
El diccionario `Dictionary<(DateTime Date, Guid?
Cierra la única ventana de condición de carrera en KeywordSettlementJob que podía
Continuación de la tarea #67 (barrido 50-SS).
Cierra la base 50-RRR (commits A/B/C) conectando el compuesto real
Se rellenaron Toggle / Heading / New / Untitled / Empty / Load:Failed / JustNow / MinAgo / HourAgo / DayAgo en los 28 locales no ingleses (en.json ya tenía el conjunto completo desde Sprint 50-CCC-2).
Espeja Sprint 50-LL (Post.CreatorProfileId) + Sprint 50-VV-2 (AdAuction
El pipeline ahora deriva la clave de capability de la topología de entrada y usa el
Contrato del adaptador para la ruta compuesta de múltiples entradas.
Commit base para la refactorización de edición multi-imagen (Opción C — capability
Hallazgo del alcance: la conexión en ChatPipelineAppService.cs:1415 ya llama a
5 adiciones de registros estructurados para que los fallos en producción expongan su contexto completo
Corrección en dos frentes para la burbuja que acumulaba sesiones vacías o no deseadas:
Cierra el -2 aplazado de 50-YY (donde el micrófono se separó para que
Cierra la brecha entre pipelines dejada por 50-AAA.
El usuario reportó que tanto "Seleccionar imagen de origen" como "Seleccionar imagen de máscara"
Registro de producción:
El usuario reportó que tanto la subida de fuente como la de máscara en /me/image Editar
Slice final del módulo library.
Retroalimentación del usuario: el banner verde "Upload complete." parpadeaba para
Sprint 50-CCCC intentó corregir el ObjectDisposedException del pipeline de subida
Causa raíz del aviso persistente "Upload failed" — a pesar de que los archivos
El usuario reportó cinco problemas distintos:
El usuario reportó que part_001.wav / part_002.wav se eliminaron de library pero
50-YYY dejó una regresión: openAssetDetail solo disparaba la precarga de texto
El usuario reportó la pestaña Documentos vacía tras subir archivos .md / .txt —
El patrón de URL pública CDN era incorrecto para /me/library — el contenido es por usuario
Dos errores en un mismo lote — ambos detectados en una prueba de usuario donde el banner verde indicaba 4 archivos 'subidos' pero la página de library mostraba 0 elementos.
Usuario: 'añade una barra de progreso para las subidas, que muestre cuántos segundos lleva y cuál se ha subido, el usuario necesita saber el estado, así queda muy soso.'
Dos problemas bloqueantes del usuario detectados en las pruebas de /me/library:
El usuario reportó 400 'Only image/* MIME types are accepted on this endpoint.' al subir un archivo no-imagen desde la pestaña Todos.
El usuario reportó 500 'Internal error' en el admin de Message Citations.
El usuario reportó subida en library fallida: 'Bunny storage upload failed with HTTP 401'.
El usuario reportó /me/image Generar roto: "Proveedor de generación de imágenes
El usuario reportó que la refactorización de posición del panel de Sprint 50-III AÚN no
Causa raíz (variante del Escenario B): `openSession()` llama a `messages.set(mapped)`
Usuario: "No tienes que usar el mismo modelo para los títulos, estos son
El usuario reportó que el panel seguía abriéndose desanclado del FAB a pesar de Sprint
Sprint 50-CCC aumentó MaxOutputTokens de 24 → 128 esperando "~100
El usuario reportó /me/activity-history vacío a pesar de horas de chat/imagen/voz/etc.
Se encontraron y corrigieron dos regresiones en pruebas de usuario; la tercera preocupación
| # | Menú | Grupo | Ruta Angular | Ruta backend | Estado | Causa raíz |
Usuario: "¿por qué tengo que añadir archivos de uno en uno en library?
Usuario: "hay subida desde PC en source, ¿por qué no en mask? nosotros
Error crítico reportado por el usuario: cada intento de subida desde PC lanzaba
El usuario reportó repetidamente desde ayer que /me/notifications/
La lista de chats recientes en /agent/chat-pipeline tenía Renombrar/Eliminar por fila
Las pruebas del usuario detectaron 5 problemas; 4 se solucionan en este commit, 1
ABP AsyncPeriodicBackgroundWorker diario (intervalo de 24h) barre los
Sprint 47-O creó entidades AdAuction planas sin FK de unión;
ABP AsyncPeriodicBackgroundWorker diario (intervalo de 24h) barre los pendientes
Sprint 50-TT fue asignado para esto pero se desvió del guion (realizó
El usuario solicitó: indicador de tamaño superior en library, subida PC, cuota por nivel de plan,
Extiende el patrón 50-RR (VideoJobPollingWorker IAbpDistributedLock)
Sprint 50-P aplazó la subida desde PC porque el backend carecía de un Bunny
50-AA fue abortado durante el barrido completo; este es el proceso por lotes reanudado
Sprint 50-U + 50-EE conectó el polling + flujo de reembolso pero asumía un solo pod
Directiva del usuario (turno Sprint 50-E): campana + activity junto a los iconos del menú derecho
Backend inaccesible en https://localhost:44304 durante este sprint;
Sprint 47-H construyó un índice compuesto degradado para el feed de Creator/Post
Sprint 47-H construyó un escaneo degradado (TenantId, CreationTime) para PersonaPost
Sprint 50-W BillingReconciliationJob detectó vacíos (Paddle
Cada modules/torun.*/angular/angular.json referenciaba
Las pruebas de aislamiento de inquilinos de Sprint 50-CC revelaron un defecto preexistente:
El barrido MT de Sprint 47-A..47-P añadió índices compuestos prefijados con TenantId a cada
Finalización de la serie Sprint 49.
Riesgo R2 previo al lanzamiento: Sprint 47-A..47-P barrió 219+ entidades para
Sprint 50-U detectó la brecha: IBillingRecorder solo tenía RecordAsync.
Plan §2.3 / auditoría R1 — Sprint 47-A...47-P barrió 219+ entidades para
Backlog del Plan §2.5: se propagaron 22 claves del pipeline ImageEdit (Sprint
Sprint 50-K detectó una colisión (configuración Paddle del plan de suscripción
Fase 1.5 §2.1 #3 — tercer worker en segundo plano.
Fase 1.5 §2.1 #4 — cuarto y último worker en segundo plano previo al lanzamiento.
/api/app/run-input-upload devolvía 404 porque el AppService
Sprint 50-P implementó la UI de la pestaña Editar de /me/image + conexión con el backend pero
El frontend (Angular | date pipe + constructor Date) gestiona UTC -> local
Fase 1.5 §2.1 — worker en segundo plano de máxima prioridad.
Fase 1.5 §2.1 #2 — segundo worker en segundo plano.
El usuario reportó que el turno de seguimiento "rellenar formulario" devolvía "Mensaje fallido.
Error A: el compositor de chat ignoraba Ctrl+V para imágenes del portapapeles.
La página de exploración de Marketplace (angular/src/app/marketplace/
A la pestaña de edición le faltaba la selección de Modelo (Auto/Manual), Calidad
El usuario reportó que el valor predeterminado de Sprint 50-I (bottom:96 right:24) se superponía
Las pruebas de /me/notifications devolvieron 404 en
PaddleOptions.WalletTopUpPriceIds era un Dictionary<string,string>
El usuario reportó "paddle.js popup no se abre, hata veriyor" al
Sprint 50-I soluciona dos regresiones UX detectadas tras Sprint 50-B + 50-E:
El administrador guardó la configuración Paddle de un SubscriptionPlan; el primer guardado funcionó.
La tabla de desglose de costes en /me/billing anteponía el prefijo $ a todos
Sprint 49-B dejó dos URLs /api/app/* codificadas en chat-pipeline
- 50-B (InAppAssistant:Bubble:Dock/Undock/DragHint): añadido a en.json + los 28 locales restantes con traducciones nativas
Usuario: 'al hacer clic en eliminar en la página memory aparece js confirm, ¿por qué no usamos LeptonX
Corrección A (error CRÍTICO del servidor):
El usuario reportó: el desplegable SourceKind mostraba bloques rosas/azules extraños (roto
Retroalimentación del usuario: las dos campanas flotantes (notification-bell + activity-center)
Aplicación del patrón Sprint 47-I + 45-M.
Sprint 46-A introdujo IBillingRecorder entre módulos + emisión de BillingRecords
Sprint 46-F completó la normalización estructural lowercase→PascalCase pero dejó 4 locales con contenido en inglés de Suite-stub.
Aplicación del patrón Sprint 45-M + 47-A a 47-N.
Aplicación del patrón Sprint 47-M.
Aplicación del patrón Sprint 45-M + 47-K.
Aplicación del patrón Sprint 45-M + 47-A a 47-K.
Aplicación del patrón Sprint 45-M + 47-A a 47-H.
Aplicación del patrón Sprint 45-M + 47-A/B/C/D/E/F/G/O.
Aplicación del patrón Sprint 45-M + 47-G.
Aplicación del patrón Sprint 45-M + 47-A/B/C/D/E/F.
Aplicación del patrón Sprint 45-M + 47-A/B/C/D/E.
Aplicación del patrón Sprint 45-M + 47-A/B/C/E.
Aplicación del patrón Sprint 45-M + 47-A + 47-B.
Aplicación del patrón Sprint 45-M + 47-A/B/C.
Aplicación del patrón Sprint 45-M + 47-A/B.
Aplicación del patrón Sprint 45-M + 47-A.
Aplicación del patrón Sprint 45-M: Suite NO emitía IMultiTenant en las clases Base a pesar de IsMultiTenant: true en el JSON.
Slice 56 — IModelRoutingService (ByokVault.Application + Contracts):