Skip to content

fix: mat-probe가 Windows 11에서 끝까지 돌고, 러너에서 도는 진단 잡을 둔다 - #101

Merged
115dkk merged 12 commits into
masterfrom
claude/mat-probe-runner
Oct 29, 2026
Merged

115dkk merged 12 commits into
masterfrom
claude/mat-probe-runner

Conversation

@115dkk

@115dkk 115dkk commented Oct 29, 2026

Copy link
Copy Markdown
Owner

바뀐 것

  • ssr-live mat-probe의 결함 두 개를 고칩니다.
    • 공간 오디오 클라이언트가 스택의 활성화 인자를 해제해 힙이 망가지던 결함(crates/ssr-sys/src/spatial.rs).
    • Windows 11이 알리는 스테레오 정적 객체 두 개가 이름 목록에 없어 진실 파일의 객체 개수와 상태 개수가 어긋나던 결함(apps/ssr-live/src/mat_probe.rs).
  • 러너에서 mat-probe와 mat-analyze를 돌리는 진단 잡 mat-probe.yml을 둡니다. 수동 실행으로만 돌고, 잡이나 스크립트를 고쳐 푸시해도 돕니다.
  • 시험서명 PC 안내서 3단계와 3-1에 러너에서 확인한 사실을 적습니다. 러너는 홈 시어터 형식을 켜지 못하므로 MAT 덤프는 시험서명 PC에서 얻습니다.

검사

  • cargo fmt --all -- --check
  • cargo clippy -p ssr-sys -p ssr-live --all-targets -- -D warnings
  • cargo test -p decode --lib mat_probe
  • 러너에서 Windows Sonic으로 mat-probe와 mat-analyze가 끝까지 돌았습니다.
  • 나머지 게이트는 이 PR의 CI가 돌립니다.

🤖 Generated with Claude Code

https://claude.ai/code/session_01AAaSH5HMtgvQH6fu47g98R

115dkk and others added 11 commits October 30, 2026 03:09
MAT 안의 PCM 배치는 공개 문서가 없어, 알고 있는 신호를 Windows 공간 음향에
넣고 드라이버 링에 들어온 MAT를 녹화해 둘을 맞춰 봅니다(ADR 0005,
test-signed-pc.md 3-1). 지금까지는 시험서명 PC에서 사람이 떠야 했습니다.

- 드라이버를 driver.yml처럼 시험서명해 설치합니다.
- tools/ci/spatial-format.ps1이 공개 WinRT API
  (Windows.Media.Audio.SpatialAudioDeviceConfiguration)로 우리 엔드포인트의
  공간 음향 지원 여부와 형식별 지원, 지금 형식을 찍고, 형식을 고릅니다.
- Dolby Access를 winget(msstore 원본)으로 설치한 뒤 'Dolby Atmos for home
  theater'를 고르고, mat-probe와 mat-analyze를 돌립니다. 약관 동의 플래그는
  사용자가 2026-10-30에 허가했습니다.
- 덤프, 신호 정보, 기록은 저장소 시크릿 MAT_DUMP_KEY로 암호화한 뒤에만
  아티팩트로 올립니다(AES-256-CBC, PBKDF2 200,000회). 시크릿이 없으면
  아무것도 올리지 않습니다.

각 단계가 어디까지 됐는지 요약에 남깁니다.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01AAaSH5HMtgvQH6fu47g98R
첫 실행(windows-2022, windows-2025)에서 Dolby Access는 winget으로 설치됐지만
세 가지가 막혔습니다.

- spatial-format.ps1이 엔드포인트 0을 '없다'고 했습니다. Windows PowerShell의
  ConvertFrom-Json은 배열을 덩어리 하나로 넘기고, 그 위에서 엔드포인트 0을
  거르는 식이 거짓이 되었습니다. endpoints.ps1을 dot-source해 함수 결과를 씁니다.
- mat-probe 단계는 출력이 없을 때 기록 파일이 생기지 않아 종료 코드를 남기기
  전에 멈췄습니다. bash로 돌려 출력을 파일로 받고 종료 코드를 요약에 적습니다.
- Git Bash의 tar가 D:\a\_temp를 원격 호스트로 읽었습니다(종료 128).
  cygpath로 POSIX 경로를 씁니다.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01AAaSH5HMtgvQH6fu47g98R
두 번째 실행에서 형식 조회가 처음 돌았습니다. windows-2025의 우리
엔드포인트 0은 공간 음향을 지원하고 'Dolby Atmos for home theater'도
지원한다고 답했지만, 그 형식을 고르자 NotSupportedOnAudioEndpoint로
거절했습니다(windows-2022는 AccessDenied). mat-probe는 덤프와 신호 정보
파일을 만든 뒤 아무것도 찍지 않고 끝났고, bash에는 127로 보였습니다.

- 내장 형식 Windows Sonic을 고르는 대조 단계를 둡니다. 형식 고르기 자체가
  되는지, Dolby home theater만 막히는지를 가립니다.
- home theater를 고르지 못하면 Windows Sonic으로라도 켜고 mat-probe를 돌려
  공간 음향 스트림 경로를 따로 확인합니다.
- mat-probe와 mat-analyze를 Start-Process로 돌려 32비트 종료 코드를 남기고,
  WER 로컬 덤프와 cdb 스택(crash-dumps.ps1, 줄 정보 포함 빌드)을 남깁니다.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01AAaSH5HMtgvQH6fu47g98R
세 번째 실행에서 mat-probe는 1.7초 만에 아무것도 찍지 않고 끝났고 크래시
덤프도 없었습니다. 단계 스크립트가 빈 출력에서 기록 파일을 만들지 못해
종료 코드를 남기기 전에 멈췄습니다. 종료 코드와 걸린 시간을 먼저 적고, 빈
출력은 그렇다고 적습니다.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01AAaSH5HMtgvQH6fu47g98R
네 번째 실행에서 mat-probe는 1.2초 만에 0xC0000374(STATUS_HEAP_CORRUPTION)로
끝났습니다. 힙 관리자가 강제로 끝내 출력도 덤프도 없었습니다. 이미지 실행
옵션으로 전체 페이지 힙을 켜 넘쳐 쓰는 순간 접근 위반이 나게 하고, 그 덤프를
cdb로 읽습니다. 공간 음향 형식 고르기를 모두 거절하는 windows-2022는
매트릭스에서 뺍니다.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01AAaSH5HMtgvQH6fu47g98R
다섯 번째 실행에서 전체 페이지 힙을 켠 mat-probe는 0xC0000421(검증기
정지)로 끝났고, 이 정지는 디버거만 보므로 WER 덤프가 남지 않았습니다.
mat-probe를 cdb 아래에서 한 번 더 돌려 정지의 보고(!avrf)와 스택을 찍습니다.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01AAaSH5HMtgvQH6fu47g98R
windows 크레이트의 PROPVARIANT는 버려질 때 PropVariantClear를 부르고,
VT_BLOB이면 스택에 있는 활성화 인자를 CoTaskMemFree로 넘겨 힙을 망가뜨렸다
(0xC0000374). MAT 진단 잡이 전체 페이지 힙과 cdb로 Client::activate 끝에서
이 자리를 잡았다. 변수를 ManuallyDrop으로 감싸 해제하지 않는다.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01AAaSH5HMtgvQH6fu47g98R
Windows 11은 정적 객체 마스크에 StereoLeft, StereoRight(1 << 18, 1 << 19)를
더해 알린다. 우리 이름 목록에는 이 둘이 없어 진실 파일의 객체는 145개인데
사건마다 상태는 마스크로 센 147개를 남겼고, mat-analyze가 진실 파일을 받지
않았다. 두 이름을 더하고, 개수는 마스크가 아니라 실제로 구동하는 객체에서
센다. 147개 객체가 전체 구간(76.5초)을 다 채우도록 상태 한도를 올리고,
진실 파일은 압축 JSON으로 버퍼에 모아 쓴다.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01AAaSH5HMtgvQH6fu47g98R
windows-2025는 홈 시어터 형식을 지원한다고 답하면서도 엔드포인트 0에서는
NotSupportedOnAudioEndpoint로 거부한다. 형식을 고르는 동안 KS 요청 추적을
걸어, 고를 때 우리 필터에 어떤 형식을 묻고 무엇을 답했는지, 아니면 아무것도
묻지 않고 엔드포인트 속성만으로 정하는지 본다.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01AAaSH5HMtgvQH6fu47g98R
KS 추적을 보니 홈 시어터 형식을 거부하는 동안 우리 필터에는 아무 요청도
오지 않았다(뒤이은 Windows Sonic만 48 kHz 스테레오 PCM을 제안했다). 거부는
엔드포인트 빌더가 저장한 값에서 나오므로, 인코딩 형식을 포함한 엔드포인트
속성을 모두 남긴다.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01AAaSH5HMtgvQH6fu47g98R
windows-2025 러너는 엔드포인트 0의 인코딩 형식에 MAT 2.0과 2.1을 저장하고
홈 시어터 형식도 지원한다고 답하지만, 기본 형식으로 고르면
NotSupportedOnAudioEndpoint로 거부하고 그동안 우리 필터에 아무것도 묻지
않는다. 그래서 3단계의 질문과 3-1의 MAT 덤프는 시험서명 PC에서 얻어야
한다고 적고, CI가 Windows Sonic으로 mat-probe의 스트림 처리만 확인한다고
적는다.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01AAaSH5HMtgvQH6fu47g98R
@115dkk
115dkk enabled auto-merge (squash) October 29, 2026 21:33
컨트롤을 누르면 컨트롤러는 의도를 보낸 뒤 스냅샷을 1초까지 기다렸다 다시
그린다. 시험의 모의 API는 스냅샷을 내지 않으므로, 파일의 마지막 시험이 그
1초 안에 끝나면 환경이 정리된 뒤에 그려 "document is not defined"로 vitest가
실패했다(PR #101의 screens 잡, skin-console.test.ts). 화면의 root가 문서에
없으면 그리지 않고, 시험 설정은 시험마다 body를 비운다.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01AAaSH5HMtgvQH6fu47g98R
@github-actions

Copy link
Copy Markdown
Contributor

이 PR의 화면 갤러리, 기본 스킨: #102 (화면이 바뀌어 다시 찍을 때마다 그 이슈의 본문이 바뀝니다)

@github-actions

Copy link
Copy Markdown
Contributor

이 PR의 화면 갤러리, 전면 패널 스킨: #103 (화면이 바뀌어 다시 찍을 때마다 그 이슈의 본문이 바뀝니다)

@github-actions

Copy link
Copy Markdown
Contributor

이 PR의 화면 갤러리, 콘솔 스킨: #104 (화면이 바뀌어 다시 찍을 때마다 그 이슈의 본문이 바뀝니다)

@115dkk
115dkk merged commit 6e16338 into master Oct 29, 2026
50 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant