From 7499b4e70921204061cee58cd29a1db3ce4d5bf0 Mon Sep 17 00:00:00 2001 From: seonghobae Date: Tue, 25 Aug 2026 14:35:41 +0900 Subject: [PATCH 01/94] docs: add product-technical gap baseline (spec/PRD/TRD/UML gaps + open-PR analysis) Derives the functional specification, PRD/TRD deltas, and UML supplements from ADRs (ARCHITECTURE.md, docs/plans), brand story, security policy, and current code state; explicitly includes the open PR series inventory and classifies remaining gaps into a prioritized buyer-visible backlog with acceptance criteria. All code claims were verified against develop@acdbea63 via grep/read; verification commands are recorded in section 9 for future loop runs. --- docs/product-technical-gap-baseline.md | 303 +++++++++++++++++++++++++ 1 file changed, 303 insertions(+) create mode 100644 docs/product-technical-gap-baseline.md diff --git a/docs/product-technical-gap-baseline.md b/docs/product-technical-gap-baseline.md new file mode 100644 index 000000000..f436c10fb --- /dev/null +++ b/docs/product-technical-gap-baseline.md @@ -0,0 +1,303 @@ +# BandScope Product-Technical Gap Baseline + +Last updated: 2026-08-25 +Base revision: `develop@acdbea63` (fix(security): projectId path guard, npm HIGH CVEs, Foote novelty sign) + +## 1. 목적과 범위 (Purpose & Scope) + +이 문서는 ADR/설계 문서(`ARCHITECTURE.md`, `docs/plans/*`), 브랜드 소스(`docs/brand-story.md`), 보안 소스(`docs/security/app-security.md`), 그리고 현재 저장소 상태(코드, 열린 PR 약 130건, 열린 이슈)를 대조하여 다음을 한 곳에 모은 baseline이다. + +- 기능 명세(functional spec)와 PRD/TRD로 승격되지 않은 요구사항의 공백 +- 구현된 코드와 문서가 선언하는 제품 범위 사이의 기술 Gap +- 누락된 UML/다이어그램 산출물 +- 구매자가 체감하는 제품 Gap 우선순위 Backlog + +범위에는 현재 열려 있는 PR 세트를 명시적으로 포함한다. 특히 `feat(workspace): name tonight's first X on the map` 시리즈는 아직 merge되지 않았으므로, 이 문서에서는 해당 시리즈가 착지했을 때 남는 Gap까지 함께 기술한다. + +검증 원칙: 본 문서의 코드 관련 주장은 전부 실제 repo에 대해 `grep`/`glob`/파일 read로 확인했다. 확인 방법은 9장에 재실행 가능한 명령으로 남긴다. + +## 2. 현행 제품 명세 스냅샷 (Current Product Specification Snapshot) + +`ARCHITECTURE.md`와 `docs/brand-story.md` 기준, BandScope는 오늘날 다음을 지향한다. + +- 퇴근 후 합주 준비자를 위한 local-first 데스크톱 앱(Tauri + Vite + React) +- 곡 보기(song view): 섹션별·연주 역할별 추정 화성, 폼(form)/그루브(groove) 큐, 스템(stems), 연주 가능 음역(playable ranges), 단순화 가이드(simplification), 전조/카포/튜닝/셋업 큐, 파트 겹침(part-overlap) 경고, 가시적 신뢰도(confidence), 리허설 우선순위 +- 분석 대상 모델은 곡 전체 코드 트랙이 아니라 `song -> section -> role` 계층이며, role은 악기/보컬 기능/손(hand) 단위까지 확장될 수 있다 +- 자동 분석 결과는 편집 가능하고, model-generated vs user-confirmed provenance를 유지해야 한다 + +아키텍처 개요: + +```mermaid +flowchart LR + subgraph Desktop["apps/desktop (Tauri + Vite + React)"] + UI["React UI
features/workspace, player,
ranges, chords, score, settings"] + Shell["src-tauri/src/main.rs
9개 typed Tauri command"] + Core["core/src/lib.rs
URL/경로/프로젝트 페이로드
검증 헬퍼 (분석 연산 없음)"] + end + subgraph Engine["services/analysis-engine (Python)"] + CLI["cli.py / api.py
stdin/stdout JSON IPC"] + Mods["chords / sections / roles /
ranges / temporal / separation /
transcription / exports"] + Sep["separation/audio_separator.py
Demucs htdemucs (CPU)
bandsplit-v1.json 폴백"] + end + Rust["services/analysis-engine/rust
bandscope_numeric (PyO3/maturin)
checkerboard_novelty + viterbi_decode"] + Types["packages/shared-types
song-section-role 계약
confidence/provenance/cue/export"] + + UI -- "typed Tauri IPC" --> Shell + Shell --> Core + Shell -- "allowlisted subprocess
stdin/stdout JSON" --> CLI + CLI --> Mods + Mods --> Sep + Mods -. "Rust 커널 호출,
Python 참조 구현 폴백" .-> Rust + UI --- Types + Mods --- Types +``` + +핵심 구조적 사실(코드 확인 완료): + +- 로컬 오케스트레이션은 loopback HTTP가 아닌 typed Tauri IPC + stdin/stdout JSON 서브프로세스 방식이다 (`ARCHITECTURE.md`, `src-tauri/main.rs`) +- `apps/desktop/core`(Rust)는 분석 연산이 아니라 입력 검증(YouTube URL, project payload, score PDF source, 경로 가드) 담당이다 (`apps/desktop/core/src/lib.rs`) +- 무거운 수치 커널 중 checkerboard novelty와 Viterbi 디코딩만 `bandscope_numeric`(Rust/PyO3)으로 포팅되어 있고, 나머지는 Python/NumPy 참조 구현이며 `tests/test_numeric_parity.py`로 f64 parity를 잠근다 (`_native.py`) +- 스템 분리는 Demucs `htdemucs`를 CPU로 돌리고 플랫폼 게이트(demucs/torch 미설치 플랫폼은 불가)이며, 주파수 컷오프만 정의한 `bandsplit-v1.json` 휴리스틱 밴드스플릿 manifest가 별도로 존재한다 (`separation/audio_separator.py`, `separation/model_weights/bandsplit-v1.json`) +- 협업 타입(assignments/comments/approvals)은 `packages/shared-types`에 정의만 되어 있고 UI 참조가 전혀 없다 (grep 확인) + +## 3. 기능 명세 및 요구사항 도출 (Functional Spec Derivation) + +제품 능력 -> 구현 위치 -> 성숙도 매핑. 성숙도: 구현됨 / 부분구현 / 미구현. + +| 제품 능력 | 구현 위치 | 성숙도 | +|---|---|---| +| 로컬 오디오 임포트(Rust 검증 + app-owned 루트) | `apps/desktop/src-tauri/src/main.rs`, `apps/desktop/core/src/lib.rs` | 구현됨 | +| YouTube 임포트(정책 제약, 실패 폴백) | `services/analysis-engine/src/bandscope_analysis/youtube.py` | 부분구현 (DRM/로그인 우회 없음, 실패 시 안내 카드는 PR 진행 중) | +| 스템 분리 | `separation/audio_separator.py` (htdemucs CPU), `bandsplit-v1.json` | 부분구현 (플랫폼 게이트, x86 macOS 미지원, GPU 없음) | +| 섹션 세그먼테이션(checkerboard novelty) | `sections/segmenter.py` + `bandscope_numeric::checkerboard_novelty` | 구현됨 | +| 섹션별 화성(HMM + Viterbi) | `chords/chord_recognizer.py`, `chords/section_harmony.py` | 구현됨 (hand-tuned prior 수준, 4장 참조) | +| 화성 기능 라벨/설명 | `chords/function_analyzer.py`, `RehearsalRole.harmonicExplanation?` | 부분구현 | +| 역할(role) 추출 및 역할별 조율 | `roles/extractor.py`, `roles/tuning.py` | 부분구현 (주파수 컷오프 휴리스틱 기반) | +| 음역/가압(range pressure) | `ranges/analyzer.py`, `ranges/pressure.py`, `ranges/pitch_tracker.py` | 구현됨 | +| 파트 겹침 경고 | `roles/overlap.py`, `RehearsalRole.overlapWarnings` | 구현됨 | +| 단순화 가이드 | `roles/priority.py` 연계, `RehearsalRole.simplification` 필드 | 구현됨 (문자열 필드 중심) | +| 전조/카포/튜닝 큐 | `chords/transposition.py`, `chords/capo.py`, `roles/tuning.py` | 구현됨 (계산), 워크스페이스 노출은 PR 진행 중 | +| 그루브/타이밍/히트 큐 | `temporal/groove.py`, `temporal/hits.py`, `temporal/stability.py` | 구현됨 | +| 진입/이탈/카운트/가사 큐 앵커 | `sections/anchors.py`, `CueAnchorKind = lyric\|count\|transition` | 부분구현 | +| 신뢰도 표시(section/role 수준) | `ConfidenceMarker(low/medium/high)` + `features/workspace/ConfidenceBadge.tsx` | 구현됨 | +| 리허설 우선순위 | `roles/priority.py`, `RehearsalPriority`, `PracticeProgress.tsx` | 구현됨 (규칙 기반 휴리스틱) | +| 수동 수정 + provenance | `ManualOverride[]`, `ProvenanceSource = model\|user` | 구현됨 | +| 내보내기(cue-sheet CSV, chart JSON) | `exports/chart.py`, `src/lib/export.ts` (filename sanitize, CSV escape) | 구현됨 | +| 악보(score) 보기 | `features/score/ScoreView.tsx`, `ScoreViewer.tsx`, `pdfjs.ts` | 부분구현 (PDF 뷰잉; PDF 바이트 검증은 PR 진행 중, 자동 채보 없음) | +| 루프 재생/역할별 재생 제어 | `features/player/index.tsx` | 미구현 (loop 미탐지, PR #903/#971 진행 중) | +| 협업(assignment/comment/approval) UI | `packages/shared-types` 타입만 존재 | 미구현 (UI 참조 0건; PR 시리즈가 첫 화면 진행 중) | +| pad/solo/riff/hook/fill/voicing/articulation/dynamics/tuning/capo/vamp 등 plan 필드 | 없음 (shared-types에 미존재) | 미구현 (PR 시리즈가 추가 예정) | +| 라이선싱/데모곡 first-run | 없음 | 미구현 (PR #1009, Issue #963/#964) | +| 자동 저장/crash-safe 프로젝트 포맷 | 없음 | 미구현 (Issue #961) | +| 서명/공증 배포+롤백 증적 | `.github/workflows/release.yml` 존재 | 부분구현 (Issue #960) | + +## 4. 현재 열린 PR 기반 Gap 분석 (Open-PR Gap Analysis) + +현재 open PR은 130건이다(`/tmp/opencode/open_prs_full.txt`, 2026-08-25 기준). 대부분은 동일 패턴의 시리즈다. + +시리즈 패턴: `feat(workspace): name tonight's first X on the map` — 워크스페이스 맵에 "오늘 밤 첫 X" next-action 카피를 올리고, Open 클릭 시 해당 섹션으로 이동. 각 PR은 role-owned plan 필드(예: `padPlan`)를 shared contract에 추가하고, own data-property descriptor 검증(Proxy `get` trap 방어), 한국어 조사 안전 카피(`패드`, `뱀프` 등), reduced-motion 처리, 그리고 강한 merge-gate 조항을 포함한다. + +capability cluster 분류와 착지 후 남는 Gap: + +| Cluster | 해당 PR (예시) | 착지가 의미하는 것 | 착지 후 남는 Gap | +|---|---|---|---| +| A. 역할별 연주 plan 필드 (pad/solo/riff/hook/fill/voicing/articulation/dynamics/tuning/capo/vamp) | #1020, #1013~#1018, #1021, #1024 | RehearsalRole 계약 확장과 첫 plan 노출. 데이터 생성기(engine)가 실제로 이 plan을 산출하는지와는 별개 | plan 값을 만들어내는 엔진 로직, plan 간 충돌/우선순위 정책, plan 편집 UX | +| B. 폼/섹션 네이밍 (intro/verse/pre-chorus/chorus/bridge/outro/tag/pickup/stop/handoff/entrance/dropout/lyric cue/transition/transition-cue/count) | #943, #947, #955, #939, #946, #986, #989, #916, #934, #937, #912, #914, #913, #994, #993, #995 | SECTION_FORM_LABELS와 CueAnchorKind가 이미 계약에 있으므로 주로 UI 노출 완성 | 앵커 정확도(가사/카운트 정렬), 사용자 직접 앵커 편집 | +| C. 화성 설명/확정/귀확인 (harmonic function/explanation/confirmed chord/ear check/setup note/transposition/part handoff/playable range/overlap/groove/simpler take/tempo-starting chord setup) | #1005, #1003, #1002, #1001, #1004, #1006, #1007, #957, #992, #991, #990, #987 | brand-story의 "추정 + 귀로 확인" 프레임을 UI 언어로 구체화 | confidence 산출 근거의 정량화, confirmed override의 재분석 반영(round trip, Issue #739) | +| D. 협업 최소면 (assignment/comment/approval/blocked/pending/open comment/export-priority actions/ready board) | #996, #997, #998, #1000, #900, #901 | shared-types의 collaboration 타입에 처음으로 UI가 붙음 | 동기화(syncMode local_only/planned_cloud), crash-safe 프로젝트 포맷(Issue #961), 권한 모델 | +| E. First-run/activation/실패 복구 (first-run card/license demo song/local intake 실패/import 실패/analysis 실패/save 실패/help) | #974, #1009, #981, #982, #976, #984, #972, #898 | 빈 상태/오류 상태의 next-action 카피 완성 | 라이선싱 백엔드, 데모곡 번들 정책, 오프라인 활성화 | +| F. 보안/신뢰경계 (log redaction x4, quick-xml RustSec, filesystem authority, canonical audio policy, CSV NUL/전각 우회 차단, credential drop, PDF bound reads, npm baseline) | #956, #951, #950, #949, #948, #858, #985/#781, #941, #894, #865, #783 | app-security.md 규칙의 코드 반영 마무리 | Issue #852(경계 재구축), #542(예외 추적), 모델 artifact checksum/signature 파이프라인 | +| G. 성능 (Bolt 시리즈: 관측 확률 벡터화, GrooveMap maxTime O(1), chart dedupe O(N), chord change count O(1), checkerboard/HMM 벡터화) | #999, #859, #849, #834, #746, #732 | 핫패스 최적화. Rust 커널 포팅과 같은 방향의 Python 측 보완 | Demucs GPU/offload, 대용량 파일 스트리밍, UI 가상화 | +| H. 접근성/디자인 시스템 (tooltip aria-disabled, icon tooltip, Storybook tokens, Figma drift check) | #833, #731, #897, #969 | WCAG 대응 시작점 | Issue #965(Figma/Storybook/shipped UI 정합 + WCAG 2.2 AA gate) 전체 | +| I. 테스트 현실성 (decoded WAV acceptance, known-take chord recovery, real YouTube known-stem benchmark, branch coverage) | #892, #891, #828, #861 | synthetic fixture에서 실오디오 기반 acceptance로 이동 시작 | Issue #770(실오디오 MIR accuracy benchmark) 체계화, RMSE/SI-SDR 임계값 정책 | +| J. 의존성/빌드 위생 (react, storybook, base-ui, lucide, sonner, codeql-action, setup-uv, uv group, numba, uuid, time, rust pinning, node floor, orphaned Actions identity) | #920, #942, #922, #921, #926, #927, #924, #931, #936, #919, #918, #754, #944, #896, #895 | 공급망/런타임 최신화 유지 | Dependabot train 정리(Issue #966), jsdom 30 전환 완료 | + +시리즈 전체에 대한 종합 판단: 이 시리즈는 "계약(contract) 필드 추가 + 첫 노출" 단계다. 착지해도 (1) plan 값의 생성 로직, (2) plan들 사이 우선순위/중복 정책, (3) 재분석 시 override 보존 round-trip, (4) 협업 영속화는 여전히 Gap으로 남는다. 또한 130건이 develop 기준으로부터 장기간 분기되어 있어 rebase 비용과 exact-head CI 증적 요구(PR 본문 명시)로 인한 merge train 정체가 자체적으로 기술 위험이다(Issue #966). + +## 5. 기술 Gap 목록 (Technical Gaps) + +문서 vs 코드 대조로 확인한 구체적 Gap. + +(a) **Rust compute layer 활용 범위** — 분석 핫패스 중 checkerboard novelty와 Viterbi decode만 Rust(`bandscope_numeric`)에 있다. 스템 분리(Demucs)는 Python/torch CPU 경로이고 GPU/CUDA/Metal 경로가 없으며, transcription은 에너지 마스크 휴리스틱(`transcription/api.py`)으로 ML 모델이 아니다. 데스크톱 단일 곡 처리 기준 CPU로도 실용적일 수 있으나, 긴 곡/다중 분석에서 병목이며 `docs/plans/2026-04-25-v2-transcription.md`가 v2 계획으로 존재한다. + +(b) **다층/계층·시간 모델링** — `song -> section -> role` 계약과 sections/roles/temporal 모듈은 존재하지만, role-level harmony는 `bandsplit-v1.json`의 고정 주파수 컷오프 휴리스틱에 의존한다. 학습된 multilevel 모델(예: role-conditioned chord/voicing 모델)과 section 경계의 temporal 일관성 학습은 없다. `docs/plans/2026-03-28-ml-engine-integration.md`가 관련 계획 문서다. + +(c)**임의 가중치 vs 문헌 기반 값** — `chord_recognizer._build_transition_matrix()`는 `self_prob=0.8`, `related_prob=0.03`, uniform baseline `0.01/n` 등 hand-set 상수를 쓴다("Encodes musical priors" 주석). 방향성(fifth/fourth/relative/parallel)은 음악 이론에 근거하지만 수치는 문헌 교정(calibration)되어 있지 않다. `roles/priority.py`는 숫자 가중치 없는 if-then 규칙이다. PR #732(relative-key prior correction)처럼 사후 수정이 발생해왔다. + +(d) **테스트 현실성** — `test_numeric_parity.py`(Rust-Python parity), `test_api.py` 등은 합성 입력 기반이고, tests 디렉터리에 .wav/.mp3 실오디오 fixture가 없다(find 확인). 실오디오 acceptance는 PR #892(decoded WAV C major), #891(known take verse/chorus recovery)이 열려 있고, 실 YouTube known-stem benchmark는 draft PR #828 + Issue #770 상태다. RMSE/SI-SDR 스타일 정량 임계값 acceptance gate는 아직 없다. + +(e) **커버리지/docstring 100%** — Python은 `--cov-fail-under=100` + Ruff D100-D107 docstring 100%가 gate로 작동한다(AGENTS.md, roadmap-completion 문서). 반면 JS workspace(vite.config.ts, packages/shared-types/vitest.config.ts)는 lines/functions/branches/statements 90% threshold이며 include 리스트도 일부 파일로 한정된다. "100%"는 Python에만 참이다. + +(f) **보안 체크리스트 잔여 항목** — 구현된 것: allowlisted stdin/stdout subprocess, Tauri CSP, path guards(#727 착지), CSV escape/sanitize, shell=False. 열린 것: canonical audio resource budget(#985 draft, Issue #781), filesystem path containment 재구축(Issue #852, #858 진행), native PDF read bounding(#865, #750), quick-xml RustSec 예외(#948, Issue #542), npm/PDF.js/nanoid/undici baseline(#783). 모델 artifact(Demucs checkpoint) checksum/signature 검증 파이프라인은 문서(app-security.md "Models") 요구 대비 미구현. + +(g) **i18n/현지화** — `src/i18n` + `locales/en`, `locales/ko` 존재, 하드코딩 한국어 문자열 미탐지(workspace tsx grep 0건), interpolation hardening PR #744 진행. en/ko 2개 언어뿐이며, PR 시리즈가 추가할 다수의 카피 키가 locales에 아직 없다. + +(h) **접근성** — workspace 컴포넌트에 aria-* 속성 52건 존재. 그러나 WCAG 2.2 AA gate는 Issue #965로 열려 있고, Figma/Storybook/shipped UI 정합 점검도 미완이다. tooltip/a11y PR(#833, #731)이 진행 중. + +(i) **Design token/Storybook** — shadcn/ui 프리미티브 중 stories는 button/checkbox/dialog 3개뿐이고, rehearsal 도메인 컴포넌트(GrooveMap, SectionRoadmap, RoleSwitcher 등) stories는 없다. Storybook token PR #897이 진행 중. + +(j) **패키징/릴리스 준비** — `CHANGELOG.md`, `VERSION`, `release.yml`, `build-baseline.yml` 존재. Windows/macOS amd64+arm64 build gate가 protected branch 요건이다(ARCHITECTURE.md). 남는 Gap: 서명/공증/자동 업데이트 롤백 증적(Issue #960), crash-safe project format/autosave/migration(Issue #961), redacted diagnostics/support bundle(Issue #962). + +## 6. UML 보완점 + +현재 docs 전역에서 Mermaid/sequence/class diagram이 하나도 존재하지 않는다(grep 확인). 아래 두 다이어그램이 최소 필수다. + +### 6.1 import -> analyze -> workspace render happy path + +```mermaid +sequenceDiagram + actor U as User + participant UI as React UI + participant T as Tauri shell (main.rs) + participant C as core/lib.rs (validation) + participant P as Python engine (cli/api) + participant N as bandscope_numeric (Rust) + U->>UI: select local audio file + UI->>T: invoke intake command + T->>C: validate path/format/project id + C-->>T: validated reference (no copy) + T->>P: spawn allowlisted subprocess (stdin/stdout JSON) + P->>P: separate stems (Demucs CPU) / segment / chords + P->>N: checkerboard_novelty, viterbi_decode + N-->>P: kernels result (parity-guaranteed) + P-->>T: RehearsalSong JSON (schema-validated) + T-->>UI: jobResult event + UI->>UI: render Workspace/GrooveMap/Roles +``` + +### 6.2 untrusted-input trust boundaries + +```mermaid +flowchart TD + subgraph Untrusted["User Input Boundary (untrusted)"] + F[local audio file] + Y[YouTube URL + metadata] + D[drag-and-drop payload] + PF[imported project file] + MF[model artifacts] + end + subgraph Gates["validation gates"] + VF[path/format/id guard - core/lib.rs] + VY[scheme/host/path/query allowlist - youtube.py] + VP[payload schema validation - IPC] + VM[checksum/signature required - 미구현] + end + subgraph Trusted["Process Boundary"] + S[Tauri shell] + PY[Python engine] + RS[Rust kernels] + end + F --> VF --> S + Y --> VY --> PY + D --> VP --> S + PF --> VP --> S + MF -. "checksum/signature gate 없음" .-> VM + VM -.-> PY + S --> PY --> RS +``` + +### 6.3 완전히 누락된 UML 산출물 + +- 프로젝트 save/load/migration 흐름(crash-safe 포맷 설계 선행 다이어그램) +- manual override <-> 재분석 round-trip(provenance 보존) 시퀀스 +- export(cue-sheet/chart) 파이프라인과 sanitize 지점 다이어그램 +- state machine: analysis job(idle/running/done/failed) 상태 전이 +- class diagram: shared-types 도메인(song/section/role/confidence/provenance) 정식 클래스 뷰 + +## 7. 우선순위가 매겨진 Gap Backlog (Prioritized Gap Backlog) + +구매자 체감 순서 기준. 각 항목에 acceptance criteria를 둔다. + +### P0 + +1. **실오디오 정확도 acceptance gate (Issue #770, PR #828/#891/#892 수렴)** + - Why: brand-story의 Accuracy principle("easy to use does not mean accuracy can be loose")은 정량 근거 없이는 신뢰할 수 없다. + - Acceptance: 실오디오 fixture(최소 3곡, known stems)에 대해 chord recognition 정확도와 stem SI-SDR 임계값이 CI gate로 실행되고, 실패 시 merge가 차단된다. +2. **canonical audio resource budget 착지 (PR #985/#866, Issue #781)** + - Why: 대용량/악성 파일로 인한 메모리 폭주는 첫 사용 경험을 깬다. 보안 gate이자 안정성 gate다. + - Acceptance: 파일 크기/길이 상한이 intake에서 강제되고, 초과 입력은 안전 실패 카피로 거부된다. quickcheck 통과. +3. **merge train 정리 (Issue #966)** + - Why: 130개 open PR의 exact-head CI 요구는 모든 후속 기능을 정체시킨다. + - Acceptance: dependency-aware train 정의 후 open PR이 cluster A-J 단위로 수렴하고, 중복 PR이 canonical PR로 link된다. +4. **filesystem path containment 재구축 (Issue #852, PR #858)** + - Why: 로컬 데스크톱 앱의 최상위 신뢰경계. 우회 시 임의 파일 접근으로 이어진다. + - Acceptance: 모든 파일 접근이 authority 객체로 바인딩되고 traversal 테스트가 gate에 포함된다. + +### P1 + +5. **plan 필드 시리즈의 엔진 생성 로직 + 우선순위 정책 (Cluster A/C 착지 후속)** + - Acceptance: 각 plan(padPlan 등)이 engine이 실제 산출하는 값과 UI 노출로 연결되고, 다중 plan 충돌 시 표시 우선순위가 문서화되며, override 시 provenance가 보존된다. +6. **루프 재생/역할별 재생 제어 (Issue #960, PR #903/#971)** + - Acceptance: 임의 섹션을 role 필터와 함께 loop 재생할 수 있고, reduced-motion/키보드 조작이 동작한다. +7. **crash-safe project format + autosave (Issue #961)** + - Acceptance: 버전 필드를 가진 프로젝트 포맷, 저장 실패 시 known-good 보존(PRx #970 방향), migration 테스트. +8. **Demucs 플랫폼 커버리지 + 모델 artifact 검증** + - Acceptance: x86 macOS 폴백 경로가 명시되고(현재 demucs 미설치 시 불가), 모델 checkpoint checksum 검증이 intake pipeline에 있다. +9. **WCAG 2.2 AA gate (Issue #965) + rehearsal 컴포넌트 Storybook tokens (PR #897)** + - Acceptance: axe 기반 자동 점검이 CI에 있고, GrooveMap/SectionRoadmap/RoleSwitcher stories가 token 기반으로 존재한다. +10. **JS coverage 90% -> 100% 상향 또는 Python과 동일한 기준 명문화** + - Acceptance: vite.config/vitest thresholds 상향 또는 "Python 100%, JS 90%" 정책이 acceptance-criteria.md에 명시된다. + +### P2 + +11. **HMM transition prior 문헌 교정 (5장 (c))** + - Acceptance: transition 행렬 상수의 출처(문헌 or 교정 데이터)가 주석/ADR로 기록되고, sensitivity test가 존재한다. +12. **v2 transcription (docs/plans/2026-04-25-v2-transcription.md) 착지** + - Acceptance: 에너지 휴리스틱 대체 모델이 parity/perf gate를 통과한다. +13. **협업 동기화(local_only -> planned_cloud) 설계 문서화** + - Acceptance: syncMode 전환 시 데이터 흐름/권한 모델이 TRD로 문서화된다(네트워크 정책 준수). +14. **i18n 확장 전략(en/ko 외) 및 PR 시리즈 카피 키 일괄 정리** + - Acceptance: 신규 카피가 locales에 key로 존재하고 particle-safe 한국어 규칙이 lint/check로 검증된다. +15. **redacted diagnostics/support bundle (Issue #962, PR #967)** + - Acceptance: 로그에 raw audio/full URL 미포함이 자동 점검으로 확인된다. + +## 8. APA 7th 참고문헌 (References) + +본 문서에서 실제 인용한 개념(MIR novelty kernel, HMM/Viterbi 디코딩, 소스 분리 평가, librosa, 접근성 표준)에 한정한다. + +Boulanger-Lewandowski, N., Bengio, Y., & Vincent, P. (2013). Audio chord recognition with recurrent neural networks. In Proceedings of the 14th International Society for Music Information Retrieval Conference (ISMIR 2013) (pp. 335–340). ISMIR. + +Défossez, A., Usunier, N., Bottou, L., & Bach, F. (2019). Music source separation in the waveform domain. arXiv. https://arxiv.org/abs/1911.13254 + +Foote, J. (1999). Visualizing music and audio using self-similarity. In Proceedings of the Seventh ACM International Conference on Multimedia (Multimedia '99) (pp. 77–80). ACM. + +Le Roux, J., Wisdom, S., Erdogan, H., & Hershey, J. R. (2019). SDR – half-baked or well done? In IEEE International Conference on Acoustics, Speech and Signal Processing (ICASSP 2019) (pp. 626–630). IEEE. + +McFee, B., Raffel, C., Liang, D., Ellis, D. P. W., McVicar, M., Battenberg, E., & Nieto, O. (2015). librosa: Audio and music signal analysis in Python. In Proceedings of the 14th Python in Science Conference (SciPy 2015) (pp. 18–24). + +Müller, M. (2015). Fundamentals of music processing: Audio, analysis, algorithms, applications. Springer. + +Viterbi, A. J. (1967). Error bounds for convolutional codes and an asymptotically optimum decoding algorithm. IEEE Transactions on Information Theory, 13(2), 260–269. + +W3C. (2023). Web Content Accessibility Guidelines (WCAG) 2.2. World Wide Web Consortium. https://www.w3.org/TR/WCAG22/ + +참고: 위 항목 중 DOI가 확실치 않은 항목은 DOI 없이 plain APA로 기술했다(조작 금지 원칙). 코드 내 개념 대응: Foote(1999)=checkerboard novelty, Viterbi(1967)/Boulanger-Lewandowski et al.(2013)=HMM 코드 디코딩 prior, Défossez et al.(2019)=Demucs htdemucs, Le Roux et al.(2019)=SI-SDR(audio_separator.py 주석 언급), Müller(2015)/McFee et al.(2015)=섹션/코드/음역 분석 기반 라이브러리. + +## 9. 검증 방법 (Verification Method) + +각 절의 근거와 재실행 명령. + +- Repo root: `git rev-parse --show-toplevel` -> `/Users/seonghobae/bandscope` +- 문서 소스 read: `ARCHITECTURE.md`, `AGENTS.md`, `docs/brand-story.md`, `docs/security/app-security.md`, `docs/workflow/one-day-delivery-plan.md`, `docs/engineering/acceptance-criteria.md`, `docs/plans/2026-03-27-bandscope-roadmap-completion.md` +- Open PR inventory: + ```bash + gh pr list --state open --limit 200 --json number,title,isDraft,headRefName \ + --jq 'sort_by(-.number) | .[] | "\(.number)\t\(.isDraft)\t\(.title)"' > /tmp/opencode/open_prs_full.txt + wc -l /tmp/opencode/open_prs_full.txt # 130 + gh pr view 1021 --json title,body # 시리즈 패턴 샘플 + ``` +- Open issues: `gh issue list --state open --limit 50 --json number,title --jq '.[]|"\(.number)\t\(.title)"'` +- 코드 검증 grep/glob (요지): + - `grep -rn "padPlan\|PadPlan" apps/desktop/src packages/shared-types/src` -> 0건(시리즈 미착지 확인) + - `find services/analysis-engine -name "*.py"` -> 모듈 목록(chords/sections/roles/ranges/temporal/separation/transcription/youtube/exports) + - `sed -n '70,110p' .../chords/chord_recognizer.py` -> hand-set transition prior 확인 + - `sed -n '1,40p' .../_native.py` -> bandscope_numeric 커널/parity 확인 + - `ls services/analysis-engine/rust` + `grep maturin rust/pyproject.toml` -> Rust 커널 위치 확인 + - `head -30 separation/model_weights/bandsplit-v1.json` -> 휴리스틱 manifest 확인 + - `grep -rn "aria-" apps/desktop/src/features/workspace/*.tsx | wc -l` -> 52 + - `grep -rln "RehearsalAssignment\|RehearsalCollaboration" apps/desktop/src` -> 0건(UI 미구현 확인) + - `grep -rn "loop" apps/desktop/src/features/player/index.tsx` -> 0건(loop 미구현 확인) + - `ls CHANGELOG.md VERSION .github/workflows` -> 릴리스 자산 확인 + - `grep -n thresholds apps/desktop/vite.config.ts packages/shared-types/vitest.config.ts` -> JS 90% 확인 + - `grep -n "cov-fail-under" AGENTS.md docs` -> Python 100% gate 확인 + - Mermaid 존재 여부: `grep -rln "sequenceDiagram\|classDiagram\|flowchart" docs ARCHITECTURE.md` -> 0건(6장 전제 확인) From fd214fcb7b6743e2d73ee9e5d241187277353c55 Mon Sep 17 00:00:00 2001 From: Seongho Bae Date: Mon, 24 Aug 2026 23:18:31 -0700 Subject: [PATCH 02/94] docs: correct product-readiness issue ownership references --- docs/product-technical-gap-baseline.md | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/docs/product-technical-gap-baseline.md b/docs/product-technical-gap-baseline.md index f436c10fb..f8bcf3eef 100644 --- a/docs/product-technical-gap-baseline.md +++ b/docs/product-technical-gap-baseline.md @@ -87,8 +87,8 @@ flowchart LR | 루프 재생/역할별 재생 제어 | `features/player/index.tsx` | 미구현 (loop 미탐지, PR #903/#971 진행 중) | | 협업(assignment/comment/approval) UI | `packages/shared-types` 타입만 존재 | 미구현 (UI 참조 0건; PR 시리즈가 첫 화면 진행 중) | | pad/solo/riff/hook/fill/voicing/articulation/dynamics/tuning/capo/vamp 등 plan 필드 | 없음 (shared-types에 미존재) | 미구현 (PR 시리즈가 추가 예정) | -| 라이선싱/데모곡 first-run | 없음 | 미구현 (PR #1009, Issue #963/#964) | -| 자동 저장/crash-safe 프로젝트 포맷 | 없음 | 미구현 (Issue #961) | +| 라이선싱/데모곡 first-run | 없음 | 미구현 (PR #1009, Issue #964; diagnostics/privacy boundary는 Issue #963) | +| 자동 저장/crash-safe 프로젝트 포맷 | 없음 | 미구현 (Issue #962) | | 서명/공증 배포+롤백 증적 | `.github/workflows/release.yml` 존재 | 부분구현 (Issue #960) | ## 4. 현재 열린 PR 기반 Gap 분석 (Open-PR Gap Analysis) @@ -104,7 +104,7 @@ capability cluster 분류와 착지 후 남는 Gap: | A. 역할별 연주 plan 필드 (pad/solo/riff/hook/fill/voicing/articulation/dynamics/tuning/capo/vamp) | #1020, #1013~#1018, #1021, #1024 | RehearsalRole 계약 확장과 첫 plan 노출. 데이터 생성기(engine)가 실제로 이 plan을 산출하는지와는 별개 | plan 값을 만들어내는 엔진 로직, plan 간 충돌/우선순위 정책, plan 편집 UX | | B. 폼/섹션 네이밍 (intro/verse/pre-chorus/chorus/bridge/outro/tag/pickup/stop/handoff/entrance/dropout/lyric cue/transition/transition-cue/count) | #943, #947, #955, #939, #946, #986, #989, #916, #934, #937, #912, #914, #913, #994, #993, #995 | SECTION_FORM_LABELS와 CueAnchorKind가 이미 계약에 있으므로 주로 UI 노출 완성 | 앵커 정확도(가사/카운트 정렬), 사용자 직접 앵커 편집 | | C. 화성 설명/확정/귀확인 (harmonic function/explanation/confirmed chord/ear check/setup note/transposition/part handoff/playable range/overlap/groove/simpler take/tempo-starting chord setup) | #1005, #1003, #1002, #1001, #1004, #1006, #1007, #957, #992, #991, #990, #987 | brand-story의 "추정 + 귀로 확인" 프레임을 UI 언어로 구체화 | confidence 산출 근거의 정량화, confirmed override의 재분석 반영(round trip, Issue #739) | -| D. 협업 최소면 (assignment/comment/approval/blocked/pending/open comment/export-priority actions/ready board) | #996, #997, #998, #1000, #900, #901 | shared-types의 collaboration 타입에 처음으로 UI가 붙음 | 동기화(syncMode local_only/planned_cloud), crash-safe 프로젝트 포맷(Issue #961), 권한 모델 | +| D. 협업 최소면 (assignment/comment/approval/blocked/pending/open comment/export-priority actions/ready board) | #996, #997, #998, #1000, #900, #901 | shared-types의 collaboration 타입에 처음으로 UI가 붙음 | 동기화(syncMode local_only/planned_cloud), crash-safe 프로젝트 포맷(Issue #962), 권한 모델 | | E. First-run/activation/실패 복구 (first-run card/license demo song/local intake 실패/import 실패/analysis 실패/save 실패/help) | #974, #1009, #981, #982, #976, #984, #972, #898 | 빈 상태/오류 상태의 next-action 카피 완성 | 라이선싱 백엔드, 데모곡 번들 정책, 오프라인 활성화 | | F. 보안/신뢰경계 (log redaction x4, quick-xml RustSec, filesystem authority, canonical audio policy, CSV NUL/전각 우회 차단, credential drop, PDF bound reads, npm baseline) | #956, #951, #950, #949, #948, #858, #985/#781, #941, #894, #865, #783 | app-security.md 규칙의 코드 반영 마무리 | Issue #852(경계 재구축), #542(예외 추적), 모델 artifact checksum/signature 파이프라인 | | G. 성능 (Bolt 시리즈: 관측 확률 벡터화, GrooveMap maxTime O(1), chart dedupe O(N), chord change count O(1), checkerboard/HMM 벡터화) | #999, #859, #849, #834, #746, #732 | 핫패스 최적화. Rust 커널 포팅과 같은 방향의 Python 측 보완 | Demucs GPU/offload, 대용량 파일 스트리밍, UI 가상화 | @@ -136,7 +136,7 @@ capability cluster 분류와 착지 후 남는 Gap: (i) **Design token/Storybook** — shadcn/ui 프리미티브 중 stories는 button/checkbox/dialog 3개뿐이고, rehearsal 도메인 컴포넌트(GrooveMap, SectionRoadmap, RoleSwitcher 등) stories는 없다. Storybook token PR #897이 진행 중. -(j) **패키징/릴리스 준비** — `CHANGELOG.md`, `VERSION`, `release.yml`, `build-baseline.yml` 존재. Windows/macOS amd64+arm64 build gate가 protected branch 요건이다(ARCHITECTURE.md). 남는 Gap: 서명/공증/자동 업데이트 롤백 증적(Issue #960), crash-safe project format/autosave/migration(Issue #961), redacted diagnostics/support bundle(Issue #962). +(j) **패키징/릴리스 준비** — `CHANGELOG.md`, `VERSION`, `release.yml`, `build-baseline.yml` 존재. Windows/macOS amd64+arm64 build gate가 protected branch 요건이다(ARCHITECTURE.md). 남는 Gap: 서명/공증/자동 업데이트 롤백 증적(Issue #960), crash-safe project format/autosave/migration(Issue #962), redacted diagnostics/support bundle(Issue #963). ## 6. UML 보완점 @@ -227,9 +227,9 @@ flowchart TD 5. **plan 필드 시리즈의 엔진 생성 로직 + 우선순위 정책 (Cluster A/C 착지 후속)** - Acceptance: 각 plan(padPlan 등)이 engine이 실제 산출하는 값과 UI 노출로 연결되고, 다중 plan 충돌 시 표시 우선순위가 문서화되며, override 시 provenance가 보존된다. -6. **루프 재생/역할별 재생 제어 (Issue #960, PR #903/#971)** +6. **루프 재생/역할별 재생 제어 (Issue #961, PR #903/#971)** - Acceptance: 임의 섹션을 role 필터와 함께 loop 재생할 수 있고, reduced-motion/키보드 조작이 동작한다. -7. **crash-safe project format + autosave (Issue #961)** +7. **crash-safe project format + autosave (Issue #962)** - Acceptance: 버전 필드를 가진 프로젝트 포맷, 저장 실패 시 known-good 보존(PRx #970 방향), migration 테스트. 8. **Demucs 플랫폼 커버리지 + 모델 artifact 검증** - Acceptance: x86 macOS 폴백 경로가 명시되고(현재 demucs 미설치 시 불가), 모델 checkpoint checksum 검증이 intake pipeline에 있다. @@ -248,7 +248,7 @@ flowchart TD - Acceptance: syncMode 전환 시 데이터 흐름/권한 모델이 TRD로 문서화된다(네트워크 정책 준수). 14. **i18n 확장 전략(en/ko 외) 및 PR 시리즈 카피 키 일괄 정리** - Acceptance: 신규 카피가 locales에 key로 존재하고 particle-safe 한국어 규칙이 lint/check로 검증된다. -15. **redacted diagnostics/support bundle (Issue #962, PR #967)** +15. **redacted diagnostics/support bundle (Issue #963, PR #967)** - Acceptance: 로그에 raw audio/full URL 미포함이 자동 점검으로 확인된다. ## 8. APA 7th 참고문헌 (References) From 27009790fec920759b7291a6af766bd746324f98 Mon Sep 17 00:00:00 2001 From: Seongho Bae Date: Mon, 24 Aug 2026 23:27:32 -0700 Subject: [PATCH 03/94] docs: align baseline with live contracts and portable verification --- docs/product-technical-gap-baseline.md | 27 +++++++++++++------------- 1 file changed, 14 insertions(+), 13 deletions(-) diff --git a/docs/product-technical-gap-baseline.md b/docs/product-technical-gap-baseline.md index f8bcf3eef..e8e8565f8 100644 --- a/docs/product-technical-gap-baseline.md +++ b/docs/product-technical-gap-baseline.md @@ -140,7 +140,7 @@ capability cluster 분류와 착지 후 남는 Gap: ## 6. UML 보완점 -현재 docs 전역에서 Mermaid/sequence/class diagram이 하나도 존재하지 않는다(grep 확인). 아래 두 다이어그램이 최소 필수다. +Protected base `develop@acdbea6344fe1231c39535b575f4de35e4c607c9`의 `docs/`와 `ARCHITECTURE.md`에는 Mermaid `sequenceDiagram`/`classDiagram`/`flowchart`가 없다. 이 PR이 아래 다이어그램을 처음 추가하므로 현재 PR checkout 자체를 검색하면 이 파일이 매치되는 것이 정상이다. ### 6.1 import -> analyze -> workspace render happy path @@ -161,7 +161,7 @@ sequenceDiagram P->>N: checkerboard_novelty, viterbi_decode N-->>P: kernels result (parity-guaranteed) P-->>T: RehearsalSong JSON (schema-validated) - T-->>UI: jobResult event + T-->>UI: analysis-job-updated UI->>UI: render Workspace/GrooveMap/Roles ``` @@ -201,7 +201,7 @@ flowchart TD - 프로젝트 save/load/migration 흐름(crash-safe 포맷 설계 선행 다이어그램) - manual override <-> 재분석 round-trip(provenance 보존) 시퀀스 - export(cue-sheet/chart) 파이프라인과 sanitize 지점 다이어그램 -- state machine: analysis job(idle/running/done/failed) 상태 전이 +- state machine: analysis job(`queued`/`running`/`succeeded`/`failed`) 상태 전이 - class diagram: shared-types 도메인(song/section/role/confidence/provenance) 정식 클래스 뷰 ## 7. 우선순위가 매겨진 Gap Backlog (Prioritized Gap Backlog) @@ -253,7 +253,7 @@ flowchart TD ## 8. APA 7th 참고문헌 (References) -본 문서에서 실제 인용한 개념(MIR novelty kernel, HMM/Viterbi 디코딩, 소스 분리 평가, librosa, 접근성 표준)에 한정한다. +본 문서에서 실제 인용한 개념(MIR novelty kernel, chord-recognition 연구 맥락, Viterbi 디코딩, 소스 분리 평가, librosa, 접근성 표준)에 한정한다. Boulanger-Lewandowski, N., Bengio, Y., & Vincent, P. (2013). Audio chord recognition with recurrent neural networks. In Proceedings of the 14th International Society for Music Information Retrieval Conference (ISMIR 2013) (pp. 335–340). ISMIR. @@ -271,16 +271,17 @@ Viterbi, A. J. (1967). Error bounds for convolutional codes and an asymptoticall W3C. (2023). Web Content Accessibility Guidelines (WCAG) 2.2. World Wide Web Consortium. https://www.w3.org/TR/WCAG22/ -참고: 위 항목 중 DOI가 확실치 않은 항목은 DOI 없이 plain APA로 기술했다(조작 금지 원칙). 코드 내 개념 대응: Foote(1999)=checkerboard novelty, Viterbi(1967)/Boulanger-Lewandowski et al.(2013)=HMM 코드 디코딩 prior, Défossez et al.(2019)=Demucs htdemucs, Le Roux et al.(2019)=SI-SDR(audio_separator.py 주석 언급), Müller(2015)/McFee et al.(2015)=섹션/코드/음역 분석 기반 라이브러리. +참고: 위 항목 중 DOI가 확실치 않은 항목은 DOI 없이 plain APA로 기술했다(조작 금지 원칙). 코드 내 개념 대응: Foote(1999)=checkerboard novelty, Viterbi(1967)=Viterbi 디코딩 알고리즘, Boulanger-Lewandowski et al.(2013)=오디오 화음 인식 연구 맥락(현재 hand-set transition prior 수치의 근거는 아님), Défossez et al.(2019)=Demucs htdemucs, Le Roux et al.(2019)=SI-SDR(audio_separator.py 주석 언급), Müller(2015)/McFee et al.(2015)=섹션/코드/음역 분석 기반 라이브러리. 현재 transition prior 수치의 문헌·교정 데이터 근거가 없는 점은 5장 (c) 및 P2-11의 미해결 Gap으로 유지한다. ## 9. 검증 방법 (Verification Method) -각 절의 근거와 재실행 명령. +각 절의 근거와 재실행 명령. 아래 명령은 저장소 루트에서 실행한다. -- Repo root: `git rev-parse --show-toplevel` -> `/Users/seonghobae/bandscope` +- Repo root: `git rev-parse --show-toplevel` -> `` - 문서 소스 read: `ARCHITECTURE.md`, `AGENTS.md`, `docs/brand-story.md`, `docs/security/app-security.md`, `docs/workflow/one-day-delivery-plan.md`, `docs/engineering/acceptance-criteria.md`, `docs/plans/2026-03-27-bandscope-roadmap-completion.md` - Open PR inventory: ```bash + mkdir -p /tmp/opencode gh pr list --state open --limit 200 --json number,title,isDraft,headRefName \ --jq 'sort_by(-.number) | .[] | "\(.number)\t\(.isDraft)\t\(.title)"' > /tmp/opencode/open_prs_full.txt wc -l /tmp/opencode/open_prs_full.txt # 130 @@ -290,14 +291,14 @@ W3C. (2023). Web Content Accessibility Guidelines (WCAG) 2.2. World Wide Web Con - 코드 검증 grep/glob (요지): - `grep -rn "padPlan\|PadPlan" apps/desktop/src packages/shared-types/src` -> 0건(시리즈 미착지 확인) - `find services/analysis-engine -name "*.py"` -> 모듈 목록(chords/sections/roles/ranges/temporal/separation/transcription/youtube/exports) - - `sed -n '70,110p' .../chords/chord_recognizer.py` -> hand-set transition prior 확인 - - `sed -n '1,40p' .../_native.py` -> bandscope_numeric 커널/parity 확인 - - `ls services/analysis-engine/rust` + `grep maturin rust/pyproject.toml` -> Rust 커널 위치 확인 - - `head -30 separation/model_weights/bandsplit-v1.json` -> 휴리스틱 manifest 확인 + - `sed -n '70,110p' services/analysis-engine/src/bandscope_analysis/chords/chord_recognizer.py` -> hand-set transition prior 확인 + - `sed -n '1,40p' services/analysis-engine/src/bandscope_analysis/_native.py` -> bandscope_numeric 커널/parity 확인 + - `ls services/analysis-engine/rust && grep -n "maturin" services/analysis-engine/rust/pyproject.toml` -> Rust 커널 위치 확인 + - `head -30 services/analysis-engine/src/bandscope_analysis/separation/model_weights/bandsplit-v1.json` -> 휴리스틱 manifest 확인 - `grep -rn "aria-" apps/desktop/src/features/workspace/*.tsx | wc -l` -> 52 - `grep -rln "RehearsalAssignment\|RehearsalCollaboration" apps/desktop/src` -> 0건(UI 미구현 확인) - `grep -rn "loop" apps/desktop/src/features/player/index.tsx` -> 0건(loop 미구현 확인) - `ls CHANGELOG.md VERSION .github/workflows` -> 릴리스 자산 확인 - `grep -n thresholds apps/desktop/vite.config.ts packages/shared-types/vitest.config.ts` -> JS 90% 확인 - - `grep -n "cov-fail-under" AGENTS.md docs` -> Python 100% gate 확인 - - Mermaid 존재 여부: `grep -rln "sequenceDiagram\|classDiagram\|flowchart" docs ARCHITECTURE.md` -> 0건(6장 전제 확인) + - `grep -rn "cov-fail-under" AGENTS.md docs` -> Python 100% gate 확인 + - Protected-base Mermaid 존재 여부: `git grep -n -E 'sequenceDiagram|classDiagram|flowchart' acdbea6344fe1231c39535b575f4de35e4c607c9 -- docs ARCHITECTURE.md || true` -> 0건(6장 전제 확인) From 0745ec8656c2c432ed3c1ef8b614ae7ac4b0fbda Mon Sep 17 00:00:00 2001 From: seonghobae Date: Tue, 25 Aug 2026 18:05:22 +0900 Subject: [PATCH 04/94] docs(gap): correct coverage claim, add operability finding, cite transition-prior calibration sources - JS workspaces measured 100% on 2026-08-25 (desktop + shared-types); the gap is the 90% gate threshold, not current coverage. Backlog item reworded accordingly. - Add finding (k): central Strix provider-routing outage (openai-direct fallback inherited the NVIDIA NIM API base) and its root-cause fix tracked in ContextualWisdomLab/.github#1324; dependency CVEs unified under canonical owner #783. - Expand (c) with a literature-grounded calibration method for HMM chord transition priors and add APA 7th entries (Burgoyne et al. 2011; Harte 2010; Logan & Chu 2000; Pauwels & Peeters 2013). --- docs/product-technical-gap-baseline.md | 14 ++++++++++++-- 1 file changed, 12 insertions(+), 2 deletions(-) diff --git a/docs/product-technical-gap-baseline.md b/docs/product-technical-gap-baseline.md index e8e8565f8..21da1f3e6 100644 --- a/docs/product-technical-gap-baseline.md +++ b/docs/product-technical-gap-baseline.md @@ -122,14 +122,16 @@ capability cluster 분류와 착지 후 남는 Gap: (b) **다층/계층·시간 모델링** — `song -> section -> role` 계약과 sections/roles/temporal 모듈은 존재하지만, role-level harmony는 `bandsplit-v1.json`의 고정 주파수 컷오프 휴리스틱에 의존한다. 학습된 multilevel 모델(예: role-conditioned chord/voicing 모델)과 section 경계의 temporal 일관성 학습은 없다. `docs/plans/2026-03-28-ml-engine-integration.md`가 관련 계획 문서다. -(c)**임의 가중치 vs 문헌 기반 값** — `chord_recognizer._build_transition_matrix()`는 `self_prob=0.8`, `related_prob=0.03`, uniform baseline `0.01/n` 등 hand-set 상수를 쓴다("Encodes musical priors" 주석). 방향성(fifth/fourth/relative/parallel)은 음악 이론에 근거하지만 수치는 문헌 교정(calibration)되어 있지 않다. `roles/priority.py`는 숫자 가중치 없는 if-then 규칙이다. PR #732(relative-key prior correction)처럼 사후 수정이 발생해왔다. +(c)**임의 가중치 vs 문헌 기반 값** — `chord_recognizer._build_transition_matrix()`는 `self_prob=0.8`, `related_prob=0.03`, uniform baseline `0.01/n` 등 hand-set 상수를 쓴다("Encodes musical priors" 주석). 방향성(fifth/fourth/relative/parallel)은 음악 이론에 근거하지만 수치는 문헌 교정(calibration)되어 있지 않다. `roles/priority.py`는 숫자 가중치 없는 if-then 규칙이다. PR #732(relative-key prior correction)처럼 사후 수정이 발생해왔다. 교정 방향: 주석 코퍼스(예: Burgoyne et al., 2011의 McGill Billboard)에서 전이 행렬을 최대우도로 추정하고, HMM prior 민감도(Logan & Chu, 2000; Pauwels & Peeters, 2013; Boulanger-Lewandowski et al., 2013 참조)와 tonal pitch space 거리 기반 스무딩(Harte, 2010)으로 현재 hand-set 값과의 코드 복원 RMSE/accuracy 차이를 정량 비교한 뒤, 우세한 값을 상수가 아닌 데이터 산출물로 고정한다. (d) **테스트 현실성** — `test_numeric_parity.py`(Rust-Python parity), `test_api.py` 등은 합성 입력 기반이고, tests 디렉터리에 .wav/.mp3 실오디오 fixture가 없다(find 확인). 실오디오 acceptance는 PR #892(decoded WAV C major), #891(known take verse/chorus recovery)이 열려 있고, 실 YouTube known-stem benchmark는 draft PR #828 + Issue #770 상태다. RMSE/SI-SDR 스타일 정량 임계값 acceptance gate는 아직 없다. -(e) **커버리지/docstring 100%** — Python은 `--cov-fail-under=100` + Ruff D100-D107 docstring 100%가 gate로 작동한다(AGENTS.md, roadmap-completion 문서). 반면 JS workspace(vite.config.ts, packages/shared-types/vitest.config.ts)는 lines/functions/branches/statements 90% threshold이며 include 리스트도 일부 파일로 한정된다. "100%"는 Python에만 참이다. +(e) **커버리지/docstring 100%** — Python은 `--cov-fail-under=100` + Ruff D100-D107 docstring 100%가 gate로 작동한다(AGENTS.md, roadmap-completion 문서). JS workspace는 2026-08-25 실측에서 desktop(469 stmts/357 branches/105 funcs)과 shared-types(717 stmts/643 branches/59 funcs) 모두 statements/branches/functions/lines **실측 100%**를 유지한다. 그러나 gate threshold(`vite.config.ts`, `vitest.config.ts`)는 90으로 Python보다 낮아, 리그레션 시 90~99% 구간이 무단 통과될 수 있다. Gate 상향은 Backlog #10. (f) **보안 체크리스트 잔여 항목** — 구현된 것: allowlisted stdin/stdout subprocess, Tauri CSP, path guards(#727 착지), CSV escape/sanitize, shell=False. 열린 것: canonical audio resource budget(#985 draft, Issue #781), filesystem path containment 재구축(Issue #852, #858 진행), native PDF read bounding(#865, #750), quick-xml RustSec 예외(#948, Issue #542), npm/PDF.js/nanoid/undici baseline(#783). 모델 artifact(Demucs checkpoint) checksum/signature 검증 파이프라인은 문서(app-security.md "Models") 요구 대비 미구현. +(k) **운영 관측(2026-08-25 strix 공급자 장애)** — 중앙 Strix 게이트가 NVIDIA NIM 소진 시 최종 폴백 `openai-direct/gpt-5.4`를 NIM 엣지 API base로 라우팅해 `404 page not found`로 실패 닫기(fail-closed)하여 전 조직 PR 큐가 정체했다. 근본 원인 수정은 ContextualWisdomLab/.github#1324(openai-direct 폴백 전용 API base 라우팅 + 회귀 계약 테스트)로 추적했고, bandscope 의존성 CVE(pdfjs-dist CVE-2026-16633 등)는 canonical owner #783으로 일원화했다. 운영 교훈: required 스캐너의 공급자 장애는 repo 단위 우회가 아니라 중앙 게이트 계약 수정으로만 풀어야 한다. + (g) **i18n/현지화** — `src/i18n` + `locales/en`, `locales/ko` 존재, 하드코딩 한국어 문자열 미탐지(workspace tsx grep 0건), interpolation hardening PR #744 진행. en/ko 2개 언어뿐이며, PR 시리즈가 추가할 다수의 카피 키가 locales에 아직 없다. (h) **접근성** — workspace 컴포넌트에 aria-* 속성 52건 존재. 그러나 WCAG 2.2 AA gate는 Issue #965로 열려 있고, Figma/Storybook/shipped UI 정합 점검도 미완이다. tooltip/a11y PR(#833, #731)이 진행 중. @@ -257,8 +259,16 @@ flowchart TD Boulanger-Lewandowski, N., Bengio, Y., & Vincent, P. (2013). Audio chord recognition with recurrent neural networks. In Proceedings of the 14th International Society for Music Information Retrieval Conference (ISMIR 2013) (pp. 335–340). ISMIR. +Burgoyne, J. A., Wild, J., & Fujinaga, I. (2011). An expert ground truth set for audio chord recognition and music analysis. In Proceedings of the 12th International Society for Music Information Retrieval Conference (ISMIR 2011) (pp. 633–638). ISMIR. + Défossez, A., Usunier, N., Bottou, L., & Bach, F. (2019). Music source separation in the waveform domain. arXiv. https://arxiv.org/abs/1911.13254 +Harte, C. (2010). Towards automatic extraction of harmony information from music signals (Doctoral dissertation, Queen Mary University of London). + +Logan, B., & Chu, S. (2000). Music summary using hidden Markov models. In IEEE International Conference on Acoustics, Speech, and Signal Processing (ICASSP 2000) (Vol. 6, pp. 3673–3676). IEEE. + +Pauwels, J., & Peeters, G. (2013). Combining harmony-based and melody-based chroma features for chord recognition. In Proceedings of the 14th International Society for Music Information Retrieval Conference (ISMIR 2013) (pp. 597–602). ISMIR. + Foote, J. (1999). Visualizing music and audio using self-similarity. In Proceedings of the Seventh ACM International Conference on Multimedia (Multimedia '99) (pp. 77–80). ACM. Le Roux, J., Wisdom, S., Erdogan, H., & Hershey, J. R. (2019). SDR – half-baked or well done? In IEEE International Conference on Acoustics, Speech and Signal Processing (ICASSP 2019) (pp. 626–630). IEEE. From 3f1b06246808895bc4e343663843b16a35cd1c2d Mon Sep 17 00:00:00 2001 From: Seongho Bae Date: Tue, 25 Aug 2026 11:10:35 -0700 Subject: [PATCH 05/94] docs(gap): align verification claims and accelerator wording --- docs/product-technical-gap-baseline.md | 36 ++++++++++++++------------ 1 file changed, 19 insertions(+), 17 deletions(-) diff --git a/docs/product-technical-gap-baseline.md b/docs/product-technical-gap-baseline.md index 21da1f3e6..912450975 100644 --- a/docs/product-technical-gap-baseline.md +++ b/docs/product-technical-gap-baseline.md @@ -1,6 +1,6 @@ # BandScope Product-Technical Gap Baseline -Last updated: 2026-08-25 +Last updated: 2026-08-26 Base revision: `develop@acdbea63` (fix(security): projectId path guard, npm HIGH CVEs, Foote novelty sign) ## 1. 목적과 범위 (Purpose & Scope) @@ -37,7 +37,7 @@ flowchart LR subgraph Engine["services/analysis-engine (Python)"] CLI["cli.py / api.py
stdin/stdout JSON IPC"] Mods["chords / sections / roles /
ranges / temporal / separation /
transcription / exports"] - Sep["separation/audio_separator.py
Demucs htdemucs (CPU)
bandsplit-v1.json 폴백"] + Sep["separation/audio_separator.py
Demucs htdemucs (CPU default)
configurable device passthrough
bandsplit-v1.json 폴백"] end Rust["services/analysis-engine/rust
bandscope_numeric (PyO3/maturin)
checkerboard_novelty + viterbi_decode"] Types["packages/shared-types
song-section-role 계약
confidence/provenance/cue/export"] @@ -57,7 +57,8 @@ flowchart LR - 로컬 오케스트레이션은 loopback HTTP가 아닌 typed Tauri IPC + stdin/stdout JSON 서브프로세스 방식이다 (`ARCHITECTURE.md`, `src-tauri/main.rs`) - `apps/desktop/core`(Rust)는 분석 연산이 아니라 입력 검증(YouTube URL, project payload, score PDF source, 경로 가드) 담당이다 (`apps/desktop/core/src/lib.rs`) - 무거운 수치 커널 중 checkerboard novelty와 Viterbi 디코딩만 `bandscope_numeric`(Rust/PyO3)으로 포팅되어 있고, 나머지는 Python/NumPy 참조 구현이며 `tests/test_numeric_parity.py`로 f64 parity를 잠근다 (`_native.py`) -- 스템 분리는 Demucs `htdemucs`를 CPU로 돌리고 플랫폼 게이트(demucs/torch 미설치 플랫폼은 불가)이며, 주파수 컷오프만 정의한 `bandsplit-v1.json` 휴리스틱 밴드스플릿 manifest가 별도로 존재한다 (`separation/audio_separator.py`, `separation/model_weights/bandsplit-v1.json`) +- 스템 분리는 Demucs `htdemucs`를 기본 `AudioSeparationConfig.device="cpu"`로 실행한다. `_apply_model`은 구성된 `device`를 Demucs `apply_model(..., device=...)`에 전달하므로 비-CPU 장치 경로 자체는 존재하지만, BandScope가 CUDA/MPS를 독립적으로 admission·parity·performance·release gate한 증거는 아직 없다 (`separation/audio_separator.py`) +- 주파수 컷오프만 정의한 `bandsplit-v1.json` 휴리스틱 밴드스플릿 manifest가 별도로 존재한다 (`separation/model_weights/bandsplit-v1.json`) - 협업 타입(assignments/comments/approvals)은 `packages/shared-types`에 정의만 되어 있고 UI 참조가 전혀 없다 (grep 확인) ## 3. 기능 명세 및 요구사항 도출 (Functional Spec Derivation) @@ -68,7 +69,7 @@ flowchart LR |---|---|---| | 로컬 오디오 임포트(Rust 검증 + app-owned 루트) | `apps/desktop/src-tauri/src/main.rs`, `apps/desktop/core/src/lib.rs` | 구현됨 | | YouTube 임포트(정책 제약, 실패 폴백) | `services/analysis-engine/src/bandscope_analysis/youtube.py` | 부분구현 (DRM/로그인 우회 없음, 실패 시 안내 카드는 PR 진행 중) | -| 스템 분리 | `separation/audio_separator.py` (htdemucs CPU), `bandsplit-v1.json` | 부분구현 (플랫폼 게이트, x86 macOS 미지원, GPU 없음) | +| 스템 분리 | `separation/audio_separator.py` (htdemucs; CPU default), `bandsplit-v1.json` | 부분구현 (플랫폼 게이트, x86 macOS 미지원; configurable device passthrough는 있으나 비-CPU 가속은 아직 BandScope release-qualified가 아님) | | 섹션 세그먼테이션(checkerboard novelty) | `sections/segmenter.py` + `bandscope_numeric::checkerboard_novelty` | 구현됨 | | 섹션별 화성(HMM + Viterbi) | `chords/chord_recognizer.py`, `chords/section_harmony.py` | 구현됨 (hand-tuned prior 수준, 4장 참조) | | 화성 기능 라벨/설명 | `chords/function_analyzer.py`, `RehearsalRole.harmonicExplanation?` | 부분구현 | @@ -107,7 +108,7 @@ capability cluster 분류와 착지 후 남는 Gap: | D. 협업 최소면 (assignment/comment/approval/blocked/pending/open comment/export-priority actions/ready board) | #996, #997, #998, #1000, #900, #901 | shared-types의 collaboration 타입에 처음으로 UI가 붙음 | 동기화(syncMode local_only/planned_cloud), crash-safe 프로젝트 포맷(Issue #962), 권한 모델 | | E. First-run/activation/실패 복구 (first-run card/license demo song/local intake 실패/import 실패/analysis 실패/save 실패/help) | #974, #1009, #981, #982, #976, #984, #972, #898 | 빈 상태/오류 상태의 next-action 카피 완성 | 라이선싱 백엔드, 데모곡 번들 정책, 오프라인 활성화 | | F. 보안/신뢰경계 (log redaction x4, quick-xml RustSec, filesystem authority, canonical audio policy, CSV NUL/전각 우회 차단, credential drop, PDF bound reads, npm baseline) | #956, #951, #950, #949, #948, #858, #985/#781, #941, #894, #865, #783 | app-security.md 규칙의 코드 반영 마무리 | Issue #852(경계 재구축), #542(예외 추적), 모델 artifact checksum/signature 파이프라인 | -| G. 성능 (Bolt 시리즈: 관측 확률 벡터화, GrooveMap maxTime O(1), chart dedupe O(N), chord change count O(1), checkerboard/HMM 벡터화) | #999, #859, #849, #834, #746, #732 | 핫패스 최적화. Rust 커널 포팅과 같은 방향의 Python 측 보완 | Demucs GPU/offload, 대용량 파일 스트리밍, UI 가상화 | +| G. 성능 (Bolt 시리즈: 관측 확률 벡터화, GrooveMap maxTime O(1), chart dedupe O(N), chord change count O(1), checkerboard/HMM 벡터화) | #999, #859, #849, #834, #746, #732 | 핫패스 최적화. Rust 커널 포팅과 같은 방향의 Python 측 보완 | Demucs 가속 admission/parity/performance qualification, 대용량 파일 스트리밍, UI 가상화 | | H. 접근성/디자인 시스템 (tooltip aria-disabled, icon tooltip, Storybook tokens, Figma drift check) | #833, #731, #897, #969 | WCAG 대응 시작점 | Issue #965(Figma/Storybook/shipped UI 정합 + WCAG 2.2 AA gate) 전체 | | I. 테스트 현실성 (decoded WAV acceptance, known-take chord recovery, real YouTube known-stem benchmark, branch coverage) | #892, #891, #828, #861 | synthetic fixture에서 실오디오 기반 acceptance로 이동 시작 | Issue #770(실오디오 MIR accuracy benchmark) 체계화, RMSE/SI-SDR 임계값 정책 | | J. 의존성/빌드 위생 (react, storybook, base-ui, lucide, sonner, codeql-action, setup-uv, uv group, numba, uuid, time, rust pinning, node floor, orphaned Actions identity) | #920, #942, #922, #921, #926, #927, #924, #931, #936, #919, #918, #754, #944, #896, #895 | 공급망/런타임 최신화 유지 | Dependabot train 정리(Issue #966), jsdom 30 전환 완료 | @@ -118,27 +119,27 @@ capability cluster 분류와 착지 후 남는 Gap: 문서 vs 코드 대조로 확인한 구체적 Gap. -(a) **Rust compute layer 활용 범위** — 분석 핫패스 중 checkerboard novelty와 Viterbi decode만 Rust(`bandscope_numeric`)에 있다. 스템 분리(Demucs)는 Python/torch CPU 경로이고 GPU/CUDA/Metal 경로가 없으며, transcription은 에너지 마스크 휴리스틱(`transcription/api.py`)으로 ML 모델이 아니다. 데스크톱 단일 곡 처리 기준 CPU로도 실용적일 수 있으나, 긴 곡/다중 분석에서 병목이며 `docs/plans/2026-04-25-v2-transcription.md`가 v2 계획으로 존재한다. +(a) **Rust compute layer 활용 범위** — 분석 핫패스 중 checkerboard novelty와 Viterbi decode만 Rust(`bandscope_numeric`)에 있다. 스템 분리(Demucs)는 Python/torch이며 `AudioSeparationConfig.device` 기본값은 `cpu`다. `_apply_model`은 구성된 device를 `demucs.apply.apply_model(..., device=...)`에 그대로 전달하므로 비-CPU 장치 경로는 존재한다. 다만 BandScope의 현재 protected/release evidence에는 CUDA/MPS 경로의 장치 admission, CPU 대비 수치 parity, 성능 기준, 플랫폼별 release qualification이 없다. 따라서 Gap은 "GPU 경로 부재"가 아니라 **가속 경로의 검증·지원 계약 부재**다. transcription은 에너지 마스크 휴리스틱(`transcription/api.py`)으로 ML 모델이 아니다. 데스크톱 단일 곡 처리 기준 CPU로도 실용적일 수 있으나, 긴 곡/다중 분석에서 병목이며 `docs/plans/2026-04-25-v2-transcription.md`가 v2 계획으로 존재한다. (b) **다층/계층·시간 모델링** — `song -> section -> role` 계약과 sections/roles/temporal 모듈은 존재하지만, role-level harmony는 `bandsplit-v1.json`의 고정 주파수 컷오프 휴리스틱에 의존한다. 학습된 multilevel 모델(예: role-conditioned chord/voicing 모델)과 section 경계의 temporal 일관성 학습은 없다. `docs/plans/2026-03-28-ml-engine-integration.md`가 관련 계획 문서다. -(c)**임의 가중치 vs 문헌 기반 값** — `chord_recognizer._build_transition_matrix()`는 `self_prob=0.8`, `related_prob=0.03`, uniform baseline `0.01/n` 등 hand-set 상수를 쓴다("Encodes musical priors" 주석). 방향성(fifth/fourth/relative/parallel)은 음악 이론에 근거하지만 수치는 문헌 교정(calibration)되어 있지 않다. `roles/priority.py`는 숫자 가중치 없는 if-then 규칙이다. PR #732(relative-key prior correction)처럼 사후 수정이 발생해왔다. 교정 방향: 주석 코퍼스(예: Burgoyne et al., 2011의 McGill Billboard)에서 전이 행렬을 최대우도로 추정하고, HMM prior 민감도(Logan & Chu, 2000; Pauwels & Peeters, 2013; Boulanger-Lewandowski et al., 2013 참조)와 tonal pitch space 거리 기반 스무딩(Harte, 2010)으로 현재 hand-set 값과의 코드 복원 RMSE/accuracy 차이를 정량 비교한 뒤, 우세한 값을 상수가 아닌 데이터 산출물로 고정한다. +(c) **임의 가중치 vs 문헌 기반 값** — `chord_recognizer._build_transition_matrix()`는 `self_prob=0.8`, `related_prob=0.03`, uniform baseline `0.01/n` 등 hand-set 상수를 쓴다("Encodes musical priors" 주석). 방향성(fifth/fourth/relative/parallel)은 음악 이론에 근거하지만 수치는 문헌 교정(calibration)되어 있지 않다. `roles/priority.py`는 숫자 가중치 없는 if-then 규칙이다. PR #732(relative-key prior correction)처럼 사후 수정이 발생해왔다. 교정 방향은 주석 코퍼스(예: Burgoyne et al., 2011의 McGill Billboard)에서 전이 행렬을 최대우도로 추정하고, 관련 HMM/화음인식 문헌(Logan & Chu, 2000; Pauwels & Peeters, 2013; Boulanger-Lewandowski et al., 2013)은 모델링 맥락으로만 사용하며 현재 transition 수치의 parameter source로 간주하지 않는 것이다. tonal pitch space 거리 기반 스무딩(Harte, 2010) 등 대안과 현재 hand-set 값의 코드 복원 RMSE/accuracy 차이를 정량 비교한 뒤, 우세한 값을 상수가 아닌 데이터 산출물로 고정한다. -(d) **테스트 현실성** — `test_numeric_parity.py`(Rust-Python parity), `test_api.py` 등은 합성 입력 기반이고, tests 디렉터리에 .wav/.mp3 실오디오 fixture가 없다(find 확인). 실오디오 acceptance는 PR #892(decoded WAV C major), #891(known take verse/chorus recovery)이 열려 있고, 실 YouTube known-stem benchmark는 draft PR #828 + Issue #770 상태다. RMSE/SI-SDR 스타일 정량 임계값 acceptance gate는 아직 없다. +(d) **테스트 현실성** — `test_numeric_parity.py`(Rust-Python parity), `test_api.py` 등은 합성 입력 기반이다. 현재 PR checkout의 Git tree 및 9장 `find` 검증 기준 test 경로에 `.wav`/`.mp3` 실오디오 fixture가 없다. 실오디오 acceptance는 PR #892(decoded WAV C major), #891(known take verse/chorus recovery)이 열려 있고, 실 YouTube known-stem benchmark는 draft PR #828 + Issue #770 상태다. RMSE/SI-SDR 스타일 정량 임계값 acceptance gate는 아직 없다. -(e) **커버리지/docstring 100%** — Python은 `--cov-fail-under=100` + Ruff D100-D107 docstring 100%가 gate로 작동한다(AGENTS.md, roadmap-completion 문서). JS workspace는 2026-08-25 실측에서 desktop(469 stmts/357 branches/105 funcs)과 shared-types(717 stmts/643 branches/59 funcs) 모두 statements/branches/functions/lines **실측 100%**를 유지한다. 그러나 gate threshold(`vite.config.ts`, `vitest.config.ts`)는 90으로 Python보다 낮아, 리그레션 시 90~99% 구간이 무단 통과될 수 있다. Gate 상향은 Backlog #10. +(e) **커버리지/docstring 100%** — Python은 `--cov-fail-under=100` + Ruff D100-D107 docstring 100%가 gate로 작동한다(AGENTS.md, roadmap-completion 문서). JS workspace의 **2026-08-25 snapshot 실측**은 desktop(469 stmts/357 branches/105 funcs)과 shared-types(717 stmts/643 branches/59 funcs) 모두 statements/branches/functions/lines 100%였다. 이 수치는 현재 영구 gate를 뜻하지 않는다. gate threshold(`vite.config.ts`, `vitest.config.ts`)는 90으로 Python보다 낮아, 리그레션 시 90~99% 구간이 무단 통과될 수 있다. Gate 상향은 Backlog #10. (f) **보안 체크리스트 잔여 항목** — 구현된 것: allowlisted stdin/stdout subprocess, Tauri CSP, path guards(#727 착지), CSV escape/sanitize, shell=False. 열린 것: canonical audio resource budget(#985 draft, Issue #781), filesystem path containment 재구축(Issue #852, #858 진행), native PDF read bounding(#865, #750), quick-xml RustSec 예외(#948, Issue #542), npm/PDF.js/nanoid/undici baseline(#783). 모델 artifact(Demucs checkpoint) checksum/signature 검증 파이프라인은 문서(app-security.md "Models") 요구 대비 미구현. -(k) **운영 관측(2026-08-25 strix 공급자 장애)** — 중앙 Strix 게이트가 NVIDIA NIM 소진 시 최종 폴백 `openai-direct/gpt-5.4`를 NIM 엣지 API base로 라우팅해 `404 page not found`로 실패 닫기(fail-closed)하여 전 조직 PR 큐가 정체했다. 근본 원인 수정은 ContextualWisdomLab/.github#1324(openai-direct 폴백 전용 API base 라우팅 + 회귀 계약 테스트)로 추적했고, bandscope 의존성 CVE(pdfjs-dist CVE-2026-16633 등)는 canonical owner #783으로 일원화했다. 운영 교훈: required 스캐너의 공급자 장애는 repo 단위 우회가 아니라 중앙 게이트 계약 수정으로만 풀어야 한다. +(g) **운영 관측(2026-08-25 strix 공급자 장애)** — 중앙 Strix 게이트가 NVIDIA NIM 소진 시 최종 폴백 `openai-direct/gpt-5.4`를 NIM 엣지 API base로 라우팅해 `404 page not found`로 실패 닫기(fail-closed)하여 전 조직 PR 큐가 정체했다. 근본 원인 수정은 ContextualWisdomLab/.github#1324(openai-direct 폴백 전용 API base 라우팅 + 회귀 계약 테스트)로 추적했고, bandscope 의존성 CVE(pdfjs-dist CVE-2026-16633 등)는 canonical owner #783으로 일원화했다. 운영 교훈: required 스캐너의 공급자 장애는 repo 단위 우회가 아니라 중앙 게이트 계약 수정으로만 풀어야 한다. -(g) **i18n/현지화** — `src/i18n` + `locales/en`, `locales/ko` 존재, 하드코딩 한국어 문자열 미탐지(workspace tsx grep 0건), interpolation hardening PR #744 진행. en/ko 2개 언어뿐이며, PR 시리즈가 추가할 다수의 카피 키가 locales에 아직 없다. +(h) **i18n/현지화** — `src/i18n` + `locales/en`, `locales/ko` 존재, 하드코딩 한국어 문자열 미탐지(workspace tsx grep 0건), interpolation hardening PR #744 진행. en/ko 2개 언어뿐이며, PR 시리즈가 추가할 다수의 카피 키가 locales에 아직 없다. -(h) **접근성** — workspace 컴포넌트에 aria-* 속성 52건 존재. 그러나 WCAG 2.2 AA gate는 Issue #965로 열려 있고, Figma/Storybook/shipped UI 정합 점검도 미완이다. tooltip/a11y PR(#833, #731)이 진행 중. +(i) **접근성** — 2026-08-25 snapshot에서 workspace 컴포넌트의 `aria-`가 포함된 matching line은 52개였다. 이는 고유 attribute token 수가 아니다. WCAG 2.2 AA gate는 Issue #965로 열려 있고, Figma/Storybook/shipped UI 정합 점검도 미완이다. tooltip/a11y PR(#833, #731)이 진행 중. -(i) **Design token/Storybook** — shadcn/ui 프리미티브 중 stories는 button/checkbox/dialog 3개뿐이고, rehearsal 도메인 컴포넌트(GrooveMap, SectionRoadmap, RoleSwitcher 등) stories는 없다. Storybook token PR #897이 진행 중. +(j) **Design token/Storybook** — shadcn/ui 프리미티브 중 stories는 button/checkbox/dialog 3개뿐이고, rehearsal 도메인 컴포넌트(GrooveMap, SectionRoadmap, RoleSwitcher 등) stories는 없다. Storybook token PR #897이 진행 중. -(j) **패키징/릴리스 준비** — `CHANGELOG.md`, `VERSION`, `release.yml`, `build-baseline.yml` 존재. Windows/macOS amd64+arm64 build gate가 protected branch 요건이다(ARCHITECTURE.md). 남는 Gap: 서명/공증/자동 업데이트 롤백 증적(Issue #960), crash-safe project format/autosave/migration(Issue #962), redacted diagnostics/support bundle(Issue #963). +(k) **패키징/릴리스 준비** — `CHANGELOG.md`, `VERSION`, `release.yml`, `build-baseline.yml` 존재. Windows/macOS amd64+arm64 build gate가 protected branch 요건이다(ARCHITECTURE.md). 남는 Gap: 서명/공증/자동 업데이트 롤백 증적(Issue #960), crash-safe project format/autosave/migration(Issue #962), redacted diagnostics/support bundle(Issue #963). ## 6. UML 보완점 @@ -159,7 +160,7 @@ sequenceDiagram T->>C: validate path/format/project id C-->>T: validated reference (no copy) T->>P: spawn allowlisted subprocess (stdin/stdout JSON) - P->>P: separate stems (Demucs CPU) / segment / chords + P->>P: separate stems (Demucs; CPU default) / segment / chords P->>N: checkerboard_novelty, viterbi_decode N-->>P: kernels result (parity-guaranteed) P-->>T: RehearsalSong JSON (schema-validated) @@ -234,7 +235,7 @@ flowchart TD 7. **crash-safe project format + autosave (Issue #962)** - Acceptance: 버전 필드를 가진 프로젝트 포맷, 저장 실패 시 known-good 보존(PRx #970 방향), migration 테스트. 8. **Demucs 플랫폼 커버리지 + 모델 artifact 검증** - - Acceptance: x86 macOS 폴백 경로가 명시되고(현재 demucs 미설치 시 불가), 모델 checkpoint checksum 검증이 intake pipeline에 있다. + - Acceptance: x86 macOS 폴백 경로가 명시되고(현재 demucs 미설치 시 불가), CPU-default 경로와 선택 가능한 비-CPU device 경로의 admission/parity/performance 지원 범위가 명문화·검증되며, 모델 checkpoint checksum 검증이 intake pipeline에 있다. 9. **WCAG 2.2 AA gate (Issue #965) + rehearsal 컴포넌트 Storybook tokens (PR #897)** - Acceptance: axe 기반 자동 점검이 CI에 있고, GrooveMap/SectionRoadmap/RoleSwitcher stories가 token 기반으로 존재한다. 10. **JS coverage 90% -> 100% 상향 또는 Python과 동일한 기준 명문화** @@ -301,11 +302,12 @@ W3C. (2023). Web Content Accessibility Guidelines (WCAG) 2.2. World Wide Web Con - 코드 검증 grep/glob (요지): - `grep -rn "padPlan\|PadPlan" apps/desktop/src packages/shared-types/src` -> 0건(시리즈 미착지 확인) - `find services/analysis-engine -name "*.py"` -> 모듈 목록(chords/sections/roles/ranges/temporal/separation/transcription/youtube/exports) + - `find . -type f \( -path '*/tests/*' -o -path '*/test/*' \) \( -iname '*.wav' -o -iname '*.mp3' \) -not -path './.git/*'` -> 0건(현재 PR checkout에서 test 실오디오 fixture 부재 확인) - `sed -n '70,110p' services/analysis-engine/src/bandscope_analysis/chords/chord_recognizer.py` -> hand-set transition prior 확인 - `sed -n '1,40p' services/analysis-engine/src/bandscope_analysis/_native.py` -> bandscope_numeric 커널/parity 확인 - `ls services/analysis-engine/rust && grep -n "maturin" services/analysis-engine/rust/pyproject.toml` -> Rust 커널 위치 확인 - `head -30 services/analysis-engine/src/bandscope_analysis/separation/model_weights/bandsplit-v1.json` -> 휴리스틱 manifest 확인 - - `grep -rn "aria-" apps/desktop/src/features/workspace/*.tsx | wc -l` -> 52 + - `grep -rn "aria-" apps/desktop/src/features/workspace/*.tsx | wc -l` -> 52 matching lines (2026-08-25 snapshot; 고유 aria-* attribute token 수가 아님) - `grep -rln "RehearsalAssignment\|RehearsalCollaboration" apps/desktop/src` -> 0건(UI 미구현 확인) - `grep -rn "loop" apps/desktop/src/features/player/index.tsx` -> 0건(loop 미구현 확인) - `ls CHANGELOG.md VERSION .github/workflows` -> 릴리스 자산 확인 From 88dcc7333aabc063931a8c77946be6540a48f5eb Mon Sep 17 00:00:00 2001 From: seonghobae Date: Fri, 28 Aug 2026 12:14:31 +0900 Subject: [PATCH 06/94] docs(gap): refresh standards and MIR references --- docs/product-technical-gap-baseline.md | 16 ++++++++++++++-- 1 file changed, 14 insertions(+), 2 deletions(-) diff --git a/docs/product-technical-gap-baseline.md b/docs/product-technical-gap-baseline.md index 912450975..a632d526d 100644 --- a/docs/product-technical-gap-baseline.md +++ b/docs/product-technical-gap-baseline.md @@ -1,6 +1,6 @@ # BandScope Product-Technical Gap Baseline -Last updated: 2026-08-26 +Last updated: 2026-08-28 Base revision: `develop@acdbea63` (fix(security): projectId path guard, npm HIGH CVEs, Foote novelty sign) ## 1. 목적과 범위 (Purpose & Scope) @@ -258,6 +258,8 @@ flowchart TD 본 문서에서 실제 인용한 개념(MIR novelty kernel, chord-recognition 연구 맥락, Viterbi 디코딩, 소스 분리 평가, librosa, 접근성 표준)에 한정한다. +2026-08-28 최신성 점검: WCAG 2.2는 현재 W3C Recommendation이며 2025년에 ISO/IEC 40500:2025로 승인되었다. 보안 개발 수명주기에는 NIST SSDF 1.1을 기준으로 삼고, MIR acceptance 설계에는 ISMIR 2024의 구조 분석·notewise source-separation 평가·다중 stem 연구를 보조 근거로 반영한다. 이 문헌은 기존 휴리스틱을 자동으로 정답으로 취급하지 않으며, 실제 오디오 benchmark와 provenance·재현성 증적을 요구하는 근거로만 사용한다. + Boulanger-Lewandowski, N., Bengio, Y., & Vincent, P. (2013). Audio chord recognition with recurrent neural networks. In Proceedings of the 14th International Society for Music Information Retrieval Conference (ISMIR 2013) (pp. 335–340). ISMIR. Burgoyne, J. A., Wild, J., & Fujinaga, I. (2011). An expert ground truth set for audio chord recognition and music analysis. In Proceedings of the 12th International Society for Music Information Retrieval Conference (ISMIR 2011) (pp. 633–638). ISMIR. @@ -280,7 +282,17 @@ Müller, M. (2015). Fundamentals of music processing: Audio, analysis, algorithm Viterbi, A. J. (1967). Error bounds for convolutional codes and an asymptotically optimum decoding algorithm. IEEE Transactions on Information Theory, 13(2), 260–269. -W3C. (2023). Web Content Accessibility Guidelines (WCAG) 2.2. World Wide Web Consortium. https://www.w3.org/TR/WCAG22/ +Chen, T.-P., & Yoshii, K. (2024). Learning multifaceted self-similarity over time and frequency for music structure analysis. In Proceedings of the 25th International Society for Music Information Retrieval Conference (pp. 189–197). ISMIR. https://doi.org/10.5281/zenodo.14877309 + +International Organization for Standardization. (2025). Information technology—W3C Web Content Accessibility Guidelines 2.2 (ISO/IEC 40500:2025). https://www.w3.org/press-releases/2025/wcag22-iso-pas/ + +Özer, Y., Berendes, H.-U., Arifi-Müller, V., Stöter, F.-R., & Müller, M. (2024). Notewise evaluation for music source separation: A case study for separated piano tracks. In Proceedings of the 25th International Society for Music Information Retrieval Conference (pp. 248–255). ISMIR. https://www.audiolabs-erlangen.de/resources/MIR/2024-ISMIR-PianoSepEval + +Souppaya, M., Scarfone, K., & Dodson, D. (2022). Secure software development framework (SSDF) version 1.1: Recommendations for mitigating the risk of software vulnerabilities (NIST Special Publication 800-218). National Institute of Standards and Technology. https://doi.org/10.6028/NIST.SP.800-218 + +Watcharasupat, K. N., & Lerch, A. (2024). A stem-agnostic single-decoder system for music source separation beyond four stems. In Proceedings of the 25th International Society for Music Information Retrieval Conference (pp. 1051–1059). ISMIR. https://arxiv.org/abs/2406.18747 + +World Wide Web Consortium. (2024). Web Content Accessibility Guidelines (WCAG) 2.2. https://www.w3.org/TR/2024/REC-WCAG22-20241212/ 참고: 위 항목 중 DOI가 확실치 않은 항목은 DOI 없이 plain APA로 기술했다(조작 금지 원칙). 코드 내 개념 대응: Foote(1999)=checkerboard novelty, Viterbi(1967)=Viterbi 디코딩 알고리즘, Boulanger-Lewandowski et al.(2013)=오디오 화음 인식 연구 맥락(현재 hand-set transition prior 수치의 근거는 아님), Défossez et al.(2019)=Demucs htdemucs, Le Roux et al.(2019)=SI-SDR(audio_separator.py 주석 언급), Müller(2015)/McFee et al.(2015)=섹션/코드/음역 분석 기반 라이브러리. 현재 transition prior 수치의 문헌·교정 데이터 근거가 없는 점은 5장 (c) 및 P2-11의 미해결 Gap으로 유지한다. From fd30db91467aefb263b72c40f12656d1e93a09b6 Mon Sep 17 00:00:00 2001 From: seonghobae Date: Fri, 28 Aug 2026 12:19:05 +0900 Subject: [PATCH 07/94] docs(gap): correct Tauri entrypoint path --- docs/product-technical-gap-baseline.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/product-technical-gap-baseline.md b/docs/product-technical-gap-baseline.md index a632d526d..b9e40289a 100644 --- a/docs/product-technical-gap-baseline.md +++ b/docs/product-technical-gap-baseline.md @@ -54,7 +54,7 @@ flowchart LR 핵심 구조적 사실(코드 확인 완료): -- 로컬 오케스트레이션은 loopback HTTP가 아닌 typed Tauri IPC + stdin/stdout JSON 서브프로세스 방식이다 (`ARCHITECTURE.md`, `src-tauri/main.rs`) +- 로컬 오케스트레이션은 loopback HTTP가 아닌 typed Tauri IPC + stdin/stdout JSON 서브프로세스 방식이다 (`ARCHITECTURE.md`, `apps/desktop/src-tauri/src/main.rs`) - `apps/desktop/core`(Rust)는 분석 연산이 아니라 입력 검증(YouTube URL, project payload, score PDF source, 경로 가드) 담당이다 (`apps/desktop/core/src/lib.rs`) - 무거운 수치 커널 중 checkerboard novelty와 Viterbi 디코딩만 `bandscope_numeric`(Rust/PyO3)으로 포팅되어 있고, 나머지는 Python/NumPy 참조 구현이며 `tests/test_numeric_parity.py`로 f64 parity를 잠근다 (`_native.py`) - 스템 분리는 Demucs `htdemucs`를 기본 `AudioSeparationConfig.device="cpu"`로 실행한다. `_apply_model`은 구성된 `device`를 Demucs `apply_model(..., device=...)`에 전달하므로 비-CPU 장치 경로 자체는 존재하지만, BandScope가 CUDA/MPS를 독립적으로 admission·parity·performance·release gate한 증거는 아직 없다 (`separation/audio_separator.py`) From 7b081bade73a06fbe4383aa7655e9b60f72a3c8b Mon Sep 17 00:00:00 2001 From: seonghobae Date: Fri, 28 Aug 2026 15:23:13 +0900 Subject: [PATCH 08/94] docs(gap): record exact-head PR governance snapshot --- docs/product-technical-gap-baseline.md | 36 +++++++++++++++++++++----- 1 file changed, 29 insertions(+), 7 deletions(-) diff --git a/docs/product-technical-gap-baseline.md b/docs/product-technical-gap-baseline.md index b9e40289a..2aba7a8b1 100644 --- a/docs/product-technical-gap-baseline.md +++ b/docs/product-technical-gap-baseline.md @@ -1,7 +1,7 @@ # BandScope Product-Technical Gap Baseline Last updated: 2026-08-28 -Base revision: `develop@acdbea63` (fix(security): projectId path guard, npm HIGH CVEs, Foote novelty sign) +Base revision: `develop@749511c3ad4000090048718f685c6bee6b3d2c25` (feat(workspace): name tonight's first playable range on the map, #957) ## 1. 목적과 범위 (Purpose & Scope) @@ -94,7 +94,30 @@ flowchart LR ## 4. 현재 열린 PR 기반 Gap 분석 (Open-PR Gap Analysis) -현재 open PR은 130건이다(`/tmp/opencode/open_prs_full.txt`, 2026-08-25 기준). 대부분은 동일 패턴의 시리즈다. +현재 open PR은 130건이다(2026-08-28 REST inventory 기준). 대부분은 동일 패턴의 시리즈다. + +### 4.1 2026-08-28 exact-head 운영 snapshot + +아래 표는 protected base `develop@749511c3ad4000090048718f685c6bee6b3d2c25`에 대해 GitHub REST API로 다시 읽은 current head와 그 head의 Checks/review 상태다. 이전 SHA의 Checks는 현재 증적으로 재사용하지 않았다. + +| PR | current head | current 상태와 traceability | +|---|---|---| +| #1045 | `7d6db4bf9a70bb861bd32e5955e9b3f6de10da09` | source/coverage/security/build/release Checks terminal success; `opencode-review`와 `strix` failure; qualifying independent approval 없음 | +| #1046 | `4d06285a780d4a17b78f0826e79ba3f64595cfc0` | current head에서 source local proof 통과; hosted Checks는 push 후 queued/in-progress; qualifying independent approval 없음 | +| #1033 | `046db562497a8104fa525f56a6437eb13fbf4760` | source/coverage/security/build/release 및 `opencode-review`/`strix` terminal success; reviews는 COMMENTED뿐이며 qualifying approval 없음 | +| #1034 | `98a99e1bff4b63f5294d8c9a5cbdaf312b235403` | source/coverage/security/build/release terminal success; `opencode-review` success; qualifying independent approval 없음 | +| #1041 | `164995d3a3c056bdbb4fc293226d0c31c062104e` | ScoreView/ScoreViewer tooltip 변경 current head; coverage/build/security Checks 일부 queued/in-progress; qualifying approval 없음 | +| #910 | `b6bcecb8649796dc13a54c39d70ca05977b0ac4c` | source/coverage/security/build/release terminal success이나 current `opencode-review` failure; current-head qualifying approval 없음 | +| #866 | `c2cc5bbeda6628fa9999401d6b0d228cb9b6bb9c` | stale base `acdbea63`, Draft + CONFLICTING; `opencode-review` failure; canonical audio policy owner이며 merge 대상 아님 | +| #1025 | `fd30db91467aefb263b72c40f12656d1e93a09b6` | 이 문서 PR의 current head; docs/source/security/build Checks는 terminal success이나 `opencode-review` failure; qualifying approval 없음 | + +이 snapshot에서 위 PR 중 병합된 것은 없다. `mergeable=true`는 protected review/required-check 완료를 뜻하지 않으며, 승인·current-head review·필수 gate가 모두 충족되지 않은 PR은 병합하지 않았다. admin/self-approval, force-push, protected gate bypass도 사용하지 않았다. + +#### Security Notes + +- 이 변경은 runtime code, 파일/URL intake, subprocess, IPC, 모델, 로그, export 동작을 변경하지 않고 현재 상태와 traceability만 갱신한다. +- 근거는 각 PR의 API current head SHA와 동일 SHA의 check-runs/reviews이며, stale/cancelled predecessor run은 성공 증적에서 제외한다. +- 명령 출력과 문서에는 secret 값이나 raw audio/사용자 경로를 기록하지 않는다. 시리즈 패턴: `feat(workspace): name tonight's first X on the map` — 워크스페이스 맵에 "오늘 밤 첫 X" next-action 카피를 올리고, Open 클릭 시 해당 섹션으로 이동. 각 PR은 role-owned plan 필드(예: `padPlan`)를 shared contract에 추가하고, own data-property descriptor 검증(Proxy `get` trap 방어), 한국어 조사 안전 카피(`패드`, `뱀프` 등), reduced-motion 처리, 그리고 강한 merge-gate 조항을 포함한다. @@ -143,7 +166,7 @@ capability cluster 분류와 착지 후 남는 Gap: ## 6. UML 보완점 -Protected base `develop@acdbea6344fe1231c39535b575f4de35e4c607c9`의 `docs/`와 `ARCHITECTURE.md`에는 Mermaid `sequenceDiagram`/`classDiagram`/`flowchart`가 없다. 이 PR이 아래 다이어그램을 처음 추가하므로 현재 PR checkout 자체를 검색하면 이 파일이 매치되는 것이 정상이다. +Protected base `develop@749511c3ad4000090048718f685c6bee6b3d2c25`의 `docs/`와 `ARCHITECTURE.md`에는 Mermaid `sequenceDiagram`/`classDiagram`/`flowchart`가 없다. 이 PR이 아래 다이어그램을 처음 추가하므로 현재 PR checkout 자체를 검색하면 이 파일이 매치되는 것이 정상이다. ### 6.1 import -> analyze -> workspace render happy path @@ -305,9 +328,8 @@ World Wide Web Consortium. (2024). Web Content Accessibility Guidelines (WCAG) 2 - Open PR inventory: ```bash mkdir -p /tmp/opencode - gh pr list --state open --limit 200 --json number,title,isDraft,headRefName \ - --jq 'sort_by(-.number) | .[] | "\(.number)\t\(.isDraft)\t\(.title)"' > /tmp/opencode/open_prs_full.txt - wc -l /tmp/opencode/open_prs_full.txt # 130 + gh api --paginate 'repos/ContextualWisdomLab/bandscope/pulls?state=open&per_page=100' \ + --jq '.[].number' | wc -l # 130 gh pr view 1021 --json title,body # 시리즈 패턴 샘플 ``` - Open issues: `gh issue list --state open --limit 50 --json number,title --jq '.[]|"\(.number)\t\(.title)"'` @@ -325,4 +347,4 @@ World Wide Web Consortium. (2024). Web Content Accessibility Guidelines (WCAG) 2 - `ls CHANGELOG.md VERSION .github/workflows` -> 릴리스 자산 확인 - `grep -n thresholds apps/desktop/vite.config.ts packages/shared-types/vitest.config.ts` -> JS 90% 확인 - `grep -rn "cov-fail-under" AGENTS.md docs` -> Python 100% gate 확인 - - Protected-base Mermaid 존재 여부: `git grep -n -E 'sequenceDiagram|classDiagram|flowchart' acdbea6344fe1231c39535b575f4de35e4c607c9 -- docs ARCHITECTURE.md || true` -> 0건(6장 전제 확인) + - Protected-base Mermaid 존재 여부: `git grep -n -E 'sequenceDiagram|classDiagram|flowchart' 749511c3ad4000090048718f685c6bee6b3d2c25 -- docs ARCHITECTURE.md || true` -> 0건(6장 전제 확인) From 8dc695121c7889928308aa7f70a25fd12d0e029f Mon Sep 17 00:00:00 2001 From: seonghobae Date: Fri, 28 Aug 2026 15:33:44 +0900 Subject: [PATCH 09/94] docs(gap): refresh moving PR heads --- docs/product-technical-gap-baseline.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/product-technical-gap-baseline.md b/docs/product-technical-gap-baseline.md index 2aba7a8b1..08c09f46e 100644 --- a/docs/product-technical-gap-baseline.md +++ b/docs/product-technical-gap-baseline.md @@ -103,13 +103,13 @@ flowchart LR | PR | current head | current 상태와 traceability | |---|---|---| | #1045 | `7d6db4bf9a70bb861bd32e5955e9b3f6de10da09` | source/coverage/security/build/release Checks terminal success; `opencode-review`와 `strix` failure; qualifying independent approval 없음 | -| #1046 | `4d06285a780d4a17b78f0826e79ba3f64595cfc0` | current head에서 source local proof 통과; hosted Checks는 push 후 queued/in-progress; qualifying independent approval 없음 | +| #1046 | `008248327f2f3e3636d9d234221810f3db56829f` | current head에서 source local proof 통과; Ruff format failure를 수정한 뒤 hosted Checks는 push 후 queued/in-progress; qualifying independent approval 없음 | | #1033 | `046db562497a8104fa525f56a6437eb13fbf4760` | source/coverage/security/build/release 및 `opencode-review`/`strix` terminal success; reviews는 COMMENTED뿐이며 qualifying approval 없음 | | #1034 | `98a99e1bff4b63f5294d8c9a5cbdaf312b235403` | source/coverage/security/build/release terminal success; `opencode-review` success; qualifying independent approval 없음 | | #1041 | `164995d3a3c056bdbb4fc293226d0c31c062104e` | ScoreView/ScoreViewer tooltip 변경 current head; coverage/build/security Checks 일부 queued/in-progress; qualifying approval 없음 | | #910 | `b6bcecb8649796dc13a54c39d70ca05977b0ac4c` | source/coverage/security/build/release terminal success이나 current `opencode-review` failure; current-head qualifying approval 없음 | | #866 | `c2cc5bbeda6628fa9999401d6b0d228cb9b6bb9c` | stale base `acdbea63`, Draft + CONFLICTING; `opencode-review` failure; canonical audio policy owner이며 merge 대상 아님 | -| #1025 | `fd30db91467aefb263b72c40f12656d1e93a09b6` | 이 문서 PR의 current head; docs/source/security/build Checks는 terminal success이나 `opencode-review` failure; qualifying approval 없음 | +| #1025 | `7b081bade73a06fbe4383aa7655e9b60f72a3c8b` | 이 문서 PR의 current head; docs 변경 push 후 hosted Checks는 queued/in-progress; qualifying approval 없음 | 이 snapshot에서 위 PR 중 병합된 것은 없다. `mergeable=true`는 protected review/required-check 완료를 뜻하지 않으며, 승인·current-head review·필수 gate가 모두 충족되지 않은 PR은 병합하지 않았다. admin/self-approval, force-push, protected gate bypass도 사용하지 않았다. From e5678a03937c0bf56c78d139c511b159a988ce08 Mon Sep 17 00:00:00 2001 From: seonghobae Date: Fri, 28 Aug 2026 15:37:55 +0900 Subject: [PATCH 10/94] docs(gap): refresh swell traceability --- docs/product-technical-gap-baseline.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/product-technical-gap-baseline.md b/docs/product-technical-gap-baseline.md index 08c09f46e..5ce022de0 100644 --- a/docs/product-technical-gap-baseline.md +++ b/docs/product-technical-gap-baseline.md @@ -102,7 +102,7 @@ flowchart LR | PR | current head | current 상태와 traceability | |---|---|---| -| #1045 | `7d6db4bf9a70bb861bd32e5955e9b3f6de10da09` | source/coverage/security/build/release Checks terminal success; `opencode-review`와 `strix` failure; qualifying independent approval 없음 | +| #1045 | `6c4edebe44740d753b7a0d287273e01b9faddfb3` | navigation-failure disarm fix 포함; 29 hosted Checks success, Rust check 진행 중, `opencode-review` failure; qualifying independent approval 없음 | | #1046 | `008248327f2f3e3636d9d234221810f3db56829f` | current head에서 source local proof 통과; Ruff format failure를 수정한 뒤 hosted Checks는 push 후 queued/in-progress; qualifying independent approval 없음 | | #1033 | `046db562497a8104fa525f56a6437eb13fbf4760` | source/coverage/security/build/release 및 `opencode-review`/`strix` terminal success; reviews는 COMMENTED뿐이며 qualifying approval 없음 | | #1034 | `98a99e1bff4b63f5294d8c9a5cbdaf312b235403` | source/coverage/security/build/release terminal success; `opencode-review` success; qualifying independent approval 없음 | From 9632d98611bf5a28b8d7037ecfd8acb0abffd2cd Mon Sep 17 00:00:00 2001 From: seonghobae Date: Fri, 28 Aug 2026 15:40:34 +0900 Subject: [PATCH 11/94] docs(gap): record Strix provider failure --- docs/product-technical-gap-baseline.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/product-technical-gap-baseline.md b/docs/product-technical-gap-baseline.md index 5ce022de0..3bc154b53 100644 --- a/docs/product-technical-gap-baseline.md +++ b/docs/product-technical-gap-baseline.md @@ -103,7 +103,7 @@ flowchart LR | PR | current head | current 상태와 traceability | |---|---|---| | #1045 | `6c4edebe44740d753b7a0d287273e01b9faddfb3` | navigation-failure disarm fix 포함; 29 hosted Checks success, Rust check 진행 중, `opencode-review` failure; qualifying independent approval 없음 | -| #1046 | `008248327f2f3e3636d9d234221810f3db56829f` | current head에서 source local proof 통과; Ruff format failure를 수정한 뒤 hosted Checks는 push 후 queued/in-progress; qualifying independent approval 없음 | +| #1046 | `008248327f2f3e3636d9d234221810f3db56829f` | current head에서 source local proof 통과; 29 hosted Checks success, Strix는 tool-description 1024자 제한 후 provider unavailable로 failure, OpenCode/macOS gate 진행 중; qualifying independent approval 없음 | | #1033 | `046db562497a8104fa525f56a6437eb13fbf4760` | source/coverage/security/build/release 및 `opencode-review`/`strix` terminal success; reviews는 COMMENTED뿐이며 qualifying approval 없음 | | #1034 | `98a99e1bff4b63f5294d8c9a5cbdaf312b235403` | source/coverage/security/build/release terminal success; `opencode-review` success; qualifying independent approval 없음 | | #1041 | `164995d3a3c056bdbb4fc293226d0c31c062104e` | ScoreView/ScoreViewer tooltip 변경 current head; coverage/build/security Checks 일부 queued/in-progress; qualifying approval 없음 | From b583f34796c002e075dd129581bf534096626b85 Mon Sep 17 00:00:00 2001 From: seonghobae Date: Fri, 28 Aug 2026 15:42:06 +0900 Subject: [PATCH 12/94] docs(gap): close fade head snapshot --- docs/product-technical-gap-baseline.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/product-technical-gap-baseline.md b/docs/product-technical-gap-baseline.md index 3bc154b53..eff187165 100644 --- a/docs/product-technical-gap-baseline.md +++ b/docs/product-technical-gap-baseline.md @@ -103,7 +103,7 @@ flowchart LR | PR | current head | current 상태와 traceability | |---|---|---| | #1045 | `6c4edebe44740d753b7a0d287273e01b9faddfb3` | navigation-failure disarm fix 포함; 29 hosted Checks success, Rust check 진행 중, `opencode-review` failure; qualifying independent approval 없음 | -| #1046 | `008248327f2f3e3636d9d234221810f3db56829f` | current head에서 source local proof 통과; 29 hosted Checks success, Strix는 tool-description 1024자 제한 후 provider unavailable로 failure, OpenCode/macOS gate 진행 중; qualifying independent approval 없음 | +| #1046 | `008248327f2f3e3636d9d234221810f3db56829f` | current head에서 source local proof 통과; 30 hosted Checks success, `opencode-review`는 current-head verdict 없음으로 failure, Strix는 tool-description 1024자 제한 후 provider unavailable로 failure; qualifying independent approval 없음 | | #1033 | `046db562497a8104fa525f56a6437eb13fbf4760` | source/coverage/security/build/release 및 `opencode-review`/`strix` terminal success; reviews는 COMMENTED뿐이며 qualifying approval 없음 | | #1034 | `98a99e1bff4b63f5294d8c9a5cbdaf312b235403` | source/coverage/security/build/release terminal success; `opencode-review` success; qualifying independent approval 없음 | | #1041 | `164995d3a3c056bdbb4fc293226d0c31c062104e` | ScoreView/ScoreViewer tooltip 변경 current head; coverage/build/security Checks 일부 queued/in-progress; qualifying approval 없음 | From ca66637b9fbb90652844a312f82331f5052d56cf Mon Sep 17 00:00:00 2001 From: seonghobae Date: Fri, 28 Aug 2026 15:54:17 +0900 Subject: [PATCH 13/94] docs(gap): record GrooveMap security-baseline repair --- docs/product-technical-gap-baseline.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/docs/product-technical-gap-baseline.md b/docs/product-technical-gap-baseline.md index eff187165..9b135373a 100644 --- a/docs/product-technical-gap-baseline.md +++ b/docs/product-technical-gap-baseline.md @@ -108,8 +108,9 @@ flowchart LR | #1034 | `98a99e1bff4b63f5294d8c9a5cbdaf312b235403` | source/coverage/security/build/release terminal success; `opencode-review` success; qualifying independent approval 없음 | | #1041 | `164995d3a3c056bdbb4fc293226d0c31c062104e` | ScoreView/ScoreViewer tooltip 변경 current head; coverage/build/security Checks 일부 queued/in-progress; qualifying approval 없음 | | #910 | `b6bcecb8649796dc13a54c39d70ca05977b0ac4c` | source/coverage/security/build/release terminal success이나 current `opencode-review` failure; current-head qualifying approval 없음 | +| #859 | `5236ac2443e037f898a250b3c1320d4b71d6aaa2` | security-baseline 회귀를 제거하고 GrooveMap 최적화·회귀 테스트만 남긴 current head; hosted Checks queued/in-progress, qualifying approval 없음 | | #866 | `c2cc5bbeda6628fa9999401d6b0d228cb9b6bb9c` | stale base `acdbea63`, Draft + CONFLICTING; `opencode-review` failure; canonical audio policy owner이며 merge 대상 아님 | -| #1025 | `7b081bade73a06fbe4383aa7655e9b60f72a3c8b` | 이 문서 PR의 current head; docs 변경 push 후 hosted Checks는 queued/in-progress; qualifying approval 없음 | +| #1025 | `b583f34796c002e075dd129581bf534096626b85` | 이 문서 PR의 current head; docs snapshot 갱신 후 hosted Checks는 queued/in-progress; qualifying approval 없음 | 이 snapshot에서 위 PR 중 병합된 것은 없다. `mergeable=true`는 protected review/required-check 완료를 뜻하지 않으며, 승인·current-head review·필수 gate가 모두 충족되지 않은 PR은 병합하지 않았다. admin/self-approval, force-push, protected gate bypass도 사용하지 않았다. From bac16c752d3f6de498b12c4216dbdd2080d43cf3 Mon Sep 17 00:00:00 2001 From: seonghobae Date: Fri, 28 Aug 2026 16:03:21 +0900 Subject: [PATCH 14/94] docs(gap): refresh first-intro repair head --- docs/product-technical-gap-baseline.md | 1 + 1 file changed, 1 insertion(+) diff --git a/docs/product-technical-gap-baseline.md b/docs/product-technical-gap-baseline.md index 9b135373a..477aff013 100644 --- a/docs/product-technical-gap-baseline.md +++ b/docs/product-technical-gap-baseline.md @@ -108,6 +108,7 @@ flowchart LR | #1034 | `98a99e1bff4b63f5294d8c9a5cbdaf312b235403` | source/coverage/security/build/release terminal success; `opencode-review` success; qualifying independent approval 없음 | | #1041 | `164995d3a3c056bdbb4fc293226d0c31c062104e` | ScoreView/ScoreViewer tooltip 변경 current head; coverage/build/security Checks 일부 queued/in-progress; qualifying approval 없음 | | #910 | `b6bcecb8649796dc13a54c39d70ca05977b0ac4c` | source/coverage/security/build/release terminal success이나 current `opencode-review` failure; current-head qualifying approval 없음 | +| #943 | `ff5e47d5cff84194e457c05e4bfbe26a30ea69a8` | first-intro player/workspace current head; Proxy metadata fail-closed fix 포함; hosted Checks queued/in-progress; qualifying approval 없음 | | #859 | `5236ac2443e037f898a250b3c1320d4b71d6aaa2` | security-baseline 회귀를 제거하고 GrooveMap 최적화·회귀 테스트만 남긴 current head; hosted Checks queued/in-progress, qualifying approval 없음 | | #866 | `c2cc5bbeda6628fa9999401d6b0d228cb9b6bb9c` | stale base `acdbea63`, Draft + CONFLICTING; `opencode-review` failure; canonical audio policy owner이며 merge 대상 아님 | | #1025 | `b583f34796c002e075dd129581bf534096626b85` | 이 문서 PR의 current head; docs snapshot 갱신 후 hosted Checks는 queued/in-progress; qualifying approval 없음 | From cb8c70a65ef11d941bfe25f9c2d326e26c893d18 Mon Sep 17 00:00:00 2001 From: seonghobae Date: Fri, 28 Aug 2026 16:05:07 +0900 Subject: [PATCH 15/94] docs(gap): refresh verse and pre-chorus repair heads --- docs/product-technical-gap-baseline.md | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/docs/product-technical-gap-baseline.md b/docs/product-technical-gap-baseline.md index 477aff013..eeea4c9d4 100644 --- a/docs/product-technical-gap-baseline.md +++ b/docs/product-technical-gap-baseline.md @@ -109,9 +109,11 @@ flowchart LR | #1041 | `164995d3a3c056bdbb4fc293226d0c31c062104e` | ScoreView/ScoreViewer tooltip 변경 current head; coverage/build/security Checks 일부 queued/in-progress; qualifying approval 없음 | | #910 | `b6bcecb8649796dc13a54c39d70ca05977b0ac4c` | source/coverage/security/build/release terminal success이나 current `opencode-review` failure; current-head qualifying approval 없음 | | #943 | `ff5e47d5cff84194e457c05e4bfbe26a30ea69a8` | first-intro player/workspace current head; Proxy metadata fail-closed fix 포함; hosted Checks queued/in-progress; qualifying approval 없음 | +| #947 | `38ed1c8f4dc5f020db43536596aa401c454db55c` | first-verse workspace/player current head; CHANGELOG heading spacing fix 포함; hosted Checks queued/in-progress; qualifying approval 없음 | +| #955 | `4058e5094bff94f9ed2df0f635313ff244f225a6` | first-pre-chorus workspace/player current head; CHANGELOG heading spacing fix 포함; hosted Checks queued/in-progress; qualifying approval 없음 | | #859 | `5236ac2443e037f898a250b3c1320d4b71d6aaa2` | security-baseline 회귀를 제거하고 GrooveMap 최적화·회귀 테스트만 남긴 current head; hosted Checks queued/in-progress, qualifying approval 없음 | | #866 | `c2cc5bbeda6628fa9999401d6b0d228cb9b6bb9c` | stale base `acdbea63`, Draft + CONFLICTING; `opencode-review` failure; canonical audio policy owner이며 merge 대상 아님 | -| #1025 | `b583f34796c002e075dd129581bf534096626b85` | 이 문서 PR의 current head; docs snapshot 갱신 후 hosted Checks는 queued/in-progress; qualifying approval 없음 | +| #1025 | `bac16c752d3f6de498b12c4216dbdd2080d43cf3` | 이 문서 PR의 current head; docs snapshot 갱신 후 hosted Checks는 queued/in-progress; qualifying approval 없음 | 이 snapshot에서 위 PR 중 병합된 것은 없다. `mergeable=true`는 protected review/required-check 완료를 뜻하지 않으며, 승인·current-head review·필수 gate가 모두 충족되지 않은 PR은 병합하지 않았다. admin/self-approval, force-push, protected gate bypass도 사용하지 않았다. From d06d4c18a7569dcf202c959d4597414ae8b07047 Mon Sep 17 00:00:00 2001 From: seonghobae Date: Fri, 28 Aug 2026 16:13:53 +0900 Subject: [PATCH 16/94] docs(gap): pin final GrooveMap repair head --- docs/product-technical-gap-baseline.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/product-technical-gap-baseline.md b/docs/product-technical-gap-baseline.md index eeea4c9d4..872a5b3ae 100644 --- a/docs/product-technical-gap-baseline.md +++ b/docs/product-technical-gap-baseline.md @@ -111,7 +111,7 @@ flowchart LR | #943 | `ff5e47d5cff84194e457c05e4bfbe26a30ea69a8` | first-intro player/workspace current head; Proxy metadata fail-closed fix 포함; hosted Checks queued/in-progress; qualifying approval 없음 | | #947 | `38ed1c8f4dc5f020db43536596aa401c454db55c` | first-verse workspace/player current head; CHANGELOG heading spacing fix 포함; hosted Checks queued/in-progress; qualifying approval 없음 | | #955 | `4058e5094bff94f9ed2df0f635313ff244f225a6` | first-pre-chorus workspace/player current head; CHANGELOG heading spacing fix 포함; hosted Checks queued/in-progress; qualifying approval 없음 | -| #859 | `5236ac2443e037f898a250b3c1320d4b71d6aaa2` | security-baseline 회귀를 제거하고 GrooveMap 최적화·회귀 테스트만 남긴 current head; hosted Checks queued/in-progress, qualifying approval 없음 | +| #859 | `9e58b226642c59db1c2260b48d4a84f3eb821a4c` | security-baseline 회귀를 제거하고 GrooveMap 최적화·회귀 테스트만 남긴 current head; hosted Checks queued/in-progress, qualifying approval 없음 | | #866 | `c2cc5bbeda6628fa9999401d6b0d228cb9b6bb9c` | stale base `acdbea63`, Draft + CONFLICTING; `opencode-review` failure; canonical audio policy owner이며 merge 대상 아님 | | #1025 | `bac16c752d3f6de498b12c4216dbdd2080d43cf3` | 이 문서 PR의 current head; docs snapshot 갱신 후 hosted Checks는 queued/in-progress; qualifying approval 없음 | From 262ca769c98fcae60e39ec91f68cb6e4dbc2c668 Mon Sep 17 00:00:00 2001 From: seonghobae Date: Fri, 28 Aug 2026 16:16:23 +0900 Subject: [PATCH 17/94] docs(gap): pin GrooveMap changelog repair head --- docs/product-technical-gap-baseline.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/product-technical-gap-baseline.md b/docs/product-technical-gap-baseline.md index 872a5b3ae..c0da599f4 100644 --- a/docs/product-technical-gap-baseline.md +++ b/docs/product-technical-gap-baseline.md @@ -111,9 +111,9 @@ flowchart LR | #943 | `ff5e47d5cff84194e457c05e4bfbe26a30ea69a8` | first-intro player/workspace current head; Proxy metadata fail-closed fix 포함; hosted Checks queued/in-progress; qualifying approval 없음 | | #947 | `38ed1c8f4dc5f020db43536596aa401c454db55c` | first-verse workspace/player current head; CHANGELOG heading spacing fix 포함; hosted Checks queued/in-progress; qualifying approval 없음 | | #955 | `4058e5094bff94f9ed2df0f635313ff244f225a6` | first-pre-chorus workspace/player current head; CHANGELOG heading spacing fix 포함; hosted Checks queued/in-progress; qualifying approval 없음 | -| #859 | `9e58b226642c59db1c2260b48d4a84f3eb821a4c` | security-baseline 회귀를 제거하고 GrooveMap 최적화·회귀 테스트만 남긴 current head; hosted Checks queued/in-progress, qualifying approval 없음 | +| #859 | `0de77e21b6d20d7b21cf44c71a95d8d8c759cf63` | security-baseline 회귀를 제거하고 GrooveMap 최적화·회귀 테스트만 남긴 current head; hosted Checks queued/in-progress, qualifying approval 없음 | | #866 | `c2cc5bbeda6628fa9999401d6b0d228cb9b6bb9c` | stale base `acdbea63`, Draft + CONFLICTING; `opencode-review` failure; canonical audio policy owner이며 merge 대상 아님 | -| #1025 | `bac16c752d3f6de498b12c4216dbdd2080d43cf3` | 이 문서 PR의 current head; docs snapshot 갱신 후 hosted Checks는 queued/in-progress; qualifying approval 없음 | +| #1025 | `d06d4c18a7569dcf202c959d4597414ae8b07047` | 이 문서 PR의 current head; docs snapshot 갱신 후 hosted Checks는 queued/in-progress; qualifying approval 없음 | 이 snapshot에서 위 PR 중 병합된 것은 없다. `mergeable=true`는 protected review/required-check 완료를 뜻하지 않으며, 승인·current-head review·필수 gate가 모두 충족되지 않은 PR은 병합하지 않았다. admin/self-approval, force-push, protected gate bypass도 사용하지 않았다. From 976ca371d3172c354fffbe900797ed4c1dc70051 Mon Sep 17 00:00:00 2001 From: seonghobae Date: Fri, 28 Aug 2026 16:18:06 +0900 Subject: [PATCH 18/94] docs(gap): record current hosted gate states --- docs/product-technical-gap-baseline.md | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/docs/product-technical-gap-baseline.md b/docs/product-technical-gap-baseline.md index c0da599f4..557e7946e 100644 --- a/docs/product-technical-gap-baseline.md +++ b/docs/product-technical-gap-baseline.md @@ -108,12 +108,12 @@ flowchart LR | #1034 | `98a99e1bff4b63f5294d8c9a5cbdaf312b235403` | source/coverage/security/build/release terminal success; `opencode-review` success; qualifying independent approval 없음 | | #1041 | `164995d3a3c056bdbb4fc293226d0c31c062104e` | ScoreView/ScoreViewer tooltip 변경 current head; coverage/build/security Checks 일부 queued/in-progress; qualifying approval 없음 | | #910 | `b6bcecb8649796dc13a54c39d70ca05977b0ac4c` | source/coverage/security/build/release terminal success이나 current `opencode-review` failure; current-head qualifying approval 없음 | -| #943 | `ff5e47d5cff84194e457c05e4bfbe26a30ea69a8` | first-intro player/workspace current head; Proxy metadata fail-closed fix 포함; hosted Checks queued/in-progress; qualifying approval 없음 | -| #947 | `38ed1c8f4dc5f020db43536596aa401c454db55c` | first-verse workspace/player current head; CHANGELOG heading spacing fix 포함; hosted Checks queued/in-progress; qualifying approval 없음 | -| #955 | `4058e5094bff94f9ed2df0f635313ff244f225a6` | first-pre-chorus workspace/player current head; CHANGELOG heading spacing fix 포함; hosted Checks queued/in-progress; qualifying approval 없음 | -| #859 | `0de77e21b6d20d7b21cf44c71a95d8d8c759cf63` | security-baseline 회귀를 제거하고 GrooveMap 최적화·회귀 테스트만 남긴 current head; hosted Checks queued/in-progress, qualifying approval 없음 | +| #943 | `ff5e47d5cff84194e457c05e4bfbe26a30ea69a8` | first-intro player/workspace current head; Proxy metadata fail-closed fix 포함; 28 hosted Checks success, macOS amd64 진행 중, `opencode-review` failure; qualifying approval 없음 | +| #947 | `38ed1c8f4dc5f020db43536596aa401c454db55c` | first-verse workspace/player current head; CHANGELOG heading spacing fix 포함; 28 hosted Checks success, macOS amd64 진행 중, `opencode-review` failure; qualifying approval 없음 | +| #955 | `4058e5094bff94f9ed2df0f635313ff244f225a6` | first-pre-chorus workspace/player current head; CHANGELOG heading spacing fix 포함; 27 hosted Checks success, Rust/macOS amd64 진행 중, `opencode-review` failure; qualifying approval 없음 | +| #859 | `0de77e21b6d20d7b21cf44c71a95d8d8c759cf63` | security-baseline 회귀를 제거하고 GrooveMap 최적화·회귀 테스트만 남긴 current head; 27 hosted Checks pending, failure 없음, qualifying approval 없음 | | #866 | `c2cc5bbeda6628fa9999401d6b0d228cb9b6bb9c` | stale base `acdbea63`, Draft + CONFLICTING; `opencode-review` failure; canonical audio policy owner이며 merge 대상 아님 | -| #1025 | `d06d4c18a7569dcf202c959d4597414ae8b07047` | 이 문서 PR의 current head; docs snapshot 갱신 후 hosted Checks는 queued/in-progress; qualifying approval 없음 | +| #1025 | `262ca769c98fcae60e39ec91f68cb6e4dbc2c668` | 이 문서 PR의 current head; docs snapshot 갱신 후 27 hosted Checks queued/in-progress; qualifying approval 없음 | 이 snapshot에서 위 PR 중 병합된 것은 없다. `mergeable=true`는 protected review/required-check 완료를 뜻하지 않으며, 승인·current-head review·필수 gate가 모두 충족되지 않은 PR은 병합하지 않았다. admin/self-approval, force-push, protected gate bypass도 사용하지 않았다. From cabcadfb9260681dba5e24b6b2ac3ee350ce5782 Mon Sep 17 00:00:00 2001 From: seonghobae Date: Fri, 28 Aug 2026 16:20:46 +0900 Subject: [PATCH 19/94] docs(gap): pin stabilized GrooveMap head --- docs/product-technical-gap-baseline.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/product-technical-gap-baseline.md b/docs/product-technical-gap-baseline.md index 557e7946e..2ba80e439 100644 --- a/docs/product-technical-gap-baseline.md +++ b/docs/product-technical-gap-baseline.md @@ -111,9 +111,9 @@ flowchart LR | #943 | `ff5e47d5cff84194e457c05e4bfbe26a30ea69a8` | first-intro player/workspace current head; Proxy metadata fail-closed fix 포함; 28 hosted Checks success, macOS amd64 진행 중, `opencode-review` failure; qualifying approval 없음 | | #947 | `38ed1c8f4dc5f020db43536596aa401c454db55c` | first-verse workspace/player current head; CHANGELOG heading spacing fix 포함; 28 hosted Checks success, macOS amd64 진행 중, `opencode-review` failure; qualifying approval 없음 | | #955 | `4058e5094bff94f9ed2df0f635313ff244f225a6` | first-pre-chorus workspace/player current head; CHANGELOG heading spacing fix 포함; 27 hosted Checks success, Rust/macOS amd64 진행 중, `opencode-review` failure; qualifying approval 없음 | -| #859 | `0de77e21b6d20d7b21cf44c71a95d8d8c759cf63` | security-baseline 회귀를 제거하고 GrooveMap 최적화·회귀 테스트만 남긴 current head; 27 hosted Checks pending, failure 없음, qualifying approval 없음 | +| #859 | `62fd665968dff9032e58a2c58141355b65f264d0` | security-baseline 회귀를 제거하고 GrooveMap 최적화·회귀 테스트만 남긴 current head; 27 hosted Checks pending, failure 없음, qualifying approval 없음 | | #866 | `c2cc5bbeda6628fa9999401d6b0d228cb9b6bb9c` | stale base `acdbea63`, Draft + CONFLICTING; `opencode-review` failure; canonical audio policy owner이며 merge 대상 아님 | -| #1025 | `262ca769c98fcae60e39ec91f68cb6e4dbc2c668` | 이 문서 PR의 current head; docs snapshot 갱신 후 27 hosted Checks queued/in-progress; qualifying approval 없음 | +| #1025 | `976ca371d3172c354fffbe900797ed4c1dc70051` | 이 문서 PR의 current head; docs snapshot 갱신 후 27 hosted Checks queued/in-progress; qualifying approval 없음 | 이 snapshot에서 위 PR 중 병합된 것은 없다. `mergeable=true`는 protected review/required-check 완료를 뜻하지 않으며, 승인·current-head review·필수 gate가 모두 충족되지 않은 PR은 병합하지 않았다. admin/self-approval, force-push, protected gate bypass도 사용하지 않았다. From 44357bfcfccf1ffcccb75643f42f8bb39c2862c2 Mon Sep 17 00:00:00 2001 From: seonghobae Date: Fri, 28 Aug 2026 16:26:11 +0900 Subject: [PATCH 20/94] docs(gap): refresh GrooveMap check count --- docs/product-technical-gap-baseline.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/product-technical-gap-baseline.md b/docs/product-technical-gap-baseline.md index 2ba80e439..cbfdafc1e 100644 --- a/docs/product-technical-gap-baseline.md +++ b/docs/product-technical-gap-baseline.md @@ -111,7 +111,7 @@ flowchart LR | #943 | `ff5e47d5cff84194e457c05e4bfbe26a30ea69a8` | first-intro player/workspace current head; Proxy metadata fail-closed fix 포함; 28 hosted Checks success, macOS amd64 진행 중, `opencode-review` failure; qualifying approval 없음 | | #947 | `38ed1c8f4dc5f020db43536596aa401c454db55c` | first-verse workspace/player current head; CHANGELOG heading spacing fix 포함; 28 hosted Checks success, macOS amd64 진행 중, `opencode-review` failure; qualifying approval 없음 | | #955 | `4058e5094bff94f9ed2df0f635313ff244f225a6` | first-pre-chorus workspace/player current head; CHANGELOG heading spacing fix 포함; 27 hosted Checks success, Rust/macOS amd64 진행 중, `opencode-review` failure; qualifying approval 없음 | -| #859 | `62fd665968dff9032e58a2c58141355b65f264d0` | security-baseline 회귀를 제거하고 GrooveMap 최적화·회귀 테스트만 남긴 current head; 27 hosted Checks pending, failure 없음, qualifying approval 없음 | +| #859 | `62fd665968dff9032e58a2c58141355b65f264d0` | security-baseline 회귀를 제거하고 GrooveMap 최적화·회귀 테스트만 남긴 current head; 1 hosted Check success, 27 pending, failure 없음, qualifying approval 없음 | | #866 | `c2cc5bbeda6628fa9999401d6b0d228cb9b6bb9c` | stale base `acdbea63`, Draft + CONFLICTING; `opencode-review` failure; canonical audio policy owner이며 merge 대상 아님 | | #1025 | `976ca371d3172c354fffbe900797ed4c1dc70051` | 이 문서 PR의 current head; docs snapshot 갱신 후 27 hosted Checks queued/in-progress; qualifying approval 없음 | From f9394139ed10920eae31fafd161e58415d5ba055 Mon Sep 17 00:00:00 2001 From: seonghobae Date: Fri, 28 Aug 2026 16:37:08 +0900 Subject: [PATCH 21/94] docs(gap): record confirmed harmony repair --- docs/product-technical-gap-baseline.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/docs/product-technical-gap-baseline.md b/docs/product-technical-gap-baseline.md index cbfdafc1e..c84884027 100644 --- a/docs/product-technical-gap-baseline.md +++ b/docs/product-technical-gap-baseline.md @@ -111,9 +111,10 @@ flowchart LR | #943 | `ff5e47d5cff84194e457c05e4bfbe26a30ea69a8` | first-intro player/workspace current head; Proxy metadata fail-closed fix 포함; 28 hosted Checks success, macOS amd64 진행 중, `opencode-review` failure; qualifying approval 없음 | | #947 | `38ed1c8f4dc5f020db43536596aa401c454db55c` | first-verse workspace/player current head; CHANGELOG heading spacing fix 포함; 28 hosted Checks success, macOS amd64 진행 중, `opencode-review` failure; qualifying approval 없음 | | #955 | `4058e5094bff94f9ed2df0f635313ff244f225a6` | first-pre-chorus workspace/player current head; CHANGELOG heading spacing fix 포함; 27 hosted Checks success, Rust/macOS amd64 진행 중, `opencode-review` failure; qualifying approval 없음 | +| #1002 | `607994004c43a084c28d2d137ec5543be903eec6` | confirmed-harmony 한국어 action contract를 feature UI 계약에 맞춰 정렬하고 case-collision을 기준 blob으로 복원; desktop 23 files/263 tests와 100% coverage, typecheck/lint/build local pass; push 후 27 hosted check-runs 중 failure 0, pending 21, `REVIEW_REQUIRED/BLOCKED`, qualifying approval 없음 | | #859 | `62fd665968dff9032e58a2c58141355b65f264d0` | security-baseline 회귀를 제거하고 GrooveMap 최적화·회귀 테스트만 남긴 current head; 1 hosted Check success, 27 pending, failure 없음, qualifying approval 없음 | | #866 | `c2cc5bbeda6628fa9999401d6b0d228cb9b6bb9c` | stale base `acdbea63`, Draft + CONFLICTING; `opencode-review` failure; canonical audio policy owner이며 merge 대상 아님 | -| #1025 | `976ca371d3172c354fffbe900797ed4c1dc70051` | 이 문서 PR의 current head; docs snapshot 갱신 후 27 hosted Checks queued/in-progress; qualifying approval 없음 | +| #1025 | `44357bfcfccf1ffcccb75643f42f8bb39c2862c2` | 이 문서 PR의 current head; #1002 exact-head snapshot 추가 후 docs Checks queued/in-progress; qualifying approval 없음 | 이 snapshot에서 위 PR 중 병합된 것은 없다. `mergeable=true`는 protected review/required-check 완료를 뜻하지 않으며, 승인·current-head review·필수 gate가 모두 충족되지 않은 PR은 병합하지 않았다. admin/self-approval, force-push, protected gate bypass도 사용하지 않았다. From e13218a2245e9929dbc93715c4f1a1061099123c Mon Sep 17 00:00:00 2001 From: seonghobae Date: Fri, 28 Aug 2026 16:50:29 +0900 Subject: [PATCH 22/94] docs(gap): refresh provenance repairs --- docs/product-technical-gap-baseline.md | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/docs/product-technical-gap-baseline.md b/docs/product-technical-gap-baseline.md index c84884027..c4cd131b4 100644 --- a/docs/product-technical-gap-baseline.md +++ b/docs/product-technical-gap-baseline.md @@ -102,8 +102,9 @@ flowchart LR | PR | current head | current 상태와 traceability | |---|---|---| -| #1045 | `6c4edebe44740d753b7a0d287273e01b9faddfb3` | navigation-failure disarm fix 포함; 29 hosted Checks success, Rust check 진행 중, `opencode-review` failure; qualifying independent approval 없음 | -| #1046 | `008248327f2f3e3636d9d234221810f3db56829f` | current head에서 source local proof 통과; 30 hosted Checks success, `opencode-review`는 current-head verdict 없음으로 failure, Strix는 tool-description 1024자 제한 후 provider unavailable로 failure; qualifying independent approval 없음 | +| #1040 | `eb7432c124ccf667eca8db0656ed09273e51e5c7` | drop-plan copy/provenance 양방향 검증을 shared-types와 native parser에 보강; 15 hosted Checks success, 11 pending, failure 없음; qualifying independent approval 없음 | +| #1045 | `88c2c741ab0d62033b3d9c330d67e8ac90010c57` | swell-plan copy/provenance 양방향 검증 보강; 새 current-head workflow 21개 pending, failure 없음; qualifying independent approval 없음 | +| #1046 | `c8b5e391cec704e599ff75fe00f5a0b2016a6eca` | fade-plan copy/provenance 양방향 검증 보강; 새 current-head workflow 21개 pending, failure 없음; qualifying independent approval 없음 | | #1033 | `046db562497a8104fa525f56a6437eb13fbf4760` | source/coverage/security/build/release 및 `opencode-review`/`strix` terminal success; reviews는 COMMENTED뿐이며 qualifying approval 없음 | | #1034 | `98a99e1bff4b63f5294d8c9a5cbdaf312b235403` | source/coverage/security/build/release terminal success; `opencode-review` success; qualifying independent approval 없음 | | #1041 | `164995d3a3c056bdbb4fc293226d0c31c062104e` | ScoreView/ScoreViewer tooltip 변경 current head; coverage/build/security Checks 일부 queued/in-progress; qualifying approval 없음 | From 852e5d8123215fd004fe3b17dea904d1fdb0ff46 Mon Sep 17 00:00:00 2001 From: seonghobae Date: Fri, 28 Aug 2026 17:05:21 +0900 Subject: [PATCH 23/94] docs(gap): record ritardando repair --- docs/product-technical-gap-baseline.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/docs/product-technical-gap-baseline.md b/docs/product-technical-gap-baseline.md index c4cd131b4..f0db93bc1 100644 --- a/docs/product-technical-gap-baseline.md +++ b/docs/product-technical-gap-baseline.md @@ -105,6 +105,7 @@ flowchart LR | #1040 | `eb7432c124ccf667eca8db0656ed09273e51e5c7` | drop-plan copy/provenance 양방향 검증을 shared-types와 native parser에 보강; 15 hosted Checks success, 11 pending, failure 없음; qualifying independent approval 없음 | | #1045 | `88c2c741ab0d62033b3d9c330d67e8ac90010c57` | swell-plan copy/provenance 양방향 검증 보강; 새 current-head workflow 21개 pending, failure 없음; qualifying independent approval 없음 | | #1046 | `c8b5e391cec704e599ff75fe00f5a0b2016a6eca` | fade-plan copy/provenance 양방향 검증 보강; 새 current-head workflow 21개 pending, failure 없음; qualifying independent approval 없음 | +| #1047 | `02b6287005dbd9ee6e770a8aba044db6b925d6ea` | ritardando plan 누락 JSDoc과 copy/provenance 양방향 검증을 보강; desktop 21 files/239 tests, analysis-engine 697 passed/24 skipped 및 100% coverage, build pass; hosted failure 없음, 22 pending, qualifying approval 없음 | | #1033 | `046db562497a8104fa525f56a6437eb13fbf4760` | source/coverage/security/build/release 및 `opencode-review`/`strix` terminal success; reviews는 COMMENTED뿐이며 qualifying approval 없음 | | #1034 | `98a99e1bff4b63f5294d8c9a5cbdaf312b235403` | source/coverage/security/build/release terminal success; `opencode-review` success; qualifying independent approval 없음 | | #1041 | `164995d3a3c056bdbb4fc293226d0c31c062104e` | ScoreView/ScoreViewer tooltip 변경 current head; coverage/build/security Checks 일부 queued/in-progress; qualifying approval 없음 | @@ -115,7 +116,7 @@ flowchart LR | #1002 | `607994004c43a084c28d2d137ec5543be903eec6` | confirmed-harmony 한국어 action contract를 feature UI 계약에 맞춰 정렬하고 case-collision을 기준 blob으로 복원; desktop 23 files/263 tests와 100% coverage, typecheck/lint/build local pass; push 후 27 hosted check-runs 중 failure 0, pending 21, `REVIEW_REQUIRED/BLOCKED`, qualifying approval 없음 | | #859 | `62fd665968dff9032e58a2c58141355b65f264d0` | security-baseline 회귀를 제거하고 GrooveMap 최적화·회귀 테스트만 남긴 current head; 1 hosted Check success, 27 pending, failure 없음, qualifying approval 없음 | | #866 | `c2cc5bbeda6628fa9999401d6b0d228cb9b6bb9c` | stale base `acdbea63`, Draft + CONFLICTING; `opencode-review` failure; canonical audio policy owner이며 merge 대상 아님 | -| #1025 | `44357bfcfccf1ffcccb75643f42f8bb39c2862c2` | 이 문서 PR의 current head; #1002 exact-head snapshot 추가 후 docs Checks queued/in-progress; qualifying approval 없음 | +| #1025 | `e13218a2245e9929dbc93715c4f1a1061099123c` | 이 문서 PR의 current head; #1047 exact-head snapshot 추가 후 docs Checks queued/in-progress; qualifying approval 없음 | 이 snapshot에서 위 PR 중 병합된 것은 없다. `mergeable=true`는 protected review/required-check 완료를 뜻하지 않으며, 승인·current-head review·필수 gate가 모두 충족되지 않은 PR은 병합하지 않았다. admin/self-approval, force-push, protected gate bypass도 사용하지 않았다. From 03abbbe57ea0ec4051d18fa49c490bcde1898a49 Mon Sep 17 00:00:00 2001 From: seonghobae Date: Fri, 28 Aug 2026 17:35:54 +0900 Subject: [PATCH 24/94] docs: record local intake concurrency repair --- docs/product-technical-gap-baseline.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/docs/product-technical-gap-baseline.md b/docs/product-technical-gap-baseline.md index f0db93bc1..4fac05c9c 100644 --- a/docs/product-technical-gap-baseline.md +++ b/docs/product-technical-gap-baseline.md @@ -114,9 +114,10 @@ flowchart LR | #947 | `38ed1c8f4dc5f020db43536596aa401c454db55c` | first-verse workspace/player current head; CHANGELOG heading spacing fix 포함; 28 hosted Checks success, macOS amd64 진행 중, `opencode-review` failure; qualifying approval 없음 | | #955 | `4058e5094bff94f9ed2df0f635313ff244f225a6` | first-pre-chorus workspace/player current head; CHANGELOG heading spacing fix 포함; 27 hosted Checks success, Rust/macOS amd64 진행 중, `opencode-review` failure; qualifying approval 없음 | | #1002 | `607994004c43a084c28d2d137ec5543be903eec6` | confirmed-harmony 한국어 action contract를 feature UI 계약에 맞춰 정렬하고 case-collision을 기준 blob으로 복원; desktop 23 files/263 tests와 100% coverage, typecheck/lint/build local pass; push 후 27 hosted check-runs 중 failure 0, pending 21, `REVIEW_REQUIRED/BLOCKED`, qualifying approval 없음 | +| #980 | `bc922359725d5b7d8eba515fb1ad4756f5bf8ec9` | local picker가 source selection을 소유하는 동안 YouTube clear action도 숨겨 동시성 계약을 완성; targeted 2 tests, typecheck/lint/build local pass; 전체 desktop 223 tests 중 219 pass 및 기존/자원경합성 4 timeout, coverage 재실행은 실패하여 100%로 주장하지 않음; hosted current check-runs 12 success, 9 pending, `opencode-review` failure(로그 조회 404), qualifying approval 없음 | | #859 | `62fd665968dff9032e58a2c58141355b65f264d0` | security-baseline 회귀를 제거하고 GrooveMap 최적화·회귀 테스트만 남긴 current head; 1 hosted Check success, 27 pending, failure 없음, qualifying approval 없음 | | #866 | `c2cc5bbeda6628fa9999401d6b0d228cb9b6bb9c` | stale base `acdbea63`, Draft + CONFLICTING; `opencode-review` failure; canonical audio policy owner이며 merge 대상 아님 | -| #1025 | `e13218a2245e9929dbc93715c4f1a1061099123c` | 이 문서 PR의 current head; #1047 exact-head snapshot 추가 후 docs Checks queued/in-progress; qualifying approval 없음 | +| #1025 | `852e5d8123215fd004fe3b17dea904d1fdb0ff46` | 이 문서 PR의 직전 current head; #1047 exact-head snapshot 이후 #980 exact-head snapshot 추가 중; qualifying approval 없음 | 이 snapshot에서 위 PR 중 병합된 것은 없다. `mergeable=true`는 protected review/required-check 완료를 뜻하지 않으며, 승인·current-head review·필수 gate가 모두 충족되지 않은 PR은 병합하지 않았다. admin/self-approval, force-push, protected gate bypass도 사용하지 않았다. From cd22ec7d7d7d1da34ec63c5c77f3d12524b04b83 Mon Sep 17 00:00:00 2001 From: seonghobae Date: Fri, 28 Aug 2026 17:44:13 +0900 Subject: [PATCH 25/94] docs: record youtube failure assertion repair --- docs/product-technical-gap-baseline.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/docs/product-technical-gap-baseline.md b/docs/product-technical-gap-baseline.md index 4fac05c9c..c4328967a 100644 --- a/docs/product-technical-gap-baseline.md +++ b/docs/product-technical-gap-baseline.md @@ -115,9 +115,10 @@ flowchart LR | #955 | `4058e5094bff94f9ed2df0f635313ff244f225a6` | first-pre-chorus workspace/player current head; CHANGELOG heading spacing fix 포함; 27 hosted Checks success, Rust/macOS amd64 진행 중, `opencode-review` failure; qualifying approval 없음 | | #1002 | `607994004c43a084c28d2d137ec5543be903eec6` | confirmed-harmony 한국어 action contract를 feature UI 계약에 맞춰 정렬하고 case-collision을 기준 blob으로 복원; desktop 23 files/263 tests와 100% coverage, typecheck/lint/build local pass; push 후 27 hosted check-runs 중 failure 0, pending 21, `REVIEW_REQUIRED/BLOCKED`, qualifying approval 없음 | | #980 | `bc922359725d5b7d8eba515fb1ad4756f5bf8ec9` | local picker가 source selection을 소유하는 동안 YouTube clear action도 숨겨 동시성 계약을 완성; targeted 2 tests, typecheck/lint/build local pass; 전체 desktop 223 tests 중 219 pass 및 기존/자원경합성 4 timeout, coverage 재실행은 실패하여 100%로 주장하지 않음; hosted current check-runs 12 success, 9 pending, `opencode-review` failure(로그 조회 404), qualifying approval 없음 | +| #982 | `821ae34a75a4d60c39dd919b4502e8a694b76ad4` | YouTube 실패 사유가 field description과 recovery alert에 중복 표시되는 계약에 맞춰 9개 stale 단일 조회 assertion을 multiplicity-safe로 정렬; App.test 65 pass와 affected visibility 10 pass, typecheck/lint/build local pass; 전체 desktop 234 tests 중 231 pass 및 기존/자원경합성 3 timeout, coverage 재실행은 100%로 주장하지 않음; hosted current check-runs failure 0, pending 21, qualifying approval 없음 | | #859 | `62fd665968dff9032e58a2c58141355b65f264d0` | security-baseline 회귀를 제거하고 GrooveMap 최적화·회귀 테스트만 남긴 current head; 1 hosted Check success, 27 pending, failure 없음, qualifying approval 없음 | | #866 | `c2cc5bbeda6628fa9999401d6b0d228cb9b6bb9c` | stale base `acdbea63`, Draft + CONFLICTING; `opencode-review` failure; canonical audio policy owner이며 merge 대상 아님 | -| #1025 | `852e5d8123215fd004fe3b17dea904d1fdb0ff46` | 이 문서 PR의 직전 current head; #1047 exact-head snapshot 이후 #980 exact-head snapshot 추가 중; qualifying approval 없음 | +| #1025 | `03abbbe57ea0ec4051d18fa49c490bcde1898a49` | 이 문서 PR의 직전 current head; #980 exact-head snapshot 이후 #982 exact-head snapshot 추가 중; qualifying approval 없음 | 이 snapshot에서 위 PR 중 병합된 것은 없다. `mergeable=true`는 protected review/required-check 완료를 뜻하지 않으며, 승인·current-head review·필수 gate가 모두 충족되지 않은 PR은 병합하지 않았다. admin/self-approval, force-push, protected gate bypass도 사용하지 않았다. From dfa47d16fd1987da339e56a83b905e33020bedf4 Mon Sep 17 00:00:00 2001 From: seonghobae Date: Fri, 28 Aug 2026 17:47:21 +0900 Subject: [PATCH 26/94] docs: refresh youtube repair check states --- docs/product-technical-gap-baseline.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/product-technical-gap-baseline.md b/docs/product-technical-gap-baseline.md index c4328967a..85ba8452c 100644 --- a/docs/product-technical-gap-baseline.md +++ b/docs/product-technical-gap-baseline.md @@ -114,8 +114,8 @@ flowchart LR | #947 | `38ed1c8f4dc5f020db43536596aa401c454db55c` | first-verse workspace/player current head; CHANGELOG heading spacing fix 포함; 28 hosted Checks success, macOS amd64 진행 중, `opencode-review` failure; qualifying approval 없음 | | #955 | `4058e5094bff94f9ed2df0f635313ff244f225a6` | first-pre-chorus workspace/player current head; CHANGELOG heading spacing fix 포함; 27 hosted Checks success, Rust/macOS amd64 진행 중, `opencode-review` failure; qualifying approval 없음 | | #1002 | `607994004c43a084c28d2d137ec5543be903eec6` | confirmed-harmony 한국어 action contract를 feature UI 계약에 맞춰 정렬하고 case-collision을 기준 blob으로 복원; desktop 23 files/263 tests와 100% coverage, typecheck/lint/build local pass; push 후 27 hosted check-runs 중 failure 0, pending 21, `REVIEW_REQUIRED/BLOCKED`, qualifying approval 없음 | -| #980 | `bc922359725d5b7d8eba515fb1ad4756f5bf8ec9` | local picker가 source selection을 소유하는 동안 YouTube clear action도 숨겨 동시성 계약을 완성; targeted 2 tests, typecheck/lint/build local pass; 전체 desktop 223 tests 중 219 pass 및 기존/자원경합성 4 timeout, coverage 재실행은 실패하여 100%로 주장하지 않음; hosted current check-runs 12 success, 9 pending, `opencode-review` failure(로그 조회 404), qualifying approval 없음 | -| #982 | `821ae34a75a4d60c39dd919b4502e8a694b76ad4` | YouTube 실패 사유가 field description과 recovery alert에 중복 표시되는 계약에 맞춰 9개 stale 단일 조회 assertion을 multiplicity-safe로 정렬; App.test 65 pass와 affected visibility 10 pass, typecheck/lint/build local pass; 전체 desktop 234 tests 중 231 pass 및 기존/자원경합성 3 timeout, coverage 재실행은 100%로 주장하지 않음; hosted current check-runs failure 0, pending 21, qualifying approval 없음 | +| #980 | `bc922359725d5b7d8eba515fb1ad4756f5bf8ec9` | local picker가 source selection을 소유하는 동안 YouTube clear action도 숨겨 동시성 계약을 완성; targeted 2 tests, typecheck/lint/build local pass; 전체 desktop 223 tests 중 219 pass 및 기존/자원경합성 4 timeout, coverage 재실행은 실패하여 100%로 주장하지 않음; hosted current check-runs 20 success, 0 pending, `strix`/`opencode-review` failure, qualifying approval 없음 | +| #982 | `821ae34a75a4d60c39dd919b4502e8a694b76ad4` | YouTube 실패 사유가 field description과 recovery alert에 중복 표시되는 계약에 맞춰 9개 stale 단일 조회 assertion을 multiplicity-safe로 정렬; App.test 65 pass와 affected visibility 10 pass, typecheck/lint/build local pass; 전체 desktop 234 tests 중 231 pass 및 기존/자원경합성 3 timeout, coverage 재실행은 100%로 주장하지 않음; hosted current check-runs 14 success, 8 pending, `opencode-review` failure, qualifying approval 없음 | | #859 | `62fd665968dff9032e58a2c58141355b65f264d0` | security-baseline 회귀를 제거하고 GrooveMap 최적화·회귀 테스트만 남긴 current head; 1 hosted Check success, 27 pending, failure 없음, qualifying approval 없음 | | #866 | `c2cc5bbeda6628fa9999401d6b0d228cb9b6bb9c` | stale base `acdbea63`, Draft + CONFLICTING; `opencode-review` failure; canonical audio policy owner이며 merge 대상 아님 | | #1025 | `03abbbe57ea0ec4051d18fa49c490bcde1898a49` | 이 문서 PR의 직전 current head; #980 exact-head snapshot 이후 #982 exact-head snapshot 추가 중; qualifying approval 없음 | From e4ecdbdbb67399ac1738dc5be5749a5c2ebff74f Mon Sep 17 00:00:00 2001 From: seonghobae Date: Fri, 28 Aug 2026 18:01:49 +0900 Subject: [PATCH 27/94] docs: record ritardando type repair --- docs/product-technical-gap-baseline.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/product-technical-gap-baseline.md b/docs/product-technical-gap-baseline.md index 85ba8452c..b35b7de33 100644 --- a/docs/product-technical-gap-baseline.md +++ b/docs/product-technical-gap-baseline.md @@ -105,7 +105,7 @@ flowchart LR | #1040 | `eb7432c124ccf667eca8db0656ed09273e51e5c7` | drop-plan copy/provenance 양방향 검증을 shared-types와 native parser에 보강; 15 hosted Checks success, 11 pending, failure 없음; qualifying independent approval 없음 | | #1045 | `88c2c741ab0d62033b3d9c330d67e8ac90010c57` | swell-plan copy/provenance 양방향 검증 보강; 새 current-head workflow 21개 pending, failure 없음; qualifying independent approval 없음 | | #1046 | `c8b5e391cec704e599ff75fe00f5a0b2016a6eca` | fade-plan copy/provenance 양방향 검증 보강; 새 current-head workflow 21개 pending, failure 없음; qualifying independent approval 없음 | -| #1047 | `02b6287005dbd9ee6e770a8aba044db6b925d6ea` | ritardando plan 누락 JSDoc과 copy/provenance 양방향 검증을 보강; desktop 21 files/239 tests, analysis-engine 697 passed/24 skipped 및 100% coverage, build pass; hosted failure 없음, 22 pending, qualifying approval 없음 | +| #1047 | `bac0d90d1f1ae88141c93dd50483eebb63ed1e85` | ritardando plan 누락 JSDoc·copy/provenance 양방향 검증과 `ritardando.py` mypy 타입 계약을 보강; 관련 desktop 23 tests, mypy/ruff pass, Python 전체 697 passed/24 skipped이나 torch child segfault로 coverage 0 산출되어 100%로 주장하지 않음; hosted current check-runs failure 0, pending 21, qualifying approval 없음 | | #1033 | `046db562497a8104fa525f56a6437eb13fbf4760` | source/coverage/security/build/release 및 `opencode-review`/`strix` terminal success; reviews는 COMMENTED뿐이며 qualifying approval 없음 | | #1034 | `98a99e1bff4b63f5294d8c9a5cbdaf312b235403` | source/coverage/security/build/release terminal success; `opencode-review` success; qualifying independent approval 없음 | | #1041 | `164995d3a3c056bdbb4fc293226d0c31c062104e` | ScoreView/ScoreViewer tooltip 변경 current head; coverage/build/security Checks 일부 queued/in-progress; qualifying approval 없음 | @@ -118,7 +118,7 @@ flowchart LR | #982 | `821ae34a75a4d60c39dd919b4502e8a694b76ad4` | YouTube 실패 사유가 field description과 recovery alert에 중복 표시되는 계약에 맞춰 9개 stale 단일 조회 assertion을 multiplicity-safe로 정렬; App.test 65 pass와 affected visibility 10 pass, typecheck/lint/build local pass; 전체 desktop 234 tests 중 231 pass 및 기존/자원경합성 3 timeout, coverage 재실행은 100%로 주장하지 않음; hosted current check-runs 14 success, 8 pending, `opencode-review` failure, qualifying approval 없음 | | #859 | `62fd665968dff9032e58a2c58141355b65f264d0` | security-baseline 회귀를 제거하고 GrooveMap 최적화·회귀 테스트만 남긴 current head; 1 hosted Check success, 27 pending, failure 없음, qualifying approval 없음 | | #866 | `c2cc5bbeda6628fa9999401d6b0d228cb9b6bb9c` | stale base `acdbea63`, Draft + CONFLICTING; `opencode-review` failure; canonical audio policy owner이며 merge 대상 아님 | -| #1025 | `03abbbe57ea0ec4051d18fa49c490bcde1898a49` | 이 문서 PR의 직전 current head; #980 exact-head snapshot 이후 #982 exact-head snapshot 추가 중; qualifying approval 없음 | +| #1025 | `dfa47d16fd1987da339e56a83b905e33020bedf4` | 이 문서 PR의 직전 current head; #982 exact-head snapshot 이후 #1047 exact-head snapshot 추가 중; qualifying approval 없음 | 이 snapshot에서 위 PR 중 병합된 것은 없다. `mergeable=true`는 protected review/required-check 완료를 뜻하지 않으며, 승인·current-head review·필수 gate가 모두 충족되지 않은 PR은 병합하지 않았다. admin/self-approval, force-push, protected gate bypass도 사용하지 않았다. From 2ce4f7aa0b57b56da57e4a52142cc459bec9a498 Mon Sep 17 00:00:00 2001 From: seonghobae Date: Fri, 28 Aug 2026 18:06:17 +0900 Subject: [PATCH 28/94] docs: record range label type repair --- docs/product-technical-gap-baseline.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/docs/product-technical-gap-baseline.md b/docs/product-technical-gap-baseline.md index b35b7de33..ca5349c58 100644 --- a/docs/product-technical-gap-baseline.md +++ b/docs/product-technical-gap-baseline.md @@ -116,9 +116,10 @@ flowchart LR | #1002 | `607994004c43a084c28d2d137ec5543be903eec6` | confirmed-harmony 한국어 action contract를 feature UI 계약에 맞춰 정렬하고 case-collision을 기준 blob으로 복원; desktop 23 files/263 tests와 100% coverage, typecheck/lint/build local pass; push 후 27 hosted check-runs 중 failure 0, pending 21, `REVIEW_REQUIRED/BLOCKED`, qualifying approval 없음 | | #980 | `bc922359725d5b7d8eba515fb1ad4756f5bf8ec9` | local picker가 source selection을 소유하는 동안 YouTube clear action도 숨겨 동시성 계약을 완성; targeted 2 tests, typecheck/lint/build local pass; 전체 desktop 223 tests 중 219 pass 및 기존/자원경합성 4 timeout, coverage 재실행은 실패하여 100%로 주장하지 않음; hosted current check-runs 20 success, 0 pending, `strix`/`opencode-review` failure, qualifying approval 없음 | | #982 | `821ae34a75a4d60c39dd919b4502e8a694b76ad4` | YouTube 실패 사유가 field description과 recovery alert에 중복 표시되는 계약에 맞춰 9개 stale 단일 조회 assertion을 multiplicity-safe로 정렬; App.test 65 pass와 affected visibility 10 pass, typecheck/lint/build local pass; 전체 desktop 234 tests 중 231 pass 및 기존/자원경합성 3 timeout, coverage 재실행은 100%로 주장하지 않음; hosted current check-runs 14 success, 8 pending, `opencode-review` failure, qualifying approval 없음 | +| #1006 | `c4d50327917e2f20ee96d6b2b0ad883e4078571a` | first-range next-action의 runtime section label을 shared `SectionFormLabel` set으로 fail-closed 검증해 번역 helper typecheck를 복구; 관련 15 tests, typecheck/lint local pass; hosted current check-runs failure 0, pending 21, qualifying approval 없음 | | #859 | `62fd665968dff9032e58a2c58141355b65f264d0` | security-baseline 회귀를 제거하고 GrooveMap 최적화·회귀 테스트만 남긴 current head; 1 hosted Check success, 27 pending, failure 없음, qualifying approval 없음 | | #866 | `c2cc5bbeda6628fa9999401d6b0d228cb9b6bb9c` | stale base `acdbea63`, Draft + CONFLICTING; `opencode-review` failure; canonical audio policy owner이며 merge 대상 아님 | -| #1025 | `dfa47d16fd1987da339e56a83b905e33020bedf4` | 이 문서 PR의 직전 current head; #982 exact-head snapshot 이후 #1047 exact-head snapshot 추가 중; qualifying approval 없음 | +| #1025 | `e4ecdbdbb67399ac1738dc5be5749a5c2ebff74f` | 이 문서 PR의 직전 current head; #1047 exact-head snapshot 이후 #1006 exact-head snapshot 추가 중; qualifying approval 없음 | 이 snapshot에서 위 PR 중 병합된 것은 없다. `mergeable=true`는 protected review/required-check 완료를 뜻하지 않으며, 승인·current-head review·필수 gate가 모두 충족되지 않은 PR은 병합하지 않았다. admin/self-approval, force-push, protected gate bypass도 사용하지 않았다. From ea512556859933997e8a31f36a8dea22623b74c5 Mon Sep 17 00:00:00 2001 From: seonghobae Date: Fri, 28 Aug 2026 18:15:17 +0900 Subject: [PATCH 29/94] docs: record jest-dom lockfile repair --- docs/product-technical-gap-baseline.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/docs/product-technical-gap-baseline.md b/docs/product-technical-gap-baseline.md index ca5349c58..c0286180b 100644 --- a/docs/product-technical-gap-baseline.md +++ b/docs/product-technical-gap-baseline.md @@ -117,9 +117,10 @@ flowchart LR | #980 | `bc922359725d5b7d8eba515fb1ad4756f5bf8ec9` | local picker가 source selection을 소유하는 동안 YouTube clear action도 숨겨 동시성 계약을 완성; targeted 2 tests, typecheck/lint/build local pass; 전체 desktop 223 tests 중 219 pass 및 기존/자원경합성 4 timeout, coverage 재실행은 실패하여 100%로 주장하지 않음; hosted current check-runs 20 success, 0 pending, `strix`/`opencode-review` failure, qualifying approval 없음 | | #982 | `821ae34a75a4d60c39dd919b4502e8a694b76ad4` | YouTube 실패 사유가 field description과 recovery alert에 중복 표시되는 계약에 맞춰 9개 stale 단일 조회 assertion을 multiplicity-safe로 정렬; App.test 65 pass와 affected visibility 10 pass, typecheck/lint/build local pass; 전체 desktop 234 tests 중 231 pass 및 기존/자원경합성 3 timeout, coverage 재실행은 100%로 주장하지 않음; hosted current check-runs 14 success, 8 pending, `opencode-review` failure, qualifying approval 없음 | | #1006 | `c4d50327917e2f20ee96d6b2b0ad883e4078571a` | first-range next-action의 runtime section label을 shared `SectionFormLabel` set으로 fail-closed 검증해 번역 helper typecheck를 복구; 관련 15 tests, typecheck/lint local pass; hosted current check-runs failure 0, pending 21, qualifying approval 없음 | +| #929 | `aac5e3becb3349c8e320c5bccd459567a6d30665` | `@testing-library/jest-dom` 7.0.1 업데이트에 맞춰 package-lock의 workspace dependency tree를 재생성; clean `npm ci`, `npm ls`, npm runtime/typecheck/lint/build와 targeted test pass; 전체 desktop 216 tests 중 215 pass 및 기존 Workspace 1 timeout으로 coverage를 주장하지 않음; hosted current check-runs failure 0, pending 21, qualifying approval 없음 | | #859 | `62fd665968dff9032e58a2c58141355b65f264d0` | security-baseline 회귀를 제거하고 GrooveMap 최적화·회귀 테스트만 남긴 current head; 1 hosted Check success, 27 pending, failure 없음, qualifying approval 없음 | | #866 | `c2cc5bbeda6628fa9999401d6b0d228cb9b6bb9c` | stale base `acdbea63`, Draft + CONFLICTING; `opencode-review` failure; canonical audio policy owner이며 merge 대상 아님 | -| #1025 | `e4ecdbdbb67399ac1738dc5be5749a5c2ebff74f` | 이 문서 PR의 직전 current head; #1047 exact-head snapshot 이후 #1006 exact-head snapshot 추가 중; qualifying approval 없음 | +| #1025 | `2ce4f7aa0b57b56da57e4a52142cc459bec9a498` | 이 문서 PR의 직전 current head; #1006 exact-head snapshot 이후 #929 exact-head snapshot 추가 중; qualifying approval 없음 | 이 snapshot에서 위 PR 중 병합된 것은 없다. `mergeable=true`는 protected review/required-check 완료를 뜻하지 않으며, 승인·current-head review·필수 gate가 모두 충족되지 않은 PR은 병합하지 않았다. admin/self-approval, force-push, protected gate bypass도 사용하지 않았다. From d6493e1378979792465077f92da81b6cee273ae9 Mon Sep 17 00:00:00 2001 From: seonghobae Date: Fri, 28 Aug 2026 18:31:51 +0900 Subject: [PATCH 30/94] docs: record dependency lockfile repairs --- docs/product-technical-gap-baseline.md | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/docs/product-technical-gap-baseline.md b/docs/product-technical-gap-baseline.md index c0286180b..250a66a3f 100644 --- a/docs/product-technical-gap-baseline.md +++ b/docs/product-technical-gap-baseline.md @@ -118,9 +118,13 @@ flowchart LR | #982 | `821ae34a75a4d60c39dd919b4502e8a694b76ad4` | YouTube 실패 사유가 field description과 recovery alert에 중복 표시되는 계약에 맞춰 9개 stale 단일 조회 assertion을 multiplicity-safe로 정렬; App.test 65 pass와 affected visibility 10 pass, typecheck/lint/build local pass; 전체 desktop 234 tests 중 231 pass 및 기존/자원경합성 3 timeout, coverage 재실행은 100%로 주장하지 않음; hosted current check-runs 14 success, 8 pending, `opencode-review` failure, qualifying approval 없음 | | #1006 | `c4d50327917e2f20ee96d6b2b0ad883e4078571a` | first-range next-action의 runtime section label을 shared `SectionFormLabel` set으로 fail-closed 검증해 번역 helper typecheck를 복구; 관련 15 tests, typecheck/lint local pass; hosted current check-runs failure 0, pending 21, qualifying approval 없음 | | #929 | `aac5e3becb3349c8e320c5bccd459567a6d30665` | `@testing-library/jest-dom` 7.0.1 업데이트에 맞춰 package-lock의 workspace dependency tree를 재생성; clean `npm ci`, `npm ls`, npm runtime/typecheck/lint/build와 targeted test pass; 전체 desktop 216 tests 중 215 pass 및 기존 Workspace 1 timeout으로 coverage를 주장하지 않음; hosted current check-runs failure 0, pending 21, qualifying approval 없음 | +| #926 | `5b3f7288874e375f97d0f80066709e7bb6f5c086` | `apps/desktop/package.json`에 남은 literal merge markers를 제거하고 lucide 1.31.0 의도와 develop의 PDF.js 6.2.108을 보존하도록 lockfile 재생성; clean `npm ci`, `npm ls`, npm runtime/typecheck/lint/build local pass; hosted non-cancelled checks 22 success, 2 pending, `opencode-review` failure, qualifying current-head approval 없음 | +| #925 | `d08fb6f5924021905f741ef57e3241e6cd9b9021` | `typescript-eslint` 8.67.0 lockfile 누락을 복구하고 루트 ESLint config의 직접 import를 root devDependency로 명시; clean `npm ci`, `npm ls`, npm runtime/typecheck/lint/build local pass; hosted non-cancelled checks 15 success, 7 pending, `opencode-review` failure, qualifying current-head approval 없음 | +| #923 | `d396f17ffb6ddf00e7c5b7e8dc36f5d8058360c4` | `@storybook/react-vite` 10.5.8 업데이트에 필요한 Storybook 10.5.10·oxc-resolver·플랫폼 optional dependency tree를 lockfile에 재생성; clean `npm ci`, `npm ls`, npm runtime/typecheck/lint/build local pass; hosted non-cancelled checks 14 success, 8 pending, `opencode-review` failure, qualifying current-head approval 없음 | +| #922 | `0a677db0cc43aaff3934b4692d1882b9b0f57769` | Storybook 10.5.8 업데이트에 필요한 Storybook 10.5.10·oxc-resolver·플랫폼 optional dependency tree를 lockfile에 재생성; clean `npm ci`, `npm ls`, npm runtime/typecheck/lint/build local pass; hosted non-cancelled checks 14 success, 8 pending, `opencode-review` failure, qualifying current-head approval 없음 | | #859 | `62fd665968dff9032e58a2c58141355b65f264d0` | security-baseline 회귀를 제거하고 GrooveMap 최적화·회귀 테스트만 남긴 current head; 1 hosted Check success, 27 pending, failure 없음, qualifying approval 없음 | | #866 | `c2cc5bbeda6628fa9999401d6b0d228cb9b6bb9c` | stale base `acdbea63`, Draft + CONFLICTING; `opencode-review` failure; canonical audio policy owner이며 merge 대상 아님 | -| #1025 | `2ce4f7aa0b57b56da57e4a52142cc459bec9a498` | 이 문서 PR의 직전 current head; #1006 exact-head snapshot 이후 #929 exact-head snapshot 추가 중; qualifying approval 없음 | +| #1025 | `ea512556859933997e8a31f36a8dea22623b74c5` | 이 문서 PR의 직전 current head; #926/#925/#923/#922 dependency exact-head snapshot 추가 중; qualifying approval 없음 | 이 snapshot에서 위 PR 중 병합된 것은 없다. `mergeable=true`는 protected review/required-check 완료를 뜻하지 않으며, 승인·current-head review·필수 gate가 모두 충족되지 않은 PR은 병합하지 않았다. admin/self-approval, force-push, protected gate bypass도 사용하지 않았다. From 6ef89a33546e1bf4a6e465572ffe5904ba599188 Mon Sep 17 00:00:00 2001 From: seonghobae Date: Fri, 28 Aug 2026 18:39:12 +0900 Subject: [PATCH 31/94] docs: record macos arm64 rerun state --- docs/product-technical-gap-baseline.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/docs/product-technical-gap-baseline.md b/docs/product-technical-gap-baseline.md index 250a66a3f..595cd6f66 100644 --- a/docs/product-technical-gap-baseline.md +++ b/docs/product-technical-gap-baseline.md @@ -114,6 +114,7 @@ flowchart LR | #947 | `38ed1c8f4dc5f020db43536596aa401c454db55c` | first-verse workspace/player current head; CHANGELOG heading spacing fix 포함; 28 hosted Checks success, macOS amd64 진행 중, `opencode-review` failure; qualifying approval 없음 | | #955 | `4058e5094bff94f9ed2df0f635313ff244f225a6` | first-pre-chorus workspace/player current head; CHANGELOG heading spacing fix 포함; 27 hosted Checks success, Rust/macOS amd64 진행 중, `opencode-review` failure; qualifying approval 없음 | | #1002 | `607994004c43a084c28d2d137ec5543be903eec6` | confirmed-harmony 한국어 action contract를 feature UI 계약에 맞춰 정렬하고 case-collision을 기준 blob으로 복원; desktop 23 files/263 tests와 100% coverage, typecheck/lint/build local pass; push 후 27 hosted check-runs 중 failure 0, pending 21, `REVIEW_REQUIRED/BLOCKED`, qualifying approval 없음 | +| #1016 | `a4948df82ad075a0b743e92b985992aa04815565` | first-fill plan current head; local `uv sync --project services/analysis-engine --group dev --frozen` pass로 macOS arm64의 이전 hatchling null-byte 오류는 재현되지 않음; 재실행 후 `coverage-evidence`/`opencode-review` success, macOS arm64 queued, `strix` failure, qualifying approval 없음 | | #980 | `bc922359725d5b7d8eba515fb1ad4756f5bf8ec9` | local picker가 source selection을 소유하는 동안 YouTube clear action도 숨겨 동시성 계약을 완성; targeted 2 tests, typecheck/lint/build local pass; 전체 desktop 223 tests 중 219 pass 및 기존/자원경합성 4 timeout, coverage 재실행은 실패하여 100%로 주장하지 않음; hosted current check-runs 20 success, 0 pending, `strix`/`opencode-review` failure, qualifying approval 없음 | | #982 | `821ae34a75a4d60c39dd919b4502e8a694b76ad4` | YouTube 실패 사유가 field description과 recovery alert에 중복 표시되는 계약에 맞춰 9개 stale 단일 조회 assertion을 multiplicity-safe로 정렬; App.test 65 pass와 affected visibility 10 pass, typecheck/lint/build local pass; 전체 desktop 234 tests 중 231 pass 및 기존/자원경합성 3 timeout, coverage 재실행은 100%로 주장하지 않음; hosted current check-runs 14 success, 8 pending, `opencode-review` failure, qualifying approval 없음 | | #1006 | `c4d50327917e2f20ee96d6b2b0ad883e4078571a` | first-range next-action의 runtime section label을 shared `SectionFormLabel` set으로 fail-closed 검증해 번역 helper typecheck를 복구; 관련 15 tests, typecheck/lint local pass; hosted current check-runs failure 0, pending 21, qualifying approval 없음 | @@ -124,7 +125,7 @@ flowchart LR | #922 | `0a677db0cc43aaff3934b4692d1882b9b0f57769` | Storybook 10.5.8 업데이트에 필요한 Storybook 10.5.10·oxc-resolver·플랫폼 optional dependency tree를 lockfile에 재생성; clean `npm ci`, `npm ls`, npm runtime/typecheck/lint/build local pass; hosted non-cancelled checks 14 success, 8 pending, `opencode-review` failure, qualifying current-head approval 없음 | | #859 | `62fd665968dff9032e58a2c58141355b65f264d0` | security-baseline 회귀를 제거하고 GrooveMap 최적화·회귀 테스트만 남긴 current head; 1 hosted Check success, 27 pending, failure 없음, qualifying approval 없음 | | #866 | `c2cc5bbeda6628fa9999401d6b0d228cb9b6bb9c` | stale base `acdbea63`, Draft + CONFLICTING; `opencode-review` failure; canonical audio policy owner이며 merge 대상 아님 | -| #1025 | `ea512556859933997e8a31f36a8dea22623b74c5` | 이 문서 PR의 직전 current head; #926/#925/#923/#922 dependency exact-head snapshot 추가 중; qualifying approval 없음 | +| #1025 | `d6493e1378979792465077f92da81b6cee273ae9` | 이 문서 PR의 직전 current head; #1016 exact-head 재실행 snapshot 추가 중; qualifying approval 없음 | 이 snapshot에서 위 PR 중 병합된 것은 없다. `mergeable=true`는 protected review/required-check 완료를 뜻하지 않으며, 승인·current-head review·필수 gate가 모두 충족되지 않은 PR은 병합하지 않았다. admin/self-approval, force-push, protected gate bypass도 사용하지 않았다. From 3c459fd033ccd94ad6cc8df6092d9e1ce4a86e6b Mon Sep 17 00:00:00 2001 From: seonghobae Date: Fri, 28 Aug 2026 18:43:34 +0900 Subject: [PATCH 32/94] docs: refresh arm64 build state --- docs/product-technical-gap-baseline.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/product-technical-gap-baseline.md b/docs/product-technical-gap-baseline.md index 595cd6f66..7d1048258 100644 --- a/docs/product-technical-gap-baseline.md +++ b/docs/product-technical-gap-baseline.md @@ -114,7 +114,7 @@ flowchart LR | #947 | `38ed1c8f4dc5f020db43536596aa401c454db55c` | first-verse workspace/player current head; CHANGELOG heading spacing fix 포함; 28 hosted Checks success, macOS amd64 진행 중, `opencode-review` failure; qualifying approval 없음 | | #955 | `4058e5094bff94f9ed2df0f635313ff244f225a6` | first-pre-chorus workspace/player current head; CHANGELOG heading spacing fix 포함; 27 hosted Checks success, Rust/macOS amd64 진행 중, `opencode-review` failure; qualifying approval 없음 | | #1002 | `607994004c43a084c28d2d137ec5543be903eec6` | confirmed-harmony 한국어 action contract를 feature UI 계약에 맞춰 정렬하고 case-collision을 기준 blob으로 복원; desktop 23 files/263 tests와 100% coverage, typecheck/lint/build local pass; push 후 27 hosted check-runs 중 failure 0, pending 21, `REVIEW_REQUIRED/BLOCKED`, qualifying approval 없음 | -| #1016 | `a4948df82ad075a0b743e92b985992aa04815565` | first-fill plan current head; local `uv sync --project services/analysis-engine --group dev --frozen` pass로 macOS arm64의 이전 hatchling null-byte 오류는 재현되지 않음; 재실행 후 `coverage-evidence`/`opencode-review` success, macOS arm64 queued, `strix` failure, qualifying approval 없음 | +| #1016 | `a4948df82ad075a0b743e92b985992aa04815565` | first-fill plan current head; local `uv sync --project services/analysis-engine --group dev --frozen` pass로 macOS arm64의 이전 hatchling null-byte 오류는 재현되지 않음; 재실행 후 `coverage-evidence`/`opencode-review` success, macOS arm64 in progress, `strix` failure, qualifying approval 없음 | | #980 | `bc922359725d5b7d8eba515fb1ad4756f5bf8ec9` | local picker가 source selection을 소유하는 동안 YouTube clear action도 숨겨 동시성 계약을 완성; targeted 2 tests, typecheck/lint/build local pass; 전체 desktop 223 tests 중 219 pass 및 기존/자원경합성 4 timeout, coverage 재실행은 실패하여 100%로 주장하지 않음; hosted current check-runs 20 success, 0 pending, `strix`/`opencode-review` failure, qualifying approval 없음 | | #982 | `821ae34a75a4d60c39dd919b4502e8a694b76ad4` | YouTube 실패 사유가 field description과 recovery alert에 중복 표시되는 계약에 맞춰 9개 stale 단일 조회 assertion을 multiplicity-safe로 정렬; App.test 65 pass와 affected visibility 10 pass, typecheck/lint/build local pass; 전체 desktop 234 tests 중 231 pass 및 기존/자원경합성 3 timeout, coverage 재실행은 100%로 주장하지 않음; hosted current check-runs 14 success, 8 pending, `opencode-review` failure, qualifying approval 없음 | | #1006 | `c4d50327917e2f20ee96d6b2b0ad883e4078571a` | first-range next-action의 runtime section label을 shared `SectionFormLabel` set으로 fail-closed 검증해 번역 helper typecheck를 복구; 관련 15 tests, typecheck/lint local pass; hosted current check-runs failure 0, pending 21, qualifying approval 없음 | @@ -125,7 +125,7 @@ flowchart LR | #922 | `0a677db0cc43aaff3934b4692d1882b9b0f57769` | Storybook 10.5.8 업데이트에 필요한 Storybook 10.5.10·oxc-resolver·플랫폼 optional dependency tree를 lockfile에 재생성; clean `npm ci`, `npm ls`, npm runtime/typecheck/lint/build local pass; hosted non-cancelled checks 14 success, 8 pending, `opencode-review` failure, qualifying current-head approval 없음 | | #859 | `62fd665968dff9032e58a2c58141355b65f264d0` | security-baseline 회귀를 제거하고 GrooveMap 최적화·회귀 테스트만 남긴 current head; 1 hosted Check success, 27 pending, failure 없음, qualifying approval 없음 | | #866 | `c2cc5bbeda6628fa9999401d6b0d228cb9b6bb9c` | stale base `acdbea63`, Draft + CONFLICTING; `opencode-review` failure; canonical audio policy owner이며 merge 대상 아님 | -| #1025 | `d6493e1378979792465077f92da81b6cee273ae9` | 이 문서 PR의 직전 current head; #1016 exact-head 재실행 snapshot 추가 중; qualifying approval 없음 | +| #1025 | `6ef89a33546e1bf4a6e465572ffe5904ba599188` | 이 문서 PR의 직전 current head; #1016 exact-head 재실행 진행 상태 반영 중; qualifying approval 없음 | 이 snapshot에서 위 PR 중 병합된 것은 없다. `mergeable=true`는 protected review/required-check 완료를 뜻하지 않으며, 승인·current-head review·필수 gate가 모두 충족되지 않은 PR은 병합하지 않았다. admin/self-approval, force-push, protected gate bypass도 사용하지 않았다. From ad72624fa81361594ee05a129b233f2119d8238c Mon Sep 17 00:00:00 2001 From: seonghobae Date: Fri, 28 Aug 2026 18:45:18 +0900 Subject: [PATCH 33/94] docs: record successful arm64 build rerun --- docs/product-technical-gap-baseline.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/product-technical-gap-baseline.md b/docs/product-technical-gap-baseline.md index 7d1048258..643654326 100644 --- a/docs/product-technical-gap-baseline.md +++ b/docs/product-technical-gap-baseline.md @@ -114,7 +114,7 @@ flowchart LR | #947 | `38ed1c8f4dc5f020db43536596aa401c454db55c` | first-verse workspace/player current head; CHANGELOG heading spacing fix 포함; 28 hosted Checks success, macOS amd64 진행 중, `opencode-review` failure; qualifying approval 없음 | | #955 | `4058e5094bff94f9ed2df0f635313ff244f225a6` | first-pre-chorus workspace/player current head; CHANGELOG heading spacing fix 포함; 27 hosted Checks success, Rust/macOS amd64 진행 중, `opencode-review` failure; qualifying approval 없음 | | #1002 | `607994004c43a084c28d2d137ec5543be903eec6` | confirmed-harmony 한국어 action contract를 feature UI 계약에 맞춰 정렬하고 case-collision을 기준 blob으로 복원; desktop 23 files/263 tests와 100% coverage, typecheck/lint/build local pass; push 후 27 hosted check-runs 중 failure 0, pending 21, `REVIEW_REQUIRED/BLOCKED`, qualifying approval 없음 | -| #1016 | `a4948df82ad075a0b743e92b985992aa04815565` | first-fill plan current head; local `uv sync --project services/analysis-engine --group dev --frozen` pass로 macOS arm64의 이전 hatchling null-byte 오류는 재현되지 않음; 재실행 후 `coverage-evidence`/`opencode-review` success, macOS arm64 in progress, `strix` failure, qualifying approval 없음 | +| #1016 | `a4948df82ad075a0b743e92b985992aa04815565` | first-fill plan current head; local `uv sync --project services/analysis-engine --group dev --frozen` pass로 macOS arm64의 이전 hatchling null-byte 오류는 재현되지 않음; 재실행 후 macOS arm64 build와 `coverage-evidence`/`opencode-review` success, `strix` failure, qualifying approval 없음 | | #980 | `bc922359725d5b7d8eba515fb1ad4756f5bf8ec9` | local picker가 source selection을 소유하는 동안 YouTube clear action도 숨겨 동시성 계약을 완성; targeted 2 tests, typecheck/lint/build local pass; 전체 desktop 223 tests 중 219 pass 및 기존/자원경합성 4 timeout, coverage 재실행은 실패하여 100%로 주장하지 않음; hosted current check-runs 20 success, 0 pending, `strix`/`opencode-review` failure, qualifying approval 없음 | | #982 | `821ae34a75a4d60c39dd919b4502e8a694b76ad4` | YouTube 실패 사유가 field description과 recovery alert에 중복 표시되는 계약에 맞춰 9개 stale 단일 조회 assertion을 multiplicity-safe로 정렬; App.test 65 pass와 affected visibility 10 pass, typecheck/lint/build local pass; 전체 desktop 234 tests 중 231 pass 및 기존/자원경합성 3 timeout, coverage 재실행은 100%로 주장하지 않음; hosted current check-runs 14 success, 8 pending, `opencode-review` failure, qualifying approval 없음 | | #1006 | `c4d50327917e2f20ee96d6b2b0ad883e4078571a` | first-range next-action의 runtime section label을 shared `SectionFormLabel` set으로 fail-closed 검증해 번역 helper typecheck를 복구; 관련 15 tests, typecheck/lint local pass; hosted current check-runs failure 0, pending 21, qualifying approval 없음 | @@ -125,7 +125,7 @@ flowchart LR | #922 | `0a677db0cc43aaff3934b4692d1882b9b0f57769` | Storybook 10.5.8 업데이트에 필요한 Storybook 10.5.10·oxc-resolver·플랫폼 optional dependency tree를 lockfile에 재생성; clean `npm ci`, `npm ls`, npm runtime/typecheck/lint/build local pass; hosted non-cancelled checks 14 success, 8 pending, `opencode-review` failure, qualifying current-head approval 없음 | | #859 | `62fd665968dff9032e58a2c58141355b65f264d0` | security-baseline 회귀를 제거하고 GrooveMap 최적화·회귀 테스트만 남긴 current head; 1 hosted Check success, 27 pending, failure 없음, qualifying approval 없음 | | #866 | `c2cc5bbeda6628fa9999401d6b0d228cb9b6bb9c` | stale base `acdbea63`, Draft + CONFLICTING; `opencode-review` failure; canonical audio policy owner이며 merge 대상 아님 | -| #1025 | `6ef89a33546e1bf4a6e465572ffe5904ba599188` | 이 문서 PR의 직전 current head; #1016 exact-head 재실행 진행 상태 반영 중; qualifying approval 없음 | +| #1025 | `3c459fd033ccd94ad6cc8df6092d9e1ce4a86e6b` | 이 문서 PR의 직전 current head; #1016 exact-head macOS arm64 재실행 성공 상태 반영 중; qualifying approval 없음 | 이 snapshot에서 위 PR 중 병합된 것은 없다. `mergeable=true`는 protected review/required-check 완료를 뜻하지 않으며, 승인·current-head review·필수 gate가 모두 충족되지 않은 PR은 병합하지 않았다. admin/self-approval, force-push, protected gate bypass도 사용하지 않았다. From 22b48f11e5dd7d050f3b29fdb7742f1f96610bf6 Mon Sep 17 00:00:00 2001 From: seonghobae Date: Fri, 28 Aug 2026 18:47:01 +0900 Subject: [PATCH 34/94] docs: refresh exact-head check counts --- docs/product-technical-gap-baseline.md | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/docs/product-technical-gap-baseline.md b/docs/product-technical-gap-baseline.md index 643654326..506c8ffeb 100644 --- a/docs/product-technical-gap-baseline.md +++ b/docs/product-technical-gap-baseline.md @@ -114,18 +114,18 @@ flowchart LR | #947 | `38ed1c8f4dc5f020db43536596aa401c454db55c` | first-verse workspace/player current head; CHANGELOG heading spacing fix 포함; 28 hosted Checks success, macOS amd64 진행 중, `opencode-review` failure; qualifying approval 없음 | | #955 | `4058e5094bff94f9ed2df0f635313ff244f225a6` | first-pre-chorus workspace/player current head; CHANGELOG heading spacing fix 포함; 27 hosted Checks success, Rust/macOS amd64 진행 중, `opencode-review` failure; qualifying approval 없음 | | #1002 | `607994004c43a084c28d2d137ec5543be903eec6` | confirmed-harmony 한국어 action contract를 feature UI 계약에 맞춰 정렬하고 case-collision을 기준 blob으로 복원; desktop 23 files/263 tests와 100% coverage, typecheck/lint/build local pass; push 후 27 hosted check-runs 중 failure 0, pending 21, `REVIEW_REQUIRED/BLOCKED`, qualifying approval 없음 | -| #1016 | `a4948df82ad075a0b743e92b985992aa04815565` | first-fill plan current head; local `uv sync --project services/analysis-engine --group dev --frozen` pass로 macOS arm64의 이전 hatchling null-byte 오류는 재현되지 않음; 재실행 후 macOS arm64 build와 `coverage-evidence`/`opencode-review` success, `strix` failure, qualifying approval 없음 | +| #1016 | `a4948df82ad075a0b743e92b985992aa04815565` | first-fill plan current head; local `uv sync --project services/analysis-engine --group dev --frozen` pass로 macOS arm64의 이전 hatchling null-byte 오류는 재현되지 않음; 재실행 후 macOS arm64 build와 `coverage-evidence`/`opencode-review` success, `strix` failure, hosted non-cancelled checks 22 success·0 pending, qualifying approval 없음 | | #980 | `bc922359725d5b7d8eba515fb1ad4756f5bf8ec9` | local picker가 source selection을 소유하는 동안 YouTube clear action도 숨겨 동시성 계약을 완성; targeted 2 tests, typecheck/lint/build local pass; 전체 desktop 223 tests 중 219 pass 및 기존/자원경합성 4 timeout, coverage 재실행은 실패하여 100%로 주장하지 않음; hosted current check-runs 20 success, 0 pending, `strix`/`opencode-review` failure, qualifying approval 없음 | | #982 | `821ae34a75a4d60c39dd919b4502e8a694b76ad4` | YouTube 실패 사유가 field description과 recovery alert에 중복 표시되는 계약에 맞춰 9개 stale 단일 조회 assertion을 multiplicity-safe로 정렬; App.test 65 pass와 affected visibility 10 pass, typecheck/lint/build local pass; 전체 desktop 234 tests 중 231 pass 및 기존/자원경합성 3 timeout, coverage 재실행은 100%로 주장하지 않음; hosted current check-runs 14 success, 8 pending, `opencode-review` failure, qualifying approval 없음 | | #1006 | `c4d50327917e2f20ee96d6b2b0ad883e4078571a` | first-range next-action의 runtime section label을 shared `SectionFormLabel` set으로 fail-closed 검증해 번역 helper typecheck를 복구; 관련 15 tests, typecheck/lint local pass; hosted current check-runs failure 0, pending 21, qualifying approval 없음 | | #929 | `aac5e3becb3349c8e320c5bccd459567a6d30665` | `@testing-library/jest-dom` 7.0.1 업데이트에 맞춰 package-lock의 workspace dependency tree를 재생성; clean `npm ci`, `npm ls`, npm runtime/typecheck/lint/build와 targeted test pass; 전체 desktop 216 tests 중 215 pass 및 기존 Workspace 1 timeout으로 coverage를 주장하지 않음; hosted current check-runs failure 0, pending 21, qualifying approval 없음 | -| #926 | `5b3f7288874e375f97d0f80066709e7bb6f5c086` | `apps/desktop/package.json`에 남은 literal merge markers를 제거하고 lucide 1.31.0 의도와 develop의 PDF.js 6.2.108을 보존하도록 lockfile 재생성; clean `npm ci`, `npm ls`, npm runtime/typecheck/lint/build local pass; hosted non-cancelled checks 22 success, 2 pending, `opencode-review` failure, qualifying current-head approval 없음 | -| #925 | `d08fb6f5924021905f741ef57e3241e6cd9b9021` | `typescript-eslint` 8.67.0 lockfile 누락을 복구하고 루트 ESLint config의 직접 import를 root devDependency로 명시; clean `npm ci`, `npm ls`, npm runtime/typecheck/lint/build local pass; hosted non-cancelled checks 15 success, 7 pending, `opencode-review` failure, qualifying current-head approval 없음 | -| #923 | `d396f17ffb6ddf00e7c5b7e8dc36f5d8058360c4` | `@storybook/react-vite` 10.5.8 업데이트에 필요한 Storybook 10.5.10·oxc-resolver·플랫폼 optional dependency tree를 lockfile에 재생성; clean `npm ci`, `npm ls`, npm runtime/typecheck/lint/build local pass; hosted non-cancelled checks 14 success, 8 pending, `opencode-review` failure, qualifying current-head approval 없음 | -| #922 | `0a677db0cc43aaff3934b4692d1882b9b0f57769` | Storybook 10.5.8 업데이트에 필요한 Storybook 10.5.10·oxc-resolver·플랫폼 optional dependency tree를 lockfile에 재생성; clean `npm ci`, `npm ls`, npm runtime/typecheck/lint/build local pass; hosted non-cancelled checks 14 success, 8 pending, `opencode-review` failure, qualifying current-head approval 없음 | +| #926 | `5b3f7288874e375f97d0f80066709e7bb6f5c086` | `apps/desktop/package.json`에 남은 literal merge markers를 제거하고 lucide 1.31.0 의도와 develop의 PDF.js 6.2.108을 보존하도록 lockfile 재생성; clean `npm ci`, `npm ls`, npm runtime/typecheck/lint/build local pass; hosted non-cancelled checks 22 success·0 pending, `opencode-review` failure, qualifying current-head approval 없음 | +| #925 | `d08fb6f5924021905f741ef57e3241e6cd9b9021` | `typescript-eslint` 8.67.0 lockfile 누락을 복구하고 루트 ESLint config의 직접 import를 root devDependency로 명시; clean `npm ci`, `npm ls`, npm runtime/typecheck/lint/build local pass; hosted non-cancelled checks 23 success·0 pending, `opencode-review` failure, qualifying current-head approval 없음 | +| #923 | `d396f17ffb6ddf00e7c5b7e8dc36f5d8058360c4` | `@storybook/react-vite` 10.5.8 업데이트에 필요한 Storybook 10.5.10·oxc-resolver·플랫폼 optional dependency tree를 lockfile에 재생성; clean `npm ci`, `npm ls`, npm runtime/typecheck/lint/build local pass; hosted non-cancelled checks 24 success·0 pending, `opencode-review` failure, qualifying current-head approval 없음 | +| #922 | `0a677db0cc43aaff3934b4692d1882b9b0f57769` | Storybook 10.5.8 업데이트에 필요한 Storybook 10.5.10·oxc-resolver·플랫폼 optional dependency tree를 lockfile에 재생성; clean `npm ci`, `npm ls`, npm runtime/typecheck/lint/build local pass; hosted non-cancelled checks 21 success·0 pending, `strix`/`opencode-review` failure, qualifying current-head approval 없음 | | #859 | `62fd665968dff9032e58a2c58141355b65f264d0` | security-baseline 회귀를 제거하고 GrooveMap 최적화·회귀 테스트만 남긴 current head; 1 hosted Check success, 27 pending, failure 없음, qualifying approval 없음 | | #866 | `c2cc5bbeda6628fa9999401d6b0d228cb9b6bb9c` | stale base `acdbea63`, Draft + CONFLICTING; `opencode-review` failure; canonical audio policy owner이며 merge 대상 아님 | -| #1025 | `3c459fd033ccd94ad6cc8df6092d9e1ce4a86e6b` | 이 문서 PR의 직전 current head; #1016 exact-head macOS arm64 재실행 성공 상태 반영 중; qualifying approval 없음 | +| #1025 | `ad72624fa81361594ee05a129b233f2119d8238c` | 이 문서 PR의 직전 current head; #1016 exact-head macOS arm64 재실행 성공 및 dependency lock repair 결과 반영 중; hosted non-cancelled checks 8 success·13 pending, qualifying approval 없음 | 이 snapshot에서 위 PR 중 병합된 것은 없다. `mergeable=true`는 protected review/required-check 완료를 뜻하지 않으며, 승인·current-head review·필수 gate가 모두 충족되지 않은 PR은 병합하지 않았다. admin/self-approval, force-push, protected gate bypass도 사용하지 않았다. From 175e2ad0338ebb0e8a5b8f6d36df285203623466 Mon Sep 17 00:00:00 2001 From: seonghobae Date: Fri, 28 Aug 2026 20:27:30 +0900 Subject: [PATCH 35/94] docs: refresh current PR traceability --- docs/product-technical-gap-baseline.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/product-technical-gap-baseline.md b/docs/product-technical-gap-baseline.md index 506c8ffeb..3f33fcda9 100644 --- a/docs/product-technical-gap-baseline.md +++ b/docs/product-technical-gap-baseline.md @@ -125,7 +125,7 @@ flowchart LR | #922 | `0a677db0cc43aaff3934b4692d1882b9b0f57769` | Storybook 10.5.8 업데이트에 필요한 Storybook 10.5.10·oxc-resolver·플랫폼 optional dependency tree를 lockfile에 재생성; clean `npm ci`, `npm ls`, npm runtime/typecheck/lint/build local pass; hosted non-cancelled checks 21 success·0 pending, `strix`/`opencode-review` failure, qualifying current-head approval 없음 | | #859 | `62fd665968dff9032e58a2c58141355b65f264d0` | security-baseline 회귀를 제거하고 GrooveMap 최적화·회귀 테스트만 남긴 current head; 1 hosted Check success, 27 pending, failure 없음, qualifying approval 없음 | | #866 | `c2cc5bbeda6628fa9999401d6b0d228cb9b6bb9c` | stale base `acdbea63`, Draft + CONFLICTING; `opencode-review` failure; canonical audio policy owner이며 merge 대상 아님 | -| #1025 | `ad72624fa81361594ee05a129b233f2119d8238c` | 이 문서 PR의 직전 current head; #1016 exact-head macOS arm64 재실행 성공 및 dependency lock repair 결과 반영 중; hosted non-cancelled checks 8 success·13 pending, qualifying approval 없음 | +| #1025 | `22b48f11e5dd7d050f3b29fdb7742f1f96610bf6` | 이 문서 PR의 current head; hosted non-cancelled check-runs 31 success·1 failure(`opencode-review`)·2 neutral·0 pending, `strix` success; OpenCode는 해당 head의 current-head verdict 미발행으로 failure이며 qualifying approval 없음 | 이 snapshot에서 위 PR 중 병합된 것은 없다. `mergeable=true`는 protected review/required-check 완료를 뜻하지 않으며, 승인·current-head review·필수 gate가 모두 충족되지 않은 PR은 병합하지 않았다. admin/self-approval, force-push, protected gate bypass도 사용하지 않았다. From 9bbd706aad5d9b9a37e6add3266ee476dffa2cd1 Mon Sep 17 00:00:00 2001 From: seonghobae Date: Fri, 28 Aug 2026 20:42:05 +0900 Subject: [PATCH 36/94] docs: make gap evidence reproducible --- docs/product-technical-gap-baseline.md | 41 +++++++++++++++++++++----- 1 file changed, 34 insertions(+), 7 deletions(-) diff --git a/docs/product-technical-gap-baseline.md b/docs/product-technical-gap-baseline.md index 3f33fcda9..8fdf79672 100644 --- a/docs/product-technical-gap-baseline.md +++ b/docs/product-technical-gap-baseline.md @@ -94,11 +94,11 @@ flowchart LR ## 4. 현재 열린 PR 기반 Gap 분석 (Open-PR Gap Analysis) -현재 open PR은 130건이다(2026-08-28 REST inventory 기준). 대부분은 동일 패턴의 시리즈다. +현재 open PR은 130건이다(2026-08-28 REST inventory 기준). 아래 표는 그중 대표적인 PR을 뽑은 snapshot이며, 대부분은 동일 패턴의 시리즈다. ### 4.1 2026-08-28 exact-head 운영 snapshot -아래 표는 protected base `develop@749511c3ad4000090048718f685c6bee6b3d2c25`에 대해 GitHub REST API로 다시 읽은 current head와 그 head의 Checks/review 상태다. 이전 SHA의 Checks는 현재 증적으로 재사용하지 않았다. +아래 표는 protected base `develop@749511c3ad4000090048718f685c6bee6b3d2c25`에 대해 GitHub REST API로 다시 읽은 대표 PR의 current head와 그 head의 Checks/review 상태다. 아래 재실행 명령은 capture 시각의 open PR 전체에 대해 각 current head, 동일 SHA의 check-runs, reviews, protected base를 JSON으로 묶는다. 이전 SHA의 Checks는 현재 증적으로 재사용하지 않았다. | PR | current head | current 상태와 traceability | |---|---|---| @@ -125,7 +125,9 @@ flowchart LR | #922 | `0a677db0cc43aaff3934b4692d1882b9b0f57769` | Storybook 10.5.8 업데이트에 필요한 Storybook 10.5.10·oxc-resolver·플랫폼 optional dependency tree를 lockfile에 재생성; clean `npm ci`, `npm ls`, npm runtime/typecheck/lint/build local pass; hosted non-cancelled checks 21 success·0 pending, `strix`/`opencode-review` failure, qualifying current-head approval 없음 | | #859 | `62fd665968dff9032e58a2c58141355b65f264d0` | security-baseline 회귀를 제거하고 GrooveMap 최적화·회귀 테스트만 남긴 current head; 1 hosted Check success, 27 pending, failure 없음, qualifying approval 없음 | | #866 | `c2cc5bbeda6628fa9999401d6b0d228cb9b6bb9c` | stale base `acdbea63`, Draft + CONFLICTING; `opencode-review` failure; canonical audio policy owner이며 merge 대상 아님 | -| #1025 | `22b48f11e5dd7d050f3b29fdb7742f1f96610bf6` | 이 문서 PR의 current head; hosted non-cancelled check-runs 31 success·1 failure(`opencode-review`)·2 neutral·0 pending, `strix` success; OpenCode는 해당 head의 current-head verdict 미발행으로 failure이며 qualifying approval 없음 | +| #1025 | `175e2ad0338ebb0e8a5b8f6d36df285203623466` | 이 문서 PR의 current head; 이전 SHA의 Checks는 재사용하지 않음; 새 hosted Checks는 실행 중이며 qualifying approval 없음 | + +`#1025`의 과거 SHA(`3c459fd033ccd94ad6cc8df6092d9e1ce4a86e6b` 등)는 이 표의 current head가 아니므로, 해당 SHA의 Checks/review를 현재 증적으로 재사용하지 않는다. 이 snapshot에서 위 PR 중 병합된 것은 없다. `mergeable=true`는 protected review/required-check 완료를 뜻하지 않으며, 승인·current-head review·필수 gate가 모두 충족되지 않은 PR은 병합하지 않았다. admin/self-approval, force-push, protected gate bypass도 사용하지 않았다. @@ -166,7 +168,7 @@ capability cluster 분류와 착지 후 남는 Gap: (d) **테스트 현실성** — `test_numeric_parity.py`(Rust-Python parity), `test_api.py` 등은 합성 입력 기반이다. 현재 PR checkout의 Git tree 및 9장 `find` 검증 기준 test 경로에 `.wav`/`.mp3` 실오디오 fixture가 없다. 실오디오 acceptance는 PR #892(decoded WAV C major), #891(known take verse/chorus recovery)이 열려 있고, 실 YouTube known-stem benchmark는 draft PR #828 + Issue #770 상태다. RMSE/SI-SDR 스타일 정량 임계값 acceptance gate는 아직 없다. -(e) **커버리지/docstring 100%** — Python은 `--cov-fail-under=100` + Ruff D100-D107 docstring 100%가 gate로 작동한다(AGENTS.md, roadmap-completion 문서). JS workspace의 **2026-08-25 snapshot 실측**은 desktop(469 stmts/357 branches/105 funcs)과 shared-types(717 stmts/643 branches/59 funcs) 모두 statements/branches/functions/lines 100%였다. 이 수치는 현재 영구 gate를 뜻하지 않는다. gate threshold(`vite.config.ts`, `vitest.config.ts`)는 90으로 Python보다 낮아, 리그레션 시 90~99% 구간이 무단 통과될 수 있다. Gate 상향은 Backlog #10. +(e) **커버리지/docstring 100%** — Python은 `--cov-fail-under=100` + Ruff D100-D107 docstring 100%가 gate로 작동한다(AGENTS.md, roadmap-completion 문서). JS workspace의 **2026-08-25 snapshot 실측**(source tree commit `d303c93e5e7d9199edb6ce596dcb9a8753f3a5fa`)은 desktop(469 stmts/357 branches/105 funcs)과 shared-types(717 stmts/643 branches/59 funcs) 모두 statements/branches/functions/lines 100%였다. 재실행 명령과 결과 artifact 경로는 각각 `npm run test --workspace @bandscope/desktop` -> `apps/desktop/coverage/coverage-summary.json`, `npm run test --workspace @bandscope/shared-types` -> `packages/shared-types/coverage/coverage-summary.json`이다. 이 수치는 현재 영구 gate를 뜻하지 않는다. gate threshold(`vite.config.ts`, `vitest.config.ts`)는 90으로 Python보다 낮아, 리그레션 시 90~99% 구간이 무단 통과될 수 있다. Gate 상향은 Backlog #10. (f) **보안 체크리스트 잔여 항목** — 구현된 것: allowlisted stdin/stdout subprocess, Tauri CSP, path guards(#727 착지), CSV escape/sanitize, shell=False. 열린 것: canonical audio resource budget(#985 draft, Issue #781), filesystem path containment 재구축(Issue #852, #858 진행), native PDF read bounding(#865, #750), quick-xml RustSec 예외(#948, Issue #542), npm/PDF.js/nanoid/undici baseline(#783). 모델 artifact(Demucs checkpoint) checksum/signature 검증 파이프라인은 문서(app-security.md "Models") 요구 대비 미구현. @@ -174,7 +176,7 @@ capability cluster 분류와 착지 후 남는 Gap: (h) **i18n/현지화** — `src/i18n` + `locales/en`, `locales/ko` 존재, 하드코딩 한국어 문자열 미탐지(workspace tsx grep 0건), interpolation hardening PR #744 진행. en/ko 2개 언어뿐이며, PR 시리즈가 추가할 다수의 카피 키가 locales에 아직 없다. -(i) **접근성** — 2026-08-25 snapshot에서 workspace 컴포넌트의 `aria-`가 포함된 matching line은 52개였다. 이는 고유 attribute token 수가 아니다. WCAG 2.2 AA gate는 Issue #965로 열려 있고, Figma/Storybook/shipped UI 정합 점검도 미완이다. tooltip/a11y PR(#833, #731)이 진행 중. +(i) **접근성** — 2026-08-28 current checkout에서 workspace 컴포넌트의 `aria-*` attribute token은 56개였다. WCAG 2.2 AA gate는 Issue #965로 열려 있고, Figma/Storybook/shipped UI 정합 점검도 미완이다. tooltip/a11y PR(#833, #731)이 진행 중. (j) **Design token/Storybook** — shadcn/ui 프리미티브 중 stories는 button/checkbox/dialog 3개뿐이고, rehearsal 도메인 컴포넌트(GrooveMap, SectionRoadmap, RoleSwitcher 등) stories는 없다. Storybook token PR #897이 진행 중. @@ -348,6 +350,29 @@ World Wide Web Consortium. (2024). Web Content Accessibility Guidelines (WCAG) 2 --jq '.[].number' | wc -l # 130 gh pr view 1021 --json title,body # 시리즈 패턴 샘플 ``` +- Exact-head PR snapshot (capture time, protected base, current head, same-head Checks and reviews): + ```bash + snapshot_dir="${TMPDIR:-/tmp}/bandscope-pr-snapshot" + mkdir -p "$snapshot_dir" + base_sha="$(git ls-remote https://github.com/ContextualWisdomLab/bandscope.git refs/heads/develop | cut -f1)" + gh api --paginate --slurp 'repos/ContextualWisdomLab/bandscope/pulls?state=open&per_page=100' \ + --jq 'add | map({number,head_sha:.head.sha,base_sha:.base.sha})' > "$snapshot_dir/prs.json" + jq -c '.[]' "$snapshot_dir/prs.json" | while read -r pr; do + number="$(jq -r .number <<<"$pr")" + head_sha="$(jq -r .head_sha <<<"$pr")" + checks="$(gh api --paginate --slurp "repos/ContextualWisdomLab/bandscope/commits/${head_sha}/check-runs?per_page=100" \ + --jq 'map(.check_runs) | add | map({name,status,conclusion,head_sha})')" + reviews="$(gh api --paginate --slurp "repos/ContextualWisdomLab/bandscope/pulls/${number}/reviews" \ + --jq 'add | map({user:.user.login,state,commit_id})')" + jq -n --argjson pr "$pr" --arg protected_base_sha "$base_sha" \ + --argjson check_runs "$checks" --argjson reviews "$reviews" \ + '$pr + {protected_base_sha:$protected_base_sha,check_runs:$check_runs,reviews:$reviews}' \ + > "$snapshot_dir/pr-${number}.json" + done + jq -s --arg captured_at "$(date -u +%FT%TZ)" --arg protected_base_sha "$base_sha" \ + '{captured_at:$captured_at,protected_base_sha:$protected_base_sha,open_pr_count:length,pull_requests:.}' \ + "$snapshot_dir"/pr-*.json > "$snapshot_dir/open-pr-snapshot.json" + ``` - Open issues: `gh issue list --state open --limit 50 --json number,title --jq '.[]|"\(.number)\t\(.title)"'` - 코드 검증 grep/glob (요지): - `grep -rn "padPlan\|PadPlan" apps/desktop/src packages/shared-types/src` -> 0건(시리즈 미착지 확인) @@ -357,10 +382,12 @@ World Wide Web Consortium. (2024). Web Content Accessibility Guidelines (WCAG) 2 - `sed -n '1,40p' services/analysis-engine/src/bandscope_analysis/_native.py` -> bandscope_numeric 커널/parity 확인 - `ls services/analysis-engine/rust && grep -n "maturin" services/analysis-engine/rust/pyproject.toml` -> Rust 커널 위치 확인 - `head -30 services/analysis-engine/src/bandscope_analysis/separation/model_weights/bandsplit-v1.json` -> 휴리스틱 manifest 확인 - - `grep -rn "aria-" apps/desktop/src/features/workspace/*.tsx | wc -l` -> 52 matching lines (2026-08-25 snapshot; 고유 aria-* attribute token 수가 아님) + - `find apps/desktop/src/features/workspace -type f -name '*.tsx' -print0 | xargs -0 grep -hEo 'aria-[[:alnum:]_-]+' | wc -l` -> 56 attribute tokens (2026-08-28 current checkout) - `grep -rln "RehearsalAssignment\|RehearsalCollaboration" apps/desktop/src` -> 0건(UI 미구현 확인) - `grep -rn "loop" apps/desktop/src/features/player/index.tsx` -> 0건(loop 미구현 확인) - `ls CHANGELOG.md VERSION .github/workflows` -> 릴리스 자산 확인 + - `npm run test --workspace @bandscope/desktop` -> `apps/desktop/coverage/coverage-summary.json` (2026-08-25 snapshot command) + - `npm run test --workspace @bandscope/shared-types` -> `packages/shared-types/coverage/coverage-summary.json` (2026-08-25 snapshot command) - `grep -n thresholds apps/desktop/vite.config.ts packages/shared-types/vitest.config.ts` -> JS 90% 확인 - `grep -rn "cov-fail-under" AGENTS.md docs` -> Python 100% gate 확인 - - Protected-base Mermaid 존재 여부: `git grep -n -E 'sequenceDiagram|classDiagram|flowchart' 749511c3ad4000090048718f685c6bee6b3d2c25 -- docs ARCHITECTURE.md || true` -> 0건(6장 전제 확인) + - Protected-base Mermaid 존재 여부: `git grep -n -E 'sequenceDiagram|classDiagram|flowchart' 749511c3ad4000090048718f685c6bee6b3d2c25 -- docs ARCHITECTURE.md || true` -> 0건(문서 추가 전 protected base 기준; 6장 전제 확인) From 29136fbb794264b2a2c587eaccb061248cf3b96e Mon Sep 17 00:00:00 2001 From: seonghobae Date: Fri, 28 Aug 2026 21:49:53 +0900 Subject: [PATCH 37/94] docs: refresh PR 1025 current-head evidence --- docs/product-technical-gap-baseline.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/product-technical-gap-baseline.md b/docs/product-technical-gap-baseline.md index 8fdf79672..fb1e62af8 100644 --- a/docs/product-technical-gap-baseline.md +++ b/docs/product-technical-gap-baseline.md @@ -125,7 +125,7 @@ flowchart LR | #922 | `0a677db0cc43aaff3934b4692d1882b9b0f57769` | Storybook 10.5.8 업데이트에 필요한 Storybook 10.5.10·oxc-resolver·플랫폼 optional dependency tree를 lockfile에 재생성; clean `npm ci`, `npm ls`, npm runtime/typecheck/lint/build local pass; hosted non-cancelled checks 21 success·0 pending, `strix`/`opencode-review` failure, qualifying current-head approval 없음 | | #859 | `62fd665968dff9032e58a2c58141355b65f264d0` | security-baseline 회귀를 제거하고 GrooveMap 최적화·회귀 테스트만 남긴 current head; 1 hosted Check success, 27 pending, failure 없음, qualifying approval 없음 | | #866 | `c2cc5bbeda6628fa9999401d6b0d228cb9b6bb9c` | stale base `acdbea63`, Draft + CONFLICTING; `opencode-review` failure; canonical audio policy owner이며 merge 대상 아님 | -| #1025 | `175e2ad0338ebb0e8a5b8f6d36df285203623466` | 이 문서 PR의 current head; 이전 SHA의 Checks는 재사용하지 않음; 새 hosted Checks는 실행 중이며 qualifying approval 없음 | +| #1025 | `9bbd706aad5d9b9a37e6add3266ee476dffa2cd1` | 이 문서 PR의 current head이며 base는 `749511c3ad4000090048718f685c6bee6b3d2c25`; hosted current check-runs는 hard failure 1건(`opencode-review`), pending 0, `coverage-evidence`/`coverage-source-tree`/`strix`/보안·플랫폼·빌드 gate success; `MERGEABLE/BLOCKED`, qualifying approval 없음 | `#1025`의 과거 SHA(`3c459fd033ccd94ad6cc8df6092d9e1ce4a86e6b` 등)는 이 표의 current head가 아니므로, 해당 SHA의 Checks/review를 현재 증적으로 재사용하지 않는다. From 2cd38b2278e6db3866797394f81876c15a07f2c3 Mon Sep 17 00:00:00 2001 From: seonghobae Date: Sat, 29 Aug 2026 08:18:15 +0900 Subject: [PATCH 38/94] docs: refresh product gap baseline evidence --- docs/product-technical-gap-baseline.md | 52 ++++++++++---------------- 1 file changed, 20 insertions(+), 32 deletions(-) diff --git a/docs/product-technical-gap-baseline.md b/docs/product-technical-gap-baseline.md index fb1e62af8..c1e88b38c 100644 --- a/docs/product-technical-gap-baseline.md +++ b/docs/product-technical-gap-baseline.md @@ -1,11 +1,11 @@ # BandScope Product-Technical Gap Baseline -Last updated: 2026-08-28 +Last updated: 2026-08-29 Base revision: `develop@749511c3ad4000090048718f685c6bee6b3d2c25` (feat(workspace): name tonight's first playable range on the map, #957) ## 1. 목적과 범위 (Purpose & Scope) -이 문서는 ADR/설계 문서(`ARCHITECTURE.md`, `docs/plans/*`), 브랜드 소스(`docs/brand-story.md`), 보안 소스(`docs/security/app-security.md`), 그리고 현재 저장소 상태(코드, 열린 PR 약 130건, 열린 이슈)를 대조하여 다음을 한 곳에 모은 baseline이다. +이 문서는 ADR/설계 문서(`ARCHITECTURE.md`, `docs/plans/*`), 브랜드 소스(`docs/brand-story.md`), 보안 소스(`docs/security/app-security.md`), 그리고 현재 저장소 상태(코드, 열린 PR 133건, 열린 이슈)를 대조하여 다음을 한 곳에 모은 baseline이다. - 기능 명세(functional spec)와 PRD/TRD로 승격되지 않은 요구사항의 공백 - 구현된 코드와 문서가 선언하는 제품 범위 사이의 기술 Gap @@ -94,41 +94,29 @@ flowchart LR ## 4. 현재 열린 PR 기반 Gap 분석 (Open-PR Gap Analysis) -현재 open PR은 130건이다(2026-08-28 REST inventory 기준). 아래 표는 그중 대표적인 PR을 뽑은 snapshot이며, 대부분은 동일 패턴의 시리즈다. +현재 open PR은 133건이다(2026-08-29 Asia/Seoul 기준 REST inventory). 아래 표는 그중 대표적인 PR을 뽑은 snapshot이며, 대부분은 동일 패턴의 시리즈다. -### 4.1 2026-08-28 exact-head 운영 snapshot +### 4.1 2026-08-29 exact-head 운영 snapshot 아래 표는 protected base `develop@749511c3ad4000090048718f685c6bee6b3d2c25`에 대해 GitHub REST API로 다시 읽은 대표 PR의 current head와 그 head의 Checks/review 상태다. 아래 재실행 명령은 capture 시각의 open PR 전체에 대해 각 current head, 동일 SHA의 check-runs, reviews, protected base를 JSON으로 묶는다. 이전 SHA의 Checks는 현재 증적으로 재사용하지 않았다. | PR | current head | current 상태와 traceability | |---|---|---| -| #1040 | `eb7432c124ccf667eca8db0656ed09273e51e5c7` | drop-plan copy/provenance 양방향 검증을 shared-types와 native parser에 보강; 15 hosted Checks success, 11 pending, failure 없음; qualifying independent approval 없음 | -| #1045 | `88c2c741ab0d62033b3d9c330d67e8ac90010c57` | swell-plan copy/provenance 양방향 검증 보강; 새 current-head workflow 21개 pending, failure 없음; qualifying independent approval 없음 | -| #1046 | `c8b5e391cec704e599ff75fe00f5a0b2016a6eca` | fade-plan copy/provenance 양방향 검증 보강; 새 current-head workflow 21개 pending, failure 없음; qualifying independent approval 없음 | -| #1047 | `bac0d90d1f1ae88141c93dd50483eebb63ed1e85` | ritardando plan 누락 JSDoc·copy/provenance 양방향 검증과 `ritardando.py` mypy 타입 계약을 보강; 관련 desktop 23 tests, mypy/ruff pass, Python 전체 697 passed/24 skipped이나 torch child segfault로 coverage 0 산출되어 100%로 주장하지 않음; hosted current check-runs failure 0, pending 21, qualifying approval 없음 | +| #1040 | `191189d52f25486028425f1266de9bc6dcb71c93` | drop-plan copy/provenance 양방향 검증을 shared-types와 native parser에 보강; current Checks 32 pass, 2 failure, 0 pending; `REVIEW_REQUIRED/BLOCKED`, qualifying independent approval 없음 | +| #1045 | `995e3fc5475f47117c9eb15f3eb1e0a6dbd249c0` | swell-plan copy/provenance 양방향 검증과 feature-cache schema 분리를 보강하고 role payload TypedDict를 정렬; current Checks 32 pass, 1 failure, 1 pending; `REVIEW_REQUIRED/BLOCKED`, qualifying independent approval 없음 | +| #1046 | `5c655995664c9d1faba60c0ae9ff896ea11c0c57` | fade-plan copy/provenance 양방향 검증과 외부 song 교체 identity reset을 보강; current Checks 32 pass, 2 failure, 0 pending; `REVIEW_REQUIRED/BLOCKED`, qualifying independent approval 없음 | +| #1047 | `bc63d8a0235ed72566e557681abd6b3958ed714e` | ritardando plan 누락 JSDoc·copy/provenance 양방향 검증과 `ritardando.py` mypy 타입 계약을 보강; 관련 Python/desktop 검증 완료; current Checks 32 pass, 2 failure, 0 pending; `REVIEW_REQUIRED/BLOCKED`, qualifying independent approval 없음 | +| #1048 | `28038721b473c1f64b6914312f48704d64e09c6a` | accelerando plan copy/provenance 양방향 검증과 beat-grid 경계 계약을 보강; current Checks 32 pass, 1 failure, 0 pending; `REVIEW_REQUIRED/BLOCKED`, qualifying independent approval 없음 | +| #1049 | `c34480961bd66485f59122f4d15c5948e8d95ac6` | fermata plan 작업 중인 Draft PR; current Checks 32 pass, 1 failure, 0 pending; `DRAFT/BLOCKED`, qualifying independent approval 없음 | | #1033 | `046db562497a8104fa525f56a6437eb13fbf4760` | source/coverage/security/build/release 및 `opencode-review`/`strix` terminal success; reviews는 COMMENTED뿐이며 qualifying approval 없음 | | #1034 | `98a99e1bff4b63f5294d8c9a5cbdaf312b235403` | source/coverage/security/build/release terminal success; `opencode-review` success; qualifying independent approval 없음 | -| #1041 | `164995d3a3c056bdbb4fc293226d0c31c062104e` | ScoreView/ScoreViewer tooltip 변경 current head; coverage/build/security Checks 일부 queued/in-progress; qualifying approval 없음 | -| #910 | `b6bcecb8649796dc13a54c39d70ca05977b0ac4c` | source/coverage/security/build/release terminal success이나 current `opencode-review` failure; current-head qualifying approval 없음 | -| #943 | `ff5e47d5cff84194e457c05e4bfbe26a30ea69a8` | first-intro player/workspace current head; Proxy metadata fail-closed fix 포함; 28 hosted Checks success, macOS amd64 진행 중, `opencode-review` failure; qualifying approval 없음 | -| #947 | `38ed1c8f4dc5f020db43536596aa401c454db55c` | first-verse workspace/player current head; CHANGELOG heading spacing fix 포함; 28 hosted Checks success, macOS amd64 진행 중, `opencode-review` failure; qualifying approval 없음 | -| #955 | `4058e5094bff94f9ed2df0f635313ff244f225a6` | first-pre-chorus workspace/player current head; CHANGELOG heading spacing fix 포함; 27 hosted Checks success, Rust/macOS amd64 진행 중, `opencode-review` failure; qualifying approval 없음 | -| #1002 | `607994004c43a084c28d2d137ec5543be903eec6` | confirmed-harmony 한국어 action contract를 feature UI 계약에 맞춰 정렬하고 case-collision을 기준 blob으로 복원; desktop 23 files/263 tests와 100% coverage, typecheck/lint/build local pass; push 후 27 hosted check-runs 중 failure 0, pending 21, `REVIEW_REQUIRED/BLOCKED`, qualifying approval 없음 | -| #1016 | `a4948df82ad075a0b743e92b985992aa04815565` | first-fill plan current head; local `uv sync --project services/analysis-engine --group dev --frozen` pass로 macOS arm64의 이전 hatchling null-byte 오류는 재현되지 않음; 재실행 후 macOS arm64 build와 `coverage-evidence`/`opencode-review` success, `strix` failure, hosted non-cancelled checks 22 success·0 pending, qualifying approval 없음 | -| #980 | `bc922359725d5b7d8eba515fb1ad4756f5bf8ec9` | local picker가 source selection을 소유하는 동안 YouTube clear action도 숨겨 동시성 계약을 완성; targeted 2 tests, typecheck/lint/build local pass; 전체 desktop 223 tests 중 219 pass 및 기존/자원경합성 4 timeout, coverage 재실행은 실패하여 100%로 주장하지 않음; hosted current check-runs 20 success, 0 pending, `strix`/`opencode-review` failure, qualifying approval 없음 | -| #982 | `821ae34a75a4d60c39dd919b4502e8a694b76ad4` | YouTube 실패 사유가 field description과 recovery alert에 중복 표시되는 계약에 맞춰 9개 stale 단일 조회 assertion을 multiplicity-safe로 정렬; App.test 65 pass와 affected visibility 10 pass, typecheck/lint/build local pass; 전체 desktop 234 tests 중 231 pass 및 기존/자원경합성 3 timeout, coverage 재실행은 100%로 주장하지 않음; hosted current check-runs 14 success, 8 pending, `opencode-review` failure, qualifying approval 없음 | -| #1006 | `c4d50327917e2f20ee96d6b2b0ad883e4078571a` | first-range next-action의 runtime section label을 shared `SectionFormLabel` set으로 fail-closed 검증해 번역 helper typecheck를 복구; 관련 15 tests, typecheck/lint local pass; hosted current check-runs failure 0, pending 21, qualifying approval 없음 | -| #929 | `aac5e3becb3349c8e320c5bccd459567a6d30665` | `@testing-library/jest-dom` 7.0.1 업데이트에 맞춰 package-lock의 workspace dependency tree를 재생성; clean `npm ci`, `npm ls`, npm runtime/typecheck/lint/build와 targeted test pass; 전체 desktop 216 tests 중 215 pass 및 기존 Workspace 1 timeout으로 coverage를 주장하지 않음; hosted current check-runs failure 0, pending 21, qualifying approval 없음 | -| #926 | `5b3f7288874e375f97d0f80066709e7bb6f5c086` | `apps/desktop/package.json`에 남은 literal merge markers를 제거하고 lucide 1.31.0 의도와 develop의 PDF.js 6.2.108을 보존하도록 lockfile 재생성; clean `npm ci`, `npm ls`, npm runtime/typecheck/lint/build local pass; hosted non-cancelled checks 22 success·0 pending, `opencode-review` failure, qualifying current-head approval 없음 | -| #925 | `d08fb6f5924021905f741ef57e3241e6cd9b9021` | `typescript-eslint` 8.67.0 lockfile 누락을 복구하고 루트 ESLint config의 직접 import를 root devDependency로 명시; clean `npm ci`, `npm ls`, npm runtime/typecheck/lint/build local pass; hosted non-cancelled checks 23 success·0 pending, `opencode-review` failure, qualifying current-head approval 없음 | -| #923 | `d396f17ffb6ddf00e7c5b7e8dc36f5d8058360c4` | `@storybook/react-vite` 10.5.8 업데이트에 필요한 Storybook 10.5.10·oxc-resolver·플랫폼 optional dependency tree를 lockfile에 재생성; clean `npm ci`, `npm ls`, npm runtime/typecheck/lint/build local pass; hosted non-cancelled checks 24 success·0 pending, `opencode-review` failure, qualifying current-head approval 없음 | -| #922 | `0a677db0cc43aaff3934b4692d1882b9b0f57769` | Storybook 10.5.8 업데이트에 필요한 Storybook 10.5.10·oxc-resolver·플랫폼 optional dependency tree를 lockfile에 재생성; clean `npm ci`, `npm ls`, npm runtime/typecheck/lint/build local pass; hosted non-cancelled checks 21 success·0 pending, `strix`/`opencode-review` failure, qualifying current-head approval 없음 | -| #859 | `62fd665968dff9032e58a2c58141355b65f264d0` | security-baseline 회귀를 제거하고 GrooveMap 최적화·회귀 테스트만 남긴 current head; 1 hosted Check success, 27 pending, failure 없음, qualifying approval 없음 | -| #866 | `c2cc5bbeda6628fa9999401d6b0d228cb9b6bb9c` | stale base `acdbea63`, Draft + CONFLICTING; `opencode-review` failure; canonical audio policy owner이며 merge 대상 아님 | -| #1025 | `9bbd706aad5d9b9a37e6add3266ee476dffa2cd1` | 이 문서 PR의 current head이며 base는 `749511c3ad4000090048718f685c6bee6b3d2c25`; hosted current check-runs는 hard failure 1건(`opencode-review`), pending 0, `coverage-evidence`/`coverage-source-tree`/`strix`/보안·플랫폼·빌드 gate success; `MERGEABLE/BLOCKED`, qualifying approval 없음 | +| #1025 | `29136fbb794264b2a2c587eaccb061248cf3b96e` | 이 문서 PR의 current head이며 base는 `749511c3ad4000090048718f685c6bee6b3d2c25`; current Checks 33 pass, 1 failure(`opencode-review`), 0 pending; `MERGEABLE/BLOCKED`, qualifying independent approval 없음 | +| #970 | `0bab0e8fbb80b3acd83773e0dddf636570df3ecc` | atomic project publication과 긴 파일명 staging 경계 수정; base가 `7ad56cf0065d068ec6463d92726de4855a6e201d`로 현재 develop보다 뒤처져 `BEHIND`; current Checks 27 pass, 1 failure, 3 pending; qualifying independent approval 없음 | `#1025`의 과거 SHA(`3c459fd033ccd94ad6cc8df6092d9e1ce4a86e6b` 등)는 이 표의 current head가 아니므로, 해당 SHA의 Checks/review를 현재 증적으로 재사용하지 않는다. +현재 merge blocker의 권위 있는 설정도 함께 확인했다. active ruleset `18156473`은 `develop`에 승인 1개, review thread resolution, 16개 required status context를 요구한다. branch-protection REST 응답의 `required_approving_review_count=0`보다 ruleset의 더 엄격한 승인 규칙이 우선하므로, `MERGEABLE`만으로 merge-ready라고 판단하지 않는다. 승인·필수 Checks·thread resolution이 모두 현재 head에 대해 충족될 때만 병합한다. + 이 snapshot에서 위 PR 중 병합된 것은 없다. `mergeable=true`는 protected review/required-check 완료를 뜻하지 않으며, 승인·current-head review·필수 gate가 모두 충족되지 않은 PR은 병합하지 않았다. admin/self-approval, force-push, protected gate bypass도 사용하지 않았다. #### Security Notes @@ -154,7 +142,7 @@ capability cluster 분류와 착지 후 남는 Gap: | I. 테스트 현실성 (decoded WAV acceptance, known-take chord recovery, real YouTube known-stem benchmark, branch coverage) | #892, #891, #828, #861 | synthetic fixture에서 실오디오 기반 acceptance로 이동 시작 | Issue #770(실오디오 MIR accuracy benchmark) 체계화, RMSE/SI-SDR 임계값 정책 | | J. 의존성/빌드 위생 (react, storybook, base-ui, lucide, sonner, codeql-action, setup-uv, uv group, numba, uuid, time, rust pinning, node floor, orphaned Actions identity) | #920, #942, #922, #921, #926, #927, #924, #931, #936, #919, #918, #754, #944, #896, #895 | 공급망/런타임 최신화 유지 | Dependabot train 정리(Issue #966), jsdom 30 전환 완료 | -시리즈 전체에 대한 종합 판단: 이 시리즈는 "계약(contract) 필드 추가 + 첫 노출" 단계다. 착지해도 (1) plan 값의 생성 로직, (2) plan들 사이 우선순위/중복 정책, (3) 재분석 시 override 보존 round-trip, (4) 협업 영속화는 여전히 Gap으로 남는다. 또한 130건이 develop 기준으로부터 장기간 분기되어 있어 rebase 비용과 exact-head CI 증적 요구(PR 본문 명시)로 인한 merge train 정체가 자체적으로 기술 위험이다(Issue #966). +시리즈 전체에 대한 종합 판단: 이 시리즈는 "계약(contract) 필드 추가 + 첫 노출" 단계다. 착지해도 (1) plan 값의 생성 로직, (2) plan들 사이 우선순위/중복 정책, (3) 재분석 시 override 보존 round-trip, (4) 협업 영속화는 여전히 Gap으로 남는다. 또한 133건이 develop 기준으로부터 장기간 분기되어 있어 rebase 비용과 exact-head CI 증적 요구(PR 본문 명시)로 인한 merge train 정체가 자체적으로 기술 위험이다(Issue #966). ## 5. 기술 Gap 목록 (Technical Gaps) @@ -176,7 +164,7 @@ capability cluster 분류와 착지 후 남는 Gap: (h) **i18n/현지화** — `src/i18n` + `locales/en`, `locales/ko` 존재, 하드코딩 한국어 문자열 미탐지(workspace tsx grep 0건), interpolation hardening PR #744 진행. en/ko 2개 언어뿐이며, PR 시리즈가 추가할 다수의 카피 키가 locales에 아직 없다. -(i) **접근성** — 2026-08-28 current checkout에서 workspace 컴포넌트의 `aria-*` attribute token은 56개였다. WCAG 2.2 AA gate는 Issue #965로 열려 있고, Figma/Storybook/shipped UI 정합 점검도 미완이다. tooltip/a11y PR(#833, #731)이 진행 중. +(i) **접근성** — 2026-08-29 current checkout에서 workspace 컴포넌트의 `aria-*` attribute token은 56개였다. WCAG 2.2 AA gate는 Issue #965로 열려 있고, Figma/Storybook/shipped UI 정합 점검도 미완이다. tooltip/a11y PR(#833, #731)이 진행 중. (j) **Design token/Storybook** — shadcn/ui 프리미티브 중 stories는 button/checkbox/dialog 3개뿐이고, rehearsal 도메인 컴포넌트(GrooveMap, SectionRoadmap, RoleSwitcher 등) stories는 없다. Storybook token PR #897이 진행 중. @@ -261,7 +249,7 @@ flowchart TD - Why: 대용량/악성 파일로 인한 메모리 폭주는 첫 사용 경험을 깬다. 보안 gate이자 안정성 gate다. - Acceptance: 파일 크기/길이 상한이 intake에서 강제되고, 초과 입력은 안전 실패 카피로 거부된다. quickcheck 통과. 3. **merge train 정리 (Issue #966)** - - Why: 130개 open PR의 exact-head CI 요구는 모든 후속 기능을 정체시킨다. + - Why: 133개 open PR의 exact-head CI 요구는 모든 후속 기능을 정체시킨다. - Acceptance: dependency-aware train 정의 후 open PR이 cluster A-J 단위로 수렴하고, 중복 PR이 canonical PR로 link된다. 4. **filesystem path containment 재구축 (Issue #852, PR #858)** - Why: 로컬 데스크톱 앱의 최상위 신뢰경계. 우회 시 임의 파일 접근으로 이어진다. @@ -299,7 +287,7 @@ flowchart TD 본 문서에서 실제 인용한 개념(MIR novelty kernel, chord-recognition 연구 맥락, Viterbi 디코딩, 소스 분리 평가, librosa, 접근성 표준)에 한정한다. -2026-08-28 최신성 점검: WCAG 2.2는 현재 W3C Recommendation이며 2025년에 ISO/IEC 40500:2025로 승인되었다. 보안 개발 수명주기에는 NIST SSDF 1.1을 기준으로 삼고, MIR acceptance 설계에는 ISMIR 2024의 구조 분석·notewise source-separation 평가·다중 stem 연구를 보조 근거로 반영한다. 이 문헌은 기존 휴리스틱을 자동으로 정답으로 취급하지 않으며, 실제 오디오 benchmark와 provenance·재현성 증적을 요구하는 근거로만 사용한다. +2026-08-29 최신성 점검: [WCAG 2.2](https://www.w3.org/TR/2024/REC-WCAG22-20241212/)는 W3C Recommendation이며, W3C는 2025년 ISO/IEC 40500:2025 승인 사실과 최신 WCAG 2.2 사용을 안내한다. 보안 개발 수명주기에는 [NIST SSDF 1.1](https://csrc.nist.gov/pubs/sp/800/218/final)을 기준으로 삼고, MIR acceptance 설계에는 [ISMIR 2024 proceedings](https://ismir.net/conferences/ismir-2024/)의 구조 분석·notewise source-separation 평가·다중 stem 연구를 보조 근거로 반영한다. 이 문헌은 기존 휴리스틱을 자동으로 정답으로 취급하지 않으며, 실제 오디오 benchmark와 provenance·재현성 증적을 요구하는 근거로만 사용한다. Boulanger-Lewandowski, N., Bengio, Y., & Vincent, P. (2013). Audio chord recognition with recurrent neural networks. In Proceedings of the 14th International Society for Music Information Retrieval Conference (ISMIR 2013) (pp. 335–340). ISMIR. @@ -347,7 +335,7 @@ World Wide Web Consortium. (2024). Web Content Accessibility Guidelines (WCAG) 2 ```bash mkdir -p /tmp/opencode gh api --paginate 'repos/ContextualWisdomLab/bandscope/pulls?state=open&per_page=100' \ - --jq '.[].number' | wc -l # 130 + --jq '.[].number' | wc -l # 133 gh pr view 1021 --json title,body # 시리즈 패턴 샘플 ``` - Exact-head PR snapshot (capture time, protected base, current head, same-head Checks and reviews): @@ -382,7 +370,7 @@ World Wide Web Consortium. (2024). Web Content Accessibility Guidelines (WCAG) 2 - `sed -n '1,40p' services/analysis-engine/src/bandscope_analysis/_native.py` -> bandscope_numeric 커널/parity 확인 - `ls services/analysis-engine/rust && grep -n "maturin" services/analysis-engine/rust/pyproject.toml` -> Rust 커널 위치 확인 - `head -30 services/analysis-engine/src/bandscope_analysis/separation/model_weights/bandsplit-v1.json` -> 휴리스틱 manifest 확인 - - `find apps/desktop/src/features/workspace -type f -name '*.tsx' -print0 | xargs -0 grep -hEo 'aria-[[:alnum:]_-]+' | wc -l` -> 56 attribute tokens (2026-08-28 current checkout) + - `find apps/desktop/src/features/workspace -type f -name '*.tsx' -print0 | xargs -0 grep -hEo 'aria-[[:alnum:]_-]+' | wc -l` -> 56 attribute tokens (2026-08-29 current checkout) - `grep -rln "RehearsalAssignment\|RehearsalCollaboration" apps/desktop/src` -> 0건(UI 미구현 확인) - `grep -rn "loop" apps/desktop/src/features/player/index.tsx` -> 0건(loop 미구현 확인) - `ls CHANGELOG.md VERSION .github/workflows` -> 릴리스 자산 확인 From f6d0bfc7da03aa8141451440673e5cc3dee3f6cb Mon Sep 17 00:00:00 2001 From: seonghobae Date: Sat, 29 Aug 2026 09:00:30 +0900 Subject: [PATCH 39/94] docs: refresh exact-head gap snapshot --- docs/product-technical-gap-baseline.md | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/docs/product-technical-gap-baseline.md b/docs/product-technical-gap-baseline.md index c1e88b38c..b84b9daed 100644 --- a/docs/product-technical-gap-baseline.md +++ b/docs/product-technical-gap-baseline.md @@ -108,10 +108,13 @@ flowchart LR | #1047 | `bc63d8a0235ed72566e557681abd6b3958ed714e` | ritardando plan 누락 JSDoc·copy/provenance 양방향 검증과 `ritardando.py` mypy 타입 계약을 보강; 관련 Python/desktop 검증 완료; current Checks 32 pass, 2 failure, 0 pending; `REVIEW_REQUIRED/BLOCKED`, qualifying independent approval 없음 | | #1048 | `28038721b473c1f64b6914312f48704d64e09c6a` | accelerando plan copy/provenance 양방향 검증과 beat-grid 경계 계약을 보강; current Checks 32 pass, 1 failure, 0 pending; `REVIEW_REQUIRED/BLOCKED`, qualifying independent approval 없음 | | #1049 | `c34480961bd66485f59122f4d15c5948e8d95ac6` | fermata plan 작업 중인 Draft PR; current Checks 32 pass, 1 failure, 0 pending; `DRAFT/BLOCKED`, qualifying independent approval 없음 | -| #1033 | `046db562497a8104fa525f56a6437eb13fbf4760` | source/coverage/security/build/release 및 `opencode-review`/`strix` terminal success; reviews는 COMMENTED뿐이며 qualifying approval 없음 | +| #1033 | `046db562497a8104fa525f56a6437eb13fbf4760` | Python 보안 lock baseline; current Checks 34 pass, 0 failure, 0 pending; `REVIEW_REQUIRED/BLOCKED`, qualifying independent approval 없음 | | #1034 | `98a99e1bff4b63f5294d8c9a5cbdaf312b235403` | source/coverage/security/build/release terminal success; `opencode-review` success; qualifying independent approval 없음 | -| #1025 | `29136fbb794264b2a2c587eaccb061248cf3b96e` | 이 문서 PR의 current head이며 base는 `749511c3ad4000090048718f685c6bee6b3d2c25`; current Checks 33 pass, 1 failure(`opencode-review`), 0 pending; `MERGEABLE/BLOCKED`, qualifying independent approval 없음 | -| #970 | `0bab0e8fbb80b3acd83773e0dddf636570df3ecc` | atomic project publication과 긴 파일명 staging 경계 수정; base가 `7ad56cf0065d068ec6463d92726de4855a6e201d`로 현재 develop보다 뒤처져 `BEHIND`; current Checks 27 pass, 1 failure, 3 pending; qualifying independent approval 없음 | +| #1025 | `2cd38b2278e6db3866797394f81876c15a07f2c3` | 이 문서 PR의 current head이며 protected base는 `749511c3ad4000090048718f685c6bee6b3d2c25`; current Checks 33 pass, 1 failure(`opencode-review`), 0 pending; `MERGEABLE/BLOCKED`, qualifying independent approval 없음 | +| #970 | `54d8966ee6734f7d6305c8bf7d503c1721a37840` | atomic project publication과 bounded load 보강, hard-link 불가 첫 저장 fail-closed; current Checks 29 pass, 1 failure(`opencode-review`), 3 pending; `MERGEABLE/BLOCKED`, qualifying independent approval 없음 | +| #858 | `f1f5e877f07aa7486cd343ddfe8aa45a9d628bbd` | analysis/cache/temp/project path authority와 redacted logging test 계약 보강; current Checks 31 pass, 1 failure(`opencode-review`), 0 pending; `DRAFT/MERGEABLE/BLOCKED`, unresolved thread 0, qualifying independent approval 없음 | +| #985 | `33d14e44bf7f41dda51b0ee246f7caae088101b9` | canonical audio resource ceiling을 desktop local/YouTube handoff와 Python defense-in-depth에 연결; current Checks 31 pass, 2 failure, 0 pending; `DRAFT/MERGEABLE/BLOCKED`, qualifying independent approval 없음 | +| #892 | `914428825a902f538971caf4c6f9f35390219a4d` | decoded WAV C-major acceptance와 silent aliased fixture fail-closed 보강; current Checks 28 pass, 3 failure, 0 pending; `DRAFT/MERGEABLE/BLOCKED`, qualifying independent approval 없음 | `#1025`의 과거 SHA(`3c459fd033ccd94ad6cc8df6092d9e1ce4a86e6b` 등)는 이 표의 current head가 아니므로, 해당 SHA의 Checks/review를 현재 증적으로 재사용하지 않는다. From 903e278eb6d40bea54e78b1a0310bd9e6c9801fe Mon Sep 17 00:00:00 2001 From: seonghobae Date: Sat, 29 Aug 2026 09:07:52 +0900 Subject: [PATCH 40/94] docs: record accessibility gap baseline --- docs/product-technical-gap-baseline.md | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/docs/product-technical-gap-baseline.md b/docs/product-technical-gap-baseline.md index b84b9daed..54d95c155 100644 --- a/docs/product-technical-gap-baseline.md +++ b/docs/product-technical-gap-baseline.md @@ -94,7 +94,7 @@ flowchart LR ## 4. 현재 열린 PR 기반 Gap 분석 (Open-PR Gap Analysis) -현재 open PR은 133건이다(2026-08-29 Asia/Seoul 기준 REST inventory). 아래 표는 그중 대표적인 PR을 뽑은 snapshot이며, 대부분은 동일 패턴의 시리즈다. +현재 open PR은 134건이다(2026-08-29 Asia/Seoul 기준 REST inventory). 아래 표는 그중 대표적인 PR을 뽑은 snapshot이며, 대부분은 동일 패턴의 시리즈다. ### 4.1 2026-08-29 exact-head 운영 snapshot @@ -115,6 +115,7 @@ flowchart LR | #858 | `f1f5e877f07aa7486cd343ddfe8aa45a9d628bbd` | analysis/cache/temp/project path authority와 redacted logging test 계약 보강; current Checks 31 pass, 1 failure(`opencode-review`), 0 pending; `DRAFT/MERGEABLE/BLOCKED`, unresolved thread 0, qualifying independent approval 없음 | | #985 | `33d14e44bf7f41dda51b0ee246f7caae088101b9` | canonical audio resource ceiling을 desktop local/YouTube handoff와 Python defense-in-depth에 연결; current Checks 31 pass, 2 failure, 0 pending; `DRAFT/MERGEABLE/BLOCKED`, qualifying independent approval 없음 | | #892 | `914428825a902f538971caf4c6f9f35390219a4d` | decoded WAV C-major acceptance와 silent aliased fixture fail-closed 보강; current Checks 28 pass, 3 failure, 0 pending; `DRAFT/MERGEABLE/BLOCKED`, qualifying independent approval 없음 | +| #1051 | `d3622b6a21ddf8ab58aa17bb565e803bf5c257ce` | WCAG 2.2 키보드 skip navigation과 focusable main landmark 최소 기준; current Checks 6 pass, 0 failure, 20 pending; `MERGEABLE/BLOCKED`, unresolved thread 0, qualifying independent approval 없음 | `#1025`의 과거 SHA(`3c459fd033ccd94ad6cc8df6092d9e1ce4a86e6b` 등)는 이 표의 current head가 아니므로, 해당 SHA의 Checks/review를 현재 증적으로 재사용하지 않는다. @@ -141,7 +142,7 @@ capability cluster 분류와 착지 후 남는 Gap: | E. First-run/activation/실패 복구 (first-run card/license demo song/local intake 실패/import 실패/analysis 실패/save 실패/help) | #974, #1009, #981, #982, #976, #984, #972, #898 | 빈 상태/오류 상태의 next-action 카피 완성 | 라이선싱 백엔드, 데모곡 번들 정책, 오프라인 활성화 | | F. 보안/신뢰경계 (log redaction x4, quick-xml RustSec, filesystem authority, canonical audio policy, CSV NUL/전각 우회 차단, credential drop, PDF bound reads, npm baseline) | #956, #951, #950, #949, #948, #858, #985/#781, #941, #894, #865, #783 | app-security.md 규칙의 코드 반영 마무리 | Issue #852(경계 재구축), #542(예외 추적), 모델 artifact checksum/signature 파이프라인 | | G. 성능 (Bolt 시리즈: 관측 확률 벡터화, GrooveMap maxTime O(1), chart dedupe O(N), chord change count O(1), checkerboard/HMM 벡터화) | #999, #859, #849, #834, #746, #732 | 핫패스 최적화. Rust 커널 포팅과 같은 방향의 Python 측 보완 | Demucs 가속 admission/parity/performance qualification, 대용량 파일 스트리밍, UI 가상화 | -| H. 접근성/디자인 시스템 (tooltip aria-disabled, icon tooltip, Storybook tokens, Figma drift check) | #833, #731, #897, #969 | WCAG 대응 시작점 | Issue #965(Figma/Storybook/shipped UI 정합 + WCAG 2.2 AA gate) 전체 | +| H. 접근성/디자인 시스템 (tooltip aria-disabled, icon tooltip, skip navigation, Storybook tokens, Figma drift check) | #833, #731, #897, #969, #1051 | WCAG 대응 시작점과 키보드 우회 경로 기준선 | Issue #965(Figma/Storybook/shipped UI 정합 + WCAG 2.2 AA gate) 전체 | | I. 테스트 현실성 (decoded WAV acceptance, known-take chord recovery, real YouTube known-stem benchmark, branch coverage) | #892, #891, #828, #861 | synthetic fixture에서 실오디오 기반 acceptance로 이동 시작 | Issue #770(실오디오 MIR accuracy benchmark) 체계화, RMSE/SI-SDR 임계값 정책 | | J. 의존성/빌드 위생 (react, storybook, base-ui, lucide, sonner, codeql-action, setup-uv, uv group, numba, uuid, time, rust pinning, node floor, orphaned Actions identity) | #920, #942, #922, #921, #926, #927, #924, #931, #936, #919, #918, #754, #944, #896, #895 | 공급망/런타임 최신화 유지 | Dependabot train 정리(Issue #966), jsdom 30 전환 완료 | @@ -167,7 +168,7 @@ capability cluster 분류와 착지 후 남는 Gap: (h) **i18n/현지화** — `src/i18n` + `locales/en`, `locales/ko` 존재, 하드코딩 한국어 문자열 미탐지(workspace tsx grep 0건), interpolation hardening PR #744 진행. en/ko 2개 언어뿐이며, PR 시리즈가 추가할 다수의 카피 키가 locales에 아직 없다. -(i) **접근성** — 2026-08-29 current checkout에서 workspace 컴포넌트의 `aria-*` attribute token은 56개였다. WCAG 2.2 AA gate는 Issue #965로 열려 있고, Figma/Storybook/shipped UI 정합 점검도 미완이다. tooltip/a11y PR(#833, #731)이 진행 중. +(i) **접근성** — 2026-08-29 current checkout에서 workspace 컴포넌트의 `aria-*` attribute token은 56개였다. WCAG 2.2 AA gate는 Issue #965로 열려 있고, Figma/Storybook/shipped UI 정합 점검도 미완이다. tooltip/a11y PR(#833, #731)과 skip navigation 기준선 PR #1051이 진행 중. (j) **Design token/Storybook** — shadcn/ui 프리미티브 중 stories는 button/checkbox/dialog 3개뿐이고, rehearsal 도메인 컴포넌트(GrooveMap, SectionRoadmap, RoleSwitcher 등) stories는 없다. Storybook token PR #897이 진행 중. @@ -268,7 +269,7 @@ flowchart TD - Acceptance: 버전 필드를 가진 프로젝트 포맷, 저장 실패 시 known-good 보존(PRx #970 방향), migration 테스트. 8. **Demucs 플랫폼 커버리지 + 모델 artifact 검증** - Acceptance: x86 macOS 폴백 경로가 명시되고(현재 demucs 미설치 시 불가), CPU-default 경로와 선택 가능한 비-CPU device 경로의 admission/parity/performance 지원 범위가 명문화·검증되며, 모델 checkpoint checksum 검증이 intake pipeline에 있다. -9. **WCAG 2.2 AA gate (Issue #965) + rehearsal 컴포넌트 Storybook tokens (PR #897)** +9. **WCAG 2.2 AA gate (Issue #965) + keyboard skip navigation (PR #1051) + rehearsal 컴포넌트 Storybook tokens (PR #897)** - Acceptance: axe 기반 자동 점검이 CI에 있고, GrooveMap/SectionRoadmap/RoleSwitcher stories가 token 기반으로 존재한다. 10. **JS coverage 90% -> 100% 상향 또는 Python과 동일한 기준 명문화** - Acceptance: vite.config/vitest thresholds 상향 또는 "Python 100%, JS 90%" 정책이 acceptance-criteria.md에 명시된다. From c1ccba4c4492955059e35251a1df391357a3f1de Mon Sep 17 00:00:00 2001 From: seonghobae Date: Sat, 29 Aug 2026 09:11:42 +0900 Subject: [PATCH 41/94] docs(baseline): reconcile current PR inventory --- docs/product-technical-gap-baseline.md | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/docs/product-technical-gap-baseline.md b/docs/product-technical-gap-baseline.md index 54d95c155..786412f3b 100644 --- a/docs/product-technical-gap-baseline.md +++ b/docs/product-technical-gap-baseline.md @@ -5,7 +5,7 @@ Base revision: `develop@749511c3ad4000090048718f685c6bee6b3d2c25` (feat(workspac ## 1. 목적과 범위 (Purpose & Scope) -이 문서는 ADR/설계 문서(`ARCHITECTURE.md`, `docs/plans/*`), 브랜드 소스(`docs/brand-story.md`), 보안 소스(`docs/security/app-security.md`), 그리고 현재 저장소 상태(코드, 열린 PR 133건, 열린 이슈)를 대조하여 다음을 한 곳에 모은 baseline이다. +이 문서는 ADR/설계 문서(`ARCHITECTURE.md`, `docs/plans/*`), 브랜드 소스(`docs/brand-story.md`), 보안 소스(`docs/security/app-security.md`), 그리고 현재 저장소 상태(코드, 열린 PR 134건, 열린 이슈)를 대조하여 다음을 한 곳에 모은 baseline이다. - 기능 명세(functional spec)와 PRD/TRD로 승격되지 않은 요구사항의 공백 - 구현된 코드와 문서가 선언하는 제품 범위 사이의 기술 Gap @@ -110,7 +110,7 @@ flowchart LR | #1049 | `c34480961bd66485f59122f4d15c5948e8d95ac6` | fermata plan 작업 중인 Draft PR; current Checks 32 pass, 1 failure, 0 pending; `DRAFT/BLOCKED`, qualifying independent approval 없음 | | #1033 | `046db562497a8104fa525f56a6437eb13fbf4760` | Python 보안 lock baseline; current Checks 34 pass, 0 failure, 0 pending; `REVIEW_REQUIRED/BLOCKED`, qualifying independent approval 없음 | | #1034 | `98a99e1bff4b63f5294d8c9a5cbdaf312b235403` | source/coverage/security/build/release terminal success; `opencode-review` success; qualifying independent approval 없음 | -| #1025 | `2cd38b2278e6db3866797394f81876c15a07f2c3` | 이 문서 PR의 current head이며 protected base는 `749511c3ad4000090048718f685c6bee6b3d2c25`; current Checks 33 pass, 1 failure(`opencode-review`), 0 pending; `MERGEABLE/BLOCKED`, qualifying independent approval 없음 | +| #1025 | `903e278eb6d40bea54e78b1a0310bd9e6c9801fe` | 이 문서 PR의 current head이며 protected base는 `749511c3ad4000090048718f685c6bee6b3d2c25`; current Checks 22 success, 1 failure(`opencode-review`), 6 in progress, 2 queued, 2 neutral; `MERGEABLE/BLOCKED`, qualifying independent approval 없음 | | #970 | `54d8966ee6734f7d6305c8bf7d503c1721a37840` | atomic project publication과 bounded load 보강, hard-link 불가 첫 저장 fail-closed; current Checks 29 pass, 1 failure(`opencode-review`), 3 pending; `MERGEABLE/BLOCKED`, qualifying independent approval 없음 | | #858 | `f1f5e877f07aa7486cd343ddfe8aa45a9d628bbd` | analysis/cache/temp/project path authority와 redacted logging test 계약 보강; current Checks 31 pass, 1 failure(`opencode-review`), 0 pending; `DRAFT/MERGEABLE/BLOCKED`, unresolved thread 0, qualifying independent approval 없음 | | #985 | `33d14e44bf7f41dda51b0ee246f7caae088101b9` | canonical audio resource ceiling을 desktop local/YouTube handoff와 Python defense-in-depth에 연결; current Checks 31 pass, 2 failure, 0 pending; `DRAFT/MERGEABLE/BLOCKED`, qualifying independent approval 없음 | @@ -146,7 +146,7 @@ capability cluster 분류와 착지 후 남는 Gap: | I. 테스트 현실성 (decoded WAV acceptance, known-take chord recovery, real YouTube known-stem benchmark, branch coverage) | #892, #891, #828, #861 | synthetic fixture에서 실오디오 기반 acceptance로 이동 시작 | Issue #770(실오디오 MIR accuracy benchmark) 체계화, RMSE/SI-SDR 임계값 정책 | | J. 의존성/빌드 위생 (react, storybook, base-ui, lucide, sonner, codeql-action, setup-uv, uv group, numba, uuid, time, rust pinning, node floor, orphaned Actions identity) | #920, #942, #922, #921, #926, #927, #924, #931, #936, #919, #918, #754, #944, #896, #895 | 공급망/런타임 최신화 유지 | Dependabot train 정리(Issue #966), jsdom 30 전환 완료 | -시리즈 전체에 대한 종합 판단: 이 시리즈는 "계약(contract) 필드 추가 + 첫 노출" 단계다. 착지해도 (1) plan 값의 생성 로직, (2) plan들 사이 우선순위/중복 정책, (3) 재분석 시 override 보존 round-trip, (4) 협업 영속화는 여전히 Gap으로 남는다. 또한 133건이 develop 기준으로부터 장기간 분기되어 있어 rebase 비용과 exact-head CI 증적 요구(PR 본문 명시)로 인한 merge train 정체가 자체적으로 기술 위험이다(Issue #966). +시리즈 전체에 대한 종합 판단: 이 시리즈는 "계약(contract) 필드 추가 + 첫 노출" 단계다. 착지해도 (1) plan 값의 생성 로직, (2) plan들 사이 우선순위/중복 정책, (3) 재분석 시 override 보존 round-trip, (4) 협업 영속화는 여전히 Gap으로 남는다. 또한 134건이 develop 기준으로부터 장기간 분기되어 있어 rebase 비용과 exact-head CI 증적 요구(PR 본문 명시)로 인한 merge train 정체가 자체적으로 기술 위험이다(Issue #966). ## 5. 기술 Gap 목록 (Technical Gaps) @@ -253,7 +253,7 @@ flowchart TD - Why: 대용량/악성 파일로 인한 메모리 폭주는 첫 사용 경험을 깬다. 보안 gate이자 안정성 gate다. - Acceptance: 파일 크기/길이 상한이 intake에서 강제되고, 초과 입력은 안전 실패 카피로 거부된다. quickcheck 통과. 3. **merge train 정리 (Issue #966)** - - Why: 133개 open PR의 exact-head CI 요구는 모든 후속 기능을 정체시킨다. + - Why: 134개 open PR의 exact-head CI 요구는 모든 후속 기능을 정체시킨다. - Acceptance: dependency-aware train 정의 후 open PR이 cluster A-J 단위로 수렴하고, 중복 PR이 canonical PR로 link된다. 4. **filesystem path containment 재구축 (Issue #852, PR #858)** - Why: 로컬 데스크톱 앱의 최상위 신뢰경계. 우회 시 임의 파일 접근으로 이어진다. @@ -339,7 +339,7 @@ World Wide Web Consortium. (2024). Web Content Accessibility Guidelines (WCAG) 2 ```bash mkdir -p /tmp/opencode gh api --paginate 'repos/ContextualWisdomLab/bandscope/pulls?state=open&per_page=100' \ - --jq '.[].number' | wc -l # 133 + --jq '.[].number' | wc -l # 134 gh pr view 1021 --json title,body # 시리즈 패턴 샘플 ``` - Exact-head PR snapshot (capture time, protected base, current head, same-head Checks and reviews): From 12afa7ac0f8f795012fe36b39e8f3ddecbfbbaa2 Mon Sep 17 00:00:00 2001 From: seonghobae Date: Sat, 29 Aug 2026 09:35:55 +0900 Subject: [PATCH 42/94] docs(baseline): track ranges product slice --- docs/product-technical-gap-baseline.md | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/docs/product-technical-gap-baseline.md b/docs/product-technical-gap-baseline.md index 786412f3b..727b62d8e 100644 --- a/docs/product-technical-gap-baseline.md +++ b/docs/product-technical-gap-baseline.md @@ -5,7 +5,7 @@ Base revision: `develop@749511c3ad4000090048718f685c6bee6b3d2c25` (feat(workspac ## 1. 목적과 범위 (Purpose & Scope) -이 문서는 ADR/설계 문서(`ARCHITECTURE.md`, `docs/plans/*`), 브랜드 소스(`docs/brand-story.md`), 보안 소스(`docs/security/app-security.md`), 그리고 현재 저장소 상태(코드, 열린 PR 134건, 열린 이슈)를 대조하여 다음을 한 곳에 모은 baseline이다. +이 문서는 ADR/설계 문서(`ARCHITECTURE.md`, `docs/plans/*`), 브랜드 소스(`docs/brand-story.md`), 보안 소스(`docs/security/app-security.md`), 그리고 현재 저장소 상태(코드, 열린 PR 135건, 열린 이슈)를 대조하여 다음을 한 곳에 모은 baseline이다. - 기능 명세(functional spec)와 PRD/TRD로 승격되지 않은 요구사항의 공백 - 구현된 코드와 문서가 선언하는 제품 범위 사이의 기술 Gap @@ -94,7 +94,7 @@ flowchart LR ## 4. 현재 열린 PR 기반 Gap 분석 (Open-PR Gap Analysis) -현재 open PR은 134건이다(2026-08-29 Asia/Seoul 기준 REST inventory). 아래 표는 그중 대표적인 PR을 뽑은 snapshot이며, 대부분은 동일 패턴의 시리즈다. +현재 open PR은 135건이다(2026-08-29 Asia/Seoul 기준 REST inventory). 아래 표는 그중 대표적인 PR을 뽑은 snapshot이며, 대부분은 동일 패턴의 시리즈다. ### 4.1 2026-08-29 exact-head 운영 snapshot @@ -116,6 +116,7 @@ flowchart LR | #985 | `33d14e44bf7f41dda51b0ee246f7caae088101b9` | canonical audio resource ceiling을 desktop local/YouTube handoff와 Python defense-in-depth에 연결; current Checks 31 pass, 2 failure, 0 pending; `DRAFT/MERGEABLE/BLOCKED`, qualifying independent approval 없음 | | #892 | `914428825a902f538971caf4c6f9f35390219a4d` | decoded WAV C-major acceptance와 silent aliased fixture fail-closed 보강; current Checks 28 pass, 3 failure, 0 pending; `DRAFT/MERGEABLE/BLOCKED`, qualifying independent approval 없음 | | #1051 | `d3622b6a21ddf8ab58aa17bb565e803bf5c257ce` | WCAG 2.2 키보드 skip navigation과 focusable main landmark 최소 기준; current Checks 6 pass, 0 failure, 20 pending; `MERGEABLE/BLOCKED`, unresolved thread 0, qualifying independent approval 없음 | +| #1052 | `8505e4538d8efd29ad6567dfc5b5ee46ec4f1184` | Ranges/Player의 playable-span·다음 instrument check 노출, 단수형 카피·다중 구간 test id·불필요한 null 비교 보강; current Checks 20 success, 1 failure(`opencode-review`), 9 in progress, 1 queued, 2 neutral; `MERGEABLE/BLOCKED`, unresolved thread 0, qualifying independent approval 없음 | `#1025`의 과거 SHA(`3c459fd033ccd94ad6cc8df6092d9e1ce4a86e6b` 등)는 이 표의 current head가 아니므로, 해당 SHA의 Checks/review를 현재 증적으로 재사용하지 않는다. @@ -146,7 +147,7 @@ capability cluster 분류와 착지 후 남는 Gap: | I. 테스트 현실성 (decoded WAV acceptance, known-take chord recovery, real YouTube known-stem benchmark, branch coverage) | #892, #891, #828, #861 | synthetic fixture에서 실오디오 기반 acceptance로 이동 시작 | Issue #770(실오디오 MIR accuracy benchmark) 체계화, RMSE/SI-SDR 임계값 정책 | | J. 의존성/빌드 위생 (react, storybook, base-ui, lucide, sonner, codeql-action, setup-uv, uv group, numba, uuid, time, rust pinning, node floor, orphaned Actions identity) | #920, #942, #922, #921, #926, #927, #924, #931, #936, #919, #918, #754, #944, #896, #895 | 공급망/런타임 최신화 유지 | Dependabot train 정리(Issue #966), jsdom 30 전환 완료 | -시리즈 전체에 대한 종합 판단: 이 시리즈는 "계약(contract) 필드 추가 + 첫 노출" 단계다. 착지해도 (1) plan 값의 생성 로직, (2) plan들 사이 우선순위/중복 정책, (3) 재분석 시 override 보존 round-trip, (4) 협업 영속화는 여전히 Gap으로 남는다. 또한 134건이 develop 기준으로부터 장기간 분기되어 있어 rebase 비용과 exact-head CI 증적 요구(PR 본문 명시)로 인한 merge train 정체가 자체적으로 기술 위험이다(Issue #966). +시리즈 전체에 대한 종합 판단: 이 시리즈는 "계약(contract) 필드 추가 + 첫 노출" 단계다. 착지해도 (1) plan 값의 생성 로직, (2) plan들 사이 우선순위/중복 정책, (3) 재분석 시 override 보존 round-trip, (4) 협업 영속화는 여전히 Gap으로 남는다. 또한 135건이 develop 기준으로부터 장기간 분기되어 있어 rebase 비용과 exact-head CI 증적 요구(PR 본문 명시)로 인한 merge train 정체가 자체적으로 기술 위험이다(Issue #966). ## 5. 기술 Gap 목록 (Technical Gaps) @@ -253,7 +254,7 @@ flowchart TD - Why: 대용량/악성 파일로 인한 메모리 폭주는 첫 사용 경험을 깬다. 보안 gate이자 안정성 gate다. - Acceptance: 파일 크기/길이 상한이 intake에서 강제되고, 초과 입력은 안전 실패 카피로 거부된다. quickcheck 통과. 3. **merge train 정리 (Issue #966)** - - Why: 134개 open PR의 exact-head CI 요구는 모든 후속 기능을 정체시킨다. + - Why: 135개 open PR의 exact-head CI 요구는 모든 후속 기능을 정체시킨다. - Acceptance: dependency-aware train 정의 후 open PR이 cluster A-J 단위로 수렴하고, 중복 PR이 canonical PR로 link된다. 4. **filesystem path containment 재구축 (Issue #852, PR #858)** - Why: 로컬 데스크톱 앱의 최상위 신뢰경계. 우회 시 임의 파일 접근으로 이어진다. @@ -339,7 +340,7 @@ World Wide Web Consortium. (2024). Web Content Accessibility Guidelines (WCAG) 2 ```bash mkdir -p /tmp/opencode gh api --paginate 'repos/ContextualWisdomLab/bandscope/pulls?state=open&per_page=100' \ - --jq '.[].number' | wc -l # 134 + --jq '.[].number' | wc -l # 135 gh pr view 1021 --json title,body # 시리즈 패턴 샘플 ``` - Exact-head PR snapshot (capture time, protected base, current head, same-head Checks and reviews): From 53acb60169a134e8fa778b38b1843a39f06ab4c1 Mon Sep 17 00:00:00 2001 From: seonghobae Date: Sat, 29 Aug 2026 10:04:07 +0900 Subject: [PATCH 43/94] docs: refresh open PR baseline snapshot --- docs/product-technical-gap-baseline.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/product-technical-gap-baseline.md b/docs/product-technical-gap-baseline.md index 727b62d8e..63aa58aee 100644 --- a/docs/product-technical-gap-baseline.md +++ b/docs/product-technical-gap-baseline.md @@ -116,7 +116,7 @@ flowchart LR | #985 | `33d14e44bf7f41dda51b0ee246f7caae088101b9` | canonical audio resource ceiling을 desktop local/YouTube handoff와 Python defense-in-depth에 연결; current Checks 31 pass, 2 failure, 0 pending; `DRAFT/MERGEABLE/BLOCKED`, qualifying independent approval 없음 | | #892 | `914428825a902f538971caf4c6f9f35390219a4d` | decoded WAV C-major acceptance와 silent aliased fixture fail-closed 보강; current Checks 28 pass, 3 failure, 0 pending; `DRAFT/MERGEABLE/BLOCKED`, qualifying independent approval 없음 | | #1051 | `d3622b6a21ddf8ab58aa17bb565e803bf5c257ce` | WCAG 2.2 키보드 skip navigation과 focusable main landmark 최소 기준; current Checks 6 pass, 0 failure, 20 pending; `MERGEABLE/BLOCKED`, unresolved thread 0, qualifying independent approval 없음 | -| #1052 | `8505e4538d8efd29ad6567dfc5b5ee46ec4f1184` | Ranges/Player의 playable-span·다음 instrument check 노출, 단수형 카피·다중 구간 test id·불필요한 null 비교 보강; current Checks 20 success, 1 failure(`opencode-review`), 9 in progress, 1 queued, 2 neutral; `MERGEABLE/BLOCKED`, unresolved thread 0, qualifying independent approval 없음 | +| #1052 | `644c3a0f10e5af184644ed5849882b55c3a26589` | Ranges/Player의 buyer-visible 노출, canonical first-range callout 단일화, active-role 연동, 단수형 카피·다중 구간 test id·runtime object guard 보강; current Checks 19 success, 1 failure(`opencode-review`), 10 in progress, 1 pending, 2 neutral, 7 skipped; `MERGEABLE/BLOCKED`, unresolved thread 0, qualifying independent approval 없음 | `#1025`의 과거 SHA(`3c459fd033ccd94ad6cc8df6092d9e1ce4a86e6b` 등)는 이 표의 current head가 아니므로, 해당 SHA의 Checks/review를 현재 증적으로 재사용하지 않는다. From 67f78e0faf989618e04aa53da94a704592903704 Mon Sep 17 00:00:00 2001 From: seonghobae Date: Sat, 29 Aug 2026 10:19:09 +0900 Subject: [PATCH 44/94] docs: record final ranges player head --- docs/product-technical-gap-baseline.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/product-technical-gap-baseline.md b/docs/product-technical-gap-baseline.md index 63aa58aee..3d44fcc41 100644 --- a/docs/product-technical-gap-baseline.md +++ b/docs/product-technical-gap-baseline.md @@ -116,7 +116,7 @@ flowchart LR | #985 | `33d14e44bf7f41dda51b0ee246f7caae088101b9` | canonical audio resource ceiling을 desktop local/YouTube handoff와 Python defense-in-depth에 연결; current Checks 31 pass, 2 failure, 0 pending; `DRAFT/MERGEABLE/BLOCKED`, qualifying independent approval 없음 | | #892 | `914428825a902f538971caf4c6f9f35390219a4d` | decoded WAV C-major acceptance와 silent aliased fixture fail-closed 보강; current Checks 28 pass, 3 failure, 0 pending; `DRAFT/MERGEABLE/BLOCKED`, qualifying independent approval 없음 | | #1051 | `d3622b6a21ddf8ab58aa17bb565e803bf5c257ce` | WCAG 2.2 키보드 skip navigation과 focusable main landmark 최소 기준; current Checks 6 pass, 0 failure, 20 pending; `MERGEABLE/BLOCKED`, unresolved thread 0, qualifying independent approval 없음 | -| #1052 | `644c3a0f10e5af184644ed5849882b55c3a26589` | Ranges/Player의 buyer-visible 노출, canonical first-range callout 단일화, active-role 연동, 단수형 카피·다중 구간 test id·runtime object guard 보강; current Checks 19 success, 1 failure(`opencode-review`), 10 in progress, 1 pending, 2 neutral, 7 skipped; `MERGEABLE/BLOCKED`, unresolved thread 0, qualifying independent approval 없음 | +| #1052 | `1f9a4ef75e563fe318f7761a400094b0d4ebff73` | Ranges/Player의 buyer-visible 노출, canonical first-range callout 단일화, active-role 연동, 첫 playable span 보존, 단수형 카피·다중 구간 selector·runtime object guard 보강; current Checks 5 success, 11 in progress, 1 pending, 8 queued, 7 skipped; `MERGEABLE/BLOCKED`, unresolved thread 0, qualifying independent approval 없음 | `#1025`의 과거 SHA(`3c459fd033ccd94ad6cc8df6092d9e1ce4a86e6b` 등)는 이 표의 current head가 아니므로, 해당 SHA의 Checks/review를 현재 증적으로 재사용하지 않는다. From 2982c19d1acad35b90f6d656eb6fbbd9dfdb4154 Mon Sep 17 00:00:00 2001 From: seonghobae Date: Sat, 29 Aug 2026 10:31:55 +0900 Subject: [PATCH 45/94] docs: refresh protected PR check snapshot --- docs/product-technical-gap-baseline.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/product-technical-gap-baseline.md b/docs/product-technical-gap-baseline.md index 3d44fcc41..ef9c8276d 100644 --- a/docs/product-technical-gap-baseline.md +++ b/docs/product-technical-gap-baseline.md @@ -115,8 +115,8 @@ flowchart LR | #858 | `f1f5e877f07aa7486cd343ddfe8aa45a9d628bbd` | analysis/cache/temp/project path authority와 redacted logging test 계약 보강; current Checks 31 pass, 1 failure(`opencode-review`), 0 pending; `DRAFT/MERGEABLE/BLOCKED`, unresolved thread 0, qualifying independent approval 없음 | | #985 | `33d14e44bf7f41dda51b0ee246f7caae088101b9` | canonical audio resource ceiling을 desktop local/YouTube handoff와 Python defense-in-depth에 연결; current Checks 31 pass, 2 failure, 0 pending; `DRAFT/MERGEABLE/BLOCKED`, qualifying independent approval 없음 | | #892 | `914428825a902f538971caf4c6f9f35390219a4d` | decoded WAV C-major acceptance와 silent aliased fixture fail-closed 보강; current Checks 28 pass, 3 failure, 0 pending; `DRAFT/MERGEABLE/BLOCKED`, qualifying independent approval 없음 | -| #1051 | `d3622b6a21ddf8ab58aa17bb565e803bf5c257ce` | WCAG 2.2 키보드 skip navigation과 focusable main landmark 최소 기준; current Checks 6 pass, 0 failure, 20 pending; `MERGEABLE/BLOCKED`, unresolved thread 0, qualifying independent approval 없음 | -| #1052 | `1f9a4ef75e563fe318f7761a400094b0d4ebff73` | Ranges/Player의 buyer-visible 노출, canonical first-range callout 단일화, active-role 연동, 첫 playable span 보존, 단수형 카피·다중 구간 selector·runtime object guard 보강; current Checks 5 success, 11 in progress, 1 pending, 8 queued, 7 skipped; `MERGEABLE/BLOCKED`, unresolved thread 0, qualifying independent approval 없음 | +| #1051 | `d3622b6a21ddf8ab58aa17bb565e803bf5c257ce` | WCAG 2.2 키보드 skip navigation과 focusable main landmark 최소 기준; current Checks 32 success, 1 failure(`opencode-review`), 2 neutral, 7 skipped; `MERGEABLE/BLOCKED`, unresolved thread 0, qualifying independent approval 없음 | +| #1052 | `1f9a4ef75e563fe318f7761a400094b0d4ebff73` | Ranges/Player의 buyer-visible 노출, canonical first-range callout 단일화, active-role 연동, 첫 playable span 보존, 단수형 카피·다중 구간 selector·runtime object guard 보강; current Checks 31 success, 1 failure(`opencode-review`), 1 in progress, 1 queued, 2 neutral, 7 skipped; `MERGEABLE/BLOCKED`, unresolved thread 0, qualifying independent approval 없음 | `#1025`의 과거 SHA(`3c459fd033ccd94ad6cc8df6092d9e1ce4a86e6b` 등)는 이 표의 current head가 아니므로, 해당 SHA의 Checks/review를 현재 증적으로 재사용하지 않는다. From b7214228c4cbde01913c43e1df33f250c820024a Mon Sep 17 00:00:00 2001 From: seonghobae Date: Sat, 29 Aug 2026 10:35:01 +0900 Subject: [PATCH 46/94] docs: align baseline snapshot with current head --- docs/product-technical-gap-baseline.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/product-technical-gap-baseline.md b/docs/product-technical-gap-baseline.md index ef9c8276d..d2e8e5bc2 100644 --- a/docs/product-technical-gap-baseline.md +++ b/docs/product-technical-gap-baseline.md @@ -110,7 +110,7 @@ flowchart LR | #1049 | `c34480961bd66485f59122f4d15c5948e8d95ac6` | fermata plan 작업 중인 Draft PR; current Checks 32 pass, 1 failure, 0 pending; `DRAFT/BLOCKED`, qualifying independent approval 없음 | | #1033 | `046db562497a8104fa525f56a6437eb13fbf4760` | Python 보안 lock baseline; current Checks 34 pass, 0 failure, 0 pending; `REVIEW_REQUIRED/BLOCKED`, qualifying independent approval 없음 | | #1034 | `98a99e1bff4b63f5294d8c9a5cbdaf312b235403` | source/coverage/security/build/release terminal success; `opencode-review` success; qualifying independent approval 없음 | -| #1025 | `903e278eb6d40bea54e78b1a0310bd9e6c9801fe` | 이 문서 PR의 current head이며 protected base는 `749511c3ad4000090048718f685c6bee6b3d2c25`; current Checks 22 success, 1 failure(`opencode-review`), 6 in progress, 2 queued, 2 neutral; `MERGEABLE/BLOCKED`, qualifying independent approval 없음 | +| #1025 | `2982c19d1acad35b90f6d656eb6fbbd9dfdb4154` | 이 문서 PR의 current head이며 protected base는 `749511c3ad4000090048718f685c6bee6b3d2c25`; current Checks 22 success, 1 failure(`opencode-review`), 9 in progress, 2 neutral, 7 skipped; `MERGEABLE/BLOCKED`, qualifying independent approval 없음 | | #970 | `54d8966ee6734f7d6305c8bf7d503c1721a37840` | atomic project publication과 bounded load 보강, hard-link 불가 첫 저장 fail-closed; current Checks 29 pass, 1 failure(`opencode-review`), 3 pending; `MERGEABLE/BLOCKED`, qualifying independent approval 없음 | | #858 | `f1f5e877f07aa7486cd343ddfe8aa45a9d628bbd` | analysis/cache/temp/project path authority와 redacted logging test 계약 보강; current Checks 31 pass, 1 failure(`opencode-review`), 0 pending; `DRAFT/MERGEABLE/BLOCKED`, unresolved thread 0, qualifying independent approval 없음 | | #985 | `33d14e44bf7f41dda51b0ee246f7caae088101b9` | canonical audio resource ceiling을 desktop local/YouTube handoff와 Python defense-in-depth에 연결; current Checks 31 pass, 2 failure, 0 pending; `DRAFT/MERGEABLE/BLOCKED`, qualifying independent approval 없음 | From 70c8003b162f794ef37f9d104a210e8a92fd35e1 Mon Sep 17 00:00:00 2001 From: seonghobae Date: Sat, 29 Aug 2026 10:45:29 +0900 Subject: [PATCH 47/94] docs: record baseline gate capture --- docs/product-technical-gap-baseline.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/product-technical-gap-baseline.md b/docs/product-technical-gap-baseline.md index d2e8e5bc2..c8e476e03 100644 --- a/docs/product-technical-gap-baseline.md +++ b/docs/product-technical-gap-baseline.md @@ -110,7 +110,7 @@ flowchart LR | #1049 | `c34480961bd66485f59122f4d15c5948e8d95ac6` | fermata plan 작업 중인 Draft PR; current Checks 32 pass, 1 failure, 0 pending; `DRAFT/BLOCKED`, qualifying independent approval 없음 | | #1033 | `046db562497a8104fa525f56a6437eb13fbf4760` | Python 보안 lock baseline; current Checks 34 pass, 0 failure, 0 pending; `REVIEW_REQUIRED/BLOCKED`, qualifying independent approval 없음 | | #1034 | `98a99e1bff4b63f5294d8c9a5cbdaf312b235403` | source/coverage/security/build/release terminal success; `opencode-review` success; qualifying independent approval 없음 | -| #1025 | `2982c19d1acad35b90f6d656eb6fbbd9dfdb4154` | 이 문서 PR의 current head이며 protected base는 `749511c3ad4000090048718f685c6bee6b3d2c25`; current Checks 22 success, 1 failure(`opencode-review`), 9 in progress, 2 neutral, 7 skipped; `MERGEABLE/BLOCKED`, qualifying independent approval 없음 | +| #1025 | `b7214228c4cbde01913c43e1df33f250c820024a` | 이 문서 PR의 마지막 캡처 head이며 protected base는 `749511c3ad4000090048718f685c6bee6b3d2c25`; 캡처 시 Checks 33 success, 1 failure(`opencode-review`), 2 neutral, 9 skipped; `MERGEABLE/BLOCKED`, qualifying independent approval 없음 | | #970 | `54d8966ee6734f7d6305c8bf7d503c1721a37840` | atomic project publication과 bounded load 보강, hard-link 불가 첫 저장 fail-closed; current Checks 29 pass, 1 failure(`opencode-review`), 3 pending; `MERGEABLE/BLOCKED`, qualifying independent approval 없음 | | #858 | `f1f5e877f07aa7486cd343ddfe8aa45a9d628bbd` | analysis/cache/temp/project path authority와 redacted logging test 계약 보강; current Checks 31 pass, 1 failure(`opencode-review`), 0 pending; `DRAFT/MERGEABLE/BLOCKED`, unresolved thread 0, qualifying independent approval 없음 | | #985 | `33d14e44bf7f41dda51b0ee246f7caae088101b9` | canonical audio resource ceiling을 desktop local/YouTube handoff와 Python defense-in-depth에 연결; current Checks 31 pass, 2 failure, 0 pending; `DRAFT/MERGEABLE/BLOCKED`, qualifying independent approval 없음 | From 443699b2b98e35ff167a2a1dc740f89e719eeb89 Mon Sep 17 00:00:00 2001 From: seonghobae Date: Sat, 29 Aug 2026 17:12:59 +0900 Subject: [PATCH 48/94] docs(gap): refresh current PR evidence --- docs/product-technical-gap-baseline.md | 47 ++++++++++++++------------ 1 file changed, 26 insertions(+), 21 deletions(-) diff --git a/docs/product-technical-gap-baseline.md b/docs/product-technical-gap-baseline.md index c8e476e03..3f47415cf 100644 --- a/docs/product-technical-gap-baseline.md +++ b/docs/product-technical-gap-baseline.md @@ -5,7 +5,7 @@ Base revision: `develop@749511c3ad4000090048718f685c6bee6b3d2c25` (feat(workspac ## 1. 목적과 범위 (Purpose & Scope) -이 문서는 ADR/설계 문서(`ARCHITECTURE.md`, `docs/plans/*`), 브랜드 소스(`docs/brand-story.md`), 보안 소스(`docs/security/app-security.md`), 그리고 현재 저장소 상태(코드, 열린 PR 135건, 열린 이슈)를 대조하여 다음을 한 곳에 모은 baseline이다. +이 문서는 ADR/설계 문서(`ARCHITECTURE.md`, `docs/plans/*`), 브랜드 소스(`docs/brand-story.md`), 보안 소스(`docs/security/app-security.md`), 그리고 현재 저장소 상태(코드, 열린 PR 136건, 열린 이슈)를 대조하여 다음을 한 곳에 모은 baseline이다. - 기능 명세(functional spec)와 PRD/TRD로 승격되지 않은 요구사항의 공백 - 구현된 코드와 문서가 선언하는 제품 범위 사이의 기술 Gap @@ -94,29 +94,32 @@ flowchart LR ## 4. 현재 열린 PR 기반 Gap 분석 (Open-PR Gap Analysis) -현재 open PR은 135건이다(2026-08-29 Asia/Seoul 기준 REST inventory). 아래 표는 그중 대표적인 PR을 뽑은 snapshot이며, 대부분은 동일 패턴의 시리즈다. +현재 open PR은 136건이다(2026-08-29 Asia/Seoul 기준 REST inventory). 아래 표는 그중 대표적인 PR을 뽑은 snapshot이며, 대부분은 동일 패턴의 시리즈다. ### 4.1 2026-08-29 exact-head 운영 snapshot -아래 표는 protected base `develop@749511c3ad4000090048718f685c6bee6b3d2c25`에 대해 GitHub REST API로 다시 읽은 대표 PR의 current head와 그 head의 Checks/review 상태다. 아래 재실행 명령은 capture 시각의 open PR 전체에 대해 각 current head, 동일 SHA의 check-runs, reviews, protected base를 JSON으로 묶는다. 이전 SHA의 Checks는 현재 증적으로 재사용하지 않았다. +아래 표는 protected base `develop@749511c3ad4000090048718f685c6bee6b3d2c25`에 대해 GitHub REST API로 다시 읽은 대표 PR의 current head와 그 head의 Checks/review 상태다. Capture 시각은 `2026-08-29T08:11:32Z` (`2026-08-29 17:11:32 Asia/Seoul`)이며, 이후 재실행 결과는 이 snapshot의 증적으로 재사용하지 않는다. 아래 재실행 명령은 capture 시각의 open PR 전체에 대해 각 current head, 동일 SHA의 check-runs, reviews, protected base를 JSON으로 묶는다. 이전 SHA의 Checks는 현재 증적으로 재사용하지 않았다. | PR | current head | current 상태와 traceability | |---|---|---| -| #1040 | `191189d52f25486028425f1266de9bc6dcb71c93` | drop-plan copy/provenance 양방향 검증을 shared-types와 native parser에 보강; current Checks 32 pass, 2 failure, 0 pending; `REVIEW_REQUIRED/BLOCKED`, qualifying independent approval 없음 | -| #1045 | `995e3fc5475f47117c9eb15f3eb1e0a6dbd249c0` | swell-plan copy/provenance 양방향 검증과 feature-cache schema 분리를 보강하고 role payload TypedDict를 정렬; current Checks 32 pass, 1 failure, 1 pending; `REVIEW_REQUIRED/BLOCKED`, qualifying independent approval 없음 | -| #1046 | `5c655995664c9d1faba60c0ae9ff896ea11c0c57` | fade-plan copy/provenance 양방향 검증과 외부 song 교체 identity reset을 보강; current Checks 32 pass, 2 failure, 0 pending; `REVIEW_REQUIRED/BLOCKED`, qualifying independent approval 없음 | -| #1047 | `bc63d8a0235ed72566e557681abd6b3958ed714e` | ritardando plan 누락 JSDoc·copy/provenance 양방향 검증과 `ritardando.py` mypy 타입 계약을 보강; 관련 Python/desktop 검증 완료; current Checks 32 pass, 2 failure, 0 pending; `REVIEW_REQUIRED/BLOCKED`, qualifying independent approval 없음 | -| #1048 | `28038721b473c1f64b6914312f48704d64e09c6a` | accelerando plan copy/provenance 양방향 검증과 beat-grid 경계 계약을 보강; current Checks 32 pass, 1 failure, 0 pending; `REVIEW_REQUIRED/BLOCKED`, qualifying independent approval 없음 | -| #1049 | `c34480961bd66485f59122f4d15c5948e8d95ac6` | fermata plan 작업 중인 Draft PR; current Checks 32 pass, 1 failure, 0 pending; `DRAFT/BLOCKED`, qualifying independent approval 없음 | -| #1033 | `046db562497a8104fa525f56a6437eb13fbf4760` | Python 보안 lock baseline; current Checks 34 pass, 0 failure, 0 pending; `REVIEW_REQUIRED/BLOCKED`, qualifying independent approval 없음 | -| #1034 | `98a99e1bff4b63f5294d8c9a5cbdaf312b235403` | source/coverage/security/build/release terminal success; `opencode-review` success; qualifying independent approval 없음 | -| #1025 | `b7214228c4cbde01913c43e1df33f250c820024a` | 이 문서 PR의 마지막 캡처 head이며 protected base는 `749511c3ad4000090048718f685c6bee6b3d2c25`; 캡처 시 Checks 33 success, 1 failure(`opencode-review`), 2 neutral, 9 skipped; `MERGEABLE/BLOCKED`, qualifying independent approval 없음 | -| #970 | `54d8966ee6734f7d6305c8bf7d503c1721a37840` | atomic project publication과 bounded load 보강, hard-link 불가 첫 저장 fail-closed; current Checks 29 pass, 1 failure(`opencode-review`), 3 pending; `MERGEABLE/BLOCKED`, qualifying independent approval 없음 | -| #858 | `f1f5e877f07aa7486cd343ddfe8aa45a9d628bbd` | analysis/cache/temp/project path authority와 redacted logging test 계약 보강; current Checks 31 pass, 1 failure(`opencode-review`), 0 pending; `DRAFT/MERGEABLE/BLOCKED`, unresolved thread 0, qualifying independent approval 없음 | -| #985 | `33d14e44bf7f41dda51b0ee246f7caae088101b9` | canonical audio resource ceiling을 desktop local/YouTube handoff와 Python defense-in-depth에 연결; current Checks 31 pass, 2 failure, 0 pending; `DRAFT/MERGEABLE/BLOCKED`, qualifying independent approval 없음 | -| #892 | `914428825a902f538971caf4c6f9f35390219a4d` | decoded WAV C-major acceptance와 silent aliased fixture fail-closed 보강; current Checks 28 pass, 3 failure, 0 pending; `DRAFT/MERGEABLE/BLOCKED`, qualifying independent approval 없음 | -| #1051 | `d3622b6a21ddf8ab58aa17bb565e803bf5c257ce` | WCAG 2.2 키보드 skip navigation과 focusable main landmark 최소 기준; current Checks 32 success, 1 failure(`opencode-review`), 2 neutral, 7 skipped; `MERGEABLE/BLOCKED`, unresolved thread 0, qualifying independent approval 없음 | -| #1052 | `1f9a4ef75e563fe318f7761a400094b0d4ebff73` | Ranges/Player의 buyer-visible 노출, canonical first-range callout 단일화, active-role 연동, 첫 playable span 보존, 단수형 카피·다중 구간 selector·runtime object guard 보강; current Checks 31 success, 1 failure(`opencode-review`), 1 in progress, 1 queued, 2 neutral, 7 skipped; `MERGEABLE/BLOCKED`, unresolved thread 0, qualifying independent approval 없음 | +| #1053 | `720c823bea91689c69c26877f20b4acd9feedf83` | Settings에서 분석 전/후의 audio next action과 Ranges 이동을 buyer-visible하게 연결; required `opencode-review` failure, `MERGEABLE/BLOCKED`, `REVIEW_REQUIRED`, qualifying independent approval 없음 | +| #1052 | `b737906aba0b95251109e53434dd8860ff6664fd` | Ranges/Player의 buyer-visible 노출, canonical first-range callout 단일화, active-role 연동, 첫 playable span 보존, 단수형 카피·다중 구간 selector·runtime object guard 보강; required `opencode-review`·`strix` failure, `MERGEABLE/BLOCKED`, `REVIEW_REQUIRED`, qualifying independent approval 없음 | +| #1051 | `d3622b6a21ddf8ab58aa17bb565e803bf5c257ce` | WCAG 2.2 키보드 skip navigation과 focusable main landmark 최소 기준; required `opencode-review` failure, `MERGEABLE/BLOCKED`, `REVIEW_REQUIRED`, qualifying independent approval 없음 | +| #1049 | `7795ff40a308cae392ce9804e624d64695a49d12` | fermata plan의 첫 섹션 next action을 추가하는 Draft PR; required `opencode-review`·`strix` failure, `DRAFT/MERGEABLE/BLOCKED`, `REVIEW_REQUIRED`, qualifying independent approval 없음 | +| #1048 | `8f8b2da7815741f4af96c70510951d01a4d302fc` | accelerando plan copy/provenance 양방향 검증과 beat-grid 경계 계약을 보강; required `opencode-review`·`strix` failure, `MERGEABLE/BLOCKED`, `REVIEW_REQUIRED`, qualifying independent approval 없음 | +| #1047 | `f2879edf8fae3dc9058ebdbc042c4f79bc243006` | ritardando plan 누락 JSDoc·copy/provenance 양방향 검증과 `ritardando.py` mypy 타입 계약을 보강; required `opencode-review`·`strix` failure, `MERGEABLE/BLOCKED`, `REVIEW_REQUIRED`, qualifying independent approval 없음 | +| #1046 | `c13314677adb0d1ae60a7d2786e858fa6b0f9306` | fade-plan copy/provenance 양방향 검증과 외부 song 교체 identity reset을 보강; required `opencode-review`·`strix` failure, `MERGEABLE/BLOCKED`, `REVIEW_REQUIRED`, qualifying independent approval 없음 | +| #1045 | `0b03fb7b20473b808fce06a4c6a178de46f2e778` | swell-plan copy/provenance 양방향 검증과 feature-cache schema 분리를 보강; required `opencode-review`·`strix` failure, `MERGEABLE/BLOCKED`, `REVIEW_REQUIRED`, qualifying independent approval 없음 | +| #1033 | `046db562497a8104fa525f56a6437eb13fbf4760` | Python 보안 lock baseline; required Checks pass; `REVIEW_REQUIRED/BLOCKED`, qualifying independent approval 없음 | +| #1040 | `693732df2b9790c2f3292b23b15b01d2e6ca822a` | drop-plan copy/provenance 양방향 검증을 shared-types와 native parser에 보강; required `opencode-review` failure, `MERGEABLE/BLOCKED`, `REVIEW_REQUIRED`, qualifying independent approval 없음 | +| #1034 | `98a99e1bff4b63f5294d8c9a5cbdaf312b235403` | customer-facing copy, safe error localization, valid/invalid YouTube guidance를 정리; required checks pass, `MERGEABLE/BLOCKED`, `REVIEW_REQUIRED`, qualifying independent approval 없음 | +| #1025 | `70c8003b162f794ef37f9d104a210e8a92fd35e1` | 이 문서 PR의 current head; protected base는 `749511c3ad4000090048718f685c6bee6b3d2c25`, required `opencode-review` failure, `MERGEABLE/BLOCKED`, `REVIEW_REQUIRED`, qualifying independent approval 없음 | +| #970 | `abb39bf7bd4f9ee6fc88bdd8db80d9a4a8113545` | atomic project publication과 bounded load 보강, hard-link 불가 첫 저장 fail-closed; required `opencode-review`·`strix` failure, `MERGEABLE/BLOCKED`, qualifying independent approval 없음 | +| #858 | `f1f5e877f07aa7486cd343ddfe8aa45a9d628bbd` | analysis/cache/temp/project path authority와 redacted logging test 계약 보강; required `opencode-review` failure, `DRAFT/MERGEABLE/BLOCKED`, unresolved thread 0, qualifying independent approval 없음 | +| #985 | `33d14e44bf7f41dda51b0ee246f7caae088101b9` | canonical audio resource ceiling을 desktop local/YouTube handoff와 Python defense-in-depth에 연결; required `opencode-review`·`strix` failure, `DRAFT/MERGEABLE/BLOCKED`, `REVIEW_REQUIRED`, qualifying independent approval 없음 | +| #892 | `fa2abea4f0063db55490b6f392d28315a975cf59` | decoded WAV C-major acceptance와 silent aliased fixture fail-closed 보강; required `opencode-review`·`strix` failure, `DRAFT/MERGEABLE/BLOCKED`, `REVIEW_REQUIRED`, qualifying independent approval 없음 | +| #891 | `9220af2921438cb51a290ab4e4314e2fd321671d` | known-take verse/chorus chord recovery acceptance; required checks pass, `DRAFT/MERGEABLE/BLOCKED`, `REVIEW_REQUIRED`, qualifying independent approval 없음 | +| #866 | `505a595d481f8ba03abd8d13e7c17202918c833f` | canonical local-audio resource policy; required `opencode-review`·`strix` failure, `DRAFT/MERGEABLE/BLOCKED`, `CHANGES_REQUESTED`, qualifying independent approval 없음 | `#1025`의 과거 SHA(`3c459fd033ccd94ad6cc8df6092d9e1ce4a86e6b` 등)는 이 표의 current head가 아니므로, 해당 SHA의 Checks/review를 현재 증적으로 재사용하지 않는다. @@ -147,7 +150,7 @@ capability cluster 분류와 착지 후 남는 Gap: | I. 테스트 현실성 (decoded WAV acceptance, known-take chord recovery, real YouTube known-stem benchmark, branch coverage) | #892, #891, #828, #861 | synthetic fixture에서 실오디오 기반 acceptance로 이동 시작 | Issue #770(실오디오 MIR accuracy benchmark) 체계화, RMSE/SI-SDR 임계값 정책 | | J. 의존성/빌드 위생 (react, storybook, base-ui, lucide, sonner, codeql-action, setup-uv, uv group, numba, uuid, time, rust pinning, node floor, orphaned Actions identity) | #920, #942, #922, #921, #926, #927, #924, #931, #936, #919, #918, #754, #944, #896, #895 | 공급망/런타임 최신화 유지 | Dependabot train 정리(Issue #966), jsdom 30 전환 완료 | -시리즈 전체에 대한 종합 판단: 이 시리즈는 "계약(contract) 필드 추가 + 첫 노출" 단계다. 착지해도 (1) plan 값의 생성 로직, (2) plan들 사이 우선순위/중복 정책, (3) 재분석 시 override 보존 round-trip, (4) 협업 영속화는 여전히 Gap으로 남는다. 또한 135건이 develop 기준으로부터 장기간 분기되어 있어 rebase 비용과 exact-head CI 증적 요구(PR 본문 명시)로 인한 merge train 정체가 자체적으로 기술 위험이다(Issue #966). +시리즈 전체에 대한 종합 판단: 이 시리즈는 "계약(contract) 필드 추가 + 첫 노출" 단계다. 착지해도 (1) plan 값의 생성 로직, (2) plan들 사이 우선순위/중복 정책, (3) 재분석 시 override 보존 round-trip, (4) 협업 영속화는 여전히 Gap으로 남는다. 또한 136건이 develop 기준으로부터 장기간 분기되어 있어 rebase 비용과 exact-head CI 증적 요구(PR 본문 명시)로 인한 merge train 정체가 자체적으로 기술 위험이다(Issue #966). ## 5. 기술 Gap 목록 (Technical Gaps) @@ -175,6 +178,8 @@ capability cluster 분류와 착지 후 남는 Gap: (k) **패키징/릴리스 준비** — `CHANGELOG.md`, `VERSION`, `release.yml`, `build-baseline.yml` 존재. Windows/macOS amd64+arm64 build gate가 protected branch 요건이다(ARCHITECTURE.md). 남는 Gap: 서명/공증/자동 업데이트 롤백 증적(Issue #960), crash-safe project format/autosave/migration(Issue #962), redacted diagnostics/support bundle(Issue #963). +(l) **운영 관측(2026-08-29 current-head Strix 장애)** — 중앙 Strix 게이트의 ContextualWisdomLab/.github#1397@`02487b4490b195c91752ba7a2d78e6d6849e1e8f` 실행은 `openai/orchestrator/free`에 세 번 bounded retry했지만 모두 HTTP 500 `internal_error`를 반환했고 vulnerability report artifact를 만들지 못해 fail-closed 되었다. 같은 외부 `strix` failure가 BandScope #1052에서도 관측된다. 이는 변경 파일의 취약점 발견이 아니라 중앙 provider/routing 운영 증적이며, repo 단위 우회는 금지하고 중앙 게이트 운영에서 복구해야 한다. + ## 6. UML 보완점 Protected base `develop@749511c3ad4000090048718f685c6bee6b3d2c25`의 `docs/`와 `ARCHITECTURE.md`에는 Mermaid `sequenceDiagram`/`classDiagram`/`flowchart`가 없다. 이 PR이 아래 다이어그램을 처음 추가하므로 현재 PR checkout 자체를 검색하면 이 파일이 매치되는 것이 정상이다. @@ -254,7 +259,7 @@ flowchart TD - Why: 대용량/악성 파일로 인한 메모리 폭주는 첫 사용 경험을 깬다. 보안 gate이자 안정성 gate다. - Acceptance: 파일 크기/길이 상한이 intake에서 강제되고, 초과 입력은 안전 실패 카피로 거부된다. quickcheck 통과. 3. **merge train 정리 (Issue #966)** - - Why: 135개 open PR의 exact-head CI 요구는 모든 후속 기능을 정체시킨다. + - Why: 136개 open PR의 exact-head CI 요구는 모든 후속 기능을 정체시킨다. - Acceptance: dependency-aware train 정의 후 open PR이 cluster A-J 단위로 수렴하고, 중복 PR이 canonical PR로 link된다. 4. **filesystem path containment 재구축 (Issue #852, PR #858)** - Why: 로컬 데스크톱 앱의 최상위 신뢰경계. 우회 시 임의 파일 접근으로 이어진다. @@ -340,7 +345,7 @@ World Wide Web Consortium. (2024). Web Content Accessibility Guidelines (WCAG) 2 ```bash mkdir -p /tmp/opencode gh api --paginate 'repos/ContextualWisdomLab/bandscope/pulls?state=open&per_page=100' \ - --jq '.[].number' | wc -l # 135 + --jq '.[].number' | wc -l # 136 gh pr view 1021 --json title,body # 시리즈 패턴 샘플 ``` - Exact-head PR snapshot (capture time, protected base, current head, same-head Checks and reviews): From ef9b10df1a7a6cb209ceb4da8f5b45b33da723ca Mon Sep 17 00:00:00 2001 From: seonghobae Date: Sat, 29 Aug 2026 17:19:36 +0900 Subject: [PATCH 49/94] docs(gap): distinguish inventory from runtime fallback --- docs/product-technical-gap-baseline.md | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/docs/product-technical-gap-baseline.md b/docs/product-technical-gap-baseline.md index 3f47415cf..3de3c1d51 100644 --- a/docs/product-technical-gap-baseline.md +++ b/docs/product-technical-gap-baseline.md @@ -37,7 +37,7 @@ flowchart LR subgraph Engine["services/analysis-engine (Python)"] CLI["cli.py / api.py
stdin/stdout JSON IPC"] Mods["chords / sections / roles /
ranges / temporal / separation /
transcription / exports"] - Sep["separation/audio_separator.py
Demucs htdemucs (CPU default)
configurable device passthrough
bandsplit-v1.json 폴백"] + Sep["separation/audio_separator.py
Demucs htdemucs (CPU default)
configurable device passthrough
bandsplit-v1.json inventory-only manifest"] end Rust["services/analysis-engine/rust
bandscope_numeric (PyO3/maturin)
checkerboard_novelty + viterbi_decode"] Types["packages/shared-types
song-section-role 계약
confidence/provenance/cue/export"] @@ -58,7 +58,7 @@ flowchart LR - `apps/desktop/core`(Rust)는 분석 연산이 아니라 입력 검증(YouTube URL, project payload, score PDF source, 경로 가드) 담당이다 (`apps/desktop/core/src/lib.rs`) - 무거운 수치 커널 중 checkerboard novelty와 Viterbi 디코딩만 `bandscope_numeric`(Rust/PyO3)으로 포팅되어 있고, 나머지는 Python/NumPy 참조 구현이며 `tests/test_numeric_parity.py`로 f64 parity를 잠근다 (`_native.py`) - 스템 분리는 Demucs `htdemucs`를 기본 `AudioSeparationConfig.device="cpu"`로 실행한다. `_apply_model`은 구성된 `device`를 Demucs `apply_model(..., device=...)`에 전달하므로 비-CPU 장치 경로 자체는 존재하지만, BandScope가 CUDA/MPS를 독립적으로 admission·parity·performance·release gate한 증거는 아직 없다 (`separation/audio_separator.py`) -- 주파수 컷오프만 정의한 `bandsplit-v1.json` 휴리스틱 밴드스플릿 manifest가 별도로 존재한다 (`separation/model_weights/bandsplit-v1.json`) +- 주파수 컷오프만 정의한 `bandsplit-v1.json` 휴리스틱 밴드스플릿 manifest가 별도로 존재하지만, 현재 코드에서 이를 읽는 runtime consumer는 확인되지 않는다 (`separation/model_weights/bandsplit-v1.json`; supplemental inventory only) - 협업 타입(assignments/comments/approvals)은 `packages/shared-types`에 정의만 되어 있고 UI 참조가 전혀 없다 (grep 확인) ## 3. 기능 명세 및 요구사항 도출 (Functional Spec Derivation) @@ -69,7 +69,7 @@ flowchart LR |---|---|---| | 로컬 오디오 임포트(Rust 검증 + app-owned 루트) | `apps/desktop/src-tauri/src/main.rs`, `apps/desktop/core/src/lib.rs` | 구현됨 | | YouTube 임포트(정책 제약, 실패 폴백) | `services/analysis-engine/src/bandscope_analysis/youtube.py` | 부분구현 (DRM/로그인 우회 없음, 실패 시 안내 카드는 PR 진행 중) | -| 스템 분리 | `separation/audio_separator.py` (htdemucs; CPU default), `bandsplit-v1.json` | 부분구현 (플랫폼 게이트, x86 macOS 미지원; configurable device passthrough는 있으나 비-CPU 가속은 아직 BandScope release-qualified가 아님) | +| 스템 분리 | `separation/audio_separator.py` (htdemucs; CPU default) | 부분구현 (플랫폼 게이트, x86 macOS 미지원; configurable device passthrough는 있으나 비-CPU 가속은 아직 BandScope release-qualified가 아님) | | 섹션 세그먼테이션(checkerboard novelty) | `sections/segmenter.py` + `bandscope_numeric::checkerboard_novelty` | 구현됨 | | 섹션별 화성(HMM + Viterbi) | `chords/chord_recognizer.py`, `chords/section_harmony.py` | 구현됨 (hand-tuned prior 수준, 4장 참조) | | 화성 기능 라벨/설명 | `chords/function_analyzer.py`, `RehearsalRole.harmonicExplanation?` | 부분구현 | @@ -158,7 +158,7 @@ capability cluster 분류와 착지 후 남는 Gap: (a) **Rust compute layer 활용 범위** — 분석 핫패스 중 checkerboard novelty와 Viterbi decode만 Rust(`bandscope_numeric`)에 있다. 스템 분리(Demucs)는 Python/torch이며 `AudioSeparationConfig.device` 기본값은 `cpu`다. `_apply_model`은 구성된 device를 `demucs.apply.apply_model(..., device=...)`에 그대로 전달하므로 비-CPU 장치 경로는 존재한다. 다만 BandScope의 현재 protected/release evidence에는 CUDA/MPS 경로의 장치 admission, CPU 대비 수치 parity, 성능 기준, 플랫폼별 release qualification이 없다. 따라서 Gap은 "GPU 경로 부재"가 아니라 **가속 경로의 검증·지원 계약 부재**다. transcription은 에너지 마스크 휴리스틱(`transcription/api.py`)으로 ML 모델이 아니다. 데스크톱 단일 곡 처리 기준 CPU로도 실용적일 수 있으나, 긴 곡/다중 분석에서 병목이며 `docs/plans/2026-04-25-v2-transcription.md`가 v2 계획으로 존재한다. -(b) **다층/계층·시간 모델링** — `song -> section -> role` 계약과 sections/roles/temporal 모듈은 존재하지만, role-level harmony는 `bandsplit-v1.json`의 고정 주파수 컷오프 휴리스틱에 의존한다. 학습된 multilevel 모델(예: role-conditioned chord/voicing 모델)과 section 경계의 temporal 일관성 학습은 없다. `docs/plans/2026-03-28-ml-engine-integration.md`가 관련 계획 문서다. +(b) **다층/계층·시간 모델링** — `song -> section -> role` 계약과 sections/roles/temporal 모듈은 존재하지만, role-level harmony는 실제 stem 경로에서 Demucs `other`/`bass` 출력에 적용하는 `ChordRecognizer`와 fallback role payload에 의존한다. `bandsplit-v1.json`은 현재 runtime consumer가 없는 inventory-only manifest이므로 이 경로의 근거로 세지 않는다. 학습된 multilevel 모델(예: role-conditioned chord/voicing 모델)과 section 경계의 temporal 일관성 학습은 없다. `docs/plans/2026-03-28-ml-engine-integration.md`가 관련 계획 문서다. (c) **임의 가중치 vs 문헌 기반 값** — `chord_recognizer._build_transition_matrix()`는 `self_prob=0.8`, `related_prob=0.03`, uniform baseline `0.01/n` 등 hand-set 상수를 쓴다("Encodes musical priors" 주석). 방향성(fifth/fourth/relative/parallel)은 음악 이론에 근거하지만 수치는 문헌 교정(calibration)되어 있지 않다. `roles/priority.py`는 숫자 가중치 없는 if-then 규칙이다. PR #732(relative-key prior correction)처럼 사후 수정이 발생해왔다. 교정 방향은 주석 코퍼스(예: Burgoyne et al., 2011의 McGill Billboard)에서 전이 행렬을 최대우도로 추정하고, 관련 HMM/화음인식 문헌(Logan & Chu, 2000; Pauwels & Peeters, 2013; Boulanger-Lewandowski et al., 2013)은 모델링 맥락으로만 사용하며 현재 transition 수치의 parameter source로 간주하지 않는 것이다. tonal pitch space 거리 기반 스무딩(Harte, 2010) 등 대안과 현재 hand-set 값의 코드 복원 RMSE/accuracy 차이를 정량 비교한 뒤, 우세한 값을 상수가 아닌 데이터 산출물로 고정한다. @@ -379,7 +379,7 @@ World Wide Web Consortium. (2024). Web Content Accessibility Guidelines (WCAG) 2 - `sed -n '70,110p' services/analysis-engine/src/bandscope_analysis/chords/chord_recognizer.py` -> hand-set transition prior 확인 - `sed -n '1,40p' services/analysis-engine/src/bandscope_analysis/_native.py` -> bandscope_numeric 커널/parity 확인 - `ls services/analysis-engine/rust && grep -n "maturin" services/analysis-engine/rust/pyproject.toml` -> Rust 커널 위치 확인 - - `head -30 services/analysis-engine/src/bandscope_analysis/separation/model_weights/bandsplit-v1.json` -> 휴리스틱 manifest 확인 + - `head -30 services/analysis-engine/src/bandscope_analysis/separation/model_weights/bandsplit-v1.json` -> runtime consumer가 없는 inventory-only 휴리스틱 manifest 확인 - `find apps/desktop/src/features/workspace -type f -name '*.tsx' -print0 | xargs -0 grep -hEo 'aria-[[:alnum:]_-]+' | wc -l` -> 56 attribute tokens (2026-08-29 current checkout) - `grep -rln "RehearsalAssignment\|RehearsalCollaboration" apps/desktop/src` -> 0건(UI 미구현 확인) - `grep -rn "loop" apps/desktop/src/features/player/index.tsx` -> 0건(loop 미구현 확인) From 68caba1e65988606558126248a8ffdd365109f56 Mon Sep 17 00:00:00 2001 From: seonghobae Date: Sat, 29 Aug 2026 17:21:47 +0900 Subject: [PATCH 50/94] docs(gap): prove manifest runtime absence --- docs/product-technical-gap-baseline.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/product-technical-gap-baseline.md b/docs/product-technical-gap-baseline.md index 3de3c1d51..eee3b155e 100644 --- a/docs/product-technical-gap-baseline.md +++ b/docs/product-technical-gap-baseline.md @@ -379,7 +379,7 @@ World Wide Web Consortium. (2024). Web Content Accessibility Guidelines (WCAG) 2 - `sed -n '70,110p' services/analysis-engine/src/bandscope_analysis/chords/chord_recognizer.py` -> hand-set transition prior 확인 - `sed -n '1,40p' services/analysis-engine/src/bandscope_analysis/_native.py` -> bandscope_numeric 커널/parity 확인 - `ls services/analysis-engine/rust && grep -n "maturin" services/analysis-engine/rust/pyproject.toml` -> Rust 커널 위치 확인 - - `head -30 services/analysis-engine/src/bandscope_analysis/separation/model_weights/bandsplit-v1.json` -> runtime consumer가 없는 inventory-only 휴리스틱 manifest 확인 + - `test -z "$(git grep -n 'bandsplit-v1\\|bandsplit' -- ':!docs/product-technical-gap-baseline.md' ':!supply-chain/supplemental-component-inventory.json' ':!services/analysis-engine/src/bandscope_analysis/separation/model_weights/bandsplit-v1.json' || true)"` -> manifest/inventory/문서 자체를 제외한 runtime consumer 0건 확인 - `find apps/desktop/src/features/workspace -type f -name '*.tsx' -print0 | xargs -0 grep -hEo 'aria-[[:alnum:]_-]+' | wc -l` -> 56 attribute tokens (2026-08-29 current checkout) - `grep -rln "RehearsalAssignment\|RehearsalCollaboration" apps/desktop/src` -> 0건(UI 미구현 확인) - `grep -rn "loop" apps/desktop/src/features/player/index.tsx` -> 0건(loop 미구현 확인) From 46c7f6f630be03d012da85d6eb38ffe9b6b8f99f Mon Sep 17 00:00:00 2001 From: seonghobae Date: Sat, 29 Aug 2026 18:03:49 +0900 Subject: [PATCH 51/94] docs(gap): record real-audio runtime probe --- docs/product-technical-gap-baseline.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/docs/product-technical-gap-baseline.md b/docs/product-technical-gap-baseline.md index eee3b155e..8da0c58d2 100644 --- a/docs/product-technical-gap-baseline.md +++ b/docs/product-technical-gap-baseline.md @@ -162,7 +162,7 @@ capability cluster 분류와 착지 후 남는 Gap: (c) **임의 가중치 vs 문헌 기반 값** — `chord_recognizer._build_transition_matrix()`는 `self_prob=0.8`, `related_prob=0.03`, uniform baseline `0.01/n` 등 hand-set 상수를 쓴다("Encodes musical priors" 주석). 방향성(fifth/fourth/relative/parallel)은 음악 이론에 근거하지만 수치는 문헌 교정(calibration)되어 있지 않다. `roles/priority.py`는 숫자 가중치 없는 if-then 규칙이다. PR #732(relative-key prior correction)처럼 사후 수정이 발생해왔다. 교정 방향은 주석 코퍼스(예: Burgoyne et al., 2011의 McGill Billboard)에서 전이 행렬을 최대우도로 추정하고, 관련 HMM/화음인식 문헌(Logan & Chu, 2000; Pauwels & Peeters, 2013; Boulanger-Lewandowski et al., 2013)은 모델링 맥락으로만 사용하며 현재 transition 수치의 parameter source로 간주하지 않는 것이다. tonal pitch space 거리 기반 스무딩(Harte, 2010) 등 대안과 현재 hand-set 값의 코드 복원 RMSE/accuracy 차이를 정량 비교한 뒤, 우세한 값을 상수가 아닌 데이터 산출물로 고정한다. -(d) **테스트 현실성** — `test_numeric_parity.py`(Rust-Python parity), `test_api.py` 등은 합성 입력 기반이다. 현재 PR checkout의 Git tree 및 9장 `find` 검증 기준 test 경로에 `.wav`/`.mp3` 실오디오 fixture가 없다. 실오디오 acceptance는 PR #892(decoded WAV C major), #891(known take verse/chorus recovery)이 열려 있고, 실 YouTube known-stem benchmark는 draft PR #828 + Issue #770 상태다. RMSE/SI-SDR 스타일 정량 임계값 acceptance gate는 아직 없다. +(d) **테스트 현실성** — `test_numeric_parity.py`(Rust-Python parity), `test_api.py` 등은 합성 입력 기반이다. 현재 PR checkout의 Git tree 및 9장 `find` 검증 기준 test 경로에 `.wav`/`.mp3` 실오디오 fixture가 없다. 실오디오 acceptance는 PR #892(decoded WAV C major), #891(known take verse/chorus recovery)이 열려 있고, 실 YouTube known-stem benchmark는 draft PR #828 + Issue #770 상태다. 별도 exploratory probe로 CC0 공개 피아노 녹음 `FurElise.ogg`(Wikimedia Commons, 176.59초)를 실제 디코더·`TemporalAnalyzer`·SSM segmenter·`ChordRecognizer`에 통과시킨 결과는 각각 `147.7 BPM/404 beats/101 downbeats`, 20개 section, 261개 chord time-segment였지만 harmony confidence가 대부분 low였다. 동일 develop production job은 성공 envelope를 반환했으나 tempo가 없고 arrangement role harmony가 남아 있어, 이 probe는 runtime 연결성 확인이지 정확도 acceptance가 아니다. RMSE/SI-SDR 스타일 정량 임계값 acceptance gate는 아직 없다. (e) **커버리지/docstring 100%** — Python은 `--cov-fail-under=100` + Ruff D100-D107 docstring 100%가 gate로 작동한다(AGENTS.md, roadmap-completion 문서). JS workspace의 **2026-08-25 snapshot 실측**(source tree commit `d303c93e5e7d9199edb6ce596dcb9a8753f3a5fa`)은 desktop(469 stmts/357 branches/105 funcs)과 shared-types(717 stmts/643 branches/59 funcs) 모두 statements/branches/functions/lines 100%였다. 재실행 명령과 결과 artifact 경로는 각각 `npm run test --workspace @bandscope/desktop` -> `apps/desktop/coverage/coverage-summary.json`, `npm run test --workspace @bandscope/shared-types` -> `packages/shared-types/coverage/coverage-summary.json`이다. 이 수치는 현재 영구 gate를 뜻하지 않는다. gate threshold(`vite.config.ts`, `vitest.config.ts`)는 90으로 Python보다 낮아, 리그레션 시 90~99% 구간이 무단 통과될 수 있다. Gate 상향은 Backlog #10. @@ -376,6 +376,7 @@ World Wide Web Consortium. (2024). Web Content Accessibility Guidelines (WCAG) 2 - `grep -rn "padPlan\|PadPlan" apps/desktop/src packages/shared-types/src` -> 0건(시리즈 미착지 확인) - `find services/analysis-engine -name "*.py"` -> 모듈 목록(chords/sections/roles/ranges/temporal/separation/transcription/youtube/exports) - `find . -type f \( -path '*/tests/*' -o -path '*/test/*' \) \( -iname '*.wav' -o -iname '*.mp3' \) -not -path './.git/*'` -> 0건(현재 PR checkout에서 test 실오디오 fixture 부재 확인) + - 2026-08-29 exploratory runtime probe: [Wikimedia Commons CC0 `FurElise.ogg`](https://commons.wikimedia.org/wiki/File:FurElise.ogg), SHA-256 `8deefb57df989a2b53a6bdd3e59813b6c34d61dca666caa39e53fa9597b378e3`, 실제 decoded duration `176.5867573696145`초. `TemporalAnalyzer` -> `147.65625 BPM`, `404` beats, `101` downbeats; `segment_with_boundaries` -> `20` sections; `ChordRecognizer` -> `261` time-segments, mostly `low` confidence. 이는 test fixture가 아니며 CI acceptance로 재사용하지 않는다. - `sed -n '70,110p' services/analysis-engine/src/bandscope_analysis/chords/chord_recognizer.py` -> hand-set transition prior 확인 - `sed -n '1,40p' services/analysis-engine/src/bandscope_analysis/_native.py` -> bandscope_numeric 커널/parity 확인 - `ls services/analysis-engine/rust && grep -n "maturin" services/analysis-engine/rust/pyproject.toml` -> Rust 커널 위치 확인 From cdaddc4ac89c035320f5ac851e2ea9ebe1cbad6b Mon Sep 17 00:00:00 2001 From: seonghobae Date: Sun, 30 Aug 2026 00:29:28 +0900 Subject: [PATCH 52/94] docs(gap): record tempo stability current-head evidence --- docs/product-technical-gap-baseline.md | 21 ++++++++++++++++++--- 1 file changed, 18 insertions(+), 3 deletions(-) diff --git a/docs/product-technical-gap-baseline.md b/docs/product-technical-gap-baseline.md index 8da0c58d2..d73f32639 100644 --- a/docs/product-technical-gap-baseline.md +++ b/docs/product-technical-gap-baseline.md @@ -1,6 +1,6 @@ # BandScope Product-Technical Gap Baseline -Last updated: 2026-08-29 +Last updated: 2026-08-30 Base revision: `develop@749511c3ad4000090048718f685c6bee6b3d2c25` (feat(workspace): name tonight's first playable range on the map, #957) ## 1. 목적과 범위 (Purpose & Scope) @@ -78,7 +78,7 @@ flowchart LR | 파트 겹침 경고 | `roles/overlap.py`, `RehearsalRole.overlapWarnings` | 구현됨 | | 단순화 가이드 | `roles/priority.py` 연계, `RehearsalRole.simplification` 필드 | 구현됨 (문자열 필드 중심) | | 전조/카포/튜닝 큐 | `chords/transposition.py`, `chords/capo.py`, `roles/tuning.py` | 구현됨 (계산), 워크스페이스 노출은 PR 진행 중 | -| 그루브/타이밍/히트 큐 | `temporal/groove.py`, `temporal/hits.py`, `temporal/stability.py` | 구현됨 | +| 그루브/타이밍/히트/tempo-stability 큐 | `temporal/groove.py`, `temporal/hits.py`, `temporal/stability.py`, PR #1059 | 구현됨 (tempo-stability 노출은 #1059 open stacked PR) | | 진입/이탈/카운트/가사 큐 앵커 | `sections/anchors.py`, `CueAnchorKind = lyric\|count\|transition` | 부분구현 | | 신뢰도 표시(section/role 수준) | `ConfidenceMarker(low/medium/high)` + `features/workspace/ConfidenceBadge.tsx` | 구현됨 | | 리허설 우선순위 | `roles/priority.py`, `RehearsalPriority`, `PracticeProgress.tsx` | 구현됨 (규칙 기반 휴리스틱) | @@ -121,6 +121,20 @@ flowchart LR | #891 | `9220af2921438cb51a290ab4e4314e2fd321671d` | known-take verse/chorus chord recovery acceptance; required checks pass, `DRAFT/MERGEABLE/BLOCKED`, `REVIEW_REQUIRED`, qualifying independent approval 없음 | | #866 | `505a595d481f8ba03abd8d13e7c17202918c833f` | canonical local-audio resource policy; required `opencode-review`·`strix` failure, `DRAFT/MERGEABLE/BLOCKED`, `CHANGES_REQUESTED`, qualifying independent approval 없음 | +### 4.2 2026-08-30 tempo-stability current-head snapshot + +PR #1059 (`feat(tempo): surface tempo movement rehearsal cues`)의 현재 증거는 head `3d2aaa27804bd6113e8e9aee8aff611976698b40`, base `fix/temporal-log-privacy@b11b1e0c1756921c64524d691fb4fac440abc65b`이다. 이 PR은 #1055에 stacked되어 있으며 `OPEN`, `MERGEABLE`, `CLEAN`이지만 formal `reviewDecision`이 없고 qualifying independent approval도 없다. 동일 head의 Devin Review와 CodeRabbit status는 성공으로 보였고, CodeRabbit은 non-default base라 review를 건너뛴 상태이며, review thread unresolved count는 0이다. 따라서 이는 구현/리뷰 증거이지 보호 브랜치 병합 증거가 아니다. 다음 push 뒤에는 반드시 head, 동일 SHA Checks, reviews, threads를 다시 조회한다. + +구현 범위는 shared contract의 `TempoStability`/`TempoChange`, API의 validated tempo mapping과 local-only orchestration, Workspace의 en/ko rehearsal copy, chart JSON export, 그리고 final analysis cache v2와 reusable stem-feature cache v1의 독립 namespace다. PR branch에서 생성한 임시 click-track WAV를 실제 `TemporalAnalyzer`와 `analyze_tempo_stability`에 통과시킨 별도 probe는 `120.2 BPM`, `15 beats`, `steady`, `0 tempo changes`를 반환했다. 이 파일은 source tree나 CI fixture가 아니므로 P0 실오디오 정확도 acceptance를 대체하지 않는다. + +검증 증적은 pinned npm shim을 사용한 `./scripts/harness/quickcheck.sh` 성공이며, Python `684 passed, 24 skipped`, Python coverage `100.00%`, desktop `218` tests와 configured coverage `100%`, shared-types `21` tests, typecheck/mypy/Ruff/Bandit/security/supply-chain/GitHub bootstrap checks 및 Vite build 성공을 포함한다. 이 결과는 위 exact head에서 실행한 local evidence로만 취급한다. + +#### Security Notes + +- tempo 분석은 기존 validated local-audio 경계 안에 있으며 새 network, URL, subprocess, WebView, IPC 경계를 추가하지 않는다. +- cache/export payload에는 raw `audio_path`와 `beat_times`를 넣지 않고, shared/API 계약은 finite·positive tempo만 허용한다. +- final result cache는 schema v2로 pre-feature 결과를 재사용하지 않으며, 호환 가능한 stem features는 독립된 v1 namespace를 유지한다. + `#1025`의 과거 SHA(`3c459fd033ccd94ad6cc8df6092d9e1ce4a86e6b` 등)는 이 표의 current head가 아니므로, 해당 SHA의 Checks/review를 현재 증적으로 재사용하지 않는다. 현재 merge blocker의 권위 있는 설정도 함께 확인했다. active ruleset `18156473`은 `develop`에 승인 1개, review thread resolution, 16개 required status context를 요구한다. branch-protection REST 응답의 `required_approving_review_count=0`보다 ruleset의 더 엄격한 승인 규칙이 우선하므로, `MERGEABLE`만으로 merge-ready라고 판단하지 않는다. 승인·필수 Checks·thread resolution이 모두 현재 head에 대해 충족될 때만 병합한다. @@ -162,7 +176,7 @@ capability cluster 분류와 착지 후 남는 Gap: (c) **임의 가중치 vs 문헌 기반 값** — `chord_recognizer._build_transition_matrix()`는 `self_prob=0.8`, `related_prob=0.03`, uniform baseline `0.01/n` 등 hand-set 상수를 쓴다("Encodes musical priors" 주석). 방향성(fifth/fourth/relative/parallel)은 음악 이론에 근거하지만 수치는 문헌 교정(calibration)되어 있지 않다. `roles/priority.py`는 숫자 가중치 없는 if-then 규칙이다. PR #732(relative-key prior correction)처럼 사후 수정이 발생해왔다. 교정 방향은 주석 코퍼스(예: Burgoyne et al., 2011의 McGill Billboard)에서 전이 행렬을 최대우도로 추정하고, 관련 HMM/화음인식 문헌(Logan & Chu, 2000; Pauwels & Peeters, 2013; Boulanger-Lewandowski et al., 2013)은 모델링 맥락으로만 사용하며 현재 transition 수치의 parameter source로 간주하지 않는 것이다. tonal pitch space 거리 기반 스무딩(Harte, 2010) 등 대안과 현재 hand-set 값의 코드 복원 RMSE/accuracy 차이를 정량 비교한 뒤, 우세한 값을 상수가 아닌 데이터 산출물로 고정한다. -(d) **테스트 현실성** — `test_numeric_parity.py`(Rust-Python parity), `test_api.py` 등은 합성 입력 기반이다. 현재 PR checkout의 Git tree 및 9장 `find` 검증 기준 test 경로에 `.wav`/`.mp3` 실오디오 fixture가 없다. 실오디오 acceptance는 PR #892(decoded WAV C major), #891(known take verse/chorus recovery)이 열려 있고, 실 YouTube known-stem benchmark는 draft PR #828 + Issue #770 상태다. 별도 exploratory probe로 CC0 공개 피아노 녹음 `FurElise.ogg`(Wikimedia Commons, 176.59초)를 실제 디코더·`TemporalAnalyzer`·SSM segmenter·`ChordRecognizer`에 통과시킨 결과는 각각 `147.7 BPM/404 beats/101 downbeats`, 20개 section, 261개 chord time-segment였지만 harmony confidence가 대부분 low였다. 동일 develop production job은 성공 envelope를 반환했으나 tempo가 없고 arrangement role harmony가 남아 있어, 이 probe는 runtime 연결성 확인이지 정확도 acceptance가 아니다. RMSE/SI-SDR 스타일 정량 임계값 acceptance gate는 아직 없다. +(d) **테스트 현실성** — `test_numeric_parity.py`(Rust-Python parity), `test_api.py` 등은 합성 입력 기반이다. 현재 PR checkout의 Git tree 및 9장 `find` 검증 기준 test 경로에 `.wav`/`.mp3` 실오디오 fixture가 없다. 실오디오 acceptance는 PR #892(decoded WAV C major), #891(known take verse/chorus recovery)이 열려 있고, 실 YouTube known-stem benchmark는 draft PR #828 + Issue #770 상태다. 별도 exploratory probe로 CC0 공개 피아노 녹음 `FurElise.ogg`(Wikimedia Commons, 176.59초)를 실제 디코더·`TemporalAnalyzer`·SSM segmenter·`ChordRecognizer`에 통과시킨 결과는 각각 `147.7 BPM/404 beats/101 downbeats`, 20개 section, 261개 chord time-segment였지만 harmony confidence가 대부분 low였다. 동일 develop production job은 성공 envelope를 반환했으나 tempo가 없고 arrangement role harmony가 남아 있어, 이 probe는 runtime 연결성 확인이지 정확도 acceptance가 아니다. PR #1059의 click-track probe도 tempo cue 연결성과 fail-closed 경로만 확인하며 known-take 정확도 gate가 아니다. RMSE/SI-SDR 스타일 정량 임계값 acceptance gate는 아직 없다. (e) **커버리지/docstring 100%** — Python은 `--cov-fail-under=100` + Ruff D100-D107 docstring 100%가 gate로 작동한다(AGENTS.md, roadmap-completion 문서). JS workspace의 **2026-08-25 snapshot 실측**(source tree commit `d303c93e5e7d9199edb6ce596dcb9a8753f3a5fa`)은 desktop(469 stmts/357 branches/105 funcs)과 shared-types(717 stmts/643 branches/59 funcs) 모두 statements/branches/functions/lines 100%였다. 재실행 명령과 결과 artifact 경로는 각각 `npm run test --workspace @bandscope/desktop` -> `apps/desktop/coverage/coverage-summary.json`, `npm run test --workspace @bandscope/shared-types` -> `packages/shared-types/coverage/coverage-summary.json`이다. 이 수치는 현재 영구 gate를 뜻하지 않는다. gate threshold(`vite.config.ts`, `vitest.config.ts`)는 90으로 Python보다 낮아, 리그레션 시 90~99% 구간이 무단 통과될 수 있다. Gate 상향은 Backlog #10. @@ -377,6 +391,7 @@ World Wide Web Consortium. (2024). Web Content Accessibility Guidelines (WCAG) 2 - `find services/analysis-engine -name "*.py"` -> 모듈 목록(chords/sections/roles/ranges/temporal/separation/transcription/youtube/exports) - `find . -type f \( -path '*/tests/*' -o -path '*/test/*' \) \( -iname '*.wav' -o -iname '*.mp3' \) -not -path './.git/*'` -> 0건(현재 PR checkout에서 test 실오디오 fixture 부재 확인) - 2026-08-29 exploratory runtime probe: [Wikimedia Commons CC0 `FurElise.ogg`](https://commons.wikimedia.org/wiki/File:FurElise.ogg), SHA-256 `8deefb57df989a2b53a6bdd3e59813b6c34d61dca666caa39e53fa9597b378e3`, 실제 decoded duration `176.5867573696145`초. `TemporalAnalyzer` -> `147.65625 BPM`, `404` beats, `101` downbeats; `segment_with_boundaries` -> `20` sections; `ChordRecognizer` -> `261` time-segments, mostly `low` confidence. 이는 test fixture가 아니며 CI acceptance로 재사용하지 않는다. + - 2026-08-30 PR #1059 current-head verification: head `3d2aaa27804bd6113e8e9aee8aff611976698b40`; `./scripts/harness/quickcheck.sh` -> Python `684 passed, 24 skipped`, 100% coverage, desktop `218` tests, shared-types `21` tests, Vite build and repository gates passed. The real click-track probe -> `120.2 BPM`, `15` beats, `steady`, `0` tempo changes. This is a local branch/probe result, not merged-branch or CI real-audio accuracy acceptance. - `sed -n '70,110p' services/analysis-engine/src/bandscope_analysis/chords/chord_recognizer.py` -> hand-set transition prior 확인 - `sed -n '1,40p' services/analysis-engine/src/bandscope_analysis/_native.py` -> bandscope_numeric 커널/parity 확인 - `ls services/analysis-engine/rust && grep -n "maturin" services/analysis-engine/rust/pyproject.toml` -> Rust 커널 위치 확인 From 686c338a33cf23d16d3900237201e2298b128611 Mon Sep 17 00:00:00 2001 From: seonghobae Date: Sun, 30 Aug 2026 01:42:21 +0900 Subject: [PATCH 53/94] docs(gap): record audio policy current head --- docs/product-technical-gap-baseline.md | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/docs/product-technical-gap-baseline.md b/docs/product-technical-gap-baseline.md index d73f32639..0106c1573 100644 --- a/docs/product-technical-gap-baseline.md +++ b/docs/product-technical-gap-baseline.md @@ -137,6 +137,20 @@ PR #1059 (`feat(tempo): surface tempo movement rehearsal cues`)의 현재 증거 `#1025`의 과거 SHA(`3c459fd033ccd94ad6cc8df6092d9e1ce4a86e6b` 등)는 이 표의 current head가 아니므로, 해당 SHA의 Checks/review를 현재 증적으로 재사용하지 않는다. +### 4.3 2026-08-30 canonical audio-resource current-head snapshot + +PR #985 (`feat(analysis): enforce one canonical audio resource policy (#781)`)의 새 current head는 `0e2486a33bb83a644f71fc0e7e57f090c7fcdb02`이며, base는 `develop@749511c3ad4000090048718f685c6bee6b3d2c25`이다. `33d14e44bf7f41dda51b0ee246f7caae088101b9`에서 fast-forward한 후, 숫자 메타데이터가 `float()` 변환에서 overflow할 때도 원시 `OverflowError`를 누출하지 않고 payload-free `non_finite_metadata` 정책 오류로 닫히도록 공용 검증 경계를 보강했다. `10**1000` 회귀 테스트도 추가했다. + +push 직후 동일 head를 다시 조회한 결과 PR은 `OPEN`, `DRAFT`, `MERGEABLE`, `BLOCKED`, `REVIEW_REQUIRED`이며 review thread unresolved count는 0이다. CodeRabbit은 draft라 review를 건너뛴 성공 상태이고, 나머지 hosted Checks는 당시 pending이었다. formal qualifying independent approval은 없으므로 이 증거만으로 병합하지 않는다. 동일 Gap의 이전 draft #866에는 #985를 canonical successor로 남겼고, 중복 PR을 독립적으로 병합하지 않는다. + +로컬 검증은 `services/analysis-engine`에서 targeted policy `59 passed`, 전체 Python `756 passed, 24 skipped`, coverage `100.00%`, Ruff 및 `git diff --check` 성공이다. 이 검증은 새 head의 로컬 증거이며 hosted required gate나 실오디오 정확도 acceptance를 대체하지 않는다. + +#### Security Notes + +- 숫자 메타데이터는 caller/decoder가 공급하는 untrusted input이며, finite·정수성 검증 전에 실패할 수 있는 Python numeric conversion도 payload-free policy error로 정규화한다. +- 수정은 파일 열기, 디코드, URL, subprocess, IPC 경계를 추가하지 않으며, 기존 encoded/decoded resource budget과 local-only 분석 경계를 유지한다. +- `10**1000` overflow 회귀 테스트는 예외 타입과 stable reason code가 외부에 노출되는 경계를 확인한다. + 현재 merge blocker의 권위 있는 설정도 함께 확인했다. active ruleset `18156473`은 `develop`에 승인 1개, review thread resolution, 16개 required status context를 요구한다. branch-protection REST 응답의 `required_approving_review_count=0`보다 ruleset의 더 엄격한 승인 규칙이 우선하므로, `MERGEABLE`만으로 merge-ready라고 판단하지 않는다. 승인·필수 Checks·thread resolution이 모두 현재 head에 대해 충족될 때만 병합한다. 이 snapshot에서 위 PR 중 병합된 것은 없다. `mergeable=true`는 protected review/required-check 완료를 뜻하지 않으며, 승인·current-head review·필수 gate가 모두 충족되지 않은 PR은 병합하지 않았다. admin/self-approval, force-push, protected gate bypass도 사용하지 않았다. From e96b841246e78336496f0302e894981a6ef08305 Mon Sep 17 00:00:00 2001 From: seonghobae Date: Sun, 30 Aug 2026 02:25:44 +0900 Subject: [PATCH 54/94] docs(gap): record real audio loop current head --- docs/product-technical-gap-baseline.md | 15 ++++++++++++++- 1 file changed, 14 insertions(+), 1 deletion(-) diff --git a/docs/product-technical-gap-baseline.md b/docs/product-technical-gap-baseline.md index 0106c1573..6fb74d2b1 100644 --- a/docs/product-technical-gap-baseline.md +++ b/docs/product-technical-gap-baseline.md @@ -85,7 +85,7 @@ flowchart LR | 수동 수정 + provenance | `ManualOverride[]`, `ProvenanceSource = model\|user` | 구현됨 | | 내보내기(cue-sheet CSV, chart JSON) | `exports/chart.py`, `src/lib/export.ts` (filename sanitize, CSV escape) | 구현됨 | | 악보(score) 보기 | `features/score/ScoreView.tsx`, `ScoreViewer.tsx`, `pdfjs.ts` | 부분구현 (PDF 뷰잉; PDF 바이트 검증은 PR 진행 중, 자동 채보 없음) | -| 루프 재생/역할별 재생 제어 | `features/player/index.tsx` | 미구현 (loop 미탐지, PR #903/#971 진행 중) | +| 루프 재생/역할별 재생 제어 | `features/workspace/RehearsalPlayer.tsx` | 부분구현 (PR #1062에서 선택 섹션의 실제 오디오 loop 재생을 연결했으나 role filter와 protected merge는 미완료) | | 협업(assignment/comment/approval) UI | `packages/shared-types` 타입만 존재 | 미구현 (UI 참조 0건; PR 시리즈가 첫 화면 진행 중) | | pad/solo/riff/hook/fill/voicing/articulation/dynamics/tuning/capo/vamp 등 plan 필드 | 없음 (shared-types에 미존재) | 미구현 (PR 시리즈가 추가 예정) | | 라이선싱/데모곡 first-run | 없음 | 미구현 (PR #1009, Issue #964; diagnostics/privacy boundary는 Issue #963) | @@ -151,6 +151,18 @@ push 직후 동일 head를 다시 조회한 결과 PR은 `OPEN`, `DRAFT`, `MERGE - 수정은 파일 열기, 디코드, URL, subprocess, IPC 경계를 추가하지 않으며, 기존 encoded/decoded resource budget과 local-only 분석 경계를 유지한다. - `10**1000` overflow 회귀 테스트는 예외 타입과 stable reason code가 외부에 노출되는 경계를 확인한다. +### 4.4 2026-08-30 real-audio loop current-head snapshot + +PR #1062 (`feat(player): play real audio section loops`)의 current head는 `280310901f63e9e71a8c064b33d719426a9cf1c7`이며, base는 stacked branch `feat/rehearsal-player-first-section-loop@7a59047b004faa7a0b584f3d6d68c94889a452d5`이다. Tauri asset protocol은 startup scope를 비워 두고 native file-dialog 또는 validated YouTube-cache 경로의 canonical exact file만 runtime allowlist에 추가한다. `RehearsalPlayer`는 실제 `