221 lines
37 KiB
Markdown
221 lines
37 KiB
Markdown
# MagnetismHeroes 개발 인수인계
|
||
|
||
## 승인 모델 적용 인수인계 (2026-10-09 KST)
|
||
|
||
제품 소스 `83182e7f3e86926bf130817d401a331829401fac`는 기존 규칙·저장·배치를 보존하고 승인한 구 몸체·묶음당 기사 장비·30개 자연 테마를 연결했다. 모델 승인일은 2026-10-08 KST이며 제품 전체의 새 사용자 최종 승인은 별도다. 기존 13 소품과 출처 기록, 후보 원본 기록을 덮어쓰지 않고 `SourceAssets/Models/{Heroes,Meadow}/active-adoption.json`에 정확한 원본·FBX·도구·Unity 재질·프리팹·GUID·검수·APK 해시를 연결한다.
|
||
|
||
네 단계 실제 종료 0을 확인했다. EditMode 103/103·PlayMode 52/52·Android 226/226, 하위 Fresh30 151·FinalBoundary 37·RapidBoundary 39·ContentBoundary 69개가 통과했다. 하위 수를 독립 기능 수로 합산하지 않는다. 실행·실제 설치 APK `BEE8E80E03C4205EDEBF616A18940D58654E9115FDC91EE0A80F47DEA91559EA`의 대응은 `artifacts/verification/VisualUpgrade/FinalProduct/completion.json`과 `documentation-final-evidence-audit.json`에 있다. 이전 Final 고정 사본은 `VisualUpgrade/PreviousFinal/manifest.json`이다. 이전 결과와 새 결과의 소스·UTC·APK를 섞지 않는다. 이 인수인계 변경은 문서와 채택 메타데이터만이며 제품 파일을 바꾸거나 Unity 재import를 실행하지 않는다.
|
||
|
||
체험은 기존 Main 씬을 연다. 초기 builder와 `VisualUpgradeAssets.Apply`는 정상 실행 준비로 재실행하지 않는다. 이미 승인된 모델·얼굴·44개 음성을 재생성하지 않는다. 검증·Editor·ADB·녹음 실행 소유자를 하나로 유지한다.
|
||
|
||
기존 무제한 카메라의 yaw 210도·pitch −45도·거리 15에서 넓어진 지면 뒷면이 보드를 더 많이 가린다. 물리 첫 hit가 같아도 화면 가림이 같지는 않으며 실제 대조는 `FinalProduct/EditorCapture/belowground-raycast-comparison.txt`에 있다. 기존 카메라·물리·초기 위치 보존을 우선해 이번 적용에서 카메라 제한이나 hit 우회를 넣지 않았다. 별도 카메라 UX 결정과 실기기·아이 대상 사용성·성능 검증이 후속이다. 실제 Android AVD 화면과 Editor의 모의 스마트폰/태블릿 viewport·CPU 자원 측정을 구분한다.
|
||
|
||
아래는 과거 제품의 승인·중단·재개 이력이며 이번 제품의 현재 실행 상태를 대신하지 않는다.
|
||
|
||
## 이전 재개·최종 검사 상태 (2026-10-07)
|
||
|
||
사용자의 “효과음·배경음악 없이 진행하겠습니다. T7을 마무리하고 T8을 진행하세요.” 요청에 따라 개발을 재개해 T7을 마감하고 T8의 통합 최종 검사를 완료했다. **아래 과거 중단·음원 대기·T8 미착수 설명은 현재 지시가 아니다.** 한국어 승인 음성 44개는 유지하며 효과음·배경음악은 첫 버전 제외 상태다.
|
||
|
||
- 로컬 `dev`의 `ea2ad4506ce2288f7777c0eb017833723679f487`에서 Final EditMode 100/100, PlayMode 47/47, AndroidBuild, AndroidSmoke의 실제 외부 종료가 모두 0이며 전후 소스는 clean이었다.
|
||
- 새 저장에서 실제 입력으로 1~30을 모두 해결했고 완료 기록 주입은 없다. Final 226개, 하위 Fresh30 151·경계 37·빠른 계수 39·콘텐츠 69개가 통과했다. 두 미완료 퍼즐과 최근 자유 놀이의 부분 계수·카메라 포함 독립 복원도 확인했다.
|
||
- 당시 APK는 `artifacts/android/MagnetismHeroes.apk`와 Final 사본이며 SHA-256 `0D341465FD2DC4809DF8FA423490A9CFB3BA755220A8685479399CACBD9BDDE8`이다. 실제 설치본·승인 44개 PCM·132개 원본 대응 SHA·고지 3개를 대조했다.
|
||
- 원본은 `artifacts/verification/Final`, 고정 사본은 `artifacts/verification/T8/BaseEa2`의 2,527개 파일과 manifest다. root 독립 원문 확인 234개도 실제 종료 0이다. 작업 디렉터리의 5eb 검사·APK는 `Implementation5eb`에 16,032개, 첫 통합 d9 실패·상하 회전 진단은 `BaseD9Failure`에 1,146개 파일로 보존했다. 다른 APK·소스의 증거를 혼용하지 않는다.
|
||
- ea2는 18번의 소품 가림을 찾아 세는 검사에 상하 회전을 추가한 한 줄 QA 수정이다. 제품 코드·자산·저장 스키마는 T7 완료 상태와 같다. 이후 개발 지침·인수인계와 새 문서의 Unity 메타데이터 3개만 추가했다. 실제 Unity import는 종료 0, 기존 제품 tracked 변경은 없으며 원문은 `artifacts/verification/T8/DocumentationImport`다. Editor·녹음은 종료하고 AVD만 유지했으며 런타임 단독 실행 소유권은 해제됐다.
|
||
- 첫 버전 개발 지침은 루트 AGENTS.md/CLAUDE.md, docs의 규칙·구조·저장/CLI 계약·운영·실패 대응 및 모듈별 AGENTS.md에 정리했다. 최종 소스 `73ffcbef`의 독립 검토는 approved, blocking 0·남은 advisory 0이며 원문은 `artifacts/verification/T8/FinalReview`다. 후보 출력과 예정 runtime 경로 구분 보완도 재검토했다. 사용자가 2026-10-07 “승인합니다”로 최종 결과와 개발 문서를 승인했다. 계획 원본은 `.dryforge/001/`에 해시를 확인해 보관하며 완료 표시는 `.dryforge/status.json`이다. 작업별 원시 증거는 기존 고정 사본과 `artifacts/verification/Completion20261007/`에 보존한 뒤 통합된 임시 작업을 정리한다.
|
||
- Unity에서 체험하려면 `Assets/MagnetismHeroes/Scenes/Main.unity`를 연다. 초기 builder를 재실행하면 완성 자산을 덮을 수 있으므로 일반 실행 준비에 사용하지 않는다. 검증/Editor/ADB/녹음 조작자는 하나로 유지한다.
|
||
- 실제 스마트폰·태블릿의 손가락 조작·가독성·성능·발열·배터리, 아이 대상 사용성·학습 효과, iOS·스토어 배포는 후속 범위다. 원격 push·게시·구매를 수행하지 않았다.
|
||
|
||
상세 통합 결과는 [final-verification.md](final-verification.md)이며 실행·검사 절차는 [operations.md](operations.md)다. 아래는 당시 원문을 보존한 이전 진행 기록이다.
|
||
|
||
작성일: 2026-10-05. 사용자가 “작업을 잠시 중단하겠습니다. docs/handoff.md 문서에 인수인계 문서를 작성해주세요.”라고 요청했다. **개발을 중단했다. 사용자가 다시 재개를 요청하기 전에는 개발·검사·독립 검토를 자동으로 계속하지 않는다.**
|
||
|
||
재개 기록: 같은 날 사용자가 이 문서를 읽고 작업을 계속하라고 요청했다. **중단 요청은 해제됐으며 T7의 미완료 Android 검사와 필요한 최소 수정을 재개한다.** 아래 중단 당시 상태와 실제 최신 Git·검사 기록을 구분한다. T1~T6를 다시 개발하지 않는다.
|
||
|
||
### 현재 진행 결정 (2026-10-06)
|
||
|
||
사용자는 “효과음·배경음악 없이 진행하겠습니다. T7을 마무리하고 T8을 진행하세요.”라고 요청했다. 첫 버전의 SFX/BGM 선정·재생·믹싱 청취·음악 반복 인수는 제외한다. 한국어 음성 44개와 외형·UI·VFX는 유지한다. **명시적 제외 범위의 T7은 독립 게이트·통합을 마쳤고 T8을 진행했다.** T8 작업 디렉터리의 최종 검사는 아래 2026-10-07 기록을 따른다. 루트 통합·completion 검사·최종 인수는 별도다. 변경 기록과 실제 문서 검사 결과는 [t7-completion.md](t7-completion.md)다.
|
||
|
||
아래 2026-10-05의 검사 결과는 재사용하는 원시 증거이며, 당시 음원 대기·프로세스 상태는 현재 상태가 아니다. 그때의 사용자 체험용 Editor 플레이 상태도 과거 기록이다. 2026-10-07 최종 검사 뒤 실제 Editor/녹음은 종료됐고 AVD만 유지했다. 재개 시 실제 프로세스와 런타임 소유권을 다시 확인한다.
|
||
|
||
### T8 최종 작업 기록 (2026-10-07)
|
||
|
||
- 검사 소스 `5ebb86e2a82c6005f870460e8434d7ad99c0e99d`에서 Final EditMode 100/100, PlayMode 47/47, AndroidBuild, AndroidSmoke의 실제 외부 종료가 모두 0이다. 검사 전후 clean, 실패·건너뜀·미확정 0이다. Android Final 226개 게이트와 Fresh30 151/FinalBoundary 37/RapidBoundary 39/ContentBoundary 69개가 각각 실제 child 종료 0으로 통과했다.
|
||
- 새 저장에서 Android 실제 터치로 1~30을 순차 해결했다. Fresh30에는 save push/완료 fixture가 없다. 별도 RapidBoundary의 평면10구 QA는 실제 Fresh30 완료/Stage20 수집 원문을 출처로 보존하며 정상 진행과 구분한다. 실제 전체 하나~열/FIFO/중복 없음, 같은 보드 Free를 마지막 전체 발화보다 먼저 관찰한 증거를 남겼다.
|
||
- `artifacts/android/Final/MagnetismHeroes.apk`, 표준 `artifacts/android/MagnetismHeroes.apk`, 실제 설치된 base.apk의 SHA는 모두 `223F26C5E2EFAE6A7C50A36CF654195C7EF3AD37DCCDC3001B8CF6E3A515C8C7`이다. 승인44 WAV는 재생성하지 않았고 실제 APK44 AudioClip PCM/채택132해시/고지3개를 검사했다. SFX/BGM은 사용자 결정에 따라 제외하며 음원 추가 요청은 없다.
|
||
- 상세 명령·범위·실패 보존·한계는 [final-verification.md](final-verification.md), 실제 지정 원문 1,982개와 SHA는 `artifacts/verification/Final/manifest.json`이다. 문서 전용 커밋과 검사 소스의 관계는 `source-documentation-relationship.json`에 남긴다. 이전 실패·preflight는 `artifacts/verification/T8-red/`에 별도로 보존하며 현재 Final 결과로 바꾸지 않는다.
|
||
- 기반 `7db0065` 대비 제품 Assets/Packages/ProjectSettings/SourceAssets의 tracked blob은 전부 같다. T8 변경은 Final 검사 연결·native QA/PCM/APK 검증 도구와 이 두 문서다. 루트의 원문 독립 검사도 234개/실제 종료0이며, 다음은 루트 독립 게이트·통합 후 기반 작업 디렉터리의 completion 네 단계와 최종 인수다. 이 문서 전용 변경 때문에 무거운 검사를 반복한 것으로 주장하지 않는다.
|
||
- Unity 6000.6.3f1/API37 AVD/2400×1080 가로 화면에서 확인했다. minSdk26/targetSdk36/arm64 APK이며 실기기 성능·FPS·iOS·스토어 배포는 미검증이다. 실제 Editor·녹음은 없고 AVD qemu PID22452만 유지했다. 마지막 native 화면/저장은 ContentBoundary의 별도 Stage11 QA이며 정상30 원문은 Fresh30 폴더에 있다. 네트워크0/1/1과 audio5/5/5를 복원했다.
|
||
- 런타임 소유자는 `/root/t8_final_implementation`이다. 루트의 해제/이관 지시 전까지 Editor/AVD/ADB/녹음을 다른 담당자가 동시에 조작하지 않는다. 다음 루트 completion 실행도 소유권을 명시해 직렬 수행한다. 과거 작업 디렉터리·실패 원문·승인 음성·제작 환경을 삭제하지 않는다.
|
||
|
||
### 2026-10-05 재개 후 검사·통합 기록
|
||
|
||
- 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 착수를 보류했다. 이 보류 사유는 2026-10-06의 명시적 제외 결정으로 해제됐다. 음원 재생 검사를 통과했다고 바꾸는 것이 아니라 첫 버전 요구 범위에서 제외하는 것이다. 문서 작업 전 clean T7 브랜치를 루트 dev `c040cafc93bd58db485a77af8df97865f3fc1c84`까지 fast-forward했다.
|
||
- 실행 중인 Editor·녹음·QA는 없다. AVD launcher 29360/qemu 28508/ADB 24536은 유지했다. 최신 실행 소유권과 소스/통합 경계는 `.dryforge/temp/go-runtime.json`과 실제 Git 상태를 확인한다. 작업 디렉터리와 과거 실패 원문을 임의 삭제하지 않는다.
|
||
|
||
2026-10-06 현재 진행 결정이 아래 과거 중단 기록·음원 대기 지시보다 우선한다. 승인된 요구사항 원본은 `.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-256 `974BA14310F020BB42DFFDF4BBE76CBB7249A9FE797853B8158B9BD700AB9D35`.
|
||
- T6 통합: `9d8e93970476170143f78f9c675dbf78f1ec8107`. 검사 소스와 전체 Git 트리가 같다. 루트 APK: `artifacts/android/Content/MagnetismHeroes.apk`, SHA-256 `2F9F31D796AB568FE7814A8930B3C64153CECD7AEDF1F42DB916FD55FBDE02DE`.
|
||
- 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`: 사용자 답 “새 음성 괜찮습니다”. 승인 SHA `fa8034948f6ac3e289e8e7e9fb447943760d4ed5ac577c8ab0c961c608fe49c2`, 대본 `여덟.`, run `20261005T043059823226Z_abdd0294`. T7에 교체했고 기존 WAV meta GUID를 유지했다.
|
||
- 나머지40개: 사용자 답 “나머지 40개도 괜찮습니다”. 원문·질문 ID·40개 SHA는 `artifacts/audio-preview/Content/user-approval-remaining40.json` 및 T7 `SourceAssets/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` 폴더에 보존한다.
|
||
|
||
1. **첫 실행 준비:** 기존 Content 도구는 시작 뒤6500ms만 기다려 검은 화면/Unity 시작 화면에서 조작·저장 검사를 진행한 실패가 있다. PID·실제 시작 화면 UI·유효 schemaVersion1 저장을 bounded 관찰하는 최소 QA 수정이 필요하다. 고정 대기를 무작정 늘리거나 파일 존재만으로 준비됐다고 처리하지 않는다. 제품에 debug 서버를 추가하지 않는다. assertion·fixture·음성 비교 기준은 유지한다. QA 사본의 진단 결과를 원문 `tools/verify.ps1` 실행의 통과로 대신하지 않는다.
|
||
2. **숫자1~10 실제 재생:** 원래 Content의11개 음성 대조에는 숫자1만 포함된다. R11/R14의1~10 확인을 별도로 수행 중이다. 실제20번의10개ID를 사용한 수집완료/계수0 QA 저장→실제 native tap→계수·FIFO·10완료 경로이며, 정상30개 진행 증거는 아니다. 빠른/느린 입력 모두 일부 whole/window 비교가 실패해 아직 전체 통과가 아니다.
|
||
3. **녹음 누락 진단:** 처음4번의 quiet 마지막100ms에서10ms 무음/지연을 관찰했다. 발화 중 PNG를 없앤 뒤에도2번 등이 실패했고, 느린 입력도 실패했다. 화면 캡처나 Render만이 원인이라고 확정하지 않는다. AudioFlinger의 underrun 관찰과 raw PCM/logcat을 보존했다. 성공해야 할 기준을 낮추거나 발화 속도·길이·검사 구간을 바꾸지 않는다.
|
||
4. **녹음 생명주기:** 긴 녹음의 후처리 완료 전에 WaitForExit30이 끝난 실패와, 기존 recorder가 살아 있을 때 복원 recorder를 시작한 race가 있었다. `count10-exercise.ps1`, `count10-slow-exercise.ps1`, `run-native-content-qa.ps1` 등의 진단 사본은 별도 증거다. 실제 PID·시작/종료·exit 기록을 확인하며 모든 recorder 종료를 기다린 뒤 원복한다. 녹음 시간·tap·비교 대기 경계를 맞춘다. 발화 중 잦은 PNG를 제외하되 빠른 입력 자체를 느리게 바꿔 인수 통과로 처리하지 않는다.
|
||
5. **다음 코드 후보:** `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)/2` mono48k로 대조한다. 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. 재개 순서와 완료 조건
|
||
|
||
1. 이 문서와 `.dryforge/handoff.md`→`spec.md`→`plan.md`, 아래 go 스킬/참조를 읽는다. 실제 루트·T7 HEAD/git status와 실행 중 프로세스를 대조하고 단독 Unity/AVD 담당자를 정한다.
|
||
2. 중단 WIP와 원문을 보존한 채 위 시작 준비·녹음 경계·계수 렌더 갱신 문제를 최소 수정한다. 의미 있는 실제 RED/GREEN과 기존 수량/배치/계수/선택/복원 회귀를 확인한다. 원인 미확정 녹음 실패도 별도로 남긴다.
|
||
3. 새 소스를 커밋·고정한 뒤 `tools/verify.ps1`의 Content EditMode/PlayMode/AndroidBuild/AndroidSmoke 네 명령을 실제 실행한다. 양수 테스트 수·전부 통과·건너뜀/불확정0·각exit0·시작/끝 소스 경계·허용 정규화 후 clean을 보존한다. 과거9aa의100/44를 새 소스 검사로 대신하지 않는다.
|
||
4. 같은 최종 APK의1~10 빠른 계수/FIFO/마지막10, 오프라인 안내·전환·일시 정지·복원을 확인한다. 설치된 base.apk와 host/build SHA가 같아야 한다. notices ZIP byte 검사·채택44음성 해시·제작 환경 제외도 확인한다.
|
||
5. 새 독립 T7 명세 검토자를 fresh context로 지정한다. 명세와 frozen raw diff·검사/PNG/PCM 원본을 제공하고 구현자의 자기 평가를 근거로 주지 않는다. 제품/규칙/JSON/30정의 보존, 외형·입력·음성/출처를 검토한다. 미제공 SFX/BGM 인수를 숨기지 않는다. 통합은 실제 검토 결과·변경 범위·소스 대응이 확인된 뒤만 수행한다.
|
||
6. 사용자 선택 음원이 필요한 최종 인수는 남긴다. T7 전체 완료 전 T8로 순서를 바꾸지 않는다. T8은 최종 APK에서 새 저장 정상30개 진행, 대표1/6/9/10/13/14/20/30, 두 개별 미완료+최근 자유 놀이, 오프라인 전체 음향 등을 검증한다. QA 주입은 정상30개 완료 증거가 아니다.
|
||
7. 전부 완료되면 통합 소스 전체 검사를 실제 수행하고, 지속 문서·최종 독립 검토·go의 사용자 승인·계획 보관 절차를 진행한다. 아직 전체 완료·최종 승인·보관·정리는 수행하지 않았다.
|
||
|
||
네 검사 명령은 T7 작업 디렉터리에서 실행한다. Android 실행 전 단독 기기 소유·부팅/화면 준비·녹음 준비·오프라인 안정화 조건을 실제 확인하고, 끝나면 환경을 복원한다.
|
||
|
||
```powershell
|
||
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로 바꾸며, 사용자가 요청하기 전까지 자동 재개하지 않는다.
|