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 Workflow와 크리에이터 Marketplace가 시작됐어요

    여러 AI 단계를 하나의 Workflow로 엮어 원할 때마다 실행하고, Marketplace에 공개하거나 다른 크리에이터가 공유한 Workflow를 둘러보세요. 이제 Workflow Editor와 Runner, Marketplace를 메뉴에서 바로 이용할 수 있어요.

  • Added
    휴대폰에 ToRun을 설치하세요

    ToRun을 홈 화면에 추가하면 네이티브 앱처럼 전체 화면에 전용 아이콘으로 실행할 수 있어요. 모바일 앱이 나오기 전까지 한 번의 탭이면 충분합니다.

  • Added
    새단장한 ToRun.ai의 모습

    앱 전반에 새로운 로고와 한층 깔끔해진 브랜딩을 적용했어요. 라이트 테마와 다크 테마 모두에 어울리도록 다듬었습니다.

  • Added
    더 똑똑하고 더 나에게 맞는 답변

    이제 Auto 모드에서도 AI가 얼마나 깊이 생각할지 직접 선택할 수 있어요. 이미지 프롬프트는 저장된 메모리를 자연스럽게 참고해, 내가 아끼는 인물과 세부 정보에 꼭 맞는 결과를 만들어 줍니다. 또한 거의 똑같은 메모리는 쌓이지 않고 자동으로 하나로 합쳐져요.

  • Fixed
    더 깔끔해진 이미지·동영상·음악 스튜디오

    이제 생성 진행 상황이 입력 폼 아래가 아닌 결과 바로 옆에 표시돼요. 각 페이지는 깔끔한 상태로 열리고, 가장 최근에 만든 작업은 가운데 정면에 보이며 이전 작업들은 Library에 정리됩니다.

  • Fixed
    더 명확해진 지갑과 더 부드러운 Library

    이제 지갑 내역이 페이지 단위로 나뉘어 표시되고 1센트 미만 금액까지 정확하게 보여줘요. Library에서 항목을 삭제할 때 더 이상 오류가 발생하지 않습니다.

  • Added
    직접 시작하는 셀프서비스 광고주 등록

    계정에서 바로 광고주 계정을 만들고 광고 캠페인을 검토 요청으로 제출하세요. 수동 설정을 기다릴 필요가 없어요.

  • Fixed
    안정성, 정확한 과금, 그리고 강화된 보안

    보이지 않는 곳에서: 더 공정한 무료 크레딧 정산, 크리에이터 정산금과 권한에 대한 한층 강화된 검증, 더 안전한 미디어 검수, 그리고 더 안정적인 Workflow 실행을 준비했어요.

  • Added
    77개 언어를 지원하는 두 번째 실시간 번역 엔진

    이제 Live Translation에서 두 가지 엔진 중 대화에 더 잘 맞는 것을 선택할 수 있습니다. 터키어와 러시아어를 포함해 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
    실시간 음성 번역

    말하면 거의 즉시 번역됩니다. 두 언어를 선택하고 한 번의 탭으로 서로 바꾸세요. 번역기가 음성을 인식해, 말하는 동안 번역을 실시간으로 들려줍니다.

  • Added
    더 명확하고 더 정직해진 영상 스튜디오

    이제 영상 페이지는 라이브러리에서 항목을 삭제할 때 타일도 함께 업데이트됩니다. 모델별로 클립 길이를 설정하고, 개별 클립을 삭제할 수 있으며, 미리보기 결과를 명확하게 표시해 지금 무엇을 보고 있는지 항상 알 수 있습니다.

  • Fixed
    더 정교해진 인앱 어시스턴트

    이제 인앱 어시스턴트는 깔끔하게 서식이 적용된 답변을 보여주고, 답변을 작성하는 동안 최신 메시지가 화면에 계속 보이도록 하며, 완성된 답변을 안정적으로 저장하고, 각 대화에 자동으로 제목을 붙입니다.

  • Fixed
    대화 답변이 안정적으로 표시됩니다 — 링크, 수식, 통화까지

    링크, 수학 수식, 통화 금액이 포함된 답변이 더 이상 빈 화면이나 일부만 표시되는 일 없이 나타나며, 페이지를 새로 고친 뒤에도 마찬가지입니다. 또한 딥리서치 답변에는 항상 최종 요약이 포함됩니다.

  • Fixed
    안정성, 청구 정확성, 보안 강화

    눈에 보이지 않는 곳에서 폭넓은 개선을 진행했습니다. 더 정확한 사용량 측정과 지출 합계, 더 공정한 자동 환불, 더 견고한 실시간 메시징, 더 강력한 개인정보 및 보안 보호, 그리고 더 명확한 서비스 상태 안내입니다.

  • Fixed
    로그인 없이 블로그와 커뮤니티 콘텐츠 읽기

    공개 블로그 글과 포럼 토론은 반응과 답글까지 포함하여 이제 로그아웃한 방문자에게도 표시됩니다.

  • Fixed
    더 명확한 요금제와 깔끔하게 정리된 모델 라인업

    이제 사용량이 단일하고 공정한 마크업으로 청구되며, 월 지출과 남은 예산 게이지도 정확하게 표시됩니다. 모델 목록도 정리하여 사용되지 않는 모델은 폐기하고 새로운 플래그십 모델을 연결했습니다.

  • Added
    이제 마켓플레이스 등록과 번들에 표지 이미지가 표시됩니다

    워크플로 등록과 번들에 제대로 된 표지 이미지를 표시할 수 있어, 마켓플레이스를 더 쉽고 보기 좋게 둘러볼 수 있습니다.

  • Added
    이제 인앱 어시스턴트가 대신 작업해 드립니다

    어시스턴트에게 요청하기만 하면 양식 입력, 버튼 클릭, 앱 내 이동까지 대신 처리합니다. 문의, FAQ, 포럼, 메모리, 원스텝 워크플로 생성까지 확장된 더 풍부한 도구 모음이 이를 뒷받침합니다.

  • Added
    어시스턴트가 옮길 수 있는 말풍선 안에서 실시간으로 답변을 입력합니다

    답변이 한 번에 모두 나타나는 대신 한 단어씩 스트리밍으로 표시됩니다. 어시스턴트 말풍선은 편한 위치로 끌어다 놓을 수 있으며, 지금 무엇을 하고 있는지도 실시간으로 알려 줍니다.

  • Fixed
    막힘 없이 프로젝트를 만들고 정리하세요

    프로젝트를 만들고 그 안에서 새 채팅을 시작하는 작업이 이제 매끄럽게 작동하여, 관련된 채팅과 파일, 컨텍스트를 한곳에 모아 둘 수 있습니다.

  • Fixed
    더 매끄러운 동영상, 아바타, 음성

    동영상이 안정적으로 재생되고, 비공개 미디어는 보안 프록시를 통해 로드됩니다. 크리에이터와 페르소나 아바타가 모두에게 표시되며, 음성 메모도 오류 없이 텍스트로 변환됩니다.

  • Fixed
    더 명확한 서비스 상태 알림

    서비스 일부에 문제가 발생하면 알림 내용이 더 이해하기 쉬워졌으며, 더 이상 내부 공급업체 이름을 노출하지 않습니다.

  • Added
    즐겨 쓰는 앱을 어시스턴트에 연결하세요

    한 번의 로그인 또는 API 키로 외부 앱을 연결하여, 어시스턴트가 이미 사용 중인 도구와 직접 함께 작업할 수 있습니다.

  • Fixed
    더 안정적인 이미지 생성 및 편집

    이미지 도구가 이제 작업 내용에 맞는 모델을 자동으로 선택하고, 결과를 즉시 인라인으로 미리 보여 줍니다. 공급자의 모델 변경 이후에도 편집이 다시 정상 작동합니다.

  • Fixed
    파일을 삭제해도 더 이상 채팅이나 갤러리가 깨지지 않습니다

    이미지나 첨부 파일이 삭제된 경우에도 채팅 기록, 미디어 갤러리, 이미지 편집기가 오류로 멈추지 않고 친절한 자리 표시자를 보여 줍니다.

  • Added
    약 100개 언어로 번역

    번역기에 약 100개 언어를 담은 검색 가능한 선택 도구가 추가되었습니다. 각 언어는 현지 이름과 영어 이름으로 함께 표시됩니다.

  • Added
    새로운 블로그 글과 커뮤니티 토론

    새로운 블로그 글과 포럼 스레드를 한 묶음 추가했습니다. 답변이 달린 질문도 포함되어 있어, 첫날부터 읽고 둘러볼 거리가 더 많아졌습니다.

  • Added
    새로운 채팅 내 도구: 파일, 코드, 이미지, 음성 등

    이제 채팅에서 업로드한 파일 검색, 샌드박스에서 Python 실행, 이미지 편집, 오디오 전사 및 재생, 워크플로우 트리거 — 모두 대화를 벗어나지 않고 사용할 수 있습니다.

  • Added
    인용이 포함된 웹 검색 및 심층 연구

    채팅이 실시간 웹을 검색하고, 다중 소스 심층 연구를 수행하며, 전체 페이지를 가져와 읽도록 합니다 — 모든 답변은 사용한 소스와 함께 반환됩니다.

  • Added
    기억하는 채팅 — 요청 시 잊기

    이제 어시스턴트가 채팅 전반에 걸쳐 경량 메모리를 유지하고, 기억하는 내용을 나열하며, 어떤 언어로든 잊어달라는 요청을 처리합니다.

  • Added
    하나의 스튜디오에서 이미지, 비디오, 음악 제작

    이미지를 생성 및 편집하고, 단편 영화를 제작하고, 가사와 함께 노래를 작곡하세요 — 새로운 이미지, 비디오 및 음악 엔진으로 구동되며, 공유 미디어 선택기와 라이브러리가 클릭 한 번으로 제공됩니다.

  • Added
    실시간 음성 모드

    ToRun에 직접 말하세요 — 새로운 실시간 음성 기능이 채팅에 음성 대화와 실시간 전사를 제공합니다.

  • Added
    워크플로우: 품질 우선 실행, 승인 및 재개

    워크플로우 실행이 이제 프리미엄 품질 모델을 선호하고, 중요한 부분에서 승인을 일시 중지하며, 취소, 재생성 및 재개가 가능합니다 — 모든 출력물이 라이브러리에 바로 저장됩니다.

  • Added
    Projects: 작업 정리

    관련 채팅, 파일 및 컨텍스트를 프로젝트로 그룹화하여 어시스턴트가 항상 현재 작업에 맞는 배경 지식을 갖추도록 합니다.

  • Added
    Canvas: 나란히 배치된 작업 공간

    채팅 옆에 전용 캔버스 패널에서 장문의 콘텐츠와 코드를 초안 작성하고 반복합니다.

  • Added
    더 스마트하고 긴 대화

    롤링 요약, 더 스마트한 컨텍스트 윈도우, 빠른 기록 스크롤로 긴 대화를 일관되고 빠르게 유지하며, 대화가 모델 윈도우를 초과할 때 명확한 제어를 제공합니다.

  • Added
    정직하고 투명한 요금 청구

    롤링 윈도우에서 보충되는 합리적인 무료 허용량, 더 명확한 지출 게이지, 이미지 또는 비디오 생성 실패 시 자동 환불, 그리고 잔액으로 충당 가능한 기능만 잠금 해제되는 추론 노력 제어.

  • Added
    더 크고 최신화된 모델 카탈로그

    2026년의 수십 개 모델이 추가되고 오래된 모델이 퇴역되었으며, 프로바이더 모델과 가격을 최신 상태로 유지하는 일일 자동 동기화 — 새로운 관리자 카탈로그에서 관리됩니다.

  • Added
    최고의 채팅 공유하기

    대화를 공개 링크로 게시하고 만들어낸 콘텐츠 주변의 커뮤니티를 성장시키세요.

v@release.Version

minor
31 5월 2026

May 2026 — 499 changes

  • Changed
    52-Q-SMOKE-HARNESS: 반복 가능한 엔드투엔드 스모크 스위트 + 첫 번째 회귀 보고서

    실행 중인 Host에 대해 인증 (OpenIddict 패스워드 그랜트)하고 실제 HTTP API를 통해 모든 핵심 기능을 엔드투엔드로 검사하는 독립 실행형 .NET 콘솔 하네스 (test/ToRun.SmokeTests): auth/me, memory CRUD, wallet, billing, library, workflow 샘플, web-search a...

  • Fixed
    52-Q-AI-MEDIA-ACCESS: 모든 파이프라인 미디어 fetch에 인증된 Bunny 읽기 적용

    플랫폼 미디어는 PRIVATE Bunny Storage Zone에 있으므로, 일반

  • Added
    52-Q-MEMORY-CHAT: memory_list 도구 + 언어 불가지론적 작동 forget

    다음 위에서 채팅 기반 메모리 관리 기능을 완성함

  • Fixed
    52-Q-MEMORY-FORGET-I18N: 언어 불가지론적 fold-match + 의미론적 폴백

    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: model-catalog + onboarding을 ByokVault 탐색 그룹 아래 중첩

    두 개의 호스트 관리자 페이지 (/admin/model-catalog, /admin/model-onboarding)

  • Fixed
    52-Q-MODEL-SYNC-DEDUP: 검색에서 날짜 스냅샷 모델 변형 건너뜀

    검색이 정확한 ProviderModelId/ModelKey로만 일치하여 날짜별 프로바이더

  • Changed
    52-Q-CHAT-EFFORT-UX-LOCALE: effort 잠금 문구 + 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 피드 + slug별 뷰어); CommunityListingAppService + MyCommunityListingController…

  • Fixed
    52-Q-CHAT-AUDIO-BRIDGE: 업로드된 오디오 전사 + 오디오 플레이어 수정

    채팅의 오디오 첨부 파일이 손상되었으며, 실제 근본 원인은 다음과 달랐음

  • Fixed
    52-Q-CHAT-CONTEXT-SLASH: 컨텍스트 오버플로 모드 유지 + 정직한 UX 슬래시 프리셋

    PART 1 — 채팅 헤더 "Context overflow handling" 드롭다운이 다음 상태에서 고착됨

  • Fixed
    52-Q-BUDGET-BUILD: 제거된 BudgetBucketCacheItem.DailyKey를 참조하는 고아 IsCurrentMonth 제거

    일일 한도 제거 (84178afab)로 BudgetBucketCacheItem에서 DailyKey/MonthlyKey가 삭제됨

  • Changed
    52-Q-SMOKE-INTEG: Mongo 바닥 정상화 (AiModels dup _id + UoW txn 수명) + ResolveAsync 전송 격리 통합 테스트

    Part 1 — MongoDB 통합 테스트 바닥을 정상화.

  • Changed
    52-Q-CHAT-EFFORT-LOCALE: ChatComposer:Effort 키 7개를 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/h 및

  • 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: 실시간 + 추론 라우팅 분류 잠금 (no-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 실제 근본 원인 (라이브 브라우저 테스트로 발견): chat-attachment 이미지

  • Changed
    slice52-Q-AUDIT: 파이프라인 중요 버그 감사 로그 — C1 DI-cycle 수정됨, M1 Quartz 처방, 파이프라인별 TODO

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

  • Fixed
    slice52-Q-QUEUE-DI-CYCLE: 지연된 워크플로우 실행 도구 의존성을 통해 대기 디스패처 DI 사이클 해소

    IQueuedRequestDispatcher 해결 시 시작 시 스택 오버플로 발생 (잡히지 않는 —

  • Fixed
    slice52-Q-LOG-ROLLING: Serilog 파일 싱크 롤링 + 한도 설정 (1 GB에서 자동 종료되던 문제 수정)

    Host 런타임 싱크 (appsettings.json)와 부트스트랩 로거 모두

  • Fixed
    slice52-Q-CHANGELOG-IDEMPOTENT: ExternalId가 아닌 Slug로 changelog 시드 키 설정 (영구적 E11000 수정)

    반복적 근본 원인: ChangelogBackfillDataSeedContributor가 다음으로 멱등성을 검사함

  • Changed
    slice52-Q-CHANGELOG: 스프린트 changelog 백필 + 29-로케일 키 (93개 새 스프린트)

    main에서 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 + voice-realtime 능력 시드 + join

    EnBillingSource.RealtimeVoice + voice-realtime 능력 시드 + join

  • 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 Rule 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: chat pipeline + 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을 호출합니다.

  • 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)를 실제 복합 연결로 닫습니다.

  • 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) 패턴을 미러링합니다.

  • 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 기반).

  • Added
    slice50-QQQ: ChatAttachment 영속성 — 제로 삽입 미스터리 가시성

    범위 발견: ChatPipelineAppService.cs:1415의 연결이 이미 호출하고 있습니다.

  • Added
    slice50-SSS: 가시성 로깅 스윗 — Bunny + OpenAI + ChatPipeline

    운영 장애의 전체 콘텍스트를 확인할 수 있도록 5개 구조적 로그를 추가했습니다.

  • Added
    slice50-NNN: InAppAssistant 세션 — 빈 세션 자동 정리 + 행별 X 삭제

    버블에 빈/원치 않는 세션이 쌓이는 문제를 두 가지 방식으로 수정했습니다.

  • Added
    slice50-YY-2: InAppAssistant Bubble — 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` 파라미터 제거 (deprecated 400)

    운영 로그:

  • Fixed
    slice50-GGGG: 이미지 편집 PUT — XHR Bearer 헤더 + 마스크 로케일 키 누락

    사용자가 /me/image 편집의 소스 업로드와 마스크 업로드 모두 문제라고 보고했습니다.

  • Added
    slice50-FFFF: 라이브러리 날짜 그룹화 + 그리드/목록 보기 템플릿 연결

    최종 라이브러리 모듈 슬라이스.

  • Changed
    slice50-EEEE: 라이브러리 일괄 업로드 — 단일 성공 배너, 파일별 깨바력 없음

    사용자 피드백: 녹색 '업로드 완료.' 배너가 켜지다 꺼졌다 깨바보았습니다.

  • Fixed
    slice50-DDDD: AbpStudioClient 모듈 제거 — 업로드 스트림 충돌의 근본 원인

    Sprint 50-CCCC에서 업로드 파이프라인 ObjectDisposedException 수정을 시도했습니다.

  • Fixed
    slice50-CCCC: 라이브러리 업로드 스트림 + 파일별 오류 보고

    지속적인 '업로드 실패' 토스트의 근본 원인 — 파일이 실제로 전송되었음에도 발생.

  • Added
    slice50-BBBB: 라이브러리 휴지통 모드 UX + 비디오 최대 높이 + md 백필 + 마크다운 렌더링 + 업로드 카운팅

    사용자가 다섯 가지 별도 문제를 보고했습니다.

  • Added
    slice50-AAAA: CDN 퍼지 outbox + 먘비스톤 워커 + 휴지통 UI

    사용자가 라이브러리에서 part_001.wav / part_002.wav를 삭제했지만 여전히 보인다고 보고했습니다.

  • Added
    slice50-ZZZ: 라이브러리 미리보기 스피너 수정 + 일괄 삭제 UI

    50-YYY에서 회귀가 남았습니다: openAssetDetail이 텍스트 사전 로드만 트리거했습니다.

  • Added
    slice50-YYY: 라이브러리 Document 종류 + 인라인 텍스트 미리보기 + 모달 정리

    사용자가 .md / .txt 파일 업로드 후 Documents 탭이 비어 있다고 보고했습니다.

  • Added
    slice50-XXX: 라이브러리 비공개 읽기 — 백엔드 스트림 프록시

    CDN 공개 URL 패턴이 /me/library에서 올바르지 않았습니다 — 콘텐츠는 사용자별로 비공개입니다.

  • Fixed
    slice50-WWW: Bunny 개발 오버라이드 동기화 + 라이브러리 업로드 카운팅 진실

    한 번의 테스트에서 4개 파일이 녹색 배너로 '업로드됨'으로 표시됩니다. 하지만 라이브러리 페이지는 0개 항목으로 남아 있는 두 가지 버그.

  • Added
    slice50-VVV: 라이브러리 일괄 업로드 풍부한 진행률 UI

    사용자: '업로드 작업에 프로그레스 바를 추가해 주세요, 몹 초가 걸리는지, 어떤 파일이 업로드뤌는지 알 수 있게요.'

  • Fixed
    slice50-UUU: .md octet-stream 폴백 + Bunny 업로드 상세 로깅

    /me/library 테스트에서 두 가지 사용자 차단 문제가 발생했습니다.

  • Fixed
    slice50-TTT: 라이브러리 업로드 MIME 허용 — 목적별(이미지 전용 vs 라이브러리 혼합)

    사용자가 All 탭에서 비이미지 파일 업로드 후 400 '이 엔드포인트는 image/* MIME 타입만 허용합니다'를 보고했습니다.

  • Fixed
    slice50-RRR: Redis 타임아웃 5s → 15s — ABP 로케라이제이션 HMGET 쾐스케이드 수정

    사용자가 Message Citations 관리자 500 '내부 오류'를 보고했습니다.

  • Fixed
    slice50-PPP: Bunny Media 저장소 자격 증명 — 대시보드와 동기화

    사용자가 라이브러리 업로드 'Bunny 스토리지 HTTP 401 실패'를 보고했습니다.

  • Fixed
    slice50-OOO: DALL-E 3 이미지 생성 400 — response_format 파라미터 제거

    사용자가 /me/image Generate 실패를 보고: '이미지 생성 프로바이더 오류'.

  • 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 이후에도 패널이 FAB에서 분리된 상태로 열린다고 보고했습니다.

  • Fixed
    slice50-KKK: 채팅 제목 생성 — ReasoningEffort=low + 1024 토큰 상한 (50-CCC 후속)

    Sprint 50-CCC에서 MaxOutputTokens를 24 → 128로 올렸습니다.

  • Added
    slice50-AAA: IUserActivityRecorder 크로스 모듈 레코더 — 채팅 턴에 대한 /me/activity-history 채워짐

    사용자가 채팅/이미지/음성 등 몇 시간 사용 후에도 /me/activity-history가 비어 있다고 보고했습니다.

  • Fixed
    slice50-CCC: 채팅 제목 회귀 + 최신 스크롤 버튼 가시성

    두 가지 사용자 테스트 회귀가 발견되어 수정되었으며, 세 번째 우려 사항은 다음으로 연기되었습니다.

  • Fixed
    slice50-BBB: InAppAssistant + Agent 관리자 메뉴 감사 — 관리자 역할 모듈 권한 시드 (1건 수정, 14/14 메뉴 차단 해제)

    | # | 메뉴 | 그룹 | Angular 경로 | 백엔드 경로 | 상태 | 원인 |

  • Fixed
    slice50-GGG: /me/library 일괄 업로드 — 다중 파일 선택

    사용자: '라이브러리에 파일을 추가할 때 왜 하나씩 수동으로 추가해야 하나요'

  • Fixed
    slice50-FFF: /me/image 편집 탭 — 마스크 PC 업로드(Bunny presign)

    사용자: '소스에는 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가지를 처리했습니다.

  • Added
    slice50-WW: MarketplaceRoyaltyPayoutCalculator — 일일 크리에이터 로열티 분배 (Plan §2.1 #7)

    일일 AsyncPeriodicBackgroundWorker(24시간 틱)가 지급된 항목을 처리합니다.

  • Added
    slice50-XX: AdAuction Bid/Impression/Click/Conversion 타입 FK 컴럼 + 인덱스 (Plan §2.2 / 50-VV-2)

    Sprint 47-O에서 조인 FK 없이 평탆한 AdAuction 엔티티를 생성했습니다.

  • Added
    slice50-UU: KeywordSettlementJob — Spot/Reserve/Futures 일일 정산 (Plan §2.1 #6)

    일일 ABP AsyncPeriodicBackgroundWorker(24시간 틱)가 대기 중인 항목을 처리합니다.

  • Added
    slice50-VV: AdAuction RTB 소비자 스캐폴드 + 일차가격 청산 (Plan §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 비정규화 (Plan §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 레거시 인덱스 삭제 스크립트 (Plan §2.1 #8)

    Sprint 47-A..47-P MT 스윗에서 모든 엔티티에 TenantId 접두사 복합 인덱스를 추가했습니다.

  • Fixed
    slice50-FF: InAppAssistant + Telemetry + EventBus + Persona 모듈 그룹 마이그레이션

    Sprint 49 시리즈 완료.

  • Changed
    slice50-GG: 출시일 테넌트 백필 DBA 스크립트 (Plan §2.4)

    출시 전 R2 위험: Sprint 47-A..47-P에서 219개 이상의 엔티티를 점검했습니다.

  • Added
    slice50-EE: IBillingRecorder.RefundAsync 형제 음수 레코드 확장

    Sprint 50-U에서 누락이 발견됨: IBillingRecorder에 RecordAsync만 있었습니다.

  • Changed
    slice50-CC: subscription + agent + persona 테넌트 격리 테스트

    Plan §2.3 / R1 감사 — Sprint 47-A...47-P에서 219개 이상의 엔티티를 점검했습니다.

  • Changed
    slice50-DD: ImageEdit 파이프라인 + InAppAssistant Bubble 승인 속성

    Plan §2.5 백로그: 22개 ImageEdit 파이프라인 키를 전파했습니다.

  • Fixed
    slice50-BB: outbox MessageKey 충돌 7개 emit 사이트 전체 점검

    Sprint 50-K에서 한 건의 충돌(구독 플랜 Paddle 설정)을 발견했습니다.

  • Added
    slice50-W: BillingReconciliationJob — Paddle↔로컈 불일치 일일 감사

    Phase 1.5 §2.1 #3 — 세 번째 백그라운드 워커.

  • Added
    slice50-X: PaddleSyncWorker — 주기적 구독 상태 중복 확인

    Phase 1.5 §2.1 #4 — 네 번째이자 마지막 출시 전 백그라운드 워커.

  • Fixed
    slice50-Z: RunInputUploadAppService TypePredicate 누락 (49-B 후속)

    /api/app/run-input-upload가 404를 반환했습니다. AppService가 등록되지 않았기 때문입니다.

  • Added
    slice50-Y: 이미지 편집 Capability 시드 + gpt-image-1 AiModelCapability + 가격 링크

    Sprint 50-P에서 /me/image 편집 탭 UI + 백엔드 연결을 구현했으나 추가 작업이 남아 있었습니다.

  • Fixed
    slice50-S: UTC 타임스탬프에 Z 붙이기 — 백엔드 직렬화기 + Mongo 콘벤션

    프론트엔드(Angular | date pipe + Date 생성자)가 UTC → 로컈 변환을 담당합니다.

  • Added
    slice50-U: VideoJobPollingWorker — Sora-2 IHostedService 강화

    Phase 1.5 §2.1 — 최우선 백그라운드 워커.

  • Added
    slice50-V: DunningAttemptScheduler — Paddle 연체 재시도 미러

    Phase 1.5 §2.1 #2 — 두 번째 백그라운드 워커.

  • Fixed
    slice50-Q: InAppAssistant SSE 소비자 + 취소 UX + 재시도 가드

    사용자가 '폼 채우기' 후속 요청에서 '메시지 전송 실패'가 반환된다고 보고했습니다.

  • Fixed
    slice50-T: 채팅 클립보드 붙여넣기 + memory_forget 빈 본문

    버그 A: 채팅 작성기에서 클립보드 이미지에 대한 Ctrl+V가 무시되었습니다.

  • Fixed
    slice50-R: /marketplace 레이아웃 — 외부 lpx-content-container 제거

    마켓플레이스 탐색 페이지(angular/src/app/marketplace/)에 이중 컨테이너가 있었습니다.

  • Fixed
    slice50-P: /me/image 편집 탭 동일성 + 반응형 버튼 행

    편집 탭에 모델 선택(Auto/Manual), 품질 설정이 누락되어 있었습니다.

  • Fixed
    slice50-N: InAppAssistant FAB 기본값 → 좌측 하단 + 패널 앵커 수정

    사용자가 Sprint 50-I 기본값(bottom:96 right:24)이 다른 요소와 격친다고 보고했습니다.

  • 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 이후 발견된 두 가지 UX 회귀를 수정합니다.

  • Fixed
    slice50-K: 두 번째 플랜 Paddle 저장 시 outbox MessageKey 충돌

    관리자가 SubscriptionPlan의 Paddle 설정을 저장했을 때 첫 번째 저장은 성공했습니다.

  • Fixed
    slice50-J: 청구 내역 — 금액 필드에만 $

    /me/billing의 비용 내역 표에서 모든 값에 $ 접두사를 붙이고 있었습니다.

  • Fixed
    slice50-H: 채팅 파이프라인 경로 마이그레이션 + /me 메뉴에 Chat 추가

    Sprint 49-B에서 채팅 파이프라인에 하드코딩된 /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 순서 + 드래그/도킹 가능한 버블 (중요)

    수정 A (서버 중요 버그):

  • Fixed
    slice50-C: /me/billing 드롭다운 렌더링 + 탭 콘텐츠 비어 있음 (중요: UX)

    사용자 보고: SourceKind 드롭다운이 이상한 분홍/파란 블록으로 표시됨 (손상된 렌더링).

  • Fixed
    slice50-A: 알림 + 활동 센터 벨 아이콘이 관리자 레이블과 격치지 않도록 수정

    사용자 피드백: 두 개의 부동 벨(알림 벨 + 활동 센터)이 격쳐 있었습니다.

  • Fixed
    slice47-J: subscription 분리 #2 최종 — Subscription/Invoice/BYOK/QueuedRequest IMultiTenant (Phase 2 중요)

    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 중요: 금액)

    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 고위험)

    Sprint 45-M + 47-A ~ 47-K 패턴 적용.

  • Fixed
    slice47-K: authoring 분리 #1 MT 감사 수정 — 워크플로 생태계 IMultiTenant (Phase 2 고위험)

    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 고위험)

    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 고위험)

    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 고위험)

    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 패턴 적용: JSON에서 IsMultiTenant: true임에도 Suite가 Base 클래스에 IMultiTenant를 적용하지 않았습니다.

  • Added
    slice56-57-58: capability-first routing + Authoring stub fix

    Slice 56 — IModelRoutingService (ByokVault.Application + Contracts):