What is new on the ToRun platform, newest first.
June 2026 — 53 changes
Modellväljaren innehåller nu Google Imagen och Gemini för bilder, samt OpenAI Sora och Google Veo för video, vid sidan av modellerna du redan hade. Välj precis den du vill ha, eller låt Auto välja det som passar din plan…
Kedja ihop flera AI-steg till ett Workflow som du kör när du vill, och publicera det sedan på Marketplace eller utforska vad andra kreatörer har delat. Workflow Editor, Runner och Marketplace finns nu direkt i menyn.
Lägg till ToRun på din hemskärm och starta den som en riktig app, i helskärm och med egen ikon, så att den är ett tryck bort tills mobilappen släpps.
En ny logotyp och renare varumärke i hela appen, anpassat för både det ljusa och det mörka temat.
Bestäm hur hårt AI:n ska tänka – nu även i Auto-läge. Bildprompter kan diskret hämta från ditt sparade minne så att resultaten matchar de personer och detaljer du bryr dig om. Och nästan identiska minnen slås samman auto…
Genereringens förlopp visas nu direkt bredvid resultatet i stället för under formuläret, varje sida öppnas ren och din senaste skapelse står i centrum medan äldre alster finns i ditt Library.
Din plånbokshistorik är nu sidindelad och visar exakta belopp ända ner till bråkdelar av en cent, och att ta bort objekt från ditt Library ger inte längre något felmeddelande.
Skapa ditt annonsörskonto och skicka in kampanjer för granskning direkt från ditt konto, utan att vänta på manuell uppsättning.
Bakom kulisserna: rättvisare hantering av gratiskrediter, starkare kontroller av kreatörers utbetalningar och behörigheter, säkrare mediegranskning och mer tillförlitliga workflow-körningar.
Live Translation låter dig nu välja mellan två motorer och ta den som passar din konversation bäst – inklusive ett nytt alternativ som talar 77 språk, bland annat turkiska och ryska. Varje val visar priset direkt, och me…
Modeller som din plan inte täcker visas nu med ett litet lås och en snabb väg att uppgradera din plan eller fylla på din plånbok, i stället för att misslyckas först när du skickat. Vi har också öppnat fler kraftfulla mod…
Dela en bild en gång så behåller assistenten det den såg under resten av konversationen – så att du kan fråga om den många meddelanden senare, även efter att du bytt modell, utan att bilden laddas upp på nytt eller debit…
Chattsvaren ritar nu diagram som riktiga diagram, lägger upp tabeller med tydliga kantlinjer och anpassar rubrikernas storlek efter meddelandet i stället för att fylla skärmen – så att svaren blir lättare att överblicka.
När en modell kräver en uppgradering eller ditt saldo börjar ta slut får du nu en vänlig banner med knapparna Uppgradera plan och Fyll på plånbok direkt där. Svar som inte kan genereras förklarar varför i stället för att…
Faktureringsposter, historik och aktivitet visas nu i din lokala tid i stället för UTC, så att tidsstämplarna stämmer med klockan på din vägg.
När du startar en ny chatt återanvänds nu en tom chatt i stället för att tomma chattar staplas på varandra, chattar som aldrig fick ett svar skräpar inte längre ner din lista, och platshållartitlar byts ut mot ett riktig…
Företag kan nu skapa ett annonsörskonto och driva sina egna annonskampanjer från början till slut – skapa kampanjer, lägga till annonsmaterialet som hör till dem och skicka in dem för en snabb granskning innan de visas.
Att använda din egen leverantörsnyckel omfattar nu även realtidsröst, livetolkning och livetranskribering: AI-användningen går via din egen nyckel och vi tar bara ut den lilla plattformsavgiften per minut.
Våra publika sidor drivs nu av redigerbart innehåll på många språk, uppladdade bilder skannas efter osäkert innehåll innan de lagras, kontoregistrering och bekräftelsemejl fungerar tillförlitligt, och en bred omgång förb…
Långa svar körs nu på servern och fortsätter medan du byter chatt, öppnar en annan sida eller stänger fliken. Kom tillbaka när som helst, så strömmar svaret fortfarande eller väntar redan på dig.
Chattar som du startar inuti ett projekt hämtar automatiskt dess instruktioner, uppladdad kunskap och minne, visar en projektetikett med en snabb länk tillbaka och namnger projektet bland dina senaste chattar. Du kan äve…
Din assistents minne håller nu reda på hur snabbt varje faktum förändras och markerar de som kan vara inaktuella, så att det förlitar sig på det som fortfarande stämmer. En ny redigerare låter dig själv granska, lägga ti…
Vi har lagt till de senaste modellerna för bild, video, transkribering och röst i realtid, och öppnat fristående sidor för att översätta och transkribera så att du når dessa verktyg direkt från menyn.
Tala och få dina ord översatta nästan omedelbart: välj två språk, byt plats på dem med en enda tryckning, så fångar översättaren din röst och strömmar tillbaka översättningen medan du pratar.
Videosidan håller nu sina rutor synkroniserade när du raderar något ur ditt bibliotek, låter dig ställa in kliplängden per modell, ta bort enskilda klipp och markerar tydligt förhandsvisade resultat så att du alltid vet…
Assistenten i appen visar nu snyggt formaterade svar, håller det senaste meddelandet i vy medan den skriver, sparar det färdiga svaret tillförlitligt och ger varje konversation en automatisk titel.
Svar som innehåller länkar, matematiska formler eller valutabelopp visas inte längre tomma eller halvrenderade, inte ens efter en siduppdatering, och svar från djupforskning innehåller alltid sin slutliga sammanfattning.
En bred omgång arbete bakom kulisserna: noggrannare användningsmätning och utgiftssummor, rättvisare automatiska återbetalningar, stabilare meddelanden i realtid, starkare skydd för integritet och säkerhet samt tydligare…
Offentliga blogginlägg och forumdiskussioner — inklusive reaktioner och svar — är nu synliga för utloggade besökare.
Användningen debiteras nu med ett enda, rättvist påslag, dina mätare för månadskostnad och kvarvarande budget visar korrekt, och modellistan har rensats — utdaterade modeller har pensionerats och nya flaggskeppsmodeller…
Arbetsflödesannonser och paket kan visa en riktig omslagsbild, vilket gör marknadsplatsen enklare och trevligare att bläddra i.
Be assistenten om hjälp så fyller den i formulär, klickar på knappar och navigerar runt i appen åt dig — med stöd av en bredare verktygslåda som nu når kontakt, vanliga frågor, forumet, minnet och skapande av arbetsflöde…
Svaren strömmar nu in ord för ord i stället för att dyka upp på en gång, och assistentbubblan kan dras dit det passar dig bäst, med en tydlig indikation om vad den arbetar med.
Att skapa ett projekt och starta en ny chatt i det fungerar nu smidigt, så att du kan hålla relaterade chattar, filer och sammanhang samlade.
Videor spelas upp pålitligt, privat media laddas via en säker proxy, avatarer för kreatörer och personas visas nu för alla, och röstmeddelanden transkriberas utan fel.
När en del av tjänsten krånglar är meddelandet nu lättare att förstå och avslöjar inte längre interna leverantörsnamn.
Koppla externa appar med en enda inloggning eller en API-nyckel, så att assistenten kan arbeta direkt med de verktyg du redan använder.
Bildverktygen väljer nu en modell som passar det du gör, visar en omedelbar förhandsvisning av resultatet på plats, och redigeringen fungerar igen efter ett byte av leverantörsmodell.
När en bild eller bilaga har tagits bort visar din chatthistorik, ditt mediegalleri och bildredigeraren nu en vänlig platshållare i stället för att stanna med ett felmeddelande.
Översättaren erbjuder nu en sökbar väljare med ungefär 100 språk, vart och ett visat med sitt namn på modersmålet och på engelska.
Vi har lagt till en omgång nya bloggartiklar och forumtrådar — inklusive besvarade frågor — så att det finns mer att läsa och utforska redan från start.
Chatten kan nu söka i dina uppladdade filer, köra Python i en sandlåda, redigera bilder, transkribera och tala ljud, och utlösa dina arbetsflöden — allt utan att lämna konversationen.
Låt chatten söka på det levande webben, köra flerkällig djupforskning och hämta och läsa hela sidor — varje svar återkommer med källorna det använde.
Din assistent håller nu ett lättviktigt minne över chattar, kan lista vad den minns och uppfyller en glömskebegäran på vilket språk som helst.
Generera och redigera bilder, producera kortfilmer och komponera låtar med texter — drivet av nya bild-, video- och musikmotorer, med en delad mediaplockare och ditt bibliotek ett klick bort.
Prata högt med ToRun — en ny realtidsröstkapacitet ger talade konversationer och direkttranskription till chatten.
Arbetsflödeskörningar föredrar nu premiumkvalitetsmodeller, pausar för ditt godkännande där det behövs och kan avbrytas, regenereras och återupptas — med varje resultat sparat direkt till ditt bibliotek.
Gruppera relaterade chattar, filer och kontext i Projekt så att din assistent alltid har rätt bakgrund för uppgiften.
Skriv utkast och iterera på långformat innehåll och kod i en dedikerad canvas-panel direkt bredvid din chatt.
Rullande sammanfattningar, smartare kontextfönster och snabbare historikbläddring håller långa chattar sammanhängande och pigga, med tydliga kontroller när en konversation växer ur modellens fönster.
En human gratisfrigivning som fylls på över ett rullande fönster, tydligare utgiftsmätare, automatiska återbetalningar när bild- eller videogenerering misslyckas, och resonemangsnivåkontroller som bara låser upp vad ditt…
Dussintals 2026-modeller lagda till och inaktuella pensionerade, plus en daglig automatisk synkronisering som håller providersmodeller och prissättning uppdaterade — hanterat från en ny adminkatalog.
Publicera en konversation till en offentlig länk och odla gemenskapen kring det du skapar.
May 2026 — 499 changes
Fristående .NET-konsolramverk (test/ToRun.SmokeTests) som autentiserar mot den körande Host (OpenIddict lösenordsbeviljande) och utövar varje kärnkapacitet end-to-end via det riktiga HTTP API: auth/me, minne CRUD, plånbo…
Plattformsmedia finns i en PRIVAT Bunny Storage Zone, så ett vanligt
Slutför den chattdrivna minneshanteringsfunktionen ovanpå
memory_forget returnerade no_match för minnen som finns.
gemini-2.5-flash började returnera HTTP 400 på thinkingBudget=128 (det låga 52-N
De två host-adminsidorna (/admin/model-catalog, /admin/model-onboarding)
Identifiering matchade bara på exakt ProviderModelId/ModelKey, så daterade provider
Resonemangsnivågrinden är nu finansieringsbaserad, inte tierbaserad.
Bäst-av-båda-sammanslagning till den landade 52-Q-MODEL-SYNC-JOB-synken: när OpenRouter
Resonemangsnivåväljaren var hårt grindat på prenumerationsnivå plus ett admin/host-undantag från ett tidigare, avvisat tillvägagångssätt.
Fas 1-leverans: 26-provider lista/prissideinventering, den
Introduktionsguiden (faser A-D) SKAPAR bara katalograder; det fanns ingen
Backend (torun.agent): SharedChat får IsListed/ListedSlug/ListedAt + denormaliserade kortfält; PublicCommunityAppService + PublicCommunityController (anonym /community-flöde + by-slug-visning); CommunityListingAppService…
Ljudbilagor i chatten var trasiga; de faktiska grundorsakerna skilde sig från
DEL 1 — chattrubriken "Kontextöverflödeshantering"-rullgardinsmeny satt fast på
Borttagningen av det dagliga taket (84178afab) raderade DailyKey/MonthlyKey från BudgetBucketCacheItem
Del 1 — återställ MongoDB-integrationstestgolvet.
Strängar för resonemangsnivåväljare (Effort:Tooltip, Effort:Locked:Tooltip,
Kanonisk, provideroberoende resonemangsnivåkontroll på chattkomponitören,
Sista genomgången av död kod för sessionsfönsterns budgetomskrivning.
Månads-/daglig utgiftsmätare läser telemetri UserDailySummary (ScopeKey=userId,
Granskningsuppföljning till sessionsfönsterns budgetomskrivning (2a33fd31f).
Start (/) + me-start budget-bucket-mätaren visade "$0.00 / 0% / $0.00" varje gång
Gratisnivåns budgetbucket var ett "$2 / 30d / 24h"-droppande: påfyllning = $2/720/h och
Start (/) och me-start (/me) BUDGET BUCKET-mätaren visade "$0.00 (2% / $0.01)":
Flertursvisionsbug.
Första regressionsläsning i röktestnivån.
Grundorsaksfixning för de återkommande title-gen / public-chat / vision 404:orna: kapacitet
Användaren bekräftade att bildbeskrivning nu fungerar.
Ägarscopet fick 403 även för den legitime chattägaren: hanterar-skapade
A3 VERKLIG grundorsak (hittad av live webbläsartest): chattbilagabild
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Lösning av IQueuedRequestDispatcher StackOverflowed vid start (ej fångbar — en
Både Host-körtidsmottagaren (appsettings.json) och bootstrap-loggarna
Återkommande grundorsak: ChangelogBackfillDataSeedContributor sonderade idempotens på
Körde extract-sprint-changelog.py + propagate-changelog-locales.py från 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-kapacitetsseed + sammanfogning
Backend exception → frontend humane message + retry hint + status banner.
Consolidator landed both 52-Q-CHAT-CONTEXT-BUILDER's ChatSummaries
Spegling av realtidsröstlägesnycklar för UI tillagda till en.json i
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
Enligt CLAUDE.md Regel 10.
Utdata från `python platform-plan/scripts/_validate-29-locales.py` efter att alla 27 syskonöversättarbatcher landade + BOM-rensningspasset:
Batchar från 6 parallella Sonnet-översättaragenter (alla incheckade i repot från tidigare omgångar + nu utflushad slutgrupp):
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).
Skrivskyddad granskningspass mot ChatPipelineAppService + InAppAssistant + providerklienter + 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 flaggade ett VERB_MISMATCH: Angular anropar ren PUT
Backend-hälften av Sprint 50-F: anonym demo-chatt på landningssidan med per-IP
Ordboken `Dictionary<(DateTime Date, Guid?
Stänger det enda kapplöpningsfönstret i KeywordSettlementJob som kunde
Fortsättning av task #67 (50-SS-genomgång).
Stänger 50-RRR-grunden (commits A/B/C) genom att koppla den faktiska kompositvägen
Återfyllde Toggle / Heading / New / Untitled / Empty / Load:Failed / JustNow / MinAgo / HourAgo / DayAgo över alla 28 icke-engelska språk (en.json hade redan hela uppsättningen från Sprint 50-CCC-2).
Speglar Sprint 50-LL (Post.CreatorProfileId) + Sprint 50-VV-2 (AdAuction
Pipeline härleder nu förmågenyckeln från inmatningstopologin och använder
Adapterkontrakt för flerinsats-kompositvägen.
Grundläggande commit för flerbilds-redigerings-refaktoreringen (Option C — förmåge
Omfångsfynd: kopplingen på ChatPipelineAppService.cs:1415 anropar redan
5 strukturerade loggtillägg så att produktionsfel visar sitt fulla sammanhang
Tvådelad fix för bubblan som samlade tomma / oönskade sessioner:
Stänger det uppskjutna -2 från 50-YY (där mikrofon-kopplingen skars ut så att
Stänger tvärspieline-luckan kvar från 50-AAA.
Användaren rapporterade att både "Välj källbild" och "Välj maskbild"
Produktionslogg:
Användaren rapporterade att både käll-uppladdning och mask-uppladdning på /me/image Redigera
Sista bibliotekets modulslice.
Användarfeedback: grön "Uppladdning klar."-banner flimmrade in/ut för
Sprint 50-CCCC försökte åtgärda uppladdningspipelinens ObjectDisposedException
Grundorsak till det ihållande "Uppladdning misslyckades"-meddelandet — trots att filer
Användaren rapporterade fem separata problem:
Användaren rapporterade att part_001.wav / part_002.wav raderades från biblioteket men
50-YYY lämnade en regression: openAssetDetail utlöste bara textförinläsning
Användaren rapporterade att fliken Dokument var tom efter uppladdning av .md / .txt-filer —
CDN offentligt URL-mönster var fel för /me/library — innehåll är per användare
Två buggar i ett batch — båda uppstod i ett användartest där 4 filer 'laddades upp' enligt den gröna bannern men bibliotekssidan stannade på 0 poster.
Användare: 'lägg till förloppsindikator för uppladdningar, visa vilka som laddats upp, det ser för tråkigt ut.'
Två användarblockerade problem från /me/library-testning:
Användaren rapporterade biblioteksuppladdning 400 'Only image/* MIME types are accepted on this endpoint.' efter uppladdning av icke-bildfil från fliken Alla.
Användaren rapporterade Message Citations admin 500 'Internal error'.
Användaren rapporterade biblioteksuppladdning 'Bunny storage upload failed with HTTP 401'.
Användaren rapporterade att /me/image Generera var trasigt: "Bildgenereringsleverantör
Användaren rapporterade att Sprint 50-III:s panel-positionsomstrukturering FORTFARANDE inte
Grundorsak (Scenario B-variant): `openSession()` anropar `messages.set(mapped)`
Användare: "Du behöver inte använda samma modell för titlar, det är
Användaren rapporterade att panelen fortsatte öppnas fristående från FAB trots Sprint
Sprint 50-CCC höjde MaxOutputTokens 24 → 128 och väntade sig "~100
Användaren rapporterade att /me/activity-history var tomt trots timmar av chatt/bild/röst/etc.
Två användartestningsregressioner hittade och åtgärdade; tredje problemet
| # | Meny | Grupp | Angular-sökväg | Backend-rutt | Status | Grundorsak |
Användare: varför måste man lägga till filer i biblioteket en i taget manuellt
Användare: källan har PC-uppladdning men masken saknar det, behövs
Användarsrapporterad kritisk bugg: varje PC-uppladdningsförsök kastade
Användaren rapporterade upprepade gånger sedan igår att /me/notifications/
Senaste chattar-listan i /agent/chat-pipeline hade per-rad Döp om/Radera
Användartestning lyfte fram 5 problem; 4 av dem åtgärdade i denna commit, 1
Daglig AsyncPeriodicBackgroundWorker (24h-tick) söker igenom Betalade
Sprint 47-O skapade platta AdAuction-entiteter utan sammanfognings-FK:er;
Daglig ABP AsyncPeriodicBackgroundWorker (24h-tick) söker igenom väntande
Sprint 50-TT skickades för detta men spårade ur (det
Användaren bad om: biblioteksövre storleksindikator, PC-uppladdning, plan-tier-kvot,
Utökar 50-RR-mönstret (VideoJobPollingWorker IAbpDistributedLock)
Sprint 50-P sköt upp PC-uppladdning eftersom backend saknade Bunny
50-AA avbröts under full genomgång; detta är den återupptagna batchade
Sprint 50-U + 50-EE kopplade polling + återbetalningsflöde men antog enpod
Användarinstruktion (Sprint 50-E): klocka + activity placeras intill menyn till höger
Backend ej nåbar på https://localhost:44304 under detta sprint;
Sprint 47-H byggde ett degraderat sammansatt index för Creator/Post-flöde
Sprint 47-H byggde en degraderad (TenantId, CreationTime)-skanning för PersonaPost
Sprint 50-W BillingReconciliationJob upptäckte hål (Paddle
Varje modules/torun.*/angular/angular.json refererade
Sprint 50-CC klientisoleringstester avslöjade ett befintligt fel:
Sprint 47-A..47-P MT-sweep lade till TenantId-prefixerade sammansatta index till varje
Sprint 49-seriens slutförande.
Förlanserings-R2-risk: Sprint 47-A..47-P svepte 219+ entiteter till
Sprint 50-U avslöjade lucka: IBillingRecorder hade bara RecordAsync.
Plan §2.3 / R1-revision — Sprint 47-A...47-P svepte 219+ entiteter till
Plan §2.5 eftersläp: spred 22 ImageEdit-pipeline-nycklar (Sprint
Sprint 50-K fångade en kollision (prenumerationsplan Paddle-konfiguration
Phase 1.5 §2.1 #3 — tredje bakgrundsarbetaren.
Phase 1.5 §2.1 #4 — fjärde och sista bakgrundsarbetaren före lansering.
/api/app/run-input-upload returnerade 404 eftersom AppService
Sprint 50-P landade /me/image Redigera-flikens UI + backend-koppling men
Frontend (Angular | date pipe + Date constructor) hanterar UTC -> lokal
Phase 1.5 §2.1 — bakgrundsarbetare med högsta prioritet.
Phase 1.5 §2.1 #2 — andra bakgrundsarbetaren.
Användaren rapporterade att uppföljningsturen returnerade "Message failed."
Bugg A: chattkomposer ignorerade Ctrl+V på urklippsbilder.
Marketplace-bläddringssidan (angular/src/app/marketplace/
Redigera-fliken saknade Modell-val (Auto/Manuell), Kvalitet
Användaren rapporterade att Sprint 50-I:s standard (bottom:96 right:24) överlappar
Användartestning av /me/notifications träffade 404 på
PaddleOptions.WalletTopUpPriceIds var ett Dictionary<string,string>
Användaren rapporterade att Paddle.js-popup inte öppnades, fel uppstod
Sprint 50-I hanterar två UX-regressioner som uppstod efter Sprint 50-B + 50-E:
Administratören sparade en SubscriptionPlan:s Paddle-konfiguration; första sparandet fungerade.
Kostnadsuppdelningstabell på /me/billing prefixade naivt varje
Sprint 49-B lämnade två hårdkodade /api/app/*-URL:er i chat-pipeline
- 50-B (InAppAssistant:Bubble:Dock/Undock/DragHint): tillagd i en.json + alla 28 andra språk med inhemska översättningar
Användare: 'js confirm visas vid radering på minnessidan, varför inte LeptonX'
Fix A (server KRITISK bugg):
Användaren rapporterade: SourceKind-dropdown visade märkliga rosa/blå block (trasig
Användarfeedback: de två flytande klockorna (notification-bell + activity-center)
Sprint 47-I + 45-M-mönster tillämpat.
Sprint 46-A introducerade tvärsmodulen IBillingRecorder + emitterade BillingRecords
Sprint 46-F strukturell normalisering avslutad lowercase→PascalCase men lämnade 4 språk med Suite-stub-engelskt innehåll.
Sprint 45-M + 47-A till 47-N-mönster tillämpat.
Sprint 47-M-mönster tillämpat.
Sprint 45-M + 47-K-mönster tillämpat.
Sprint 45-M + 47-A till 47-K-mönster tillämpat.
Sprint 45-M + 47-A till 47-H-mönster tillämpat.
Sprint 45-M + 47-A/B/C/D/E/F/G/O-mönster tillämpat.
Sprint 45-M + 47-G-mönster tillämpat.
Sprint 45-M + 47-A/B/C/D/E/F-mönster tillämpat.
Sprint 45-M + 47-A/B/C/D/E-mönster tillämpat.
Sprint 45-M + 47-A/B/C/E-mönster tillämpat.
Sprint 45-M + 47-A + 47-B-mönster tillämpat.
Sprint 45-M + 47-A/B/C-mönster tillämpat.
Sprint 45-M + 47-A/B-mönster tillämpat.
Sprint 45-M + 47-A-mönster tillämpat.
Sprint 45-M-mönster tillämpat: Suite emitterade INTE IMultiTenant på basklasser trots IsMultiTenant: true i JSON.
Slice 56 — IModelRoutingService (ByokVault.Application + Contracts):