Changelog

What is new on the ToRun platform, newest first.

v@release.Version

minor
14 6月 2026

June 2026 — 53 changes

  • Added
    選べる画像・動画モデルがさらに充実

    モデルピッカーに、これまでのモデルに加えて画像向けのGoogle ImagenとGemini、動画向けのOpenAI SoraとGoogle Veoが新たに加わりました。使いたいモデルをご自身でピンポイントに選ぶのはもちろん、Autoにおまかせすれば、お使いのプランに最適なモデルを自動で選んでくれます。

  • Added
    ノーコードのAIワークフローとクリエイター向けMarketplaceが登場

    複数のAIステップをひとつのWorkflowにつなげて、必要なときにいつでも実行できます。作ったWorkflowはMarketplaceに公開したり、他のクリエイターが共有したものを探したりすることも可能。Workflow Editor、Runner、Marketplaceはメニューからすぐにご利用いただけます。

  • Added
    ToRunをスマホにインストール

    ToRunをホーム画面に追加すれば、専用アイコンからフルスクリーンでネイティブアプリのように起動できます。モバイルアプリの登場までは、ワンタップでさっとアクセスできて便利です。

  • Added
    ToRun.aiのデザインを一新

    新しいロゴと、よりすっきりとしたブランディングをアプリ全体に採用。ライトテーマ・ダークテーマのどちらにも美しくなじむよう仕上げました。

  • Added
    よりスマートで、あなたらしい回答に

    AIがどこまでじっくり考えるかを、Autoモードでも選べるようになりました。画像プロンプトでは保存したメモリをさりげなく参照し、あなたが大切にしている人物やディテールに沿った結果を生成します。さらに、よく似たメモリは自動で統合されるので、増えすぎて散らかる心配もありません。

  • Fixed
    画像・動画・音楽スタジオがすっきり快適に

    生成の進捗が、フォームの下ではなく結果のすぐ横に表示されるようになりました。各ページは毎回すっきりした状態で開き、最新の作品は常に中央で目立つ位置に。過去の作品はLibraryにきちんと整理されます。

  • Fixed
    ウォレットがより見やすく、Libraryもさらにスムーズに

    ウォレットの履歴がページ分けされ、1セント未満の金額まで正確に表示されるようになりました。また、Libraryからアイテムを削除してもエラーが発生しなくなりました。

  • Added
    セルフサービスで広告主になれます

    広告主アカウントを作成し、アカウントから直接キャンペーンを審査に提出できます。手動でのセットアップを待つ必要はもうありません。

  • Fixed
    信頼性・課金精度・セキュリティを強化

    見えないところでも改善を重ねました。無料クレジットの計算をより公平に、クリエイターへの支払いと権限のチェックをより厳格に、メディアのモデレーションをより安全に、そしてWorkflowの実行をより安定したものにしています。

  • Added
    2つ目のライブ翻訳エンジン登場、77言語に対応

    ライブ翻訳で2つのエンジンから選べるようになり、会話に合ったものをお選びいただけます。トルコ語やロシア語を含む77言語に対応した新しいエンジンも追加されました。それぞれの料金が事前に表示され、ワンタップで翻訳の向きを切り替えられるので、相手もすぐに返信できます。

  • Added
    見やすくなったモデル選択画面と、Free planで使えるモデルが拡充

    プランに含まれないモデルには小さな鍵マークが表示され、ワンタップでアップグレードやウォレットへのチャージができるようになりました。送信してから初めて失敗する、ということがなくなります。さらにFree planでも高性能なモデルを開放し、Haiku、Sonnet、Gemini Flashといった普段使いのモデルを無料でご利用いただけます。

  • Added
    共有した画像をアシスタントが覚えています

    一度画像を共有すれば、アシスタントはその内容を会話の最後まで記憶します。何度かやり取りを重ねた後でも、モデルを切り替えた後でも画像について質問でき、画像が再アップロードされたり二重に課金されたりすることはありません。

  • Added
    チャットに図表や見やすい書式が加わりました

    チャットの回答で、図はちゃんとした図として描画され、表は見やすい枠線付きで整い、見出しは画面いっぱいにならずメッセージに合ったサイズになりました。回答がひと目で読みやすくなります。

  • Fixed
    対象外のときも常に分かりやすく、行き止まりにはなりません

    モデルにアップグレードが必要なときや残高が少なくなったときは、その場にアップグレードとウォレットへのチャージのボタン付きの分かりやすいバナーが表示されます。生成できない回答は、空の吹き出しのままにせず理由を説明します。チャットを切り替えて戻ってきた後でも同様です。

  • Fixed
    時刻がお使いのタイムゾーンで表示されるように

    課金記録、履歴、アクティビティがUTCではなく現地時間で表示されるようになりました。お手元の時計と同じ時刻でご確認いただけます。

  • Fixed
    すっきり整理されたチャット一覧

    新しいチャットを始めると空のチャットを再利用するようになり、空白のチャットが積み重なりません。返信のないチャットが一覧を散らかすこともなくなり、仮のタイトルは意味のある発言をするとすぐに本当の名前に置き換わります。

  • Added
    ToRunに広告を出稿

    企業の方は広告主アカウントを開設し、広告キャンペーンを最初から最後までご自身で運用できるようになりました。キャンペーンを作成し、合わせて広告クリエイティブを追加し、掲載前の簡単な審査に提出できます。

  • Added
    ライブ音声や翻訳でも自分のAPIキーを使えます

    ご自身のプロバイダーキーの利用が、リアルタイム音声、ライブ翻訳、ライブ文字起こしにも対応しました。AIの利用はご自身のキーを通して行われ、当社はわずかな分単位のプラットフォーム手数料のみを頂戴します。

  • Fixed
    公開サイトを刷新、より安全なアップロードとスムーズな登録

    公開ページは多言語で編集可能なコンテンツで配信されるようになり、アップロードされた画像は保存前に不適切なコンテンツがないかスキャンされます。アカウント登録や確認メールも安定して動作するようになり、幅広い裏側の改善によってプラットフォーム全体がより安定しました。

  • Added
    別の画面に移動しても、チャットの生成は続きます

    長い回答はサーバー側で実行されるようになり、チャットを切り替えても、別のページを開いても、タブを閉じても処理が続きます。いつ戻ってきても、回答はまだ生成中か、すでに完成して待っています。

  • Added
    プロジェクトが、すべてのチャットに最適なコンテキストを提供します

    プロジェクト内で始めたチャットは、その指示・アップロードした知識・メモリを自動的に引き継ぎ、戻るためのリンク付きプロジェクトバッジを表示し、最近のチャット一覧にプロジェクト名を表示します。PDF、Word、テキストファイルをプロジェクトの知識に追加することもできます。

  • Added
    時間を理解し、自分で編集できるメモリ

    アシスタントのメモリが、各情報の変化の速さを把握し、古くなっている可能性のあるものに印を付けるようになりました。これにより、今も正しい情報をより重視します。新しいエディターで、一つひとつのメモリを自分で確認・追加・削除できます。

  • Added
    最新モデルに加え、専用の翻訳ページと文字起こしページ

    最新の画像・動画・文字起こし・リアルタイム音声モデルを追加し、独立した翻訳ページと文字起こしページを開設しました。メニューからこれらのツールに直接アクセスできます。

  • Added
    リアルタイム音声翻訳

    話すだけで、ほぼ瞬時に訳されます。2つの言語を選び、ワンタップで入れ替え。翻訳ツールが音声を聞き取り、話している間に訳文をリアルタイムで返します。

  • Added
    より見やすく、より正直になった動画スタジオ

    動画ページは、ライブラリから削除したときにタイル表示も連動するようになりました。モデルごとにクリップの長さを設定でき、クリップを個別に削除でき、プレビュー結果には明確な印が付くので、今見ているものが常にわかります。

  • Fixed
    さらに洗練されたアプリ内アシスタント

    アプリ内アシスタントは、見やすく整形された回答を表示し、入力中も最新のメッセージが見えるようにスクロールし、完成した回答を確実に保存し、各会話に自動でタイトルを付けるようになりました。

  • Fixed
    チャットの回答が確実に表示されます — リンク・数式・通貨も

    リンクや数式、通貨の金額を含む回答が、空白になったり途中までしか表示されなかったりすることがなくなりました。ページを更新した後でも同様です。さらに、ディープリサーチの回答には必ず最終的な要約が含まれます。

  • Fixed
    信頼性・課金の正確さ・セキュリティの強化

    幅広い舞台裏の改善を行いました。より正確な使用量の計測と利用額の集計、より公平な自動返金、より安定したリアルタイムメッセージング、より強固なプライバシーとセキュリティの保護、そしてよりわかりやすいサービス状況のお知らせです。

  • Fixed
    サインインせずにブログやコミュニティの記事を閲覧

    公開ブログ記事やフォーラムのディスカッションは、リアクションや返信も含めて、未ログインの訪問者にも表示されるようになりました。

  • Fixed
    わかりやすい料金体系と、すっきり整理されたモデル一覧

    利用料はシンプルで公正な単一のマークアップで請求され、月間利用額と残り予算のメーターも正確に表示されます。モデル一覧も整理され、廃止されたモデルを除き、新しいフラッグシップモデルを組み込みました。

  • Added
    マーケットプレイスの出品とバンドルにカバー画像が表示されるようになりました

    ワークフローの出品やバンドルにきちんとしたカバー画像を表示できるようになり、マーケットプレイスがより見やすく、より快適に閲覧できます。

  • Added
    アプリ内アシスタントがあなたの代わりに操作できるようになりました

    アシスタントに頼むだけで、フォームの入力、ボタンのクリック、アプリ内の移動まで代行します。お問い合わせ、FAQ、フォーラム、メモリ、ワンステップのワークフロー作成にまで広がった充実のツールセットが、これを支えます。

  • Added
    アシスタントが、動かせる吹き出しの中でリアルタイムに返信を入力します

    回答が一度にまとめて表示されるのではなく、一語ずつストリーミングで表示されるようになりました。アシスタントの吹き出しは好きな場所へドラッグでき、いま何に取り組んでいるかもリアルタイムでヒント表示します。

  • Fixed
    プロジェクトをスムーズに作成・整理

    プロジェクトの作成や、その中での新しいチャットの開始がスムーズに動作するようになり、関連するチャット・ファイル・コンテキストをひとまとめに管理できます。

  • Fixed
    より滑らかな動画・アバター・音声

    動画が安定して再生され、非公開メディアは安全なプロキシ経由で読み込まれます。クリエイターやペルソナのアバターが誰にでも表示されるようになり、ボイスメモもエラーなく文字起こしされます。

  • Fixed
    よりわかりやすいサービス状況のお知らせ

    サービスの一部に不具合が生じている場合、お知らせがより理解しやすくなり、内部のベンダー名を表示しないようになりました。

  • Added
    お気に入りのアプリをアシスタントに接続

    1 回のサインインまたは API キーで外部アプリを連携でき、アシスタントがあなたの使い慣れたツールと直接連携して作業できます。

  • Fixed
    より信頼性の高い画像生成と編集

    画像ツールは、あなたの作業内容に合ったモデルを自動で選び、結果をその場でインラインプレビュー表示します。プロバイダーのモデル変更後も編集が再び正しく動作するようになりました。

  • Fixed
    ファイルを削除してもチャットやギャラリーが壊れなくなりました

    画像や添付ファイルが削除されている場合でも、チャット履歴、メディアギャラリー、画像エディターはエラーで止まらず、わかりやすいプレースホルダーを表示するようになりました。

  • Added
    約 100 言語にわたる翻訳

    翻訳機能に、約 100 言語を収録した検索可能な選択ツールが加わりました。各言語は、その現地名と英語名の両方で表示されます。

  • Added
    新しいブログ記事とコミュニティのディスカッション

    新しいブログ記事やフォーラムのスレッドをまとめて追加しました。回答済みの質問も含まれており、初日からもっと多くの読みものや見どころを楽しめます。

  • Added
    新しいチャット内ツール: ファイル、コード、画像、音声など

    チャットから離れることなく、アップロードしたファイルの検索、サンドボックスでの Python 実行、画像編集、音声のトランスクリプションや読み上げ、ワークフローのトリガーが可能になりました。

  • Added
    ウェブ検索と詳細リサーチ(引用付き)

    チャットがライブウェブを検索し、マルチソースの詳細リサーチを実行し、ページ全体を取得して読み込めるようになりました — すべての回答に使用したソースが添付されます。

  • Added
    記憶する、そして求めに応じて忘れるチャット

    アシスタントがチャット間で軽量なメモリを保持し、記憶している内容を一覧表示し、どの言語でも忘却リクエストに応じるようになりました。

  • Added
    1つのスタジオで画像・動画・音楽を作成

    新しい画像・動画・音楽エンジンを搭載し、画像の生成・編集、短編映像の制作、歌詞付き楽曲の作成が可能です。共有メディアピッカーとライブラリにワンクリックでアクセスできます。

  • Added
    リアルタイム音声モード

    ToRun に声で話しかけましょう — 新しいリアルタイム音声機能により、チャットで音声会話とライブトランスクリプションが利用できます。

  • Added
    ワークフロー: 品質優先の実行、承認、再開

    ワークフロー実行がプレミアム品質モデルを優先し、重要な箇所で承認を一時停止し、キャンセル・再生成・再開が可能になりました — すべての出力がライブラリに直接保存されます。

  • Added
    プロジェクト: 作業を整理する

    関連するチャット、ファイル、コンテキストをプロジェクトにまとめることで、アシスタントが常にタスクに最適な背景情報を持てるようになります。

  • Added
    キャンバス: 並列ワークスペース

    専用のキャンバスパネルでチャットの横に並べながら、長文コンテンツやコードを作成・反復できます。

  • Added
    より賢く、より長い会話

    ローリングサマリー、スマートなコンテキストウィンドウ、高速な履歴スクロールにより、長い会話を一貫性よくスムーズに保ちます。会話がモデルウィンドウを超えた際には、明確な操作コントロールを提供します。

  • Added
    誠実で透明な課金

    ローリングウィンドウで補充される人道的な無料枠、より明確な支出ゲージ、画像や動画生成が失敗した際の自動返金、そして残高でまかなえる範囲のみ解放される推論エフォートコントロール。

  • Added
    より充実した最新のモデルカタログ

    2026年の多数のモデルが追加され、古いモデルは廃止されました。さらに、新しい管理カタログから管理できる日次自動同期により、プロバイダーのモデルと価格を常に最新に保ちます。

  • Added
    ベストチャットを共有する

    会話を公開リンクとして公開し、作成したコンテンツを中心にコミュニティを育てましょう。

v@release.Version

minor
31 5月 2026

May 2026 — 499 changes

  • Changed
    52-Q-SMOKE-HARNESS: 再現可能なエンドツーエンドスモークスイート + 初回リグレッションレポート

    スタンドアロン .NET コンソールハーネス (test/ToRun.SmokeTests) は、実行中のHost(OpenIddict パスワードグラント)に対して認証し、実際の HTTP API を通じてすべてのコア機能をエンドツーエンドで検証: auth/me、メモリCRUD、ウォレット、課金、ライブラリ、ワークフローサンプル、ウェブ検索など...

  • Fixed
    52-Q-AI-MEDIA-ACCESS: パイプライン全メディアフェッチに認証済み Bunny 読み取りを実装

    プラットフォームのメディアはプライベートな Bunny Storage Zone に保存されているため、通常の

  • Added
    52-Q-MEMORY-CHAT: memory_list ツール + 言語非依存の動作するforget

    チャット駆動メモリ管理機能を完成させる

  • Fixed
    52-Q-MEMORY-FORGET-I18N: 言語非依存のフォールドマッチ + セマンティックフォールバック

    memory_forget が存在するメモリに対して no_match を返していた。

  • Fixed
    52-Q-GEMINI-FLASH-400: flashのthinkingBudget下限を 128->512 に引き上げ + Google 400 ボディのログ出力

    gemini-2.5-flash が thinkingBudget=128(52-N の低い値)で HTTP 400 を返すようになった

  • Fixed
    52-Q-MODEL-MENU: モデルカタログ + オンボーディングを ByokVault ナビグループ下に統合

    2つのホスト管理者ページ (/admin/model-catalog, /admin/model-onboarding)

  • Fixed
    52-Q-MODEL-SYNC-DEDUP: 検出時に日付付きスナップショットのモデルバリアントをスキップ

    検出は正確な ProviderModelId/ModelKey のみで一致していたため、日付付きプロバイダーの

  • Changed
    52-Q-CHAT-EFFORT-UX-LOCALE: エフォートロック済みコピー + WalletCta を28ロケールに展開

    推論エフォートゲートがティアベースではなく資金ベースになった。

  • Added
    52-Q-MODEL-SYNC-AI: モデル同期用価格ページフォールバックの AI パース

    マージ済みの 52-Q-MODEL-SYNC-JOB 同期への最良の統合: OpenRouter が

  • Fixed
    52-Q-CHAT-EFFORT-UX: ウォレット/資金対応のエフォートゲート

    推論エフォートセレクターはサブスクリプションティアと、以前の却下されたアプローチに由来する管理者/ホスト免除によりハードゲートされていた。

  • Changed
    52-Q-MODEL-SYNC-JOB: プロバイダー同期リサーチ + アーキテクチャマップ

    フェーズ1の成果物: 26-provider リスト/価格ソースインベントリ、

  • Added
    52-Q-MODEL-ONBOARDING: ホスト管理者向けモデルカタログ管理(一覧/編集/削除)

    オンボーディングウィザード(フェーズA-D)はカタログ行の作成のみ行い、

  • Added
    52-P-SHARE: 公開共有 + コミュニティ成長サーフェス

    バックエンド (torun.agent): SharedChat に IsListed/ListedSlug/ListedAt と非正規化カードフィールドを追加; PublicCommunityAppService + PublicCommunityController(匿名 /community フィード + スラッグ別ビューワー); CommunityListingAppService + MyCommunityListingCon…

  • Fixed
    52-Q-CHAT-AUDIO-BRIDGE: アップロード音声のトランスクリプション + 音声プレーヤーの修正

    チャット内の音声添付が壊れていたが、実際の根本原因は当初の想定とは異なっていた。

  • Fixed
    52-Q-CHAT-CONTEXT-SLASH: コンテキストオーバーフローモードの永続化 + 誠実なUXスラッシュプリセット

    パート1 — チャットヘッダーの「コンテキストオーバーフロー処理」ドロップダウンが固定されていた問題:

  • Fixed
    52-Q-BUDGET-BUILD: 削除済み BudgetBucketCacheItem.DailyKey を参照する孤立した IsCurrentMonth を除去

    日次上限の削除 (84178afab) により、BudgetBucketCacheItem から DailyKey/MonthlyKey が削除された

  • Changed
    52-Q-SMOKE-INTEG: Mongoフロアのグリーン化(AiModels 重複 _id + UoW トランザクションライフタイム)+ ResolveAsync トランスポート分離インテグレーションテスト

    パート1 — MongoDB インテグレーションテストのフロアをグリーンに戻す。

  • Changed
    52-Q-CHAT-EFFORT-LOCALE: 7件の ChatComposer:Effort キーを28ロケールに展開

    推論エフォートセレクターの文字列(Effort:Tooltip、Effort:Locked:Tooltip など)を

  • Added
    52-Q-CHAT-EFFORT: モデル別推論エフォートセレクターをエンドツーエンドで配線

    チャットコンポーザー上の正規のプロバイダー非依存推論エフォートコントロール、

  • Changed
    52-Q-BUDGET-DAILYCAP-REMOVE: 不活性な日次上限 + アクティブ分数を削除

    セッションウィンドウ予算書き換えに伴う最終デッドコードパス。

  • Changed
    52-Q-MONTHLY-SPEND-FIX: 支出ソースのコメント + XMLドキュメントをテレメトリの UserDailySummary に修正

    月次/日次支出ゲージはテレメトリの UserDailySummary(ScopeKey=userId)を読み取る。

  • Changed
    52-Q-BUDGET-DEADCFG: 廃止された Allowance 設定ノブを削除

    セッションウィンドウ予算書き換え (2a33fd31f) の監査フォローアップ。

  • Fixed
    52-Q-BUDGET-BUCKET-GAUGE-ZERO: バケットキャッシュミス時に設定済みセッション容量をプレビュー表示

    ホーム (/) + me-home のバジェットバケットゲージが、バケットキャッシュミス時に「$0.00 / 0% / $0.00」と表示されていた:

  • Added
    52-Q-BUDGET-HUMANE: ローリングセッションウィンドウ無料枠 (容量 $0.20 / 5h)

    フリーティアの予算バケットは「$2 / 30d / 24h」の点滴方式だった: 補充 = $2/720時間、かつ

  • Fixed
    52-Q-BUDGET-BUCKET-GAUGE-UX: 読みやすいバケットゲージ — 4桁精度 + 無料バースト期間のヒント表示

    ホーム (/) および me-home (/me) の BUDGET BUCKET ゲージが「$0.00 (2% / $0.01)」と表示されていた:

  • Fixed
    52-Q-CHAT-HISTORY-VISION-LEAK: テキスト専用モデルの履歴から画像パーツを除去

    マルチターンビジョンのバグ。

  • Changed
    52-Q-SMOKE: リアルタイム + 推論ルーティング分類のロック(DBなしガード)

    スモークレイヤーでの初回リグレッションロック。

  • Added
    52-Q-INVOCATION-PROTOCOL: 補完ルーティングからモデルをトランスポート分離

    繰り返し発生するタイトル生成 / パブリックチャット / ビジョン 404 の根本原因修正: 機能

  • Fixed
    52-Q-VISION-BRIDGE: 補完ベースのビジョンルーティングからリアルタイム SKU を除外 — 検証済み

    ユーザーが画像説明が動作することを確認した。

  • Fixed
    52-Q-CHAT-IMG-PROXY: ChatMessageId チェーンによる添付ファイル所属の検証

    オーナースコープでも正規のチャットオーナーが403を受けていた: マネージャーが作成した

  • Fixed
    slice52-Q-CHAT-IMG-PROXY: チャット履歴の画像をバックエンドのストリームプロキシ経由でレンダリング(Bunny 503 修正)

    A3 実際の根本原因(ライブブラウザテストで発見): チャット添付画像

  • Changed
    slice52-Q-AUDIT: パイプラインクリティカルバグ監査ログ — C1 DIサイクル修正済み、M1 Quartz 処方、パイプライン別TODO

    Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>

  • Fixed
    slice52-Q-QUEUE-DI-CYCLE: ワークフロー実行ツール依存をレイジー化してキューディスパッチャーの DI サイクルを解消

    IQueuedRequestDispatcher の解決がスタートアップ時に StackOverflow を起こしていた(キャッチ不可能な

  • Fixed
    slice52-Q-LOG-ROLLING: Serilog ファイルシンクのローテーション+上限設定(1 GB でサイレントに停止していた問題を修正)

    Hostランタイムシンク (appsettings.json) とブートストラップロガーの両方

  • Fixed
    slice52-Q-CHANGELOG-IDEMPOTENT: チェンジログシードのキーを ExternalId ではなく Slug に変更(E11000 の恒久的修正)

    再発の根本原因: ChangelogBackfillDataSeedContributor がべき等性を

  • Changed
    slice52-Q-CHANGELOG: スプリントチェンジログ + 29ロケールキーのバックフィル(93件の新スプリント)

    メインから extract-sprint-changelog.py + propagate-changelog-locales.py を実行:

  • Fixed
    slice52-Q-QUEUE-DI-CRASH: gate dispatcher resolution behind non-empty queue

    QueuedRequestRunner.DoWorkAsync resolved IQueuedRequestDispatcher at the TOP of

  • Added
    slice52-Q-CHAT-CTX-WINDOW-CLAMP: clamp context budget to model window (covers tier-budget > window gap)

    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.

  • Changed
    slice52-Q-PROACTIVE-CONCERN/locale: fan out 29 concern-toast keys to 28 siblings

    Proactive "concern toast" (Honest-UX DNA pattern #3).

  • Changed
    slice52-Q-CHAT-WALLET-OVERRIDE/locale: fan out overrun + ContextOverrun keys to 28 siblings

    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).

  • Changed
    slice52-Q-HUMANE-ERRORS/locale: fan out 70 StatusBanner + Error keys to 28 siblings

    Propagate the EN-only humane-error + status-banner keys (ErrorHumanizerService

  • Added
    slice52-Q-CHAT-CANVAS/frontend: canvas proxy + side-panel surface

    Phase B surface for the chat-canvas (ChatGPT Canvas / Claude Artifacts

  • Changed
    slice52-Q-PROACTIVE-CONCERN: EN keys for concern toast + settings opt-out + admin effectiveness panel

    Honest-UX DNA pattern #3.

  • Added
    slice52-Q-CHAT-WALLET-OVERRIDE: per-chat overrun PATCH endpoint + Agent locale keys

    Completes the wallet-funded context-overrun feature.

  • Changed
    slice52-Q-LEARNING-LOOP/locale: fan out 10 Admin/Permission UserExperience keys to 28 siblings

    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…

  • Fixed
    slice52-Q-BUILD-GREEN: resolve cross-chip integration errors blocking main build

    Four parallel 52-Q chips landed code referencing symbols their sibling chips

  • Changed
    slice52-Q-CHAT-CANVAS/locale: fan out 28 Canvas/Artifacts + Chat:Summary keys to 28 siblings

    Closes the 29-locale parity gap for the CHAT-CANVAS / ChatSummaries slices,

  • Added
    slice52-Q-LEARNING-LOOP/phase2-dashboard: admin ComplaintLink panel

    Phase 2 Scope B of the honest-UX-DNA pattern #5 loop.

  • Added
    slice52-Q-AUTO-REFUND/frontend: refund toast + /me/billing highlight + /me/wallet badge

    Honest UX DNA pattern #2 (Reversibility) — make the auto-refund VISIBLE.

  • Added
    slice52-Q-AUTO-REFUND/dispatcher: two consumers on torun.billing.refunded.v1

    Honest UX DNA pattern #2 (Reversibility) — wire the projection layer

  • Added
    slice52-Q-AUTO-REFUND/triggers: wire RefundAsync at image/video failure points

    Honest UX DNA pattern #2 (Reversibility) — refund the user when something

  • Added
    slice52-Q-AUTO-REFUND/api: IMyRefundAppService + DTOs + 5-min cache

    Honest UX DNA pattern #2 (Reversibility) — user-facing read API for the

  • Changed
    slice52-Q-AUTO-REFUND/locale: EN strings + PublicChangelogEntry

    EN-only this commit — the paired slice52-Q-AUTO-REFUND-LOCALE chip fans

  • Added
    slice52-Q-AUTO-REFUND/entity: AutoRefundLog entity + EnAutoRefundTrigger enum

    Honest UX DNA pattern #2 (Reversibility) — append-only audit row for

  • Changed
    slice52-Q-CHAT-PROJECTS/locale: Projects keys across 29 locales + de/zh JSON hotfix

    Paired locale fan-out for the /me/projects feature (components landed in

  • Added
    52-Q-voice-realtime-catalog: EnBillingSource.RealtimeVoice + ボイスリアルタイム機能シード + ジョイン

    EnBillingSource.RealtimeVoice + ボイスリアルタイム機能シード + ジョイン

  • Added
    slice52-Q-HUMANE-ERRORS: humane error surfaces (honest-UX DNA #1 Şeffaflık)

    Backend exception → frontend humane message + retry hint + status banner.

  • Fixed
    slice52-Q-CHAT-CANVAS: dedup ChatSummaries collection + add Volo.Abp.Authorization using

    Consolidator landed both 52-Q-CHAT-CONTEXT-BUILDER's ChatSummaries

  • Added
    52-Q-voice-realtime-locale: 25件のボイスモードキーを28の兄弟ロケールにファンアウト

    en.json に追加されたリアルタイム音声モード UI キーのミラー

  • Changed
    slice52-Q-USER-SENTIMENT-LOCALE: Privacy Policy Section 11 + UX dashboard keys in ar, hi, zh-Hans, zh-Hant, ja (5 locales)

    Native translations of the 40-key User Sentiment / Privacy Policy v3 Section 11 block (legal text per GDPR Art.

  • Added
    slice52-Q-CHAT-PROJECTS: Suite-managed file edits (Permissions+MongoDB+ChatPipeline)

    Suite-managed file edits (Permissions+MongoDB+ChatPipeline)

  • Changed
    slice52-Q-consolidate-2: land additional parallel-chip WIP

    land additional parallel-chip WIP

  • Changed
    slice52-Q-consolidate: land stashed parallel-chip WIP onto main

    Consolidates the working-tree state stashed during the

  • Added
    slice52-Q-CHAT-SUMMARY-SERVICE: rolling chat summary service + ChatSummary entity

    Adds IChatSummarizationService + concrete impl that compresses the dropped

  • Added
    slice52-Q-TOOL-FILE-SEARCH: file_search chat tool + chat-attachment RAG ingest pipeline

    Third of the four P0 chat tools — ChatGPT File Search parity.

  • Added
    slice52-Q-CHAT-SUMMARY-UX: rolling summary pill + ChatSummary endpoint

    Why: backend tier-budget context builder (slice52-Q-CHAT-CONTEXT-BUILDER)

  • Added
    slice52-Q-TOOL-IMAGE-EDIT: image_edit P1 chat tool + URL→MediaAsset helper

    Adds ImageEditTool (mirror of ImageGenerateTool) so the LLM can edit user-

  • Changed
    slice52-Q-ME-WEBSEARCH/locale: propagate Agent::WebSearch:* keys to 28 siblings

    Fans out the 46 Agent WebSearch + Menu:WebSearch + Permission:WebSearch.*

  • Added
    slice52-Q-TOOL-TTS-STT: P1 chat tools tts_generate + stt_transcribe

    Why: P1 voice tools listed in feedback_chat_context_management.md — text

  • Added
    slice52-Q-LEARNING-LOOP: UserComplaintLink + nightly fix matcher (pattern #5 honest-UX DNA)

    Closes the user-complaint → shipped-fix loop automatically so we never make

  • Added
    slice52-Q-EPISTEMIC-HONESTY: chip + system prompt for Honest-UX DNA pattern #4

    Backend:

  • Added
    slice52-Q-ME-WEBSEARCH/shared-enum: add missing EnWebSearchKind enum

    The /me/web-search slice landed almost entirely via Serkan's recent

  • Added
    slice52-Q-CODE-INTERPRETER/runner: Pyodide host orchestrator + Web Worker

    Post-streaming runner that drives Pyodide in a Web Worker and feeds

  • Added
    slice52-Q-CODE-INTERPRETER/upload: chat-attachment MIME whitelist + EN keys

    MyMediaUploadAppService.PurposeChatAttachment validation extended to

  • Added
    slice52-Q-CODE-INTERPRETER/bridge: pending + completion endpoints + flat-fee billing

    Two-endpoint AppService that bridges the server-side code_interpreter

  • Added
    slice52-Q-CODE-INTERPRETER/backend: code_interpreter tool + scoped tool context

    Ship the ADR-043 Pyodide v1 backend slice — the LLM-facing IAgentTool

  • Added
    slice52-Q-CHAT-VIRTUALIZATION: cursor-paginated chat history + render-window pattern

    Why: long chats (100+ turns) bloat browser memory + slow ngx-markdown re-renders

  • Added
    slice52-Q-TOOL-WORKFLOW-RUN/backend: add workflow_run chat tool (list/describe/run modes)

    Fourth of 4 P0 chat tools per feedback_chat_context_management.md roadmap and

  • Changed
    slice52-Q-CODE-INTERPRETER/adr: ADR-043 Pyodide v1 sandbox + 5MB attachment scope

    Phase 1 design spike for code_interpreter chat tool (second P0 tool after

  • Added
    slice52-Q-PUBLIC-CHAT-TURNSTILE/frontend: mount Cloudflare widget + ship token in stream POST

    Public-chat launcher now boots a Cloudflare Turnstile widget at view

  • Changed
    slice52-Q-PUBLIC-CHAT-TURNSTILE/locale: Public:Chat:Error:BotChallenge EN + TR master

    Locale key for the new Cloudflare Turnstile rejection banner shipped

  • Added
    slice52-Q-PUBLIC-CHAT-TURNSTILE/backend: Cloudflare Turnstile bot-protection for anon homepage chat

    The [AllowAnonymous] PublicChatAppService now verifies a Cloudflare

  • Added
    slice52-Q-PUBLIC-CHAT-STREAMING: SSE streaming variant for anon homepage chat

    Marketing landing's anon chat now streams the assistant reply

  • Changed
    slice52-Q-WEBSEARCH-PROVIDER/appsettings: expose DeepResearch + FetchUrl cost knobs + ExtractCacheMinutes

    Surface the three new WebSearchOptions knobs in appsettings.json so the

  • Added
    slice52-Q-WEBSEARCH-PROVIDER/tools: dual-tier chat web-search — web_search / deep_research / fetch_url

    Three tools wired to the canonical authoring-tier IWebSearchProviderFactory.

  • Added
    slice52-Q-WEBSEARCH-PROVIDER/seed: tavily provider + tavily-search model + 2 capabilities + 3 pricing meters

    Catalog seed for the dual-tier chat web-search tooling.

  • Added
    slice52-Q-WEBSEARCH-PROVIDER/tavily-client: IWebSearchProvider.ExtractAsync + Tavily /extract + raw_content

    Adds the second half of the provider contract needed by the dual-tier chat

  • Fixed
    slice52-Q-PUBLIC-CHAT-HARDEN: tighten output cap + rate caps + prompt length for anon vitrin

    User report 2026-05-27 — public chat marketing surface 60s+ bekleyip

  • Fixed
    slice52-Q-PUBLIC-CHAT-MD: markdown render + bigger output cap for anon homepage reply

    User: "ana sayfada neden markdown renderer yok, direk markdown olarak

  • Added
    slice52-Q-DEEP-RESEARCH-EXEC: wire DeepResearchExecutor to Tavily advanced search

    Bridges the gap between DeepResearchSession CRUD (sat at default state forever)

  • Changed
    slice52-Q-PUBLIC-CHAT-FALLBACK/locale-fanout: 3 Error keys × 27 siblings

    Propagate Public:Chat:Error:NoModel / CallFailed / EmptyPrompt

  • Fixed
    slice52-Q-PARTNER-CTA-URL: pricing-grid Partner CTA drops legacy /company/ prefix

    User report 2026-05-27: pricing sayfasındaki Partner card'ın

  • Fixed
    slice52-Q-PUBLIC-CHAT-FALLBACK: tiered routing fallback + actionable error codes for anon homepage chat

    User: "burayı geçen gün yaptık sağlamdı, yine bozuldu.

  • Added
    slice52-Q-WEBSEARCH-UNIFY: bridge chat web_search to authoring provider registry

    Slice 452-fu already shipped first-class Brave + Tavily IWebSearchProvider

  • Added
    slice52-Q-WEBSEARCH-PROVIDER: wire Brave + Tavily as real web-search tool backend

    Replaces the stub web_search tool with a config-selectable provider:

  • Fixed
    slice52-Q-STREAM-PERSIST: persist user + partial assistant turn on stream cancel / provider error

    User: "deepseek response geldi ekran 2'de, sayfayı refresh edince

  • Changed
    slice52-Q-TOOL-ONLY-TURN/locale-fanout: ToolOnlyTurn 27 sibling locales

    Native-quality translations for "Action completed.

  • Fixed
    slice52-Q-TOOL-ONLY-TURN: friendly localized rendering for tool-only assistant turns

    User şikayet: "gpt 4o mini response boş geldi.

  • Fixed
    slice52-Q-CHAT-ORDER: defensive chronological sort on chat history hydration

    User: "her sayfa refresh ettiğimde chatlerin yerleri ve sıraları

  • Fixed
    slice52-Q-UTC-PARSE-fu: chat history load also parses UTC defensively

    Önceki commit (e2a74db8) sadece relativeTime/fullTimestamp helper'ını

  • Fixed
    slice52-Q-UTC-PARSE: defensive UTC parse on chat timestamps — refresh no longer shifts "just now" → "3h ago"

    Sprint 50-S backend fix made the wire format emit `Z`-suffixed ISO

  • Changed
    slice52-Q-PROVIDER-NOTES: three provider API truth-tables + 2 latent regression fixes

    User direktif: "arkada iş kalmasın".

  • Fixed
    slice52-Q-ANTHROPIC-1M-BETA-REVERT: drop retired beta header — was the actual cause of Opus 4.7 / Sonnet 4.6 400s

    Önceki "fix" (a56449db) Opus 4.7 / Sonnet 4.6 için preemptive olarak

  • Fixed
    slice52-Q-CHAT-UX4: error bubble icon + text inline alignment

    Pre-fix rendered the warning triangle as an inline <i> followed by

  • Fixed
    slice52-Q-AUTO-DEFAULT: "Auto" dropdown pick → resolve to deepseek-v4-flash, not null

    Önceki rev (a56449db) sadece ilk-mount fallback'i çözüyordu —

  • Fixed
    slice52-Q-IMG-PRICING-GUARD: three-layer defense against image-gen overcharge ($22.50/image gpt-image-2)

    Third regression of the same bug class in three sessions.

  • Fixed
    slice52-Q-CHAT-MODEL-QUARTET: default picker / focus restore / single error / opus-4.7 + flash-lite

    User reported four issues in a single round of chat smoke-testing:

  • Fixed
    slice52-Q-FINANCIAL-AUDIT-3: UserBillingDailyBackfill now overwrites existing rows — true idempotency

    Atladığım şey buydu.

  • Fixed
    slice52-Q-HOME-SPEND-CANONICAL: aggregate BillingRecord directly for /home Monthly Spend, not derived summary

    Three iterations of the same bug (Monthly Spend $0 → $0.33 → $0.15) had

  • Fixed
    slice52-Q-MIME-PARAM-FIX: defensive MediaTypeHeaderValue.Parse for caller-supplied Content-Type with codec parameters

    Mic-capture via MediaRecorder (chat composer Whisper STT, Sprint 52-O)

  • Added
    slice52-Q-MODEL-SEED-RETIRE-AUDIT/openai-deepseek: retire gpt-4.1 family + DeepSeek aliases (force-cut from active rotation per user directive, 2026-05-27)

    OpenAI gpt-4.1 family (Deprecated → Retired, isActive:false, version 3→4):

  • Added
    slice52-Q-MODEL-SEED-RETIRE-AUDIT/pricing: EffectiveTo dates for retired pricing rows

    Close 10 pricing rows for the 5 retired models:

  • Added
    slice52-Q-MODEL-SEED-RETIRE-AUDIT/anthropic-google: retire claude-3.5 + gemini-2.0/1.5 SKUs

    Anthropic (DeprecatedAt 2025-09-29, RetiresAt 2026-05-01):

  • Fixed
    slice52-Q-PICKER-DEPRECATED-v2: hide Deprecated + Retired + realtime + computer-use from chat model picker

    User reported a wide swath of dropdown rows error on send:

  • Fixed
    slice52-O-REASONING-UX: legible thinking-pane indicator while gpt-5 reasons server-side

    User report: "reason yapar gibi baya bekliyor ama hareket yok, reason

  • Fixed
    slice52-Q-FINANCIAL-AUDIT-2: kill double-count of chat spend in UserBillingDailySummary

    Audit continuation after slice52-Q-FINANCIAL-AUDIT-1.

  • Changed
    slice52-Q-USER-BILLING-DAILY/handoff: log progress + defer admin UI to Suite session

    - PROGRESS.md: Sprint 52-Q-USER-BILLING-DAILY entry with all 4 commits,

  • Fixed
    slice52-Q-FINANCIAL-AUDIT-1: UserDailySummary consumer subscribes torun.billing.recorded.v1 — closes universal-spend leak

    User report: "monthly spend 0.33 olamaz, burada bir hata var, muhtemelen

  • Added
    slice52-Q-USER-BILLING-DAILY/backfill: seed UserBillingDailySummary from BillingRecord history

    - New IDataSeedContributor: UserBillingDailyBackfillDataSeedContributor

  • Added
    slice52-Q-USER-BILLING-DAILY/consumer: UserBillingDailySummaryConsumer micro-batch projection

    - New IInboxConsumer: GroupId "torun-user-billing-daily-summary"

  • Added
    slice52-Q-USER-BILLING-DAILY/entity: UserBillingDailySummary entity + Mongo wiring + indexes

    - Suite entity JSON: modules/torun.subscription/.suite/entities/UserBillingDailySummary.json

  • Fixed
    slice52-O-HOME-SPEND-V3: swap BillingRecord aggregate for UserDailySummary read

    User: "TelemetryUserDailySummaries tablomuz var gördüğün gibi içide dolu.

  • Fixed
    slice52-O-HOME-SPEND-V2: tenant filter bypass + cache write-back for monthly spend

    User report (continued from slice 52-O-NIGHT-TODO-IMPL/home-spend-fallback):

  • Fixed
    slice52-O-NIGHT-TODO-IMPL/home-spend-fallback: DB fallback for monthly/daily spend when Redis bucket is stale

    User report: "monthly spend her gün sıfırlanıyor — redis recycle ettiğimden,

  • Changed
    slice52-O-NIGHT-TODO-IMPL/progress: activity routes done + remaining TODO inventory

    activity routes done + remaining TODO inventory

  • Added
    slice52-O-NIGHT-TODO-IMPL/activity-routes: wire 4 missing UserActivityKind → router URL mappings

    User feedback: "kod içerisine daha önce yazdığımız TODO lara hiç

  • Changed
    slice52-O-NIGHT-TODO/progress: TODO cleanup audit ledger

    TODO cleanup audit ledger

  • Changed
    slice52-O-NIGHT-TODO: TODO/FIXME comment cleanup — project-wide grep zero

    User directive: "TODO ve benzeri yorumları ara, sonraya bırakılmış iş

  • Changed
    slice52-O-NIGHT-LOCALE/progress: morning report for Serkan — overnight locale + changelog ledger

    morning report for Serkan — overnight locale + changelog ledger

  • Changed
    slice52-O-NIGHT-LOCALE/scripts: preserve overnight locale-fill + translation scripts for reference

    These four ad-hoc scripts drove the overnight locale recovery:

  • Changed
    slice52-O-NIGHT-CHANGELOG: backfill 2 days of sprint commits to PublicChangelogEntry seed

    extract-sprint-changelog.py wrote 364 sprint rows to

  • Changed
    slice52-O-NIGHT-LOCALE/translate: native translations for core user-facing keys (14 locales)

    Followed up the placeholder fill (commit a3834ea4) with native-language

  • Changed
    slice52-O-NIGHT-LOCALE/fill: backfill 1311 missing locale keys with EN placeholder across 28 locales × 17 resources

    Audit found 1311 missing keys spread across 27 sibling locales (en-GB

  • Changed
    slice52-O-CHAT-WHISPER-FALLBACK/locale: ChatTranscript keys across 28 sibling locales

    Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>

  • Changed
    slice52-O-CHAT-LIBRARY/locale: EN master keys for /me/library source chip strip

    Adds the 11 EN-master entries the new SourceContext chip strip

  • Added
    slice52-O-CHAT-LIBRARY/library-ui: SourceContext chip strip in /me/library

    Surfaces the new SourceContext metadata as a user-facing filter so

  • Added
    slice52-O-CHAT-LIBRARY/composer: pre-upload pendingAttachments → Attachments[] + history-replay hydration

    Closes the chat-attachment data-loss bug: previously the composer

  • Added
    slice52-O-CHAT-WHISPER-FALLBACK/frontend: inline transcript caption + collapse on user message turn

    ChatTurn interface gains audioTranscripts[] with an expanded flag.

  • Added
    slice52-O-CHAT-WHISPER-FALLBACK/backend: capability check + Whisper transcript inject pre-call

    Add CapabilityKeys.AudioInput ("audio-input") so the fallback condition is

  • Added
    slice52-O-CHAT-LIBRARY/backend: chat-attachment purpose presign + GetMyLibrary SourceContextFilter

    The chat composer's prior path inlined image attachments as base64 data

  • Fixed
    slice52-O-BILLING-AUDIT/token-drift: costProjection includes conversation history

    Pre-fix, the composer cost badge only sized the draft text via

  • Fixed
    slice52-O-BILLING-AUDIT/gemini-stream: append alt=sse on streamGenerateContent

    `:streamGenerateContent` without `alt=sse` returns a JSON-array transport

  • Fixed
    slice52-O-BILLING-AUDIT/o3-cost: model-level pricing fallback when capability tag drifts

    GetActivePricingAsync now falls back to model-level pricing rows when the

  • Changed
    slice52-O-CHAT-CONTINUE/locale: fan-out Chat:Continue:* keys to 27 sibling locales

    Adds 9 new Chat:Continue:* keys (Button, Tooltip, Loading, Error, MaxReached,

  • Added
    slice52-O-CHAT-CONTINUE/frontend: Continue button + handler + en+tr locale master keys

    Angular proxy: +wasTruncated/continuedFromMessageId/hasContinuation on both DTOs;

  • Added
    slice52-O-OPENAI-REASONING: Responses API path for gpt-5 reasoning panel

    OpenAI Chat Completions silently consumes reasoning tokens for the

  • Added
    slice52-O-CHAT-CONTINUE/backend: finish_reason persist + ContinueAsync endpoint

    PersistAssistantMessageAsync now sets FinishReason/WasTruncated/ContinuedFromMessageId

  • Added
    slice52-O-CHAT-CONTINUE/entity: ChatMessage WasTruncated + FinishReason + ContinuedFromMessageId + HasContinuation fields

    Extend ChatMessage.Extended.cs with 4 new virtual properties (FinishReason,

  • Fixed
    slice52-O-CHAT-BUDGET-BANNER: hide when wallet has balance

    User reported the "Daily free limit reached — Charge wallet" yellow

  • Changed
    slice52-O-CHAT-MIC-WHISPER-locale: mic + Whisper keys across 28 sibling locales

    Propagate the new MediaRecorder + Whisper STT composer keys from en.json to all 28

  • Added
    slice52-O-CHAT-MIC-WHISPER: MediaRecorder + Whisper STT for chat composer mic

    Why: legacy Web Speech path produced transcript-only with no audio artifact

  • Fixed
    slice52-O-CHAT-UX2: default DeepSeek model + dismissable budget banner

    User reported two chat UX papercuts after the chat-footer fix landed:

  • Fixed
    slice52-O-CHAT-FOOTER: reasoning badge overlap + mic timer + Charge wallet 404 trio

    User-reported chat composer trio:

  • Changed
    slice52-O-CHANGELOG-locale: 38-sprint fan-out across 28 sibling locales

    Propagated Changelog:Sprint:<slug>:Title and :Body keys for the 38 new sprints

  • Changed
    slice52-O-VERSION-BUMP: 1.0.0 → 1.1.0-phase1-launch

    Minor bump for the Phase 1 feature wave summarized in the changelog backfill

  • Changed
    slice52-O-CHANGELOG-BACKFILL: absorb 38 new sprints into PublicChangelogEntry seed

    Ran extract-sprint-changelog.py against HEAD.

  • Added
    slice52-O-WORKFLOW-QUALITY: GenerateTextAsync + PreferQuality routing for workflow runners

    - New IChatPipelineAppService.GenerateTextAsync endpoint (creative-writer

  • Added
    slice52-O-LOCALE-FANOUT: WorkflowRuns:CancelRun keys → 27 sibling locales

    Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>

  • Fixed
    slice52-O-BUNDLE-ROUTE/template-literal: escape backticks in My Bundles empty-state HTML comment

    Comment introduced in 57c15021 used backticks around '/marketplace' which

  • Fixed
    slice52-O-LOCALE-SWEEP/workflow-template-keys: backend prefix workaround + missing Birthday Audio/Cinema/ProvidedLyrics/EstimatedCost keys

    **Bug 1 — Card titles render raw `WorkflowTemplate:foo:Title` keys:**

  • Added
    slice52-O-RESUME-APPROVAL: add OutputsJson to WorkflowStepExecution extension

    Per-step output variable snapshot so the resume-aware wave loop can

  • Fixed
    slice52-O-APPROVAL-PAUSE-REMOVE: drop lyrics-approval HumanApproval node from birthday trio

    In-memory wait loop in WorkflowExecutorAppService.RunWaveLoopOnRowAsync (line 1797) is

  • Changed
    slice52-O-LYRICS-APPROVAL-locale: LyricsApproval 26-locale fan-out

    Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>

  • Added
    slice52-O-LYRICS-APPROVAL: preview/approve/edit/regenerate gate between gen-lyrics and gen-music

    Inject HumanApproval (kind=12) node into all three birthday catalog

  • Changed
    slice52-O-CINEMA-locale: BirthdayCinema 26-locale fan-out

    WorkflowTemplate:BirthdayCinema:Title + :Description propagated to all 26

  • Added
    slice52-O-CINEMA: VideoCapabilityRunner (Sora-2 sync poll) + birthday-cinema template (premium tier ~$12)

    User wanted the third leg of the birthday trio: "isteyen kullanıcı video

  • Added
    slice52-O-LYRICS-OVERRIDE: optional user-provided lyrics short-circuits AI gen-lyrics step

    Birthday workflows expose a textarea field 'provided_lyrics'; when filled

  • Changed
    slice52-O-TEMPLATE-TRIO-A-locale: BirthdayAudio + EstimatedCost 26-locale fan-out

    Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>

  • Changed
    slice52-O-UPLOAD-GUARD-locale: WorkflowWizard:WaitingForUploads 26-locale fan-out

    Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>

  • Fixed
    slice52-O-UPLOAD-GUARD: wizard Run/Preview buttons gated on hasActiveUploads() so character photo race no longer ships filenames as Guids

    THE photo-binding bug.

  • Fixed
    slice52-O-MEDIACOMPOSITE-LIBRARY: register composite mp4 as MediaAsset at merge time so it lands in /me/library even if QC escalates or persist cancels

    User observation: "library bakınca sadece image görüyroum ne ses var ne

  • Fixed
    slice52-O-FFMPEG-SLIDESHOW/D19: build proper concat filter + drop -shortest for image-only slideshows so merge produces a real mp4, not a 46 KB empty container

    User report: merge step "Succeeded" but composite_url_duration_seconds

  • Fixed
    slice52-O-RUN-STATUS-TRUTH/D12: run-detail truthfulness — parent RunStatus computed from worst step status, not just abortReason

    User report: "succeeded yazıyor da bunlar success degil ki hata veriyor

  • Fixed
    slice52-O-BUNNY-AUTH-fu/no-region-prefix: drop regional prefix from Bunny storage URL — 401 cause

    User directive 2026-05-25 — region prefix produced 401 Unauthorized on

  • Fixed
    slice52-O-BUNNY-AUTH/merge-storage-read: route Bunny CDN URLs through Storage API with AccessKey header so merge can actually read its inputs

    Root cause (from Note column added in 0a9e941f):

  • Fixed
    slice52-O-MERGE-FANOUT/multi-url-tracks: split comma-joined sourceVar into per-URL tracks so birthday-song-video merge stops cancelling

    Root cause: ImageCapabilityRunner with n>1 packs all generated URLs as a

  • Added
    slice52-O-MEDIA-PICKER-UNIVERSAL/workflow-wizard: add "From Library" path next to file inputs

    Adds an "Or pick from your library" link/button beneath the workflow-wizard

  • Added
    slice52-O-MEDIA-PICKER-UNIVERSAL/me-audio: wire STT source to two-tab MediaPicker

    Replaces the /me/audio direct file input (audio.component.html line 17 —

  • Added
    slice52-O-MEDIA-PICKER-UNIVERSAL/me-image-mask: swap bespoke mask picker for universal MediaPicker

    Replaces the /me/image Edit-tab mask widget (bespoke library-only modal +

  • Added
    slice52-O-MEDIA-PICKER-UNIVERSAL/me-video: swap PC-only refs for two-tab picker

    Replaces the inline "Drop an image or click to upload" widget for character

  • Added
    slice52-O-MEDIA-PICKER-UNIVERSAL/scaffold: shared MediaPickerComponent with PC + Library tabs

    Universal two-tab picker that replaces PC-only uploads across /me/* surfaces.

  • Fixed
    slice52-O-GOOGLE-VIDEO-CLIENT/veo-3-veo-3-1-async-adapter: register IAiVideoClient for providerKey "google" so Veo-3 + Veo-3.1 stop silent-dropping from /me/video catalog

    Pre-fix VideoPipelineAppService.GetCapabilitiesAsync (commit 5e39d434)

  • Fixed
    slice52-O-REPLICATE-VIDEO-SEED/kling-hunyuan-ltx: seed 3 Replicate video models with pinned SHAs + 2.0x margin pricing

    Pre-fix /me/video catalog query returned only sora-2 + sora-2-pro because no

  • Fixed
    slice52-O-MUSIC-SLIDER-SYNC-i18n/duration-max-hint: add Music:Form:DurationMaxHint to 28 sibling locales (en already present)

    Native translation per locale (prefix only; the numeric seconds cap

  • Fixed
    slice52-O-MUSIC-SLIDER-SYNC/duration-cap-aware-slider: bind /me/music + /me/video duration slider max to the selected model's real ceiling

    Pre-fix the duration slider on /me/music was hardcoded max=120s.

  • Fixed
    slice52-O-VIDEO-CATALOG/dynamic-model-picker: drive /me/video model dropdown from AiModel+AiModelCapability catalog instead of hardcoded sora-2 stub

    Pre-fix VideoPipelineAppService.GetCapabilitiesAsync returned a single

  • Fixed
    slice52-O-MUSIC-DURATION-CAP/per-model-billing-truth: cap requested duration at the model's real ceiling, bill only for delivered seconds

    User generated music with `requestedDuration=120s` against Riffusion

  • Fixed
    slice52-O-RIFFUSION-OBJOUT/replicate-object-output: handle Object-shaped Replicate output (riffusion multi-stream + future schemas)

    User got

  • Fixed
    slice52-O-RIFFUSION-PIN/replicate-version-sha: pin riffusion/riffusion model version SHA so picks past musicgen route cleanly

    User got the UFE

  • Fixed
    slice52-O-REPLICATE-401-fu/actionable-error: distinguish 401 / 402 / 429 / other in Replicate prediction failure UFE

    User got HTTP 401 from Replicate after triggering musicgen and the

  • Added
    slice52-O-MUSIC-MODELS-SEED/replicate-music-trio: seed musicgen-medium + musicgen-large + riffusion via Replicate

    User reported the /me/music model dropdown stayed empty even with

  • Fixed
    slice52-O-MUSIC-ROUTE-fu/models-endpoint-404: correct music model picker URL — /api/byokvault/my-available-models/by-capability

    Console showed:

  • Fixed
    slice52-O-MENU-VISIBILITY-fu/route-guards: drop route-level permissionGuard for /me/video + /me/music

    Carry-forward from 05999c1c.

  • Fixed
    slice52-O-MENU-VISIBILITY/video-music-sidebar: drop requiredPolicy gates from /me/video + /me/music — match Image/Voice/Audio pattern

    User reported video + music menus missing from My Account sidebar even

  • Added
    slice52-O-MUSIC-MENU/locale-fanout: propagate 43 Music keys to 28 sibling locales

    Mirrors fc625886 EN seeding into ar/cs/de/de-DE/en-GB/es/fi/fr/hi/hr/

  • Added
    slice52-O-MUSIC-MENU/angular: /me/music component + sidebar entry + EN locale

    Angular standalone component mirrors /me/voice + /me/image shape:

  • Added
    slice52-O-MUSIC-MENU/backend: MyMusicPipelineAppService for /me/music

    User-facing music generation pipeline mirroring ImagePipeline pattern:

  • Fixed
    slice52-O-VIDEO-MENU-FIX: default-grant VideoPipeline.MyGenerate to user role

    The AuthoringPermissions.VideoPipeline.MyGenerate comment says the

  • Fixed
    slice52-O-MERGE-RESILIENCE/ffmpeg-defensive-trio: track-attributed errors + skip-empty + Bunny CDN retry

    Second-pass merge failure after b9dm94er4 + 21983ef0 still surfacing

  • Added
    slice52-Q-MODEL-ONBOARDING/locale-fanout: propagate 60 ModelOnboarding keys to 28 sibling locales

    Adds the Sprint 52-Q ModelOnboarding admin UI strings (Menu:ModelOnboarding +

  • Added
    slice52-O-MARGIN-AUDIT-LOCALE-FANOUT/cost-markup-i18n: 32 keys × 28 sibling locales for AI cost markup admin page

    Fans out the 32 EN keys added in commit be0190b2 (admin /cost-markup

  • Added
    slice52-O-REAL-COST-AUDIT/locale-fanout: propagate margin-reconciliation labels to 28 locales

    39 MR keys (Menu:Admin:MarginReconciliation, Permission:MarginReconciliation, MarginReconciliation:*) added to every sibling locale under src/ToRun.Domain.Shared/Localization/ToRun/.

  • Added
    slice52-Q-MODEL-ONBOARDING/phase-D-bulk-import-export: JSON snapshot round-trip for providers + models + stubs

    Sprint 52-Q-MODEL-ONBOARDING Phase D — round-trip bulk-import / bulk-export

  • Added
    slice52-Q-MODEL-ONBOARDING/phase-C-admin-ui: /admin/model-onboarding wizard for providers, models, stubs

    Sprint 52-Q-MODEL-ONBOARDING Phase C — host-admin Angular UI at

  • Fixed
    slice52-O-MARGIN-AUDIT/dto-leak-jsonignore: [JsonIgnore] ResolvedModelDto.AppliedMarkupMultiplier

    Guardrail sweep finding from Phase D of the 52-O-MARGIN-AUDIT sprint.

  • Added
    slice52-Q-MODEL-ONBOARDING/phase-B2-generic-rest-client: GenericRestClient (chat path) + RegisterClientStubAsync

    Sprint 52-Q-MODEL-ONBOARDING Phase B.2 — adds the GenericRestClient that

  • Added
    slice52-O-MARGIN-AUDIT/admin-cost-markup-ui: Angular page for runtime markup tweak

    Phase C UI of the 52-O-MARGIN-AUDIT sprint.

  • Added
    slice52-O-REAL-COST-AUDIT/phase-C-pipelines: pipeline AppService plumbing for ops ledger

    Sprint 52-O-REAL-COST-AUDIT phase C — each pipeline AppService that wraps

  • Added
    slice52-Q-MODEL-ONBOARDING/phase-B1-stub-entity: AiProviderClientStub aggregate + Mongo repo

    Sprint 52-Q-MODEL-ONBOARDING Phase B.1 — scaffolds the AiProviderClientStub

  • Added
    slice52-O-MARGIN-AUDIT/admin-cost-markup: host-admin AppService + ISettingProvider bridge

    Phase C of the 52-O-MARGIN-AUDIT sprint.

  • Added
    slice52-Q-MODEL-ONBOARDING/phase-A-onboarding-AppService: host-admin composer for AiProvider/AiModel/Capability/Pricing

    Sprint 52-Q-MODEL-ONBOARDING Phase A — adds AdminModelOnboardingAppService

  • Added
    slice52-O-REAL-COST-AUDIT/phase-B-providers: ProviderUsageSnapshot + 6 client parsers

    Sprint 52-O-REAL-COST-AUDIT phase B — every IAi*Client now stamps a

  • Added
    slice52-O-REAL-COST-AUDIT/phase-A-schema: add 4 ops-only columns to BillingRecord

    Sprint 52-O-REAL-COST-AUDIT phase A — parallel server-side-only ledger so

  • Added
    slice52-O-MARGIN-AUDIT/markup-options: AiCostMarkupOptions + routing snapshot multiplier

    Phase B of the 52-O-MARGIN-AUDIT sprint.

  • Fixed
    slice52-O-MARGIN-AUDIT/seed-bake-margin: 268 AiModelPricing rows bumped to ≥1.5x/2.0x real cost

    Phase A of the 52-O-MARGIN-AUDIT sprint.

  • Fixed
    slice52-P-SHARE-fu/slug-partial-index-operator: swap \$ne for \$type in unq_MediaAsset_Slug partial filter — DbMigrator unblocked

    Error from DbMigrator on every restart:

  • Fixed
    slice52-O-MARGIN-fu/runner-fallback-sweep: bump Image / ImageEdit / TTS fallback rates +50% per margin-baked-in rule

    Carry-forward from b4ab9daf music_v1 seed bump + feedback_pricing_

  • Fixed
    slice52-O-MARGIN/music-v1-bake-margin: bump Eleven Music v1 seed from \$0.002 to \$0.0035 per-second (+110% margin) per user directive

    User feedback after 21983ef0 landed: looked at ElevenLabs analytics

  • Fixed
    slice52-P-SHARE/locale-fanout: 37 keys × 28 sibling locales for shared-media + library-share dialog

    - ToRun resource: 36 keys (Library:Share:* dialog + SharedMedia:* public page)

  • Added
    slice52-O-LIBRARY-ARTIFACT/workflow-output-to-library: ArtifactSave registers MediaAsset row → /me/library surfaces workflow outputs

    Pre-fix: workflow ArtifactSave nodes uploaded blobs to Bunny and stuffed

  • Fixed
    slice51-M-fu2/legal-v2-natives-full: close the last 2 placeholder locales — ar v2.0 + vi native

    Sprint 51-M-fu2 completion pass.

  • Fixed
    slice52-O-IMG-SRC/workflow-edit-image: route uploaded photos through image-edit pipeline

    Birthday-song-video template's `photos` multiphoto field reached Bunny CDN

  • Fixed
    slice51-M-fu2/legal-v2-natives: 23 native v2.0 legal translations replace placeholders

    Drops native v2.0 About/Terms/Privacy/Contact for 10 brand-new locales

  • Fixed
    slice52-A-M5/enhance-prompt-outbox: publish chat-message-recorded.v1 from EnhancePromptAsync so UsageDailySummary counts prompt-enhance token usage

    EnhancePromptAsync wrote a BillingRecord and settled the budget but never

  • Fixed
    slice52-O-PRICING-fu/image-gen-overcharge: kill the 500x gpt-image-1-mini per-image overcharge

    Root cause (two layers, one bug):

  • Fixed
    slice52-A-H4/load-history-graph-lookup: collapse the N+1 ParentMessageId walk into a single $graphLookup aggregation

    LoadHistoryAsync previously walked the leaf → ancestor chain by issuing one

  • Changed
    52-O-NIGHT/progress-ledger: 夜間52-Oスイープのエントリを PROGRESS.md に追記

    CLAUDE.md ルール10に従い。

  • Changed
    52-O-NIGHT/locale-validation-report: 6エージェント翻訳ファンアウト後のリソース × ロケール別パリティレポート

    27件の兄弟翻訳バッチがすべてマージされ、BOMストリップパスが完了した後の `python platform-plan/scripts/_validate-29-locales.py` の出力:

  • Changed
    52-O-NIGHT/translator-batches: 25件のネイティブ翻訳ロケールバッチが完了 — 52ファイルで合計 ~7,800+ キー

    6件の並列 Sonnet 翻訳エージェントによるバッチ(以前のターンからリポジトリにチェックイン済み+フラッシュ済みの最終グループ):

  • Added
    slice52-O-NIGHT-fu/image-edit-progress-bar: bring Edit tab's staged-progress UI up to Generate-tab parity

    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…

  • Fixed
    slice52-O-NIGHT-fu/workflow-runner-principal-scope: restore triggering user's principal at wave-loop entry so background workers don't trip AbpAuthorizationException on every [Authorize]-gated capa...

    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…

  • Fixed
    slice52-O-12-locale-2/workflow-select-option-remaining-19-locales: populate native-language translations for the 19 sibling locales that shipped as empty stubs in 0da3c077

    Completes the locale-fanout begun in 0da3c077 (Sprint 52-O-12-locale).

  • Changed
    52-A/audit: チャットパイプライン + InAppAssistant コードレビュー所見 — 4件High + 8件Medium + 5件Low

    ChatPipelineAppService + InAppAssistant + プロバイダークライアント + ProviderFallbackChain に対する読み取り専用の監査パス。

  • Changed
    slice52-O-12-locale-2: partial native-language translations for 7 sibling locales (nl, sv, fi, is, en-GB, ru, pl-PL)

    7 of 19 stub locales populated; 12 remaining (cs, sk, hu, ro-RO, hr, sl, ko, zh-Hans, zh-Hant, hi, ar, vi).

  • Changed
    slice52-O-18-fu/lifecycle-legacy-available-28-locales: propagate "Legacy Available" enum translation to the 28 sibling locales

    Sprint 52-O-18 added ModelLifecycleStatus.LegacyAvailable (used to mark Claude 4.5/4.1/Opus 4.6/Sonnet 4.5 etc.

  • Changed
    slice52-O-19-G/sprint-wrap: point SunoMusicClient stub's "use the live music provider instead" guidance at ReplicateGenericClient ('replicate') rather than the deprecated MusicgenMusicClient ('musi...

    Sprint 52-O-19 (provider runtime hardening) complete — 7 commits land:

  • Added
    slice52-O-19-F/credential-normalization: close the per-model ProviderKey trap by adding a providerKey → canonical-providerKey normalization map to CredentialResolver.GetApiKeyAsync — exact-match lo...

    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…

  • Added
    slice52-O-19-E/resilience-circuit-breaker: introduce per-(providerKey, capabilityKey) circuit breaker + intra-provider 429 backoff + chain length cap + 4xx-bad-shape carve-out so a thrashing upstre...

    New IProviderCircuitBreaker (Application.Contracts/AiClient/Resilience/) + default ProviderCircuitBreaker impl backed by IDistributedCache<CircuitState,string> keyed by torun:byok:circuit:{providerKey}:{capabilityKey} wi…

  • Changed
    slice52-O-18-rollout: integrate 25-provider AI catalog seed refresh — 8 commits covering AiProvider/CapabilityKeys/EnPricingUnit/EnProviderTier/ModelLifecycleStatus expansions + ~60 new 2026 models...

    # Conflicts:

  • Added
    slice52-O-19-D/elevenlabs-client: introduce ElevenLabsClient — single adapter that covers TTS (eleven_multilingual_v2/eleven_flash_v2_5/eleven_v3), text-to-music (music_v1 GA endpoint), and Scribe...

    ProviderKey="elevenlabs".

  • Added
    slice52-O-19-C/replicate-generic-client: introduce ReplicateGenericClient — single adapter that serves every Replicate-hosted modality (image, video, music, TTS) through the uniform /v1/predictions...

    ProviderKey=\"replicate\".

  • Added
    slice52-O-18-rollout/payload-grammar-2026: seed PayloadGrammarJson on the 2026 image / video / audio / 3D capability rows so resolver picks DB row over static fallback

    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…

  • Added
    slice52-O-18-rollout/pricing-2026-refresh: seed pricing for the ~60 new 2026 models so AiModelPricing reflects the May 2026 research roster

    Adds ~60 new pricing rows in the 520180XX-...

  • Added
    slice52-O-19-B/wire-protocol-resolver: introduce IWireProtocolResolver + cache-resilient default impl that maps an AiProvider.ProviderKey → wire-level metadata (Protocol enum, BaseUrl, IsActive/IsD...

    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…

  • Added
    slice52-O-18-rollout/capability-joins: wire the ~60 new 2026 models to their capability sets + bind the new capability anchors to existing flagships

    SeedSlice52O18Async() runs at the end of SeedAsync regardless of count gate (idempotent EnsureCapabilityRowAsync calls, deterministic XOR-based GUIDs so reruns are no-ops).

  • Added
    slice52-O-18-rollout/aimodels-2026-refresh: patch lifecycle statuses + add ~60 new flagship models so the catalog reflects the May 2026 25-provider research roster

    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-…

  • Added
    slice52-O-19-A/aiprovider-wire-protocol-enum: introduce EnWireProtocol (12 values: OpenAiCompat | AnthropicNative | GeminiNative | Replicate | ElevenLabs | StabilityNative | BedrockConverse | Bedro...

    Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>

  • Added
    slice52-O-19/aiprovider-wire-protocol-enum: tag each AiProvider with its wire-level HTTP family so the adapter factory resolves the right IAi*Client from a DB row instead of a hand-rolled per-provi...

    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…

  • Added
    slice52-O-16-a/workflow-async-queue: convert workflow execution from synchronous HTTP to queued + worker-processed so a multi-minute DAG no longer blocks the request

    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…

  • Added
    slice52-O-18-rollout/lifecycle-legacy-available: add LegacyAvailable to ModelLifecycleStatus so still-callable-but-not-recommended models can be marked correctly

    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.

  • Added
    slice52-O-18-rollout/pricing-tier-enums: add PerCitationToken/PerReasoningToken/PerRun units + Priority/OffPeak/SelfHost tiers for the May 2026 catalog

    EnPricingUnit grows 12 → 15 to model 2026 billing meters the legacy enum couldn't represent.

  • Added
    slice52-O-18-rollout/capability-keys-36: expand CapabilityKeys + Capabilities seed to cover the 22 new 2026 capabilities surfaced by the May research roster

    The 2026 model generation introduced capabilities that the old 18-key vocabulary couldn't address: Claude's adaptive vs.

  • Added
    slice52-O-18-rollout/aiproviders-25: re-add stability + add fireworks/deepinfra so the catalog reflects the May 2026 25-provider research roster

    23 → 25 providers (stability re-introduced after slice 4xx removal, two OSS-serving newcomers fireworks + deepinfra added).

  • Added
    slice52-O-17-fu/openai-image-grammar-admin-form: expose PayloadGrammarJson (and the previously hidden InputBoundsJson) on the AiModelCapability create/edit modal — textarea + "Validate JSON" button...

    Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>

  • Added
    slice52-O-17-fu/openai-image-grammar-seed: seed PayloadGrammarJson on the image-generation join rows for dall-e-3 and gpt-image-1 — mirrors the existing static OpenAiImageModelGrammar entries so fr...

    Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>

  • Changed
    slice52-O-17/openai-image-grammar-db-resolver: migrate the OpenAI image-model payload grammar (sizes, quality vocab, accept/reject lists) from the static OpenAiImageModelGrammar.ByPrefix dispatch o...

    Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>

  • Changed
    slice52-O-15-fu/openai-image-grammar-registry: replace inline model-quirk branching with a data-driven OpenAiImageModelGrammar table — new models = one dictionary row, no client code touched

    Pre-52-O-15-fu the OpenAiImageClient hand-coded every model-specific quirk inline.

  • Added
    slice52-O-14-fu/budget-preview-wizard-modal: wire pre-flight budget preview + LeptonX confirm modal in the workflow wizard so users consent before the daily-cap-closed wallet charge

    Backend (fu1): new POST /api/subscription/budget-preview/preview wraps IBudgetGuard.CheckAsync read-only.

  • Fixed
    slice52-O-15/openai-image-size-snap: snap arbitrary WxH to the closest model-supported preset by aspect ratio — workflow 1280x720 no longer hits HTTP 400

    OpenAI image API rejects unknown sizes outright with HTTP 400 + "Invalid size 'WxH'.

  • Fixed
    slice52-O-12-locale/workflow-select-option-28-locales: seed native-language translations across the platform's 28 sibling locales

    WorkflowSelectOptionsDataSeedContributor now does an idempotent per-(option, locale)

  • Added
    slice52-O-14/budget-banner-wallet-after-daily-cap: emit Budget:UsingWalletAfterDailyCap so chat banner warns user the free-tier daily slot closed + wallet is funding the call

    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…

  • Fixed
    slice52-O-13/budget-daily-cap-wallet-bypass: daily cap gates bucket path only — wallet credit is paid spend, never throttled by cap

    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.

  • Added
    slice52-O-12d/workflow-select-option-admin: host-admin CRUD UI for the workflow input-form catalog (add categories without code deploy)

    Sprint 52-O-12d completes the catalog story started by 52-O-12a (entity)

  • Fixed
    slice52-O-12c/workflow-template-spec-lookup-backfill: align backend seeded templates with the new spec lookup/multiSelect syntax

    Hygiene-only follow-up to 52-O-12a/b.

  • Fixed
    slice52-O-12-translations-stub/build-break: add empty WorkflowSelectOptionTranslations.Map so contributor compiles

    User added a per-locale enrichment block to

  • Fixed
    slice52-O-12-di/workflow-select-option-localization-aggregate-root: change to FullAuditedAggregateRoot so ABP auto-registers IRepository

    Sprint 52-O-12a follow-up — DI bootstrap fail

  • Added
    slice52-O-12b/workflow-wizard-lookup-render: wizard fetches catalog options via lookup + Language category seed + 7 template inputs migrated

    Phase B (Angular wizard) for the 52-O-12a data-driven dropdowns.

  • Added
    slice52-O-12a/workflow-select-options-backend: catalog entity + ~430-option English seed + spec lookup/multi-select fields

    Phase 1 backend stack for data-driven workflow wizard dropdowns.

  • Fixed
    slice52-O-10/cache-manager-abp-key-wrap: substring SCAN + drop cache: gate so admin UI surfaces every category + Browse finds keys

    Backend bug — Cache Manager shows 3 categories of ~10+, every Browse empty

  • Fixed
    slice52-O-9/bunny-stream-library-message: rewrite missing-config error as admin-actionable copy

    UX bug — cryptic exception copy on /media/video-stream

  • Fixed
    slice52-O-8/wallet-recent-tx-empty: drop redundant IsActive predicate + add observability — recent transactions list now surfaces history

    Backend bug — empty Recent transactions list with non-zero balance

  • Fixed
    slice52-O-3/workflow-editor-theme-tokens: drop hardcoded #fff / hex / fixed rgba in favour of Bootstrap 5.3 theme tokens

    UI bug — multi-theme breakage

  • Fixed
    slice52-O-2/workflow-editor-i18n-en: merge 134 missing Workflow* keys into ToRun resource

    Backend bug — entire workflow editor surface ships raw keys

  • Fixed
    slice52-O-1/workflow-spec-polymorphic-default: accept number/bool tokens on string Default + map int/float legacy types

    Backend bug — every workflow template run failed

  • Fixed
    slice52-M/title-gen-reasoning-effort: gate reasoning_effort field on isReasoningOrGpt5 — close 8th regression

    Exception screenshot from Serkan (2026-05-23):

  • Changed
    slice52-L/provider-quirks: formalise OpenAI-compat subclass extension contract — every provider owns its own quirks

    Serkan's motto (2026-05-23): "biz 25 farklı AI provider destekliyoruz...

  • Fixed
    slice52-K/title-gen-max-tokens: split max_completion_tokens/max_tokens by client class — title-gen finally lands on DeepSeek

    THE ACTUAL ROOT CAUSE of the seven "title-gen yine bozdun" reports —

  • Fixed
    slice52-J/title-gen-budget: bump title-gen MaxOutputTokens 1024→4096 — close 7th regression on reasoning-only deployments

    52-I excluded DeepSeek V4 from cheap-model picks, but on a deployment

  • Fixed
    slice52-I/title-gen-deepseek-v4: extend reasoning-class filter to deepseek-v4-pro/flash — close 6th title-gen regression

    50-LLL-2 added an ExcludeReasoningModels filter so the cost-saving

  • Fixed
    slice52-D-7-fu/audit-chain-named-args: named-arg call site for ExecuteServerToolsAsync to clear stale Roslyn binding cache

    User reported VS Error List showing CS1501 "No overload for method

  • Fixed
    slice52-D-7/audit-chain: hash-chained AgentAuditEntry per server-tool invocation

    F15 (root cause: AgentAuditEntry table unused for the bubble's

  • Fixed
    slice52-D-6/turn-svc-correctness: real daily-turn cap + anon graceful degrade + localized approval fallback + token-budget history truncate

    Four backend regressions in InAppAssistantTurnAppService surfaced

  • Fixed
    slice52-C-6/chat-reasoning-indicator: surface reasoning-class model selection in the composer

    Audit #14 — confirm Sprint 51-A's reasoning opt-in path is per-request,

  • Fixed
    slice52-F/console-noise-2: suppress NG0505 dev-only hydration warning + bump SignalR server timeout 30s→60s

    Two more console warnings flagged in /me/chat after 52-E:

  • Fixed
    slice52-C-5/chat-composer-polish: persisted model+tone + real-rate cost projection + locale-aware voice + SSE assert

    Bundles four small chat-pipeline polish fixes from the audit (#10, #11,

  • Fixed
    slice52-D-5/sse-controller-recovery: guard SSE recovery write against double-fault swallowing original exception

    F10 (root cause: bare WriteSseEventAsync in the controller's outer

  • Fixed
    slice52-D-4/bubble-ux-a11y: pretty-print approval args + USD currency-code pill + dialog a11y

    Three UX / a11y polish items from the sprint 52-D code-review pass.

  • Fixed
    slice52-D-3/bubble-dom-guards: broaden modal click-guard + skip bubble inputs in page-context

    Two DOM-side hygiene fixes from the sprint 52-D code-review pass:

  • Fixed
    slice52-D-2/bubble-races: serialise session start + close-cleanup dropdown bookkeeping

    Three concurrency / state-coherence regressions in the bubble component

  • Fixed
    slice52-D-1/bubble-sse-resilience: token refresh + typed 401 banner + parseSseFrame robustness

    Three SSE-stream regressions in the InAppAssistant bubble shipped with

  • Fixed
    slice52-C-4/chat-i18n: extract hardcoded UI strings to Agent locale keys

    Three chat-pipeline surfaces were emitting hardcoded strings in violation

  • Fixed
    slice52-E/console-noise: suppress ABP localization separator warnings at bootstrap

    Serkan flagged ~148 identical "The localization source separator (::)

  • Fixed
    slice52-C-3/chat-backend: real fallback provider lookup + title-gen SourceEntityId + LoadHistory N+1 doc

    C5: ResolveFallbackProviderKey returned the literal string "google"

  • Fixed
    slice52-C-2/chat-onpush: switch chat-pipeline component to OnPush change detection

    Every state write in chat-pipeline.component.ts goes through a Signal

  • Fixed
    slice52-C-1/chat-lifecycle-leaks: plug route + history subscribe leaks + harden streamTurn re-entry

    Three lifecycle / concurrency defects in the chat-pipeline component, all

  • Fixed
    slice52-B/chat-bottom-gap: tighten chat shell chrome budget + switch vh→dvh

    Serkan flagged a visible dead band between the composer card and the

  • Fixed
    slice51-Z/changelog-manifest: sync embedded DbMigrator manifest with extract script output

    ChangelogBackfillDataSeedContributor reads from the embedded resource

  • Fixed
    slice51-X/contact-form: new ContactSubmission entity + sweep all public email exposure

    > "bu contact formunda bütün maillerimizi açık açık yazdık spammerlara mail

  • Fixed
    slice51-V-fu/i18n-pricing-v2: propagate Subscription pricing copy across 28 SupportedLanguages

    Follow-up to Sprint 51-V (commit 373d84d9) which rewrote en.json only.

  • Fixed
    slice51-W/persona-seed: retire demo personas entirely — kill ghost-click on /p/echo

    Smoke at 2026-05-22 showed `/personas` listing "Echo the Storyteller"

  • Fixed
    slice51-V/pricing-alignment: features render + price-row alignment + 51-R/51-P-compliant copy

    Three compounding bugs from 51-S → 51-U all visible in the same screenshot:

  • Fixed
    slice51-U/pricing-catalog: rebuild /pricing 1:1 against canonical LeptonX pricing.html

    51-S / 51-T drifted from the catalog-first vocabulary and shipped a

  • Fixed
    slice51-T/pricing-fix: entity-driven contact-sales + revert to 4-col grid + Partner strip

    Cleanup of regressions introduced by 51-S.

  • Fixed
    slice51-S-fu/i18n-pricing-plan-custom: propagate Pricing:Plan:Custom across 28 SupportedLanguages

    Sprint 51-S (28e76a7d) shipped lib-pricing-grid with a contact-sales price cell that

  • Fixed
    slice51-S/pricing-unification: single <lib-pricing-grid> for /pricing + /me/subscription/upgrade + Web.Public

    ONE pricing surface for all 6 plans (Free / Starter / Pro / Business /

  • Fixed
    slice51-R/plan-descriptions: rewrite SubscriptionPlan descriptions — value-first copy, no token counts, no share %, no specific limits

    User mandate (2026-05-22): "Bu description'ları biraz zenginleştir.

  • Fixed
    slice51-R/external-links: target=_blank + rel=noopener noreferrer on every off-origin anchor

    User mandate (2026-05-22): public surfaces leaked the visitor to a new

  • Fixed
    slice51-Q/pricing-render-from-dto: mirror authed /me/subscription/upgrade pattern — render plan.title + plan.audience directly, drop the broken locale-key indirection

    User report (2026-05-22): "Login durumdayken pricing geliyor, public

  • Fixed
    slice51-P/pricing-trial-removed: kill the trial vector + fix planKey case mismatch on title localisation

    Two user-flagged issues on the same screenshot (2026-05-22, anon

  • Fixed
    slice51-O/pricing-public: public /pricing now actually shows plan cards (URL action suffix + BillingCycle case match)

    User report (2026-05-22): "Login durumdayken pricing geliyor ama public

  • Fixed
    slice51-N-fu/languages-reconcile: custom seed contributor reconciles 20→29 Languages on every DbMigrator run

    User report after 51-N landed: "DbMigrator çalıştırdım, proje yeniden

  • Fixed
    slice51-N/abp-languages-29: expand AbpLocalizationOptions.Languages 20→29 to match canonical SupportedLanguages

    User report (2026-05-22): "ABP bunu hala 20 dil görüyor ve dilleri açtığımızda 20 dil çıkıyor.

  • Fixed
    slice51-M-fu1/legal-29locales: expand legal-doc matrix to all 29 SupportedLanguages with localized v2.0-pending banners

    User correction (2026-05-22): "bizim platformumuz 29 dilde." Legal seeds

  • Fixed
    slice51-M/legal-v2: comprehensive About/Terms/Privacy/Contact v2.0 with version-upgrade seed logic

    User directive (2026-05-22): About too thin, Terms must hold up against

  • Fixed
    slice51-I/51-J/51-K: torun.app→torun.ai sweep + workflow-template 404 + InAppAssistant /start 500

    Three connected anasayfa bugs landed in the same commit because they all

  • Changed
    slice51-changelog: pre-release changelog seed refresh — extract + propagate 51-* sprints

    User mandate from 2026-05-22: "release çıkmadan önce change loglarının seed

  • Fixed
    slice51-F/51-H/legal-pricing-mvc: public routes + slug parity — BUG-6, 7, 9 closeout

    Three connected bugs from the anasayfa list (platform-plan/BUG_LIST_ANASAYFA_2026-05-22.md):

  • Fixed
    slice51-E/personas: View profile button + Persona: key prefix + trim seed to 1 demo (Echo)

    BUG-3+4+5 from anasayfa list closed.

  • Fixed
    slice51-D-fu/legal-locale: rename Legal:: → Legal: keys + use ToRun resource

    Follow-up to 51-C — my own mistake.

  • Fixed
    slice51-D/anon-billing: seed UnAuthenticatedUser + wire public chat + Public::Chat + Profile::NotFound locale keys

    BUG-1 closeout from anasayfa bug list (platform-plan/BUG_LIST_ANASAYFA_2026-05-22.md).

  • Fixed
    slice51-C/homepage-shell: public sidebar menus + Legal:: keys + scroll fix + reasoning opt-in across normal chat

    BUG-2 closeout (3-part user report + 1 rule refinement):

  • Fixed
    slice51-B/iaa-thinking: per-second SSE thinking event + bubble elapsed-time label

    BUG-1 part 2.

  • Changed
    slice50-RRRR/other: translate authoring placeholders — 149 keys × 3 locales (ar, hi, vi)

    - Workflow editor, wizard, templates, validation, preview, run history strings

  • Changed
    slice50-RRRR/cjk: translate authoring placeholders — 149 keys × 4 locales (ja, ko, zh-Hans, zh-Hant)

    - Workflow editor, wizard, templates, validation, preview, run history strings

  • Changed
    slice50-RRRR/slavic-south-hu: translate authoring placeholders — 149 keys × 3 locales (hr, sl, hu)

    - Workflow editor, wizard, templates, validation, preview, run history strings

  • Changed
    slice50-RRRR/iberian-romance: translate authoring placeholders — 149 keys × 3 locales (pt, pt-BR, ro-RO)

    - Workflow editor, wizard, templates, validation, preview, run history strings

  • Changed
    slice50-RRRR/english-nordic: translate authoring placeholders — 149 keys x 3 locales (en-GB, sv, fi)

    - Workflow editor, wizard, templates, validation, preview, run history strings

  • Changed
    slice50-RRRR/romance: translate authoring placeholders — 149 keys × 3 locales (fr, es, it)

    - Workflow editor, wizard, templates, validation, preview, run history strings

  • Changed
    slice50-RRRR/slavic-east: translate authoring placeholders — 149 keys × 4 locales (ru, pl-PL, cs, sk)

    - Workflow editor, wizard, templates, validation, preview, run history strings

  • Changed
    slice50-RRRR/germanic-north: translate authoring placeholders — 149 keys × 4 locales (de, de-DE, nl, is)

    - Workflow editor, wizard, templates, validation, preview, run history strings

  • Added
    slice50-QQQQ/changelog-auto-emit: post-commit hook + append-sprint-row script (ADR-042 implementation)

    Closes ADR-042 — previously Proposed, now Accepted.

  • Fixed
    slice50-G-fu2: personas-index clear-all button auto-width + right-align on md+

    `col-md-1 text-end` clipped the localized "Clear all" label at

  • Fixed
    slice50-PPPP/outbox-idempotency: HashChainAuditJob MessageKey bucketised by hour + tampered-ids hash

    Sprint 50-PPPP audit — most MessageKey expressions across the codebase

  • Changed
    slice50-OOOO/capability-keys: consolidate capability key strings into ToRun.ByokVault.Capabilities.CapabilityKeys

    TEST_PLAN §4 deferred — capability key string literals (text-chat,

  • Fixed
    slice50-G-fu: persona-profile/-index touch-ups (linter + wrapper)

    - persona-profile.component.ts: drop outer `lpx-content-container py-4` wrapper

  • Changed
    slice50-workflow-engine/closeout: progress doc — final pass

    Three deferred items landed (or were dismissed) since the previous closeout

  • Added
    slice50-workflow-engine/qgate-audit: emit append-only audit row per QualityGate loop-back iteration (Rule 11)

    Completes the slice50-workflow-engine audit pass for the QualityGate

  • Changed
    slice50-media/locale-sweep: translate Phase1Note storage-provider keys across 6 more locales

    Continues the slice50-media Phase1Note translation pass started by

  • Changed
    slice50-media/ar: translate Phase1Note storage-provider keys to Arabic

    Replaces 8 [en] placeholder Admin:StorageProviders:Phase1Note:* and

  • Changed
    slice50-media/locale-maintenance: clean machine-translation artifacts + propagate Admin:* placeholders across 12 locales

    Sweeps the torun.media Localization resource for the 12 non-EN locales

  • Changed
    slice50-workflow/tr: translate workflow editor + wizard + templates to Turkish

    Replaces ~110 [en] placeholder values in the Authoring resource's

  • Added
    slice50-workflow/cursor-insert-and-edge-findings: variable chip auto-inserts at cursor + edge-level validator markers

    [Cursor-aware var insert (slice50-S)]

  • Added
    slice50-workflow/preflight-budget-estimator: IBudgetEstimator + DefaultBudgetEstimator + executor pre-flight check

    Closes the loop on slice50-I's per-node budgetUsd intent layer with

  • Added
    slice50-media/admin-polish: Open-in-dashboard link + Phase 1 posture banner on storage providers

    User-driven polish on the /media/storage-providers surface:

  • Added
    slice50-media/optimizer-config: scaffold Bunny Optimizer config block (disabled by default)

    Adds OptimizerOptions sub-block under BunnyCdnOptions for Pull-Zone-level

  • Added
    slice50-MMMM/template-sync: backend WorkflowTemplate ↔ TS catalog enrichment + CI audit

    Closes chip #118 last deferred item:

  • Added
    slice50-G/public-personas: /personas browse + /p/:handle detail + 29-locale prop

    Backend (modules/torun.persona):

  • Added
    slice50-LLLL/validation-overlay: edge markers + node corner badge + finding tooltips

    Closes the deferred item from chip #118 wrap doc:

  • Added
    slice50-workflow/inspector-vars-and-model: capability-filtered model dropdown + available variables chip strip

    Two inspector enhancements that close the gap between author intent

  • Added
    slice50-workflow/canvas-interactivity: pan/zoom + node-drag-to-reposition on the visual editor canvas

    WorkflowGraphComponent:

  • Added
    slice50-workflow/wizard-photos: real Bunny multipart upload + per-file progress

    Closes the deferred item from chip #118 wrap doc:

  • Added
    slice50-workflow/preview-only: cheap-proxy executor override for RequestPreviewAsync

    Closes the deferred item from the workflow-editor wrap (chip #118):

  • Added
    slice50-workflow/inspector-enhancements: inline validation markers + per-node budget cap + max-retries

    Two related extensions to the advanced editor surface:

  • Added
    slice50-workflow-engine/outbox: emit workflow.completed / workflow.failed v1

    Rule 8 (transactional outbox) — after the executor's RunSpecAsync returns

  • Changed
    slice50-media/complete: drop stale 'Coming soon' from landing descriptions — all 6 surfaces live

    StorageBrowse and UploadAsset landing card descriptions had leftover

  • Fixed
    slice50-workflow-engine/loopback: align template QGate configs with executor

    The existing executor's QualityGate node (Slice 449/449b) already implements

  • Added
    slice50-workflow-engine/template-run: preview + run-from-template AppService

    Single AppService surfaces three endpoints:

  • Added
    slice50-workflow-engine/resolver: IWorkflowModelResolver wrapper

    Workflow-node-shaped wrapper over Sprint 50-LLL's IModelRoutingService.

  • Added
    slice50-workflow-engine/public-template: catalogue read AppService

    User-facing wizard-catalogue endpoint.

  • Changed
    slice50-workflow: progress log + deferred work for the workflow editor rebuild

    Captures what landed this sprint (library landing + simple-mode wizard

  • Changed
    slice50-media/admin: propagate 80 Media:Admin:* keys to 28 sibling locales as [en] placeholders

    Auto-propagated from the en.json additions in 9b95c79c (admin panel

  • Added
    slice50-workflow/advanced-palette: draggable node palette + drop-on-canvas for the visual editor

    Replaces the existing add-node dropdown with a permanent left-rail

  • Added
    slice50-workflow/library-landing: user-facing template gallery + simple-mode wizard

    Replaces the /me/workflow-editor entry that dropped users straight into

  • Added
    slice50-workflow-engine/seed: seed 3 canonical workflow templates

    Idempotent host-pass DataSeedContributor that materialises the three wizard

  • Added
    slice50-media/scaffolding: activate /media admin panel — perms + DTOs + AppService backends

    Foundation for the six host-admin /media surfaces.

  • Added
    slice50-workflow-engine/entity: add WorkflowTemplate aggregate + permissions

    Catalog entity for wizard-surfaced workflow presets.

  • Added
    slice50-pub-wire: replace 4 view-adapter stubs with real DB reads

    Public-site MVC Razor pages were rendering hardcoded fixture data

  • Fixed
    slice50-pub-blog-seed: BlogPost unique index — (TenantId, Slug, Locale) compound

    DbMigrator hit E11000 on BlogPostsDataSeedContributor: the legacy

  • Added
    slice50-content-seed: seed 6 marketing blog posts × 29 locales (174 rows)

    BlogPostsDataSeedContributor adds the initial public marketing blog catalog

  • Added
    slice50-pub-scaffold: _Header.cshtml 29-lang locale switcher

    PublicWebsite layout header override:

  • Added
    slice50-pub-marketplace: IPublicMarketplaceBrowseAppService — [AllowAnonymous] rate-limited

    - Anonymous browse for /marketplace (paged listings)

  • Added
    slice50-pub-seo: sitemap.xml + robots.txt + LeptonX 404/500 overrides

    - Pages/Sitemap.cshtml (route /sitemap.xml) — returns sitemaps.org urlset

  • Added
    slice50-pub-legal-company-support: /legal/{slug}, Company quad, Support FAQ

    - Pages/Legal/Detail.cshtml (route /legal/{slug}) — Markdig-rendered long

  • Added
    slice50-pub-pricing: 5-plan grid with billing-cycle + channel toggle

    - Pages/Pricing/Index.cshtml (route /pricing) — Monthly/Yearly toggle (real

  • Added
    slice50-pub-docs: tree sidebar + markdown detail with prev/next nav

    - Pages/Docs/Index.cshtml (route /docs) — section grid landing + sidebar

  • Added
    slice50-pub-persona: IPublicPersonaBrowseAppService — [AllowAnonymous] rate-limited

    - Anonymous browse for /personas (paged catalog)

  • Added
    slice50-pub-landing: Index page LeptonX rewrite

    Pull landing data from IPublicLandingAppService stub + pricing teaser from

  • Changed
    slice50-pub-shared: public-site infra (Markdig + SEO + stub AppServices)

    - ToRun.Web.Public.csproj — add Markdig 0.37.0 for markdown rendering

  • Added
    slice50-pub-legal: IPublicLegalAppService — [AllowAnonymous] rate-limited

    - Anonymous read for /legal/{slug} — Terms, Privacy, Cookie, Refund,

  • Added
    slice50-pub-faq: IPublicFaqAppService — [AllowAnonymous] rate-limited

    - Anonymous read for /faq

  • Added
    slice50-pub-doc: IPublicDocAppService — [AllowAnonymous] rate-limited

    - Anonymous read for /docs (tree + by-slug)

  • Added
    slice50-pub-changelog: IPublicChangelogAppService — [AllowAnonymous] rate-limited

    - Anonymous read for /changelog (paged, PublishedAt DESC)

  • Added
    slice50-pub-forum: IPublicForumAppService — [AllowAnonymous] rate-limited

    - Threads list (paged, optional CategoryKey tag match against ForumThread.Tags)

  • Added
    slice50-pub-blog: IPublicBlogAppService — [AllowAnonymous] rate-limited

    - Anonymous read surface for /blog (list + by-slug)

  • Fixed
    slice50-smoke: MySettings — 明示的な [HttpPut] ルート属性

    smoke-backend.py が VERB_MISMATCH を検出: Angular がベア PUT を呼び出していましたが、コントローラーに明示的な [HttpPut] 属性がありませんでした。

  • Added
    slice50-F/task#30: PublicChatAppService — 匿名デモターン、IPごとのレート制限、MarketingDemo 課金

    Sprint 50-F のバックエンド部分: ランディングページデモチャットの匿名アクセスと IP ごとのレート制限。

  • Changed
    slice50-RRR-fu: BillingDailySummaryConsumer — タプル分解型推論

    Dictionary<(DateTime Date, Guid? ...) のタプル分解で型推論の問題が発生していました。

  • Fixed
    slice50-UU-fu/task#73: KeywordSettlement — ExternalId のユニーク疎インデックス + レースロスト処理

    KeywordSettlementJob で二重処理を引き起こす可能性のある唯一のレース条件を解消しました。

  • Changed
    slice50-SS-task67: ja.json バッチ 1/4 — 最初の約140件の中国語アーティファクトキーをネイティブ日本語に変換

    task #67(50-SS スイープ)の継続。

  • Added
    slice50-RRR-2: ImageEdit コンポジット — マルチソースチップ UI + プロバイダーブランチ

    50-RRR 基盤(コミット A/B/C)を実際のコンポジット画像編集 UI に接続して解消します。

  • Changed
    slice50-NNN-fu: InAppAssistant Sessions:* ロケールバックフィル(10キー × 28ロケール)

    Toggle / Heading / New / Untitled / Empty / Load:Failed / JustNow / MinAgo / HourAgo / DayAgo を英語以外の28ロケール全てにバックフィルしました(en.json には Sprint 50-CCC-2 から完全なセットがありました)。

  • Added
    slice50-RRR-fu/task#74: MarketplacePurchase — BundleId/CreatorProfileId/BuyerUserId FK カラム + インデックス

    Sprint 50-LL (Post.CreatorProfileId) + Sprint 50-VV-2 (AdAuction FK) のパターンを踏襲。

  • Added
    slice50-RRR/C: ImageEditPipeline — capability-key トポロジールーティング

    パイプラインが入力トポロジーから capability キーを導出し、それを使用してルーティングするようになりました。

  • Added
    slice50-RRR/B: IAiImageClient.EditCompositeAsync + InputBounds POCO

    マルチ入力コンポジットパスのアダプターコントラクト。

  • Added
    slice50-RRR/A: capability-shape モデル — キー + InputBoundsJson + シードデルタ

    マルチ画像編集リファクタリング(Option C — capability-shape アプローチ)の基盤コミット。

  • Added
    slice50-QQQ: ChatAttachment 永続化 — ゼロ挿入謎の可観測性

    スコープの所見: ChatPipelineAppService.cs:1415 の配線は既に ChatAttachment.Insert を呼び出していましたが、挿入がゼロ件でした。

  • Added
    slice50-SSS: 可観測性ログスイープ — Bunny + OpenAI + ChatPipeline

    本番障害時に全コンテキストが表面化するよう、5件の構造化ログを追加しました。

  • Added
    slice50-NNN: InAppAssistant セッション — 空セッションの自動クリーンアップ + 行ごとの削除 X

    バブルに空/不要なセッションが蓄積する問題への二段構えの修正:

  • Added
    slice50-YY-2: InAppAssistant バブル — コンポーザーに Whisper STT マイク録音を追加

    50-YY の延期された -2 を解消します(マイク添付は別コミットに切り出されていました)。

  • Added
    slice50-JJJJ: UserActivity レコーダー配線 — ImageEdit + Translator + Video パイプライン

    50-AAA で残ったクロスパイプラインのギャップを解消します。

  • Added
    slice50-IIII: /me/image ライブラリピッカー — Blob ストリーミング + 検索 + ソート + ページネーション

    ユーザー報告: 「ソース画像を選択」と「マスク画像を選択」の両方のライブラリピッカーが正しく動作していませんでした。

  • Fixed
    slice50-HHHH: OpenAI DALL-E 3 — `style` パラメータを削除(非推奨 400)

    本番ログ:

  • Fixed
    slice50-GGGG: 画像編集 PUT — XHR への Bearer ヘッダー + 欠落マスクロケールキー

    ユーザー報告: /me/image 編集でソースアップロードとマスクアップロードの両方が失敗していました。

  • Added
    slice50-FFFF: ライブラリの日付グループ化 + グリッド/リストビューテンプレートの配線

    ライブラリモジュールの最終スライス。

  • Changed
    slice50-EEEE: ライブラリ一括アップロード — 単一成功バナー、ファイルごとのちらつきなし

    ユーザーフィードバック: グリーンの「Upload complete.」バナーが各ファイルごとに点滅して表示されていました。

  • Fixed
    slice50-DDDD: AbpStudioClient モジュールを削除 — アップロードストリームクラッシュの根本原因

    Sprint 50-CCCC でアップロードパイプラインの ObjectDisposedException を修正しようとしました。

  • Fixed
    slice50-CCCC: ライブラリアップロードストリーム + ファイルごとのエラー報告

    「Upload failed」トーストが繰り返し表示される根本原因 — ファイルは実際にアップロードされていたにもかかわらず。

  • Added
    slice50-BBBB: ライブラリゴミ箱モード UX + ビデオ最大高さ + md バックフィル + マークダウンレンダリング + アップロードカウント

    ユーザーが5件の別々の問題を報告しました:

  • Added
    slice50-AAAA: CDN パージアウトボックス + トゥームストーンワーカー + ゴミ箱 UI

    ユーザー報告: part_001.wav / part_002.wav をライブラリから削除しても CDN 経由でまだアクセスできていました。

  • Added
    slice50-ZZZ: ライブラリプレビュースピナー修正 + 一括削除 UI

    50-YYY で退行が残っていました: openAssetDetail がテキストプリロードのみをトリガーしていました。

  • Added
    slice50-YYY: ライブラリの Document 種別 + インラインテキストプレビュー + モーダル整理

    ユーザー報告: .md / .txt ファイルをアップロード後、Documents タブが空のままでした。

  • Added
    slice50-XXX: ライブラリのプライベート読み取り — バックエンドストリームプロキシ経由

    /me/library の CDN パブリック URL パターンが誤っていました — コンテンツはユーザーごとのプライベートアセットです。

  • Fixed
    slice50-WWW: Bunny 開発環境オーバーライド同期 + ライブラリアップロードカウントの正確化

    1回のバッチで2件のバグ修正 — どちらも4ファイルを「アップロード」した際にグリーンバナーは表示されるもののライブラリページに0件のままという状況で発覚しました。

  • Added
    slice50-VVV: ライブラリ一括アップロード リッチ進捗 UI

    ユーザー: 「アップロード処理にプログレスバーを付けて、アップロード中/秒数を表示し、どれがアップロードされたか分かるようにしてほしい。このままでは味気ない。」

  • Fixed
    slice50-UUU: .md の octet-stream フォールバック + Bunny アップロード詳細ログ

    /me/library テストで発見された2件のユーザーブロッキング問題:

  • Fixed
    slice50-TTT: ライブラリアップロード MIME 受け入れ — 目的別(画像のみ vs ライブラリ混在)

    ユーザー報告: 「All」タブから画像以外のファイルをアップロードしたところ 400「Only image/* MIME types are accepted on this endpoint.」が返されました。

  • Fixed
    slice50-RRR: Redis タイムアウト 5秒 → 15秒 — ABP ローカライゼーション HMGET カスケード修正

    ユーザー報告: Message Citations 管理画面で 500「Internal error」。

  • Fixed
    slice50-PPP: Bunny Media ストレージ認証情報 — ダッシュボードと同期

    ユーザー報告: ライブラリアップロードで「Bunny storage upload failed with HTTP 401」。

  • Fixed
    slice50-OOO: DALL-E 3 画像生成 400 — `style` パラメータを削除(非推奨 400)

    ユーザー報告: /me/image 生成が壊れていました。「画像生成プロバイダーエラー」

  • Fixed
    slice50-MMM: InAppAssistant パネルの overflow:visible + ドロップダウンクリップ修正 + 位置バインディング整理

    ユーザー報告: Sprint 50-III のパネル位置リファクタリング後もまだ正しく動作していませんでした。

  • Fixed
    slice50-JJJ: InAppAssistant ウェルカムメッセージの空ボディ — 50-CCC-2 メッセージソース退行

    根本原因(シナリオB変形): `openSession()` が `messages.set(mapped)` を呼び出す際にマッピングが不完全でした。

  • Added
    slice50-LLL: タイトル生成を最安テキストチャットモデルにルーティング(Rule 2 capability-first)

    ユーザー: 「タイトルに同じモデルを使う必要はない、安いモデルでいい。」

  • Fixed
    slice50-III: InAppAssistant FAB+パネルの位置認識クアドラントリファクタリング

    ユーザー報告: Sprint 50-MMM 後もパネルが FAB から切り離されて開き続けていました。

  • Fixed
    slice50-KKK: チャットタイトル生成 — ReasoningEffort=low + 1024トークン上限(50-CCC 続編)

    Sprint 50-CCC で MaxOutputTokens を 24 → 128 に上げて「約100トークン」を期待しましたが十分ではありませんでした。

  • Added
    slice50-AAA: IUserActivityRecorder クロスモジュールレコーダー — /me/activity-history にチャットターンを反映

    ユーザーが /me/activity-history が何時間もチャット/画像/音声等を使っても空のままと報告しました。

  • Fixed
    slice50-CCC: チャットタイトル退行 + 最新へスクロールボタンの表示

    ユーザーテストで2件の退行が発見され修正されました。3件目の懸念は継続調査中。

  • Fixed
    slice50-BBB: InAppAssistant + Agent 管理メニュー監査 — 管理ロールのモジュールパーミッションシード(1件修正、14/14メニューのブロック解除)

    | # | メニュー | グループ | Angular パス | バックエンドルート | ステータス | 根本原因 |

  • Fixed
    slice50-GGG: /me/library 一括アップロード — 複数ファイル選択

    ユーザー: 「ライブラリにファイルを追加するとき、なぜ一つずつ手動で追加しないといけないのか、複数選択できるようにしてほしい。」

  • Fixed
    slice50-FFF: /me/image 編集タブ — Bunny プリサインによるマスク PC アップロード

    ユーザー: 「ソースにはPC アップロードがあるのにマスクにはないのはなぜか、うちはどんな画像もアップロードできるはずなのに。」

  • Fixed
    slice50-EEE: Bunny プロバイダーが IMediaStorageProvider + IVideoStreamProvider インターフェースを公開

    ユーザー報告のクリティカルバグ: すべての PC アップロード試行が例外をスローしていました。

  • Fixed
    slice50-DDD: 通知プリファレンス 404 — /my-preferences アクションサフィックスを追加

    ユーザーが昨日から繰り返し /me/notifications/ が 404 になると報告していました。

  • Fixed
    slice50-ZZ: チャットサイドバードロップダウン z-index — 日付区切りスタッキングを回避

    /agent/chat-pipeline の最近のチャット一覧に行ごとの名前変更/削除ドロップダウンがありましたが、日付区切りの下に隠れていました。

  • Fixed
    slice50-YY: InAppAssistant FAB 左上 + ベル右上に戻す + モデルダウングレード同意プロンプト

    ユーザーテストで5件の懸念が浮上し、このコミットで4件を対処、1件は継続。

  • Added
    slice50-WW: MarketplaceRoyaltyPayoutCalculator — 日次クリエイターロイヤリティ分配(プラン §2.1 #7)

    日次 AsyncPeriodicBackgroundWorker(24時間ティック)が支払い済みの MarketplacePurchase をスイープします。

  • Added
    slice50-XX: AdAuction Bid/Impression/Click/Conversion 型付き FK カラム + インデックス(プラン §2.2 / 50-VV-2)

    Sprint 47-O で作成した AdAuction エンティティには結合 FK がありませんでした。

  • Added
    slice50-UU: KeywordSettlementJob — Spot/Reserve/Futures 日次決済(プラン §2.1 #6)

    日次 ABP AsyncPeriodicBackgroundWorker(24時間ティック)が保留中の KeywordSettlement をスイープします。

  • Added
    slice50-VV: AdAuction RTB コンシューマーのスキャフォールド + ファーストプライスクリアリング(プラン §2.1 #5)

    Sprint 50-TT がこのために投入されましたが、別の方向に進んでしまいました。

  • Added
    slice50-OO: /me/library クォータシステム — ストレージ追跡 + PC アップロード + ウォレット消費

    ユーザー要求: ライブラリの容量インジケータ、PC アップロード、プランティア別クォータ、ウォレット残高からの課金。

  • Added
    slice50-TT: 定期ワーカーの行ごと分散ロック — マルチポッド安全対策

    50-RR パターン(VideoJobPollingWorker IAbpDistributedLock)を他のワーカーに拡張します。

  • Added
    slice50-NN: /me/image 編集タブ PC アップロード — Bunny プリアップロード経由

    Sprint 50-P でバックエンドに Bunny プリアップロードエンドポイントが不足していたため PC アップロードを延期しました。

  • Changed
    slice50-SS: ja.json バッチ 1/N — 最初の300件の中国語アーティファクトキーをネイティブ日本語に変換

    50-AA が全スイープ中に中断しました。これは再開されたバッチ処理です。

  • Added
    slice50-RR: VideoJobPollingWorker Redis 分散ロック — マルチポッド安全対策

    Sprint 50-U + 50-EE でポーリング + 返金フローを配線しましたが、シングルポッドを前提にしていました。

  • Added
    slice50-QQ: 通知+アクティビティベルをトップ右フロートからサイドバー隣接に移動

    ユーザー指示(Sprint 50-E ターン): ベルとアクティビティは右側のメニューアイコンの隣に配置すること。

  • Changed
    slice50-PP: プロキシ再生成をスキップ — バックエンド未起動

    このスプリント中、https://localhost:44304 のバックエンドに到達できませんでした。

  • Added
    slice50-MM: Creator/Post.CreatorProfileId の非正規化 — 50-LL スコープ修正

    Sprint 47-H で Creator/Post フィードに劣化した複合インデックスが使われていました。

  • Added
    slice50-LL: PersonaPost.PersonaId + CreatorProfileId の非正規化(プラン §2.2 — フィードクエリ)

    Sprint 47-H で PersonaPost に劣化した (TenantId, CreationTime) スキャンが使われていました。

  • Added
    slice50-JJ: IBillingRecorder.RecordPaddleTransactionAsync — 調整自動修復

    Sprint 50-W の BillingReconciliationJob が Paddle ↔ ローカルの穴を検出しました。

  • Fixed
    slice50-KK: モジュール Angular ワークスペースビルダーの乖離(Sprint 50-M 異常)

    各 modules/torun.*/angular/angular.json が参照していた設定に乖離がありました。

  • Fixed
    slice50-II: Suite *DataSeedContributor の「sample-X」リテラルを有効なプレースホルダーに置換

    Sprint 50-CC のテナント分離テストで既存の不具合が発覚しました。

  • Changed
    slice50-HH: MongoDB レガシーインデックス削除スクリプト(プラン §2.1 #8)

    Sprint 47-A..47-P の MT スイープにより、すべてのエンティティに TenantId プレフィックス付き複合インデックスが追加されました。

  • Fixed
    slice50-FF: InAppAssistant + Telemetry + EventBus + Persona モジュールグループを移行

    Sprint 49 シリーズの完了。

  • Changed
    slice50-GG: ローンチ当日テナントバックフィル DBA スクリプト(プラン §2.4)

    プレローンチ R2 リスク: Sprint 47-A..47-P で219以上のエンティティをスイープし IMultiTenant を追加しました。

  • Added
    slice50-EE: IBillingRecorder.RefundAsync — 兄弟負レコード拡張

    Sprint 50-U でギャップが判明: IBillingRecorder には RecordAsync しかありませんでした。

  • Changed
    slice50-CC: subscription + agent + persona のテナント分離テスト

    プラン §2.3 / R1 監査 — Sprint 47-A...47-P で219以上のエンティティをスイープし IMultiTenant を修正しました。

  • Changed
    slice50-DD: ImageEdit パイプライン + InAppAssistant Bubble 承認プロパティ

    プラン §2.5 バックログ: Sprint 50-P 由来の22個の ImageEdit パイプラインキーを伝播しました。

  • Fixed
    slice50-BB: 7つの出力サイトでアウトボックス MessageKey 衝突を一括修正

    Sprint 50-K でサブスクリプションプラン Paddle 設定の衝突が1件検出されました。

  • Added
    slice50-W: BillingReconciliationJob — 日次 Paddle ↔ ローカル差分監査

    Phase 1.5 §2.1 #3 — 3番目のバックグラウンドワーカー。

  • Added
    slice50-X: PaddleSyncWorker — 定期的なサブスクリプション状態の冗長性チェック

    Phase 1.5 §2.1 #4 — 4番目かつ最後のプレローンチ バックグラウンドワーカー。

  • Fixed
    slice50-Z: RunInputUploadAppService TypePredicate の欠落(49-B フォローアップ)

    /api/app/run-input-upload が 404 を返していました。AppService が欠落した TypePredicate を使用していたためです。

  • Added
    slice50-Y: 画像編集 Capability のシード + gpt-image-1 AiModelCapability + 価格リンク

    Sprint 50-P で /me/image 編集タブの UI + バックエンド配線が実装されましたが、画像編集 Capability のシードが不足していました。

  • Fixed
    slice50-S: UTC タイムスタンプに Z を付与 — バックエンドシリアライザー + MongoDB 規約

    フロントエンド(Angular | date パイプ + Date コンストラクタ)が UTC → ローカル変換を処理します。

  • Added
    slice50-U: VideoJobPollingWorker — Sora-2 IHostedService ハードニング

    Phase 1.5 §2.1 — 最優先バックグラウンドワーカー。

  • Added
    slice50-V: DunningAttemptScheduler — Paddle past_due リトライミラー

    Phase 1.5 §2.1 #2 — 2番目のバックグラウンドワーカー。

  • Fixed
    slice50-Q: InAppAssistant SSE コンシューマー + キャンセル UX + リトライガード

    ユーザー報告: 「フォーム入力」フォローアップターンが「Message failed.」を返していました。

  • Fixed
    slice50-T: チャットクリップボード貼り付け + memory_forget 空ボディ

    バグA: チャットコンポーザーがクリップボード画像の Ctrl+V を無視していました。

  • Fixed
    slice50-R: /marketplace レイアウト — 外側の lpx-content-container を除去

    マーケットプレイス閲覧ページに余分な lpx-content-container ラッパーがありました。

  • Fixed
    slice50-P: /me/image 編集タブのパリティ + レスポンシブボタン行

    編集タブにモデル選択(自動/手動)、品質などが欠けていました。

  • Fixed
    slice50-N: InAppAssistant FAB デフォルト → 左下 + パネルアンカー修正

    ユーザー報告: Sprint 50-I のデフォルト(bottom:96 right:24)が他のUI要素と重なっていました。

  • Fixed
    slice50-O: /me/notifications + プリファレンスルート移行(49-B の漏れ)

    ユーザーが /me/notifications をテストしていた際に 404 が発生しました。

  • Fixed
    slice50-M: WalletTopUpPriceIds を削除 — 常にインラインの非カタログ価格を使用

    PaddleOptions.WalletTopUpPriceIds は Dictionary<string,string> でした。

  • Fixed
    slice50-L: Paddle チェックアウト — 4xx/5xx 時のステータス + ボディをログに記録

    ユーザー報告: 「paddle.js ポップアップが開くはずなのにエラーが出る」

  • Fixed
    slice50-I: InAppAssistant FAB ドラッグ(パネルドラッグを元に戻す)+ 通知ドロップダウン位置調整

    Sprint 50-I は Sprint 50-B + 50-E 後に表面化した2つの UX 退行に対処します。

  • Fixed
    slice50-K: 2回目のプラン Paddle 保存時のアウトボックス MessageKey 衝突

    管理者が SubscriptionPlan の Paddle 設定を保存した際、1回目は成功しましたが2回目以降が失敗していました。

  • Fixed
    slice50-J: 課金内訳 — 金額フィールドのみ $

    /me/billing のコスト内訳テーブルがすべての値に無差別に $ プレフィックスを付けていました。

  • Fixed
    slice50-H: チャットパイプラインルート移行 + /me メニューにチャットを追加

    Sprint 49-B でチャットパイプラインに2つのハードコードされた /api/app/* URL が残っていました。

  • Changed
    slice50-Fi: 統合プロパゲーション — 50-B ドラッグ/ドック + 50-D ワークフローモーダル + 50-E 通知/アクティビティセンターを29ロケールへ展開

    - 50-B (InAppAssistant:Bubble:Dock/Undock/DragHint): en.json と他28ロケールすべてにネイティブ翻訳を追加

  • Fixed
    slice50-D: プロジェクト全体のネイティブ js confirm/alert/prompt を ABP ConfirmationService + LeptonX モーダルに移行

    ユーザー: 「メモリページで削除をクリックすると js confirm が出る。なぜ LeptonX を使わないのか。」

  • Fixed
    slice50-B: InAppAssistant tool_calls 順序 + ドラッグ/ドック可能バブル(CRITICAL)

    修正A(サーバー CRITICAL バグ):

  • Fixed
    slice50-C: /me/billing ドロップダウン表示 + タブコンテンツ空白(CRITICAL UX)

    ユーザー報告: SourceKind ドロップダウンがピンク/青のブロック(壊れたスタイル)として表示されていました。

  • Fixed
    slice50-A: 通知 + アクティビティセンターのベルが管理ラベルと重ならなくなりました

    ユーザーフィードバック: 2つのフローティングベル(通知ベル + アクティビティセンター)が重複していました。

  • Fixed
    slice47-J: subscription 分割 #2 最終 — Subscription/Invoice/BYOK/QueuedRequest IMultiTenant (Phase 2 CRITICAL)

    Sprint 47-I + 45-M パターン適用。

  • Added
    slice48-B: 埋め込みコストを AiModelPricing スナップショットに接続(Sprint 46-A フォローアップ)

    Sprint 46-A でクロスモジュール IBillingRecorder を導入し、BillingRecord を出力しました。

  • Fixed
    slice48-A: Translation モジュール ja/ko/pt/sv 適切な翻訳(約272エントリ)

    Sprint 46-F の構造正規化で小文字→PascalCase への変換は完了しましたが、4つのロケールに Suite スタブの英語コンテンツが残っていました。

  • Fixed
    slice47-I: subscription 分割 #1 MT監査修正 — Wallet/BillingRecord/Refund/Dispute IMultiTenant (Phase 2 CRITICAL MONEY)

    Sprint 45-M + 47-A から 47-N パターン適用。

  • Fixed
    slice47-N: agent 分割 #2 MT監査修正 — Council/DeepResearch/CodeSandbox/Voice/Translator IMultiTenant (Phase 2)

    Sprint 47-M パターン適用。

  • Fixed
    slice47-L: authoring 分割 #2 MT監査修正 — GenJobs/BlogPost/クォータ IMultiTenant (Phase 2)

    Sprint 45-M + 47-K パターン適用。

  • Fixed
    slice47-M: agent 分割 #1 MT監査修正 — Chat/ChatMessage/Assistant IMultiTenant (Phase 2 HIGH RISK)

    Sprint 45-M + 47-A から 47-K パターン適用。

  • Fixed
    slice47-K: authoring 分割 #1 MT監査修正 — Workflow エコシステム IMultiTenant (Phase 2 HIGH RISK)

    Sprint 45-M + 47-A から 47-H パターン適用。

  • Fixed
    slice47-P: marketplace MT監査修正 — 15エンティティ IMultiTenant (Phase 2)

    Sprint 45-M + 47-A/B/C/D/E/F/G/O パターン適用。

  • Fixed
    slice47-H: creator 分割 #2 MT監査修正 — Posts/Teams/Payouts エンティティ IMultiTenant (Phase 2 HIGH RISK)

    Sprint 45-M + 47-G パターン適用。

  • Fixed
    slice47-O: advertising MT監査修正 — 16エンティティ IMultiTenant (Phase 2)

    Sprint 45-M + 47-A/B/C/D/E/F パターン適用。

  • Fixed
    slice47-G: creator 分割 #1 MT監査修正 — Profile/Account/Org エンティティ IMultiTenant (Phase 2 HIGH RISK)

    Sprint 45-M + 47-A/B/C/D/E パターン適用。

  • Fixed
    slice47-F: forum MT監査修正 — 19エンティティ IMultiTenant + 通知ファンアウトのテナント対応 (Phase 2)

    Sprint 45-M + 47-A/B/C/E パターン適用。

  • Fixed
    slice47-D: telemetry MT監査修正 — 18エンティティ IMultiTenant + クロスモジュール書き込みのテナントスコープ (Phase 2 HIGH RISK)

    Sprint 45-M + 47-A + 47-B パターン適用。

  • Fixed
    slice47-E: persona MT監査修正 — 16エンティティ IMultiTenant (Phase 2)

    Sprint 45-M + 47-A/B/C パターン適用。

  • Fixed
    slice47-C: moderation MT監査修正 — 11エンティティ IMultiTenant (Phase 2)

    Sprint 45-M + 47-A/B パターン適用。

  • Fixed
    slice47-B: byokvault + knowledge MT監査修正 — 7エンティティ IMultiTenant (Phase 2)

    Sprint 45-M + 47-A パターン適用。

  • Fixed
    slice47-A: eventbus + translation MT監査修正 — 8エンティティ IMultiTenant (Phase 2)

    Sprint 45-Mパターン適用: Suite はJSONで IsMultiTenant: true と指定していても、ベースクラスに IMultiTenant を出力していませんでした。

  • Added
    slice56-57-58: capability-first routing + Authoring stub fix

    Slice 56 — IModelRoutingService (ByokVault.Application + Contracts):