27 KiB
MagnetismHeroes 개발 인수인계
작성일: 2026-10-05. 사용자가 “작업을 잠시 중단하겠습니다. docs/handoff.md 문서에 인수인계 문서를 작성해주세요.”라고 요청했다. 개발을 중단했다. 사용자가 다시 재개를 요청하기 전에는 개발·검사·독립 검토를 자동으로 계속하지 않는다.
재개 기록: 같은 날 사용자가 이 문서를 읽고 작업을 계속하라고 요청했다. 중단 요청은 해제됐으며 T7의 미완료 Android 검사와 필요한 최소 수정을 재개한다. 아래 중단 당시 상태와 실제 최신 Git·검사 기록을 구분한다. T1~T6를 다시 개발하지 않는다.
재개 후 최신 확인 상태
- T7 담당자는
/root/presentation_resume, 독립 검토자는/root/presentation_spec_review다. Unity·AVD·ADB 조작과 T7 소스 수정은 구현 담당자 한 명만 수행한다. - 최종 검사 소스는
dffd90b1b8979eb790bacb6c0eb1889851d7accc다. 실제 EditMode 100/100, PlayMode 47/47, Android 기본 검사 65/65, 별도 빠른 계수 검사 36/36, Android 숫자 가독성·분리 회귀 9/9이 통과했다. 네 가지 검증 명령과 두 추가 검사 명령의 실제 종료 코드는 모두 0이다. 실패·건너뜀·미확정 검사 없이 고정 소스/검사 전후 clean을 확인했다. - 설치된 APK·빌드 APK·호스트 APK 해시는 모두
88DB5288275FA31B35F5BC301DA94D24E49EB6BDFF273A6F924F5BC90C02E604이다. 최신 체험용 파일은artifacts/android/T7/MagnetismHeroes.apk이며 최종 음원 인수와 T8 완료를 의미하지 않는다. 승인 음성 44개의 원본·편집본·런타임 해시 132개가 일치하고 사용 고지 3개도 APK에 포함됐다. - 빠른 계수 검사는 합법적인 Stage20 수집 완료/계수 전 QA 배치를 복원한 뒤 실제 Android 입력 11회(중복 탭 포함)를 약 1.028초에 수행했다. 하나~열의 전체 발화와 순서, 같은 구 ID·위치·카메라의 자유 놀이 전이가 확인됐다. 마지막 발화 끝 8.193375초는 PCM 전체 길이 23.616초 안에 있다. 정상 새 저장에서 30개 스테이지를 모두 진행한 증거는 아니다. 검사 후 음량 5/5/5와 네트워크 0/1/1을 실제로 복원했다.
2970의 원시 검사·실패 이력·APK는 루트artifacts/verification/T7/Freeze2970/에 3,669개 파일과 해시 목록으로 보존했다. T7 작업 디렉터리에도Implementation/freeze2970-*사본이 있다.- 최신 독립 검토는 현재 허용된 구현 범위
pass다. 기존SPEC-01은 같은 구·배경·카메라를 보존한 숫자 전용 재질 수정으로 해소했다. 실제 기존 재질에서 숫자 2의 글자 픽셀 기여 약 17%로 실패하는 RED와 수정본 100% GREEN, 실제 Android의 동일 문제 배치 화면을 보존했다. 정상 Stage13의 실제 두 구 선택·끌기→3+2 자유 놀이·회전 검사와 Stage9 원래 기하 QA 복원 검사는 구분했다. JSON 소수 표현 차이는 양측 IEEE32-bit 값의 정확한 일치로 검증하며 허용 오차로 통과시키지 않았다. - 최종 원문은 루트
artifacts/verification/T7/Final/에 2,720개 파일과manifest.json으로 보존했다. 독립 검토는Review/spec-independent-dffd/review-dffd.json, 추가 검사·설치/프로세스/볼륨/캡처 시각 경계는Implementation/number-depth/, 네 검사 원문은Content/와Implementation/resume/에 있다. 기존 RED·실행 준비 실패·잘못된 부분 글자 검사·녹음 경로 준비 실패도 보존했다. 소스 통합 관계는source-relationship.json으로 기록한다. - 검증된 구현 범위를 루트 dev에 통합했다. 통합 커밋은
ed73a845e876e8bf6482bedb16e994b9c6a748b9이며, 고정 검사 소스dffd와의 차이는 인수인계 문서뿐이다. 앱·자산·검증 도구의 모든 tracked blob은 동일하다. T7 전체 완료로 표시하지 않으며 T8도 시작하지 않는다. 최종 효과음·배경음악은 사용자가 나중에 선택하기로 한 별도 미완료 인수 항목이다. 임의 음원으로 대체하지 않는다. 다음 개발은docs/audio-requests.md의 사용자 선택 파일에 대해 출처·사용 조건·연결·편집·반복/믹싱을 검증해 T7을 마친 뒤 T8을 수행하는 순서다. 새 자산 작업 전에 보존된 T7 작업 브랜치를 최신 dev 문서 커밋까지 fast-forward하고 소유권을 확인한다. - 실행 중인 Editor·녹음·QA는 없다. AVD launcher 29360/qemu 28508/ADB 24536은 유지했다. 최신 실행 소유권과 소스/통합 경계는
.dryforge/temp/go-runtime.json과 실제 Git 상태를 확인한다. 작업 디렉터리와 과거 실패 원문을 임의 삭제하지 않는다.
이 문서의 현재 상태가 이전 중단 기록보다 우선한다. 승인된 요구사항 원본은 .dryforge/handoff.md, .dryforge/spec.md, .dryforge/plan.md다. 과거 인수인계는 Git 이력과 .dryforge/temp/handoff-before-pause-20261005-075205.md에 보존했다.
1. 이전 중단 당시 지점
T1~T6는 구현·검증·독립 검토를 마치고 루트 dev에 통합했다. T7의 카툰 외형·승인 음성 통합은 별도 작업 디렉터리에 있으며, 최종 Android 검사와 독립 검토가 끝나지 않았다. T8은 시작하지 않았다.
| 항목 | 확인한 상태 |
|---|---|
| 프로젝트 루트 | C:/git/MagnetismHeroes |
| 루트 브랜치 | dev — 로컬 개발 기반, 원격 게시·스토어 배포 없음 |
| 문서 작성 전 루트 HEAD | dd471eb — 나머지 40개 음성 승인 기록만 추가 |
| T7 작업 디렉터리 | C:/git/MagnetismHeroes/.dryforge/worktrees/T7 |
| T7 브랜치 | dryforge/T7 |
| T7 기반 커밋 | a383bc9d13155553b1fdaa72e6d126f2ff81d57b |
| T7 마지막 고정 소스 | 9aa9e3c7091a27dd207f43850620e8c0d9a2c6a2 |
| 실행 기록 | .dryforge/temp/go-runtime.json |
| 직전 구현 담당자 | /root/presentation_implementation — 재개 시 생존 상태·소유권 재확인 |
루트에서 T7 기반 이후 수정한 제품 파일은 없다. 루트의 후속 변경은 docs/handoff.md뿐이다. 재개 시 T7을 무조건 rebase/pull하지 말고, 실제 검사 소스와 통합 소스의 차이가 이 문서에만 한정되는지 확인한다.
중단 정리 후 실제 Git 상태에는 ProjectSettings/ProjectAuditorSettings.asset, ProjectSettings/QualitySettings.asset 두 파일의 자동 개행 변경이 있다. 각 working blob과 HEAD blob이 같다는 원문을 보존했으며 원복하지 않았다. 재개할 때 실제 상태를 다시 확인한다. 파일 전체의 정규화된 blob이 HEAD와 같은 경우에만 허용된 개행 정규화를 한다. 의미 있는 설정 변경을 덮어써 숨기지 않는다. 아래 제안된 렌더 재사용 수정·새 RED/GREEN·시작 준비 검사 수정은 아직 작성·적용되지 않았다.
작업 디렉터리·제작 산출물·검증 원본은 일부 Git 제외 대상이다. 저장소를 복제하거나 이동할 때 .dryforge, artifacts와 제작 환경·원본도 함께 보존해야 한다. 실패 WAV·PCM·APK·로그·이전 고정 소스를 삭제하지 않는다.
2. 확정 완료된 검사
| 단계 | 검사한 소스 | 실제 결과 |
|---|---|---|
| T4 | 08ce71c0a2c7ce9e5504c7a461252bdbfd295c0b |
Edit79/79, Play31/31, Android23/23, 독립 검토 pass |
| T5 | babaee3608d8e8fdc3c172bd6055aa2f480c3811 |
Edit87/87, Play34/34, Android 일반56/56·오프라인56/56, 독립 검토 pass |
| T6 | ccc8b77cf52e1a591f900ce25cf4c16b1d92b9f8 |
Edit97/97, Play40/40, AndroidSmoke48/48, 추가30번10/10, 독립 검토 pass |
실제 통과 검사에는 건너뜀·불확정이 없고 종료 코드가 0이다. T5의 주 파일 누락 시 유효 백업을 무시하던 결함은 수정·재검증됐다. 이전 인수인계의 미해결 T5 결함을 다시 작업하지 않는다.
- T5 통합:
60f8a55bb9b3f690ce9c9e5eaffe09930d321da6. APK:artifacts/android/Persistence/MagnetismHeroes.apk, SHA-256974BA14310F020BB42DFFDF4BBE76CBB7249A9FE797853B8158B9BD700AB9D35. - T6 통합:
9d8e93970476170143f78f9c675dbf78f1ec8107. 검사 소스와 전체 Git 트리가 같다. 루트 APK:artifacts/android/Content/MagnetismHeroes.apk, SHA-2562F9F31D796AB568FE7814A8930B3C64153CECD7AEDF1F42DB916FD55FBDE02DE. - T6 원본 923개와 독립 검토 원본 44개는
artifacts/verification/T6/Implementation/,IndependentReview/에 있다. 상위 manifest/source-relationship JSON으로 원본·복사본 해시를 확인했다. 설치된 base.apk도 같은 SHA다. - T6는 30개 정의·55개 수집형 구의 발견/집기/끌기·세 배경 테마·도움·첫 합체/분리 시범을 검사했다. 추가30번은 앞 단계 완료 기록을 주입한 QA 경로다. 새 저장에서 정상 진행으로 30개 전부를 Android에서 해결한 증거는 아직 아니다.
3. T7 구현과 실제 검증 범위
T7 소스는 아직 루트에 통합하지 않았다. 작업 디렉터리의 주요 변경은 다음과 같다.
- 기존 구 위 대표 얼굴·얇은 마스크, 여섯 표정, 묶음별 얇은 리본 망토, 접촉부의 빛과 짧은 합체·분리 반응을 구현했다. 장식에는 입력 collider를 추가하지 않았다.
- 숫자는 TMP 실제 텍스트다. 현재 발화 중인 숫자도 화면에 표시한다. 원래 구의 반지름·ID·기본 배치·수량/성공 조건·JSON v1 계약은 유지한다.
- 카메라의 표시 FOV는62, 고정 시각 pivot은
(0,.65,0)이다. 저장된 원시 CameraState는 바꾸지 않는다. 새 자유 놀이 공급 위치의 행 간격은1.8이며 저장/사용자 배치는 바꾸지 않는다. tools/android/exercise-{content,composition,persistence}.ps1의 구 좌표 투영을 실제 FOV/pivot에 맞췄다. 기존 UI/터치 일부는 단일 2400×1080 AVD를 전제로 하므로 범용 해상도 지원 증거로 확대하지 않는다.GameSound는 기존 Voice/SFX/Music Mixer 연결·발화 중 음량 조절·화면 이동/일시 정지 정리·음악 재개를 제공한다. 사용자 미제공 SFX/BGM 클립은 null이다. 실제 음향 완성은 아니다. 음악 pause 재개 결함의 실제 RED/GREEN은Implementation/red/music-pause-*.json,green-v5-*.json에 있다.
마지막 고정 소스 9aa9e3c의 실제 검사:
| 검사 | 결과 |
|---|---|
| EditMode | 100/100, 실패·건너뜀·불확정0, 종료0 |
| PlayMode | 44/44, 실패·건너뜀·불확정0, 종료0 |
| AndroidBuild | 종료0, APK 생성 및 검사 통과 |
| AndroidSmoke | 미통과 — 실패 원본 보존, 시작 준비·녹음 경계 진단 중 |
T7 APK는 작업 디렉터리 안의 artifacts/android/Content/MagnetismHeroes.apk다. SHA-256은 EF6952EC2578724983600B9B69DA00922DE65C5AC35BE3E49ABFF7975EC1A09F다. 루트 Content APK의 T6 SHA와 혼동하지 않는다.
APK ZIP에서 assets/Notices/NotoSansCJK-OFL.txt, TTS-Apache-2.0.txt, TTS-model-card.txt의 존재와 각 소스 byte SHA 일치를 확인했다. Implementation/apk-notices-byte-verification.json이 원본이다. 이전 977c68a APK는 Qwen 고지 파일명 때문에 제작 환경 제외 검사에 걸렸고, 에디터 API로 고지 파일명만 바꾸어 새 소스를 고정했다. 제외 검사 자체를 완화하지 않았다.
외형 증거: T7/artifacts/verification/T7/Implementation/editor-play/final-*.png/.json. final-capture-host-index.json의49개 PNG+JSON98해시는 루트에서 모두 대조했다. Editor Camera.Render RT와 임시 Canvas/화면 비율·안전영역 시뮬레이션이며 Android나 실기기 캡처가 아니다. 합성 5인 직선/입체 보드는 명시된 렌더 fixture이며 실제 퍼즐 성공 증거와 구분한다. 2+3→5와 떨어진 두 구 선택/5→2+3·취소·복원은 실제 Session 경로의 증거도 있다.
루트는 서로 다른 두 5인 배치, 10인/평면/입체 회전, 2+3 개요·미리보기·확정, 5+5, 떨어진 두 구 선택·분리, 태블릿10개 공급 화면을 직접 확인했다. 기록은 .dryforge/temp/T7-root-visual-review-9aa.json에 있다. 숫자와 얼굴의 관계를 확인한 정지 화면으로 접촉 빛의 전체 시간 흐름까지 검증했다고 주장하지 않는다.
Editor 측정의 음성 메모리는16,168,748B, 텍스처는 최대25,347,196B였다. Camera.Render 호출 비용과 UnityStats는 Editor 범위 관찰값이다. GPU overdraw·Android 전체 프레임 성능·실기기 성능 합격은 아니다.
4. 음성 승인과 자산 원본
현재 채택 음성44개는 전부 사용자 청취 승인됐다. 이전 “세 개만 승인” 상태는 더 이상 현재 상태가 아니다.
- 최초3개:
count_01,guide_collect,guide_count, 사용자 답 “세 파일 모두 괜찮습니다”. - 수정
count_08: 사용자 답 “새 음성 괜찮습니다”. 승인 SHAfa8034948f6ac3e289e8e7e9fb447943760d4ed5ac577c8ab0c961c608fe49c2, 대본여덟., run20261005T043059823226Z_abdd0294. T7에 교체했고 기존 WAV meta GUID를 유지했다. - 나머지40개: 사용자 답 “나머지 40개도 괜찮습니다”. 원문·질문 ID·40개 SHA는
artifacts/audio-preview/Content/user-approval-remaining40.json및 T7SourceAssets/Audio/Voice/reviews/에 있다. - 거절된 이전8 SHA
6bde9265a8e4ac5a4209b1ddcebf57251430bd2eb5134a59af403f351a640aa2는 승인 대상이 아니다. 이전 후보 WAV·manifest·페이지는 보존했다. artifacts/audio-preview/Content/index.html은 승인44개와 새8을 재생한다. 원래 후보candidate-record.json은 변경하지 않았다. 전체44에는 필수43개와 선택demo_composition이 포함된다.- T7
SourceAssets/Audio/Voice/active-adoption.json의 제작 원본·편집본·runtime44개 총132 SHA를 루트가 대조하여 모두 일치했다. 아직 최종 새 소스/APK에서의 실제 재생 완료를 의미하지 않는다.
AI 얼굴 원본은 T7 SourceAssets/Art/Faces/face-expressions-v2.png, 런타임 Presentation/Textures/FaceExpressions.png이다. 동일 SHA 0E3C115619C4AE68CF8859CCBC6D4BFB3A26A1A247B3DDB41327C46829540C98, RGBA1536×1024·3×2 셀. 실제 imagegen 도구로 생성/수정했고 픽셀 원본은 유지했다. Unity Sprite.Create 셀/pivot만 조정했다. provenance.json에 프롬프트·원본·해시가 있으며 도구가 제공하지 않은 모델 이름을 추정하지 않는다. Numberblocks 자산을 가져오지 않았다. Python으로 이미지 픽셀을 편집하지 않는다.
효과음·음악은 사용자가 나중에 선택하기로 했다. 요청은 docs/audio-requests.md다. 임의 음원·직접 작곡·AI 음악·유료 구매로 대신하지 않는다. 실제 SFX/BGM 재생·발화와의 혼합 청취·음악3회 반복 인수는 열려 있다. 이 항목을 통과로 표시하여 T7/T8 전체 완료로 넘어가지 않는다.
5. 재개 시 해결할 Android 검사
원본 증거 위치는 모두 T7 작업 디렉터리의 artifacts/verification/T7/Implementation/ 및 artifacts/verification/Content/다. 이전 고정 소스와 실패는 각 native-*-failure/source-freeze 폴더에 보존한다.
- 첫 실행 준비: 기존 Content 도구는 시작 뒤6500ms만 기다려 검은 화면/Unity 시작 화면에서 조작·저장 검사를 진행한 실패가 있다. PID·실제 시작 화면 UI·유효 schemaVersion1 저장을 bounded 관찰하는 최소 QA 수정이 필요하다. 고정 대기를 무작정 늘리거나 파일 존재만으로 준비됐다고 처리하지 않는다. 제품에 debug 서버를 추가하지 않는다. assertion·fixture·음성 비교 기준은 유지한다. QA 사본의 진단 결과를 원문
tools/verify.ps1실행의 통과로 대신하지 않는다. - 숫자1~10 실제 재생: 원래 Content의11개 음성 대조에는 숫자1만 포함된다. R11/R14의1~10 확인을 별도로 수행 중이다. 실제20번의10개ID를 사용한 수집완료/계수0 QA 저장→실제 native tap→계수·FIFO·10완료 경로이며, 정상30개 진행 증거는 아니다. 빠른/느린 입력 모두 일부 whole/window 비교가 실패해 아직 전체 통과가 아니다.
- 녹음 누락 진단: 처음4번의 quiet 마지막100ms에서10ms 무음/지연을 관찰했다. 발화 중 PNG를 없앤 뒤에도2번 등이 실패했고, 느린 입력도 실패했다. 화면 캡처나 Render만이 원인이라고 확정하지 않는다. AudioFlinger의 underrun 관찰과 raw PCM/logcat을 보존했다. 성공해야 할 기준을 낮추거나 발화 속도·길이·검사 구간을 바꾸지 않는다.
- 녹음 생명주기: 긴 녹음의 후처리 완료 전에 WaitForExit30이 끝난 실패와, 기존 recorder가 살아 있을 때 복원 recorder를 시작한 race가 있었다.
count10-exercise.ps1,count10-slow-exercise.ps1,run-native-content-qa.ps1등의 진단 사본은 별도 증거다. 실제 PID·시작/종료·exit 기록을 확인하며 모든 recorder 종료를 기다린 뒤 원복한다. 녹음 시간·tap·비교 대기 경계를 맞춘다. 발화 중 잦은 PNG를 제외하되 빠른 입력 자체를 느리게 바꿔 인수 통과로 처리하지 않는다. - 다음 코드 후보:
BoardPresenter.Render는 계수만 바뀌어도 기존 구/배지를 모두 Destroy/Create한다. 실제 Editor에서 동일10구/1badge Render10회 호출 총5.9584ms, 기존view 보존0/10을 관찰했다.count-render-before.json,count-render-measure.cs가 원본이다. 지연된 Destroy/GPU/Android 오디오 비용까지 측정한 것이 아니다. 동일ID·구성·위치의 계수 갱신에서 기존view를 재사용하는 최소 분기와 실제 identity RED/GREEN을 준비하려다가 중단했다. 아직 해당 수정·새 테스트 통과가 없다. 일반 pool/프레임워크로 확장하지 않는다. 실제 Android 빠른1~10 전체 발화로 효과를 판정한다.
녹음·기기 설정 복원
- 공식 scrcpy4.1의 AudioRecord REMOTE_SUBMIX로 원시 stereo48k PCM16을 보존하고
(left+right)/2mono48k로 대조한다. gRPC 녹음에서 긴 발화 실패를 기존 APK에서도 재현했으므로 이 경로를 사용한다. 제품에는 recorder·모델·서버를 넣지 않는다. compare-audio.ps1 -RequireFullSpeech: 전체 상관≥.95, RMS>32, 비무음 샘플>100, 동일 onset의100ms 창/50ms 간격, source활동 RMS32 이상인 모든 창≥.95. 창0개·짧음·누락은 실패다. 시간축 변환·최적 부분 발췌로 대신하지 않는다. T6의 정상1개/훼손6개 대조와 독립 재계산 증거를 유지한다.- 녹음 장치 remote_submix의 실제 음량15가 필요했던 선행 증거가 있다. speaker15만으로 같은 gain이라고 가정하지 않는다. 활성 장치 실제 readback을 확인한다. 키 입력만 이용한 복원에는 실패가 있었으며 실패 원문을 보존했다.
- 이 AVD에서 무인자
adb shell cmd audio는 실제 도움말을 출력했다.cmd audio help는 exit0/빈출력이었으므로 지원 확인 증거가 아니다. - 모든 recorder 종료 뒤 실제 지원된
cmd audio set-volume 3 5,cmd audio set-device-volume 3 5 32768,cmd audio set-device-volume 3 5 1073741824로 speaker/remote_submix/default를 명시 복원했다. 각 명령exit0와 실제 STREAM_MUSIC readback 5/5/5, network airplane0/wifi1/data1, restoredtrue를audio-shell-device-restoration.json에서 루트도 확인했다. 현재 사용 중인 장치와 비활성 장치의 API 동작을 구분하고, 명령exit0만으로 복원 성공을 추정하지 않는다. - 재개·중단 때 기기 상태는 다시 확인한다. 현재 캡처를 건드리는 다른 ADB/에뮬레이터 담당자를 동시에 두지 않는다.
6. 재개 순서와 완료 조건
- 이 문서와
.dryforge/handoff.md→spec.md→plan.md, 아래 go 스킬/참조를 읽는다. 실제 루트·T7 HEAD/git status와 실행 중 프로세스를 대조하고 단독 Unity/AVD 담당자를 정한다. - 중단 WIP와 원문을 보존한 채 위 시작 준비·녹음 경계·계수 렌더 갱신 문제를 최소 수정한다. 의미 있는 실제 RED/GREEN과 기존 수량/배치/계수/선택/복원 회귀를 확인한다. 원인 미확정 녹음 실패도 별도로 남긴다.
- 새 소스를 커밋·고정한 뒤
tools/verify.ps1의 Content EditMode/PlayMode/AndroidBuild/AndroidSmoke 네 명령을 실제 실행한다. 양수 테스트 수·전부 통과·건너뜀/불확정0·각exit0·시작/끝 소스 경계·허용 정규화 후 clean을 보존한다. 과거9aa의100/44를 새 소스 검사로 대신하지 않는다. - 같은 최종 APK의1~10 빠른 계수/FIFO/마지막10, 오프라인 안내·전환·일시 정지·복원을 확인한다. 설치된 base.apk와 host/build SHA가 같아야 한다. notices ZIP byte 검사·채택44음성 해시·제작 환경 제외도 확인한다.
- 새 독립 T7 명세 검토자를 fresh context로 지정한다. 명세와 frozen raw diff·검사/PNG/PCM 원본을 제공하고 구현자의 자기 평가를 근거로 주지 않는다. 제품/규칙/JSON/30정의 보존, 외형·입력·음성/출처를 검토한다. 미제공 SFX/BGM 인수를 숨기지 않는다. 통합은 실제 검토 결과·변경 범위·소스 대응이 확인된 뒤만 수행한다.
- 사용자 선택 음원이 필요한 최종 인수는 남긴다. T7 전체 완료 전 T8로 순서를 바꾸지 않는다. T8은 최종 APK에서 새 저장 정상30개 진행, 대표1/6/9/10/13/14/20/30, 두 개별 미완료+최근 자유 놀이, 오프라인 전체 음향 등을 검증한다. QA 주입은 정상30개 완료 증거가 아니다.
- 전부 완료되면 통합 소스 전체 검사를 실제 수행하고, 지속 문서·최종 독립 검토·go의 사용자 승인·계획 보관 절차를 진행한다. 아직 전체 완료·최종 승인·보관·정리는 수행하지 않았다.
네 검사 명령은 T7 작업 디렉터리에서 실행한다. Android 실행 전 단독 기기 소유·부팅/화면 준비·녹음 준비·오프라인 안정화 조건을 실제 확인하고, 끝나면 환경을 복원한다.
pwsh -NoProfile -File tools/verify.ps1 -Phase EditMode -Milestone Content
pwsh -NoProfile -File tools/verify.ps1 -Phase PlayMode -Milestone Content
pwsh -NoProfile -File tools/verify.ps1 -Phase AndroidBuild -Milestone Content
pwsh -NoProfile -File tools/verify.ps1 -Phase AndroidSmoke -Milestone Content
7. 개발 경계와 적용 지침
go 스킬: C:/Users/baram/.codex/plugins/cache/dryforge/dryforge/1.3.7/skills/go/SKILL.md.
기본 참조는 references/orchestration.md, graph-contract.md, implementer-prompt.md, spec-review-prompt.md; 최종 단계에는 harness/final-review/archive 참조를 읽는다. 그래프는 T1→T2→T3→T4→T5→T6→T7→T8, 모두RISKY, regen_barriers는 빈 배열이다. 위험 작업의 별도 구현 담당자와 독립 검토는 호출된 스킬의 요구다. 관련 없는 위임·병렬 AVD/Editor 조작을 하지 않는다.
- 순수 C# Core, 상태 머신·Presenter·저장 인터페이스·직접 시작 연결을 유지한다. 범용 DI·MVVM·이벤트 프레임워크를 추가하지 않는다.
- 구ID·같은 반지름·기본 배열·묶음 수량의 다중집합 목표·30개 스테이지·JSON v1을 바꾸지 않는다. 선택/연출은 저장하지 않는다. 복원은 같은 원시 CameraState로 한다.
- 숫자 음성은FIFO다. 동일 보드 성공→자유 놀이와 나누기 취소는 마지막 숫자를 끊지 않는다. 상태변경은 오래된 안내만 취소한다. 화면 이동/앱 pause는 이전 큐를 비운다.
- Unity 장면/프리팹/ScriptableObject는 에디터 API로 제작한다. YAML 수동 편집을 하지 않는다. Main 연결 GUID와 패키지/제품 설정을 불필요하게 바꾸지 않는다.
- 설정 dirty 경계는 원문 보존 뒤 지정된 전체 blob 동일 개행만 정규화한다. URP GlobalSettings의 정확한 파생14rid→빈목록 예외는
.dryforge/temp/T5-derived-URP-decision.json에 근거가 있다. 다른 변화에 확대하지 않는다. - 아직 첫 개발 주기이며
.dryforge/status.json은 없다. 전체 완료 전 active 세 문서를 삭제/보관하거나 완료 표식을 쓰지 않는다. branchdryforge/T6라는 미사용 브랜치가60f8a55에 남아 있다. 마지막 안전 정리 때 실제 보존·조상 관계를 확인한다. 작업 디렉터리/미통합 브랜치를 임의 삭제하지 않는다.- 모든 사용자 설명·인수인계·지속 문서는 한국어다. 외부 메시지·원격 게시·유료 구매·iOS/스토어 배포는 요청되지 않았다.
8. 환경과 중단 정리
| 도구 | 구성 |
|---|---|
| Unity | 6000.6.3f1, Android SDK/NDK/OpenJDK·Build Support 설치 |
| 패키지 | URP17.6.0, Input System1.20.0, uGUI/TMP2.6.0, Test Framework1.8.0 |
| Unity CLI | C:/Users/baram/AppData/Local/Unity/bin/unity.exe |
| Blender | C:/Program Files/Blender Foundation/Blender 5.2/blender.exe, 5.2.2 LTS |
| Qwen Python | C:/Users/baram/anaconda3/envs/qwen3-tts/python.exe |
| 음성 | GPU·1.7B CustomVoice·한국어Sohee·seed42·SDPA/bfloat16 |
| GPU/모델 | RTX4080SUPER, revision 0c0e3051f131929182e2c023b9537f8b1c68adfe |
| AVD | Medium_Phone_API_37.0, emulator-5554, API37 x86_64·ARM64 변환, 가로2400×1080 |
| 마지막 확인 launcher PID | 35400, gRPC 127.0.0.1:8554 — 재개 시 실제 재확인 |
AVD는 숨김 창 -no-window -no-snapshot-save -gpu host -grpc 8554 -grpc-use-token으로 실행했다. 실제 Android 폰의 발열·배터리·터치감·성능 인증이 아니다. ADB 버전 혼합에 따른 일시 offline 이력이 있으므로 실제 boot/device 상태를 확인한다. gRPC touch는 (x,y)→(1080-y,x)였고 ADB는 가로 좌표를 직접 사용한다. 토큰·인증 헤더를 로그/문서에 출력하지 않는다. Qwen/conda/제작 도구를 APK에 포함하거나 모델/목소리를 바꾸지 않는다.
중단 정리 원문은 T7 artifacts/verification/T7/Implementation/PAUSED-handoff-summary.md, pause-device-state.json, pause-final-workspace-state.json에 있다. 구현 담당자는 중단 요청 이후 새 개발·테스트·커밋·원복을 하지 않았고 종료했다.
- Editor33484·worker6336은 종료됐으며 루트도 실제 PID 부재를 확인했다.
editor_stop은 종료0/이미 Edit 상태,EditorApplication.Exit(0)호출은 서버 응답이 끊겨 CLI 종료6이었다. 이 호출을 종료0으로 바꾸지 않고 실제 프로세스 부재와 구분해 기록했다. - 녹음·scrcpy·QA·테스트 실행은 없다. AVD35400은 유지했다. ADB PID는 변할 수 있으므로 재개 시 확인한다.
- 최종 기기 원문에는 STREAM_MUSIC speaker5/remote_submix5/default5, airplane0/wifi1/data1이 기록됐다. 루트가 원문을 다시 확인했다.
- T7의 HEAD는9aa 그대로, dirty는 위 설정2개의 개행뿐이다. 새 렌더 재사용·identity RED/GREEN·tracked 준비 검사는 아직 없다.
readiness-function.txt/apply-readiness.ps1은 미적용 QA 초안이며 그대로 실행하지 말고 내용부터 검토한다. - 루트의 이번 변경은 이 인수인계 문서뿐이다. 실행 기록은 paused로 바꾸며, 사용자가 요청하기 전까지 자동 재개하지 않는다.