56 lines
3.8 KiB
Plaintext
56 lines
3.8 KiB
Plaintext
2026-10-14 UTC — 배포 후 오디오 캐시 회귀 수정
|
|
|
|
발견 원인
|
|
- v0.1 → v0.1.1에서 intro 1개·목표 100개 WAV 내용이 바뀌었지만 파일명은 동일하다.
|
|
- src/game.ts와 src/audio/engine.ts가 버전 없는 /audio/*.wav URL을 요청했다.
|
|
- 사용자 보고에 따르면 배포 Nginx는 /audio를 7일 캐시한다. 기존 URL의 캐시가
|
|
유효한 사용자는 이전 음성을 계속 받는다. 이 작업은 원격 서버에 접속하지 않았다.
|
|
- 배포 문서는 expires -1을 가정했고, 브라우저 요청 관찰의 URL.endsWith('.wav')와
|
|
404 route의 **/audio/*.wav glob도 query string을 처리하지 못했다.
|
|
|
|
실제 RED → GREEN 순서
|
|
1. 앱 소스를 그대로 두고 unit/browser 계약 테스트를 먼저 작성했다.
|
|
기존 endsWith 판정을 공용 테스트 helper로 추출했으며 RED까지 동작은 그대로다.
|
|
2. 01-unit-red.log: 5 failed / 12 passed / exit 1.
|
|
목표 100개 버전, intro·target fetch, intro/target 각각 404 retry,
|
|
query 순서와 무관한 pathname 판정 및 가짜 .wav query 배제를 검출했다.
|
|
3. 02-build-before-fix.log: 수정 전 앱 production build 성공.
|
|
4. 03-browser-red.log: sandboxed Chrome desktop 4 failed / exit 1.
|
|
101개 URL, 실제 앱 요청/정답 mapping, intro/target 404 계약이 모두
|
|
v=null 대신 v=0.1.1을 기대하는 assertion에서 실패했다.
|
|
5. 04-red-state.json: 위 RED 완료 시점의 production source diff가 비어 있음을 기록.
|
|
6. 그 뒤 src/audio/assets.ts 한 곳에 AUDIO_ASSET_VERSION="0.1.1"과
|
|
audioAssetUrl을 정의하고 intro·target에 함께 적용했다.
|
|
테스트 요청 관찰·404 route·정답 mapping·101개 manifest 대응은 pathname 기준이다.
|
|
7. 05-unit-green.log: 같은 대상 17 passed / exit 0.
|
|
8. 09-browser-green.log: desktop/mobile 전체 16 passed (2.6m) / exit 0.
|
|
|
|
최종 검증
|
|
- npm run lint: PASS (06-lint.log, ESLint + TypeScript).
|
|
- npm test: PASS, 12 files / 65 tests, skip 0 (07-full-test.log).
|
|
Python 생성기 18개 계약도 기존 npm test runner를 통해 통과했다.
|
|
- npm run build: PASS, WAV 101개 hash 및 runtime notice 전문 (08-build.log).
|
|
- env -u PLAYWRIGHT_NO_SANDBOX CHROME_PATH=/usr/bin/google-chrome DEBUG=pw:browser
|
|
npm run test:browser: PASS, desktop/mobile 전체 16개, skip 0.
|
|
- 두 viewport 모두 실제 음성으로 10문제 완주·재청취·정답 mapping·intro/target
|
|
각각 404 복구·키보드·레이아웃·axe를 통과했다.
|
|
- 두 viewport 각각 101/101 query URL 요청·SHA-256·bytes·24kHz mono decode·
|
|
duration·RMS·peak 통과. 외부 페이지 요청 0, 페이지 JS 예외 0.
|
|
- Node 26.7.0 / npm 11.19.0 / system Chrome 146.0.7680.80.
|
|
- 11-sandbox-green.log: Layer 1 Namespace, PID/Network namespaces,
|
|
Seccomp-BPF/TSYNC 활성. 실제 실행 인자 --no-sandbox 없음.
|
|
10-sandbox.log는 보조 검사에서 Chrome 상태 라벨을 'Namespace sandbox Yes'로
|
|
잘못 가정한 실패 기록이다. 실제 표시 'Layer 1 Sandbox Namespace'와
|
|
PID/Network Yes를 검사하도록 보조 probe를 고친 뒤 11번에서 통과했다.
|
|
앱·Playwright sandbox 설정은 바꾸지 않았다.
|
|
|
|
기록 및 범위
|
|
- 제품 0.1.1 유지. WAV/manifest 재생성 및 package/lock 변경 없음.
|
|
- 런타임 버전 조회·외부 TTS/API 호출 없음. 저장 WAV의 상대 URL query만 추가했다.
|
|
- 스크린샷은 test-results/에 저장 후 이번 artifacts/로 복사했다.
|
|
과거 verify_browser.mjs, 로그, 스크린샷은 수정하거나 다시 실행해 덮어쓰지 않았다.
|
|
- 00-baseline.json의 기존 evidence 149개, 오디오 102개, 기존 RESULT.md,
|
|
package/lock 포함 총 254개 파일은 최종 13-final-integrity.json에서 해시 대조한다.
|
|
- .agent/RESULT-v0.1.1.md에는 이번 결과를 뒤에 추가한다.
|
|
- Git commit/push/tag/merge 및 서버 배포 실행 없음. 로컬 production preview만 사용했다.
|