Conversation
Pre-registers the Browser skeleton in Musebase.sln so parallel platform agents never touch shared files (sln/ci). Android stays out of the sln until the android workload lands in CI. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
- StateBroadcaster: 최신 상태 보관 + 전체 WS 클라이언트 JSON 방송, 신규 접속 시 현재 상태 즉시 1회 전송. Publish(PlaybackViewState) 공개 API로 Windows 앱이 LyricsCoordinator.StateChanged를 직접 물릴 수 있음. 느린 클라이언트는 bounded channel(DropOldest)로 격리. - 엔드포인트: GET /healthz, WS /ws, wwwroot/ 정적 서빙. 기본 포트 5123 (--urls / ASPNETCORE_URLS로 재정의). - --demo: 자작 샘플 가사 4줄(카라오케 마크, 마지막 줄은 마크 없음)을 5초 간격 순환 방송 + 사이클마다 IsPlaying=false 1회로 숨김 검증. - wwwroot/index.html: 외부 CDN 없는 단일 파일 디스플레이. WS 자동 재접속, LineStartedAt 앵커 + Karaoke 마크 rAF 로컬 보간 (canvas measureText로 글자 채움 픽셀 계산), Karaoke null 단색, IsPlaying=false 페이드 숨김, 수신 시각-LineStartedAt 시계 오차 1회 보정. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
.NET for Android(net8.0-android) 헤드 스캐폴드 + 재생 감지 스파이크. Musebase.sln에는 넣지 않음(워크로드 없는 머신/CI 보호). - MediaListenerService: NotificationListenerService — 알림 접근 권한 앵커 (BIND_NOTIFICATION_LISTENER_SERVICE 서비스 선언은 특성에서 생성) - AndroidNowPlayingSource: INowPlayingSource의 Android 구현 — MediaSessionManager.GetActiveSessions + OnActiveSessionsChangedListener, 재생 중 세션 우선 선택, 콜백+500ms 폴링, 위치 보간(1초 미만 역행 흡수) - MainActivity: 스파이크 UI — 권한 설정 버튼 + 곡명/아티스트/위치/소스앱 1초 갱신 - README: 환경 확인 결과(워크로드 설치됨, JDK/SDK 없음 → XA5300)와 InstallAndroidDependencies 기반 사용자 설치 절차, 사이드로드 테스트 절차 C# 소스는 Mono.Android(API 34) 참조 어셈블리 대상 경고 0 컴파일 검증 완료. APK 산출은 JDK 17 + Android SDK 설치 후 가능. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
feat(browser): PlaybackViewState WS broadcast + web display (Phase 1)
feat(android): MediaSession now-playing spike (Phase 2)
…ndroid.Widget using Found on first real APK build (JDK/SDK installed via InstallAndroidDependencies). APK builds clean: 0 warnings, 0 errors. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
…d at launch Debug default (Fast Deployment) leaves assemblies out of the APK; manual sideload then crashes on startup. EmbedAssembliesIntoApk=true always. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
- POST /ingest: anonymous opt-in event batches (validated types/sizes, no IP stored), GET /stats: public 30-day aggregates, GET /healthz - D1 schema: events table + indexes (raw retention 90d planned) - Deployed: https://musebase-telemetry.musebase.workers.dev Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
…act, ITelemetry seam - ADR-0004: opt-in dual-tier anonymous telemetry, self-hosted backend - TELEMETRY.md: user-facing full disclosure (ko/en) linked from settings later - contracts/telemetry-events.md: wire format + event/props table (v1) - Musebase.Engine.ITelemetry + NoopTelemetry + TelemetryEvents constants (stable seam so core/windows agents can build against it in parallel) Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
…ation, client-side feature_use aggregation) Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
…_lyrics/playback_source/translation
contracts/telemetry-events.md(v1)에 따라 코어 계측 훅을 발화한다(ADR-0004).
동의 관리·큐잉·전송은 플랫폼 ITelemetry 구현 책임 — 코어는 Noop 기본값으로 무수집.
- LyricsEngineFactory.Create에 선택 매개변수 ITelemetry? telemetry 추가
(기본 null → NoopTelemetry, 기존 호출부 무수정 컴파일 유지).
BuildTranslation이 EngineId를 채워 translation 이벤트의 engine 식별에 사용.
- lyrics_search(①): 검색 1회당 소스별 hit/latencyMs(SearchDiagnostics 집계),
채택 소스(winner, 없으면 "none"), cached, cleanedQueryUsed(정제 변형 채택 여부).
곡 제목/아티스트는 절대 포함하지 않음. 캐시 적중 시 cached=true·perSource={}.
- lyrics_not_found(②): 모든 소스 전패 시 title/artist와 함께 발화.
- wrong_lyrics(②): MarkWrongLyrics 시 title/artist + 채택됐던 소스 id.
- playback_source(①): 트랙 변경 시 TrackInfo.SourceAppId — 같은 트랙 반복
통지(SMTC 재발화 등)는 억제, 일일 디바운스는 클라이언트 책임.
- translation(①): 곡당 1회(실번역이 필요했던 첫 완료 시점) — engine,
cacheHitPct(0–100 정수), linesBucket(1-10/11-50/51+). TranslationRunStats 집계.
- 테스트 5건 추가(FakeTelemetry): 검색 성공/전패 필드 검증, wrong_lyrics,
playback_source 중복 억제, translation 캐시 적중률·버킷. 전체 87건 통과.
계약·Worker 화이트리스트·TELEMETRY.md와 어긋남 없음(이벤트 type/props 문서 그대로).
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
- Services/TelemetryClient.cs: Musebase.Engine.ITelemetry 구현. 옵트인 2단계 게이트(꺼짐 = 수집 자체 안 함), 익명 clientId(최초 켜짐 시 랜덤 GUID 생성·재설정 API), 로컬 JSONL 큐(상한 500건), 시작 30초 후 + 6시간 주기 배치(≤100건) 업로드(실패 시 큐 보존). 클라이언트 집계: playback_source는 appId별 하루 1회 디바운스, feature_use는 세션 카운터 → 업로드 시 집계 이벤트, app_session은 하루 1회(일일 ping 겸용). - TelemetryConsentWindow.cs: 최초 1회 동의 다이얼로그(체크박스 2개 기본 꺼짐, ②는 곡 제목·아티스트 포함 명시, TELEMETRY.md 링크). - SettingsWindow [일반] 탭 "사용 통계" 섹션: 토글 2개(즉시 반영) + 수집 항목 링크 + 익명 ID 재설정 버튼. - 앱 수준 이벤트 배선(Program.cs): app_session(uiLang/targetLang/engine/ sources/sourceMode/osVersion 대분류), playback_source(TrackChanged), feature_use(search/edit/export/offset/mediaControls 카운트), error(Dispatcher+AppDomain 비처리 예외 → kind/frame/fatal, 메시지·경로 금지). - i18n: en/ko 카탈로그에 동의·설정 문구 추가(나머지 언어는 en 폴백). 엔진 계측 연결(LyricsEngineFactory.Create에 ITelemetry 주입)은 core PR 머지 후 오케스트레이터가 통합한다. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
… platform heads Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
feat(core): telemetry instrumentation (search/translation/playback/wrong-lyrics)
feat(windows): telemetry client, consent dialog, settings toggles
…mentation) Drops the app-level playback_source handler — the coordinator now emits it and the client still debounces per appId per local day. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
…overview wrong_lyrics / lyrics_not_found grouped by song (frequency-sorted), event totals, platform/version distribution. Auth via ADMIN_TOKEN worker secret; 401 without it. noindex. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
…g-lyrics - Periodic upload interval 6h -> 1h - wrong_lyrics triggers an upload after a 3s coalescing delay so quality reports appear on the admin page right away - SemaphoreSlim gate prevents overlapping periodic/immediate uploads (no duplicate batches) Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
…s, tag scheme) Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Promotes beta to master for the first Musebase-branded release:
🤖 Generated with Claude Code