Files

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만 사용했다.