docs: 승인 모델 채택과 최종 검증 기록

This commit is contained in:
NINI
2026-10-09 01:22:07 +09:00
parent 83182e7f3e
commit a906be69a0
11 changed files with 2388 additions and 15 deletions
@@ -0,0 +1,584 @@
{
"schemaVersion": 1,
"status": "APPROVED_MODELS_ADOPTED_VERIFIED_PRODUCT_CANDIDATE",
"recordedKstDate": "2026-10-09",
"scope": "사용자 승인 바이트와 실제 Unity 채택을 연결한다. 제품 전체의 새 사용자 최종 승인은 별도이며 원본 후보 이력을 덮어쓰지 않는다.",
"approval": {
"path": "artifacts/verification/VisualUpgrade/ModelReview/user-approval.json",
"sha256": "b539d582aa77d032918bbb580d10d2374f65be4bdd6868432a84ed1d23a46bc5",
"userResponse": "승인합니다",
"confirmedUtc": "2026-10-08T14:05:56.585939+00:00",
"approvedFileCount": 25,
"reviewPacket": {
"path": "artifacts/verification/VisualUpgrade/ModelReview/review-packet.json",
"sha256": "4787e5679d1fe940060a889ffee42020258587ffb19eff32696ea6fc2f48cc99"
}
},
"approvedFiles": [
{
"kind": "BLENDER_SOURCE",
"repositoryRelativePath": "SourceAssets/Models/Heroes/MagneticKnight.blend",
"bytes": 1833499,
"sha256": "7ce1272dfe861aee986609cdb899f0edf8b8f2f0f17269c0eda472c8aa90ee3a"
},
{
"kind": "FBX",
"repositoryRelativePath": "Assets/MagnetismHeroes/UnityRuntime/Presentation/Models/Heroes/HeroBody.fbx",
"bytes": 60076,
"sha256": "56f3301176c612ebeab3fdaaba5c019674beeb0f727f97ed27dd67e32ff50a40"
},
{
"kind": "FBX",
"repositoryRelativePath": "Assets/MagnetismHeroes/UnityRuntime/Presentation/Models/Heroes/KnightEquipment.fbx",
"bytes": 222764,
"sha256": "a8059a020e79e080635e7326bb91576010cad10c60ee931d95536d47fe76e61c"
}
],
"historicalProvenance": {
"path": "SourceAssets/Models/Heroes/provenance.json",
"bytes": 6298,
"sha256": "16d9e14f9e3ee66dce4b16737e1b1e3380fb0ffff35e322d24508cef42d52851"
},
"authoringTool": {
"name": "Blender",
"version": "5.2.2 LTS",
"script": {
"path": "tools/models/build_hero.py",
"bytes": 22664,
"sha256": "6ac494c6207f2a49804db2b06691519920e28fd1af06224793b341854d63e638"
},
"frozenToolRecord": {
"name": "Blender",
"actualVersion": "5.2.2 LTS"
},
"toolBuildHash": null
},
"originalPlaygroundHistory": [
{
"path": "SourceAssets/Models/PlaygroundProps.blend",
"bytes": 301307,
"sha256": "59f543fc6d3b835fa282eac6459b9ed45ed2617052b7f1d2184895eb978b5775"
},
{
"path": "SourceAssets/Models/provenance.json",
"bytes": 3848,
"sha256": "4429c76007f59a6f3a2243204cae2b4ab0ab3d8d6fbf2cdaae9da01df50e9038"
}
],
"unity": {
"productSourceCommit": "83182e7f3e86926bf130817d401a331829401fac",
"applyScript": {
"path": "Assets/MagnetismHeroes/Editor/VisualUpgradeAssets.cs",
"bytes": 17527,
"sha256": "8996b23a4da448562c34bd681529414e87fcaa809fc62c563d135f8c61dc2569",
"guid": "40789cbe0397f8745bff78d14a544113",
"metaSha256": "f017c6e684dd15cd8d1a3682eea8ff6f1b0e4ab75f04087c092484cd19a97821"
},
"imports": [
{
"path": "Assets/MagnetismHeroes/UnityRuntime/Presentation/Models/Heroes/HeroBody.fbx",
"bytes": 60076,
"sha256": "56f3301176c612ebeab3fdaaba5c019674beeb0f727f97ed27dd67e32ff50a40",
"guid": "a1145d71b07ba34489a0290583fbe4ee",
"metaSha256": "808a80e2c555d64c82fc42d09809a3d93313b305e268e12a7fa524504c1e4d69",
"rootEuler": {
"x": 89.98021697998047,
"y": 0.0,
"z": 0.0
},
"meshCount": 1,
"triangleCount": 3968,
"globalScale": 1,
"bakeAxisConversion": true,
"rootRotationPreserved": true
},
{
"path": "Assets/MagnetismHeroes/UnityRuntime/Presentation/Models/Heroes/KnightEquipment.fbx",
"bytes": 222764,
"sha256": "a8059a020e79e080635e7326bb91576010cad10c60ee931d95536d47fe76e61c",
"guid": "ccc4dc45d61bc64499d7c0e1591e1b85",
"metaSha256": "f4a1b0bc232425b5e678d6d90e65f76510644d55c83fe9189fe7db0eaf46222f",
"rootEuler": {
"x": 0.0,
"y": 0.0,
"z": 0.0
},
"meshCount": 22,
"triangleCount": 11684,
"globalScale": 1,
"bakeAxisConversion": true,
"rootRotationPreserved": true
}
],
"materials": [
{
"path": "Assets/MagnetismHeroes/UnityRuntime/Presentation/Materials/VisualUpgrade/Hero_CyanSatin.mat",
"bytes": 3919,
"sha256": "1c8727d6437de82f5842e1acda727f65196c4d92355857c168e62a68a37abbab",
"guid": "21b713eed8aa73146a39c8501b952ef9",
"metaSha256": "a171f8daa3b2b70fdb0141bf5c17f152c0468822411fbf87fde440eea2dd463c",
"sourceMaterial": "Hero_CyanSatin",
"shader": "Universal Render Pipeline/Lit",
"baseColorSrgb": [
0.17,
0.72,
0.83
],
"roughness": 0.48,
"smoothness": 0.52,
"metallic": 0,
"enableInstancing": true
},
{
"path": "Assets/MagnetismHeroes/UnityRuntime/Presentation/Materials/VisualUpgrade/Helmet_SilverTint.mat",
"bytes": 3919,
"sha256": "3aeca0f84d254552a3decf8004d4fbd6909fb26c75509069828605e1f3d9de39",
"guid": "6bc3d158d578da846bebebd6363bd204",
"metaSha256": "89a1606ce98219701647a35e393456945882a03011a45bfbc218b2be1e454c30",
"sourceMaterial": "Helmet_SilverTint",
"shader": "Universal Render Pipeline/Lit",
"baseColorSrgb": [
0.72,
0.85,
0.86
],
"roughness": 0.39,
"smoothness": 0.61,
"metallic": 0.18,
"enableInstancing": true
},
{
"path": "Assets/MagnetismHeroes/UnityRuntime/Presentation/Materials/VisualUpgrade/Ceramic_WarmCream.mat",
"bytes": 3922,
"sha256": "04f690db82d0cf505e4822f8f309c2905367b1fa83670f5422ab952f13b1a559",
"guid": "dad2eea71471abc488393ffb4dc0cc6f",
"metaSha256": "e871bbbbcedbf57be1ebe507c40b13739d3e2d82b249efad0afc0fe577199692",
"sourceMaterial": "Ceramic_WarmCream",
"shader": "Universal Render Pipeline/Lit",
"baseColorSrgb": [
0.97,
0.92,
0.78
],
"roughness": 0.43,
"smoothness": 0.5700000000000001,
"metallic": 0,
"enableInstancing": true
},
{
"path": "Assets/MagnetismHeroes/UnityRuntime/Presentation/Materials/VisualUpgrade/Trim_HoneyGold.mat",
"bytes": 3928,
"sha256": "d496af29ccbcfa9d3991818801535c68d21f549ff170978ef79627c21907f39f",
"guid": "50c03e94de1db4a4daf15b060866ac70",
"metaSha256": "102520158a20f5541cd883f1581fb1603f5ec2a0b080e454aa2b09a7bacc5658",
"sourceMaterial": "Trim_HoneyGold",
"shader": "Universal Render Pipeline/Lit",
"baseColorSrgb": [
0.94,
0.71,
0.34
],
"roughness": 0.42,
"smoothness": 0.5800000000000001,
"metallic": 0.12,
"enableInstancing": true
},
{
"path": "Assets/MagnetismHeroes/UnityRuntime/Presentation/Materials/VisualUpgrade/Enamel_DeepTeal.mat",
"bytes": 3939,
"sha256": "d6b422ffa5b6a4e688c8734070a4246967f950b73f7a504732c3a3d4bc863242",
"guid": "794c64e2850c3f541981a51bb4314d5e",
"metaSha256": "8ead210e4db06ee198df147bbcce864292e502a676d131d45c0089146029f7ef",
"sourceMaterial": "Enamel_DeepTeal",
"shader": "Universal Render Pipeline/Lit",
"baseColorSrgb": [
0.055,
0.4,
0.44
],
"roughness": 0.42,
"smoothness": 0.5800000000000001,
"metallic": 0,
"enableInstancing": true
},
{
"path": "Assets/MagnetismHeroes/UnityRuntime/Presentation/Materials/VisualUpgrade/Blade_SatinSilver.mat",
"bytes": 3918,
"sha256": "92c3fa6805b1c6405baf2fdfa113aa7689df1b73571cc9ed782bc6be4d54281b",
"guid": "59b7934cb6c96624abd461dad0a6a8f2",
"metaSha256": "440fb1197475cc9df36fafcd0c549cd5befb92b19ddbdb3de00e8baad268fc22",
"sourceMaterial": "Blade_SatinSilver",
"shader": "Universal Render Pipeline/Lit",
"baseColorSrgb": [
0.85,
0.92,
0.91
],
"roughness": 0.4,
"smoothness": 0.6,
"metallic": 0.2,
"enableInstancing": true
}
],
"prefabs": [
{
"path": "Assets/MagnetismHeroes/UnityRuntime/Presentation/Prefabs/MagnetFriend.prefab",
"bytes": 18184,
"sha256": "5e986e01ad9bcd2026e713b62601f92c7d8cfb9febf91d3591a833e38f7b4d46",
"guid": "91ae23d420859244686c2c654ab58bf3",
"metaSha256": "5e31161dac1026b55ff8b8c40fec85f1acdf7f154efb573036cda67c7e99139b"
},
{
"path": "Assets/MagnetismHeroes/UnityRuntime/Presentation/Prefabs/GroupBadge.prefab",
"bytes": 18371,
"sha256": "8804ed655c33dddff00f5b060e84ca67c9b91a65fbffb501fc83ada4e1594edc",
"guid": "f6475c2f7cafe4441a6f4706a3b2b6a4",
"metaSha256": "b76c78e7133454e8bf325948bcbc9f392c96c10fb4eb5a78b01eefac2109c8d7"
},
{
"path": "Assets/MagnetismHeroes/UnityRuntime/Presentation/Prefabs/GameApp.prefab",
"bytes": 406884,
"sha256": "a36a37bc84fe99dd8dc2c0bcf24ee5dfae266dd5da0c1a272caeb7bfbc7fc44c",
"guid": "73c3215bc432df740b907a1edefa9ea1",
"metaSha256": "248f9572123fca7ee45d9d56358e2e89a67c2a78b4c27cb74c4281170ace1db6"
}
],
"stages": [],
"sourceImportEvidence": {
"path": "artifacts/verification/VisualUpgrade/UnityApply/source-import.json",
"sha256": "4a8788aff69cd30befe5c20d94e63542ee9ad4a102710bfd7c208a8beb14f9a6"
},
"sourceImportEvidenceScope": "실제 초기 채택 import 기록이다. 현재 제품의 GUID·SHA는 별도로 위에 기록한다.",
"colorMapping": "원본 sRGB 값을 URP Lit BaseColor에 연결하고 linearBaseColor를 sRGB 입력으로 재사용하지 않는다. smoothness=1−roughness, metallic은 원본 값이다.",
"geometryBoundary": "원본 미터·Z-up 및 FBX -Z forward·Y-up, import scale 1·원래 import root 회전을 유지한다. 승인 메시·원본 재질 바이트를 변경하지 않는다."
},
"verification": {
"finalCompletion": {
"path": "artifacts/verification/VisualUpgrade/FinalProduct/completion.json",
"sha256": "587b92a7f4f63986bfa32af647bc184745b5b100deeed2b0ca4b7818ac309414"
},
"editorCaptureDirectory": "artifacts/verification/VisualUpgrade/FinalProduct/EditorCapture",
"previousGameReview": {
"path": "artifacts/verification/VisualUpgrade/GameReview/visual-review.json",
"sha256": "c1d86277177ae32b891a1b4be4ecb637fe48ecb0785e292ee6a43835206ee6dc"
},
"previousGameReviewScope": "이전 통합 소스 b4d8854의 검수 이력이며 현재 최종 명령 결과를 대신하지 않는다.",
"limitations": "지면 아래 시점의 넓어진 지면 가림은 docs/tracking/findings.md에 기록한다. Editor 비율 캡처·CPU 시간·상주 자원은 Android 실기기 성능이 아니다.",
"representativeEditorCaptures": [
{
"metadata": {
"path": "artifacts/verification/VisualUpgrade/FinalProduct/EditorCapture/world1-soft-shadow.json",
"sha256": "3b09516098a73d3fb76c7992feaf0123b206472458dacb718f4f21aeef58a1e0"
},
"image": {
"path": "artifacts/verification/VisualUpgrade/FinalProduct/EditorCapture/world1-soft-shadow.png",
"sha256": "3cbe3c75bc6e864a2abf4a4275ca2aafb6f8ad61db8a09a4b7568053ea2e3902"
},
"sourceCommit": "83182e7f3e86926bf130817d401a331829401fac",
"utc": "2026-10-08T15:25:03.7926755Z",
"width": 1280,
"height": 720,
"balls": 1,
"groups": 1,
"equipmentAssemblies": 1,
"boardOrigin": "Actual Main daylight with soft shadows",
"scope": "실제 Main PlayMode 렌더링의 모의 viewport이다. Android 화면이 아니며 합성 상태는 정상 진행 증거가 아니다."
},
{
"metadata": {
"path": "artifacts/verification/VisualUpgrade/FinalProduct/EditorCapture/world11-soft-shadow.json",
"sha256": "43ec85a330d87af485051023ccb75752e1699ac7a9f02da3968577217c6957b3"
},
"image": {
"path": "artifacts/verification/VisualUpgrade/FinalProduct/EditorCapture/world11-soft-shadow.png",
"sha256": "6c1433aa7ddb80f7f08f6477e6254023a8b57ce18168b7a018a65f815fcb722c"
},
"sourceCommit": "83182e7f3e86926bf130817d401a331829401fac",
"utc": "2026-10-08T15:25:04.0908702Z",
"width": 1280,
"height": 720,
"balls": 3,
"groups": 1,
"equipmentAssemblies": 1,
"boardOrigin": "Actual Main daylight with soft shadows",
"scope": "실제 Main PlayMode 렌더링의 모의 viewport이다. Android 화면이 아니며 합성 상태는 정상 진행 증거가 아니다."
},
{
"metadata": {
"path": "artifacts/verification/VisualUpgrade/FinalProduct/EditorCapture/world21-soft-shadow.json",
"sha256": "b3f0c277da8218d26854e42f92b64a8d4a82cf5329992cea4c8adf8da470deb1"
},
"image": {
"path": "artifacts/verification/VisualUpgrade/FinalProduct/EditorCapture/world21-soft-shadow.png",
"sha256": "a3688b2458fd8551f9b847a78b4f348e70dd7296d85be2437805aee6b8c1314d"
},
"sourceCommit": "83182e7f3e86926bf130817d401a331829401fac",
"utc": "2026-10-08T15:25:04.1905928Z",
"width": 1280,
"height": 720,
"balls": 6,
"groups": 2,
"equipmentAssemblies": 2,
"boardOrigin": "Actual Main daylight with soft shadows",
"scope": "실제 Main PlayMode 렌더링의 모의 viewport이다. Android 화면이 아니며 합성 상태는 정상 진행 증거가 아니다."
},
{
"metadata": {
"path": "artifacts/verification/VisualUpgrade/FinalProduct/EditorCapture/world11-two-plus-three-phone-default.json",
"sha256": "dfdbae399d6dc0671edca533807342cea44ed20d227cc74332eba133e6ca1355"
},
"image": {
"path": "artifacts/verification/VisualUpgrade/FinalProduct/EditorCapture/world11-two-plus-three-phone-default.png",
"sha256": "610a1fd1a25f03a50757a17c7f6f01d463a8b430971aa3d882c2d88fe213ba22"
},
"sourceCommit": "83182e7f3e86926bf130817d401a331829401fac",
"utc": "2026-10-08T15:25:05.8152052Z",
"width": 2400,
"height": 1080,
"balls": 5,
"groups": 2,
"equipmentAssemblies": 2,
"boardOrigin": "Validated five-ball 2+3 free-play store fixture; actual Main app/session",
"scope": "실제 Main PlayMode 렌더링의 모의 viewport이다. Android 화면이 아니며 합성 상태는 정상 진행 증거가 아니다."
},
{
"metadata": {
"path": "artifacts/verification/VisualUpgrade/FinalProduct/EditorCapture/world11-merged-five-phone-default.json",
"sha256": "cca93732bef1a2fb86622411295c4f2a638bd1ed2c96c2ef96ece26d1ee3e95b"
},
"image": {
"path": "artifacts/verification/VisualUpgrade/FinalProduct/EditorCapture/world11-merged-five-phone-default.png",
"sha256": "6c03e9c1d814cc88c28254e5357d98f3c50bde22f2e824da3475c43cf40a3c56"
},
"sourceCommit": "83182e7f3e86926bf130817d401a331829401fac",
"utc": "2026-10-08T15:25:06.1027531Z",
"width": 2400,
"height": 1080,
"balls": 5,
"groups": 1,
"equipmentAssemblies": 1,
"boardOrigin": "Actual app/session 2+3 merge from labeled boundary fixture",
"scope": "실제 Main PlayMode 렌더링의 모의 viewport이다. Android 화면이 아니며 합성 상태는 정상 진행 증거가 아니다."
},
{
"metadata": {
"path": "artifacts/verification/VisualUpgrade/FinalProduct/EditorCapture/world11-disconnected-split-two-three-tablet-orbitzoom.json",
"sha256": "e27b260c70273f1ec68c43bc1aac16e666dc4c494253df0055703610dd908ecd"
},
"image": {
"path": "artifacts/verification/VisualUpgrade/FinalProduct/EditorCapture/world11-disconnected-split-two-three-tablet-orbitzoom.png",
"sha256": "dea0046052f1400a0fd1e2e870b4546d01859c9463178867084c9fe21cd4c173"
},
"sourceCommit": "83182e7f3e86926bf130817d401a331829401fac",
"utc": "2026-10-08T15:25:06.5677124Z",
"width": 1600,
"height": 1000,
"balls": 5,
"groups": 2,
"equipmentAssemblies": 2,
"boardOrigin": "Actual app/session split of disconnected five-group endpoints",
"scope": "실제 Main PlayMode 렌더링의 모의 viewport이다. Android 화면이 아니며 합성 상태는 정상 진행 증거가 아니다."
},
{
"metadata": {
"path": "artifacts/verification/VisualUpgrade/FinalProduct/EditorCapture/world1-ten-single-groups-phone-default.json",
"sha256": "66521c24e42b09e02212409819e35ef30f9c01e39c7fc212722a9ad817413911"
},
"image": {
"path": "artifacts/verification/VisualUpgrade/FinalProduct/EditorCapture/world1-ten-single-groups-phone-default.png",
"sha256": "8f0a22475b6013c58ff5bd9addd285f3927eb94e48aa081f2046eb8c1e276c52"
},
"sourceCommit": "83182e7f3e86926bf130817d401a331829401fac",
"utc": "2026-10-08T15:25:08.5003167Z",
"width": 2400,
"height": 1080,
"balls": 10,
"groups": 10,
"equipmentAssemblies": 10,
"boardOrigin": "Validated synthetic Core FreePlay render fixture; session UI remains underlying stage 1",
"scope": "실제 Main PlayMode 렌더링의 모의 viewport이다. Android 화면이 아니며 합성 상태는 정상 진행 증거가 아니다."
},
{
"metadata": {
"path": "artifacts/verification/VisualUpgrade/FinalProduct/EditorCapture/world1-ten-one-group-tablet-default.json",
"sha256": "54c6f106ead00b1ede9bebdf182b78cbeb66007c50b53583a9d0847c27fa3bf5"
},
"image": {
"path": "artifacts/verification/VisualUpgrade/FinalProduct/EditorCapture/world1-ten-one-group-tablet-default.png",
"sha256": "3959e9679a5418b96d2b63d1de0479c2b537934dd3e7c5e71357c9f343d8ea54"
},
"sourceCommit": "83182e7f3e86926bf130817d401a331829401fac",
"utc": "2026-10-08T15:25:08.8364150Z",
"width": 1600,
"height": 1000,
"balls": 10,
"groups": 1,
"equipmentAssemblies": 1,
"boardOrigin": "Validated synthetic Core FreePlay render fixture; session UI remains underlying stage 1",
"scope": "실제 Main PlayMode 렌더링의 모의 viewport이다. Android 화면이 아니며 합성 상태는 정상 진행 증거가 아니다."
}
],
"modelRoundtripEvidence": {
"path": "artifacts/verification/VisualUpgrade/ModelReview/integration-verification.json",
"sha256": "9dbe2c85a83c5f5098669724a8e0e73e34bda137a5cbe40e08e8c459e0a810ca"
},
"finalEvidenceAudit": {
"path": "artifacts/verification/VisualUpgrade/FinalProduct/documentation-final-evidence-audit.json",
"sha256": "778be655b03b0e159dfdc981be368802b39e2c25cc34e54d24761cba0dd3701e"
},
"actualFinalResults": {
"productSourceCommit": "83182e7f3e86926bf130817d401a331829401fac",
"phaseExitCodes": {
"EditMode": 0,
"PlayMode": 0,
"AndroidBuild": 0,
"AndroidSmoke": 0
},
"editorTests": {
"EditMode": 103,
"PlayMode": 52
},
"androidChecks": 226,
"children": [
{
"suite": "Fresh30",
"checks": 151,
"exitCode": 0,
"sourceCommit": "83182e7f3e86926bf130817d401a331829401fac",
"apkSha256": "bee8e80e03c4205edebf616a18940d58654e9115fdc91ee0a80f47dea91559ea",
"scope": "Fresh 30-stage sequential actual touch progression, no save writes or completion fixtures; separate boundary suites are labelled separately"
},
{
"suite": "FinalBoundary",
"checks": 37,
"exitCode": 0,
"sourceCommit": "83182e7f3e86926bf130817d401a331829401fac",
"apkSha256": "bee8e80e03c4205edebf616a18940d58654e9115fdc91ee0a80f47dea91559ea",
"scope": "Separate native boundaries after real30 completion; deliberate corrupt-file tests labelled, no fabricated completion or board injection"
},
{
"suite": "RapidBoundary",
"checks": 39,
"exitCode": 0,
"sourceCommit": "83182e7f3e86926bf130817d401a331829401fac",
"apkSha256": "bee8e80e03c4205edebf616a18940d58654e9115fdc91ee0a80f47dea91559ea",
"scope": "Separate QA planar collected10 replay20 fixture; real30 source record preserved. Actual offline native11 taps and complete numeric PCM; not fresh progression evidence."
},
{
"suite": "ContentBoundary",
"checks": 69,
"exitCode": 0,
"sourceCommit": "83182e7f3e86926bf130817d401a331829401fac",
"apkSha256": "bee8e80e03c4205edebf616a18940d58654e9115fdc91ee0a80f47dea91559ea",
"scope": "별도 명시 경계 검사. 정상 30단계 진행 수에 합산하지 않는다."
}
],
"smokeStartedUtc": "2026-10-08T15:31:53.7694461Z",
"smokeFinishedUtc": "2026-10-08T15:47:20.6303343Z",
"androidReport": {
"path": "artifacts/verification/Final/android-final-evidence.json",
"sha256": "070b33c70925eabebf33c66dfd08daa902ddffaa6591e052c765d7884e22ba8b"
},
"freshAll30SuccessAndIdsChecked": true,
"freshSavePushCommandCount": 0,
"failedAttemptsPreserved": [
{
"phase": "AndroidSmoke",
"command": "pwsh -NoProfile -File tools/verify.ps1 -Phase AndroidSmoke -Milestone Final",
"startedUtc": "2026-10-08T15:26:38.5225191Z",
"finishedUtc": "2026-10-08T15:30:38.1167761Z",
"exitCode": 1,
"status": "failed",
"sourceCommit": "83182e7f3e86926bf130817d401a331829401fac",
"sourceDirty": false,
"sourceDirtyEnd": null,
"outerLog": "artifacts/verification/VisualUpgrade/FinalProduct/FailedAndroidAttempt1/androidsmoke-outer.log",
"evidence": "artifacts/verification/VisualUpgrade/FinalProduct/FailedAndroidAttempt1/Final/androidsmoke-evidence.json",
"originalEvidencePath": "C:\\git\\MagnetismHeroes\\artifacts\\verification\\Final\\androidsmoke-evidence.json",
"originalOuterLogPath": "C:\\git\\MagnetismHeroes\\artifacts\\verification\\VisualUpgrade\\FinalProduct\\androidsmoke-outer.log"
}
]
},
"apkProvenance": {
"apk": {
"path": "artifacts/android/MagnetismHeroes.apk",
"sha256": "bee8e80e03c4205edebf616a18940d58654e9115fdc91ee0a80f47dea91559ea",
"bytes": 57215937
},
"installedApk": {
"path": "artifacts/verification/Final/Fresh30/installed-base.apk",
"sha256": "bee8e80e03c4205edebf616a18940d58654e9115fdc91ee0a80f47dea91559ea"
},
"actualClipCount": 44,
"voicePayload": {
"path": "artifacts/verification/Final/VoicePayload/apk-voice-payload.json",
"sha256": "e89d1987d515ab958cc411f299297ccbea9c1a4f4b62c7886d6d7bc17be2a620"
},
"notices": [
{
"name": "NotoSansCJK-OFL.txt",
"sha256": "88f117575237307bdd86a17ef15e21790fc9a662fe4dfb103ca1ca077f0d9982"
},
{
"name": "TTS-Apache-2.0.txt",
"sha256": "7137274bab133744763a3906ace2a13844c2b34635136fc6d4454c25bfd76eda"
},
{
"name": "TTS-model-card.txt",
"sha256": "2157466302fcaf8e4979d0505aa4b648ad32468aff98b3e964046db05e574f3c"
}
]
},
"actualAndroidAvdCaptures": [
{
"stage": 1,
"image": {
"path": "artifacts/verification/Final/Fresh30/stage-1-enter.png",
"sha256": "6eee00ef4b430cb0ad9c697ca24d5ac4fe8de3630f14488e74fe78c25c87a301"
},
"captureCommands": {
"path": "artifacts/verification/Final/Fresh30/stage-1-enter-commands.json",
"sha256": "465c74bd14cb7cef440efd1e9007adb5f0626b4824fdd780cf8c637a0d6c07f5"
},
"observedUtc": "2026-10-08T15:32:22.2063877Z",
"sourceCommit": "83182e7f3e86926bf130817d401a331829401fac",
"installedApkSha256": "bee8e80e03c4205edebf616a18940d58654e9115fdc91ee0a80f47dea91559ea",
"scope": "실제 Android API37 AVD 2400×1080 화면. 정상 30단계 실제 입력의 한 시점이며 모든 얼굴의 동시 가시성을 보장하지 않는다."
},
{
"stage": 11,
"image": {
"path": "artifacts/verification/Final/Fresh30/stage-10-next.png",
"sha256": "4e64e2ed5706d4571ac43fad55616a457caea934c596a12d437195b13903e905"
},
"captureCommands": {
"path": "artifacts/verification/Final/Fresh30/stage-10-next-commands.json",
"sha256": "b447368b273e8213a3644a1c4afb201597ba884c623d443190d18bbcfb686af5"
},
"observedUtc": "2026-10-08T15:34:51.7253665Z",
"sourceCommit": "83182e7f3e86926bf130817d401a331829401fac",
"installedApkSha256": "bee8e80e03c4205edebf616a18940d58654e9115fdc91ee0a80f47dea91559ea",
"scope": "실제 Android API37 AVD 2400×1080 화면. 정상 30단계 실제 입력의 한 시점이며 모든 얼굴의 동시 가시성을 보장하지 않는다."
},
{
"stage": 21,
"image": {
"path": "artifacts/verification/Final/Fresh30/stage-20-next.png",
"sha256": "030ca33f9f11da310c2ead3a78b61306eee195a162cec1b8f32c5fda009328ef"
},
"captureCommands": {
"path": "artifacts/verification/Final/Fresh30/stage-20-next-commands.json",
"sha256": "4d21313b8c846e97effc65c1bddc94de87c7ab454d94512b2b8f0e56f41b4255"
},
"observedUtc": "2026-10-08T15:39:44.5484050Z",
"sourceCommit": "83182e7f3e86926bf130817d401a331829401fac",
"installedApkSha256": "bee8e80e03c4205edebf616a18940d58654e9115fdc91ee0a80f47dea91559ea",
"scope": "실제 Android API37 AVD 2400×1080 화면. 정상 30단계 실제 입력의 한 시점이며 모든 얼굴의 동시 가시성을 보장하지 않는다."
}
],
"newFinalProductUserApproval": "별도 최종 사용자 승인 대기이며 모델 승인과 구분한다."
},
"preservation": "기존 13 FBX·원본·출처, 기존 GUID, 30 비시각 정의·초기 구 위치·ID·수량, 음성 44개·얼굴 6표정·폰트·UI·Mixer·Core·저장을 유지한다.",
"fileHashScope": "실제 최종 빌드 저장소 파일 바이트이며 Git 체크아웃의 줄바꿈 차이와 구분한다.",
"pathBase": "path와 repositoryRelativePath는 저장소 루트를 기준으로 한다. artifacts 경로는 검증 원문이며 제품 자산이 아니다."
}
File diff suppressed because it is too large Load Diff
+14 -2
View File
@@ -27,7 +27,7 @@ Stage06/10/14 ScriptableObject와 GameApp의 대표 선택·나누기·취소
# Content 추가: 실제 Blender 세 테마
2026-10-05 T6에서 아래 실제 소스와 공유 프리팹을 제작했다. 앞의 첫 퍼즐 임시 배경/후속 상태는 해당 시점의 이력이며, 현재 30개 스테이지는 이 고정 배경 자산을 사용한다.
2026-10-05 T6에서 아래 실제 소스와 공유 프리팹을 제작했다. 앞의 첫 퍼즐 임시 배경/후속 상태는 해당 시점의 이력이며, 당시 30개 스테이지는 이 고정 배경 자산을 사용했다. 현재 자연 배경 적용은 아래 2026-10-09 기록을 따른다.
| 자산 | 실제 경로 | 사용·출처·조건 |
| --- | --- | --- |
@@ -41,7 +41,7 @@ Stage06/10/14 ScriptableObject와 GameApp의 대표 선택·나누기·취소
수집 자석 55개(1..5,16..20)의 시점 탐색·실제 Collider pick·직접 drag/수집을 PlayMode에서 확인하고 `artifacts/verification/Content/editor-play/counting-discovery.txt`에 stage/ID/yaw/pitch 기록을 남긴다. 세 테마의 Free 0..10 공급, 전체 묶음 반납, 원래 stage 테마 복원도 검사한다. 시범 실루엣은 UI Image만 사용하며 실제 구 ID/Collider가 없다. T6 당시 T7 외형·음향은 후속 작업이었다. 현재 얼굴·UI·VFX 채택 상태는 아래 T7 등록을 따르고, SFX/BGM은 2026-10-06 결정으로 첫 버전에서 제외한다.
## T7 현재 채택: 얼굴·표현·음성 (2026-10-05)
## T7 채택 이력: 얼굴·표현·음성 (2026-10-05)
동일 기본 구 하나의 표면에 6표정(기본/관심/집중/웃음/격려/축하) 눈·입·얇은 파란 마스크 Sprite를 붙인다. 구 몸체·추가 머리·숫자 캐릭터 그림으로 대체하지 않는다. 수와 한국어는 TMP 동적 텍스트이며 얼굴/숫자/얇은 빛 리본은 안정 묶음당 하나다. 장식 Collider/raycast target이 없다. 선택 황색 테두리와 접촉 녹색 작은 고리는 독립적이며 확정 접촉 고리와 실제 접촉 위치에서의 짧은 거리별 빛 전파는 표현만 바꾼다. 기존 Core/저장 배열/구 기본 크기는 유지한다.
@@ -55,3 +55,15 @@ Stage06/10/14 ScriptableObject와 GameApp의 대표 선택·나누기·취소
| SFX/BGM 연결 | `Presentation/GameSound.cs` | 기존 Mixer Voice/SFX/Music 직접 연결과 lifecycle hooks 유지. 사용자 결정으로 첫 버전 SFX/BGM 제외. GameApp의 효과음 10개·음악 4개 clip 참조는 null이며 대체 음원 없음. 실제 음원 청취·음악 3회 반복은 제외 항목이며 통과로 표시하지 않음. |
Editor RT 캡처는 Camera.Render와 임시 ScreenSpaceCamera Canvas/안전영역 시뮬레이션 후 복원한 결과이며 Android 기기 화면과 구별한다. JSON은 raw CameraState, 실제 transform/FOV/pivot, 화면·Canvas·viewport 및 측정 범위를 기록한다. editorUnityStatsDrawCalls는 UnityEditor.UnityStats.drawCalls의 해당 Editor frame 관찰값이다. GameView/SceneView 귀속을 이 API만으로 확정할 수 없어 RT GPU draw/overdraw나 제품 draw call 합격으로 취급하지 않는다. Camera.Render wall time은 Editor 비용이며 AVD/실기기 프레임 합격 증거가 아니다. 0/미측정 값을 합격으로 취급하지 않는다.
## 승인 모델 적용 상태 (2026-10-09 KST)
2026-10-08 KST 사용자가 다섯 모델 묶음의 검수 갤러리를 확인하고 “승인합니다”라고 답했다. 승인 범위는 Blender 원본 2개와 FBX 23개의 정확한 바이트이며 최종 제품 전체의 새 사용자 승인을 뜻하지 않는다. [모델 승인 원문](../artifacts/verification/VisualUpgrade/ModelReview/user-approval.json)과 [검수 갤러리](../artifacts/verification/VisualUpgrade/ModelReview/index.html)를 보존한다.
현재 몸체는 승인된 청록색 구 FBX이며 메시 반경 0.5·구 루트 크기 1·기존 SphereCollider 반경 0.5를 유지한다. 기존 6표정·얇은 마스크·TMP 숫자·빛 리본은 유지하고, 대표 친구마다 둥근 투구·무딘 검·둥근 방패 한 벌을 붙인다. 팔·다리·리그·장비 Collider는 없다. 합체·분리·취소·미리보기·재진입 때 얼굴과 장비는 같은 대표 친구를 따른다.
정원 1..10은 맑은 초원, 구름 11..20은 꽃 언덕, 별 작업실 21..30은 바위 언덕으로 표현한다. 기존 Garden/Cloud/Workshop 식별자와 자유 놀이의 sourceStageId는 그대로다. 나무의 가지·수관, 꽃의 줄기·잎, 풀·돌·지면·원경은 실제 승인 메시와 원본 재질 값으로 연결했다. 가까운 아치·계단은 실제 메시 Collider를 사용하며 아치 구멍을 보존한다. 작은 장식·원경에는 Collider를 추가하지 않았다. 원래 바닥 Collider는 유지하고 렌더러만 숨겼다.
원본 `PlaygroundProps.blend`·기존 13 FBX·과거 출처 기록을 보존한다. 새 원본의 후보 provenance도 당시 검수 상태의 고정 이력으로 유지하고, 실제 채택은 [영웅 채택 기록](../SourceAssets/Models/Heroes/active-adoption.json)과 [자연 배경 채택 기록](../SourceAssets/Models/Meadow/active-adoption.json)에 별도로 연결한다. 새 Unity 재질은 31개(영웅 6·배경 25)다. 30개 스테이지의 초기 구 ID·수량·배치·위치·목표·종류 등 비시각 필드, 기존 GUID, 44개 음성·6표정 atlas·폰트·UI·Mixer·Core·저장 형식을 바꾸지 않았다.
제품 소스 `83182e7f3e86926bf130817d401a331829401fac`의 실제 최종 결과는 EditMode 103/103·PlayMode 52/52·Android 226/226이며 네 명령 종료는 모두 0이다. 실행·APK 대응 원문은 `artifacts/verification/VisualUpgrade/FinalProduct/completion.json`이다. 기존 카메라의 yaw 210도·pitch −45도·거리 15에서는 넓어진 지면 뒷면이 보드를 더 많이 가리며 실제 대조는 `FinalProduct/EditorCapture/belowground-raycast-comparison.txt`에 있다. Editor의 스마트폰·태블릿 비율 렌더링과 실제 Android AVD 화면을 구분하며 실기기 성능·아이 대상 사용성·iOS·스토어 게시를 완료로 표시하지 않는다.
+9 -1
View File
@@ -1,8 +1,10 @@
# T6 고정 30개 콘텐츠
아래 제작·음성 후보·가독성 잔여는 2026-10-05 당시 구현 이력이다. 현재 시각 채택은 2026-10-09 기록, 음성은 승인 44개 active-adoption을 따른다. 당시 후속 상태를 현재 미완료로 확대하지 않는다.
R07의 1..30 초기 묶음·목표·종류를 30개 ScriptableObject로 작성했다. 수 세기는 1..5에서 N=번호, 16..20에서 N=번호−10의 분리된 1인 친구를 정확히 제공한다. 수량·구 ID·묶음 소속·수집·계수·성공은 기존 순수 C# Core가 담당한다. 모든 구성 퍼즐은 전체 최종 group multiset으로 판정하며 구의 모양, 조작 횟수와 풀이 순서를 조건으로 삼지 않는다.
`ContentAssets.Build`는 고정 정의·초기 배치·공유 프리팹 참조를 Unity Editor API로 작성한다. 번호별 씬/실행 규칙은 없다. 기존 단일 GameApp/Main 연결을 사용한다. 정원 1..10, 구름 11..20, 별 작업실 21..30은 같은 공통 바닥·아치·계단·돌과 테마별 세 소품으로 구성한다. Blender 원본/FBX/설정/해시는 [자산 등록](asset-register.md)에 있다.
`ContentAssets.Build`는 고정 정의·초기 배치·공유 프리팹 참조를 Unity Editor API로 작성한다. 번호별 씬/실행 규칙은 없다. 기존 단일 GameApp/Main 연결을 사용한다. 당시 정원 1..10, 구름 11..20, 별 작업실 21..30은 같은 공통 바닥·아치·계단·돌과 테마별 세 소품으로 구성했다. Blender 원본/FBX/설정/해시는 [자산 등록](asset-register.md)에 있다.
새 저장은 1번만 열리며 성공하면 원래 배치·카메라·공간을 유지한 Free로 전환한다. 자동 다음 이동은 없다. 선택 화면은 잠금/완료/이어하기/시작을 표시한다. Free의 다음 버튼은 다음 번호의 저장 퍼즐을 먼저 복원하며 30에서는 표시하지 않는다. 완료 퍼즐을 다시 풀다가 나와도 완료 기록과 뒤 해금은 유지한다. 테마 저장 필드는 추가하지 않고 퍼즐 stageId/Free sourceStageId로 Stage SO를 찾는다.
@@ -21,3 +23,9 @@ T7의 AI 최종 캐릭터/UI 이미지·표정/VFX, SFX/BGM 및 아직 응답받
시각 검수 잔여: Free 10개를 두 줄로 공급한 기본 시점에서는 아래 줄 일부 개별 묶음의 숫자 배지가 위 줄 친구 몸체와 겹쳐 보인다. T7에서 모든 배열의 배지·선택·계수 표시 가독성을 최종 검수할 대상으로 기록한다. 배경에 의한 기존 아래 시점 숫자 가림은 Blender 바닥을 원래 평면 범위로 조정하여 Collider를 유지한 채 회귀 검사를 통과시켰다. 탐험 자석 몸체는 시점 회전으로 발견할 수 있으며 장식 Collider를 무시하지 않는다.
Android 음성 검사는 Content만 `record-native-audio.ps1`의 Android AudioRecord REMOTE_SUBMIX 무압축 stereo48k PCM16을 원시 보존하고 각 좌우 프레임의 정확한 정수 평균으로 mono48k를 만든다. 공식 scrcpy4.1 ZIP SHA `5b12172b3264b2889f4583ee64752ce832e29bc8b1089dca81093459697165db`를 검증하며 도구·서버·캐시는 ignored artifacts에만 있어 APK에 들어가지 않는다. 기존 gRPC/T5 경로와 비교기의 기본 동작은 유지한다. Content의 `-RequireFullSpeech`는 기존 전체 .95 상관과 동일 onset에서100ms/50ms 겹침의 모든 source RMS32 이상 창 .95를 함께 요구하고, 유효 창0개/불충분 자료는 실패한다. 실제 native 정상 발화와 다른 clip/앞뒤250ms 삭제/중간250ms 삭제·중복/노이즈 negative를 검사한다. gRPC 경로는 같은 APK·원본의 전체발화 불일치가 있었고 이전 T5 APK/native48/냉간부팅 교차 실패를 원시 보존했다. 내부 Android 경로의 정상 대조와 구분하며 정확한 SDK 원인을 확정하지 않는다.
## 현재 자연 테마 연결 (2026-10-09 KST)
승인한 영웅 2 FBX와 자연 배경 21 FBX를 실제 Unity 참조로 연결했다. Garden 1..10의 맑은 초원, Cloud 11..20의 꽃 언덕, Workshop 21..30의 바위 언덕은 자유 놀이에서도 원래 sourceStageId를 따른다. 30개 정의의 수량·ID·초기 위치·목표·종류 등 비시각 필드와 기존 GUID를 유지한다. 장비는 실제 묶음당 한 벌이며 새 장식의 배치가 정답 조건이 되지 않는다. 기존 구 탐색·직접 pick/drag·숫자 가독성 검사의 기준을 낮추지 않았다.
현재 얼굴 6표정·한국어 UI·승인 음성 44개는 유지하며 SFX/BGM은 첫 버전 제외다. 당시 자유 놀이 배지 겹침의 후속 검수는 현재 단일/복수 묶음·합체/분리·10개 상태의 실제 캡처로 확인했다. 기존 카메라의 yaw 210도·pitch −45도·거리 15에서는 넓어진 지면 뒷면이 보드를 더 많이 가린다. 적용 원본은 `SourceAssets/Models/{Heroes,Meadow}/active-adoption.json`, 실제 실행은 `artifacts/verification/VisualUpgrade/FinalProduct/completion.json`에 연결한다. 제품 소스 `83182e7f3e86926bf130817d401a331829401fac`의 EditMode 103/103·PlayMode 52/52·Android 226/226와 네 명령의 실제 종료 0을 확인했다.
+6 -1
View File
@@ -26,11 +26,16 @@
## Unity 자산
- 배치 Edit/Play 검사에서 URP의 Editor 생성 runtime 참조 목록이 비워지고 설정이 LF로 재작성됐다. 검사 전 Git 원문과 다른 모든 바이트가 같고 알려진 목록 변환만 존재하는지 확인한 경우에만 정리했다. 실제 설정 변경을 같은 처리로 숨기면 안 된다.
- Blender FBX의 root 회전을 제거하면 배경 소품이 눕는다. 제작 원본은 m·Z-up이고 내보내기는 -Z forward·Y-up이다. Unity import scale 1과 bakeAxisConversion을 맞추고 프리팹 wrapper에서 import root 회전을 유지한 뒤 바닥 피벗을 실제 화면에서 확인한다.
- Blender FBX의 root 회전을 제거하면 소품이 눕는다. 승인 몸체의 실제 import root X는 약 89.98도, 자연 소품은 90도이며 장비는 0도다. 제작 원본 m·Z-up, 내보내기 -Z forward·Y-up, Unity import scale 1·bakeAxisConversion을 유지하고 wrapper 아래 원래 root를 보존한다. 얼굴 평면을 장비 중심으로 쓰면 장비가 구 앞에 뜨므로 대표 구 중심으로 되돌려 배치한다.
- 아치 전체를 BoxCollider로 감싸면 보이는 구멍도 Raycast를 막는다. 실제 아치 메시의 MeshCollider로 구멍을 보존하고 뒤쪽 자석을 선택할 수 있는지 확인한다.
- 투명 얼굴 PNG는 일부 뷰어에서 alpha 0 픽셀의 RGB가 파란 배경처럼 보인다. 원본 alpha와 실제 Unity 구 표면의 가장자리를 함께 확인한다. 현재 v2는 도구 편집 결과 자체를 채택했고 별도 래스터 변환 없이 런타임 파일과 같은 바이트를 유지한다.
- 글꼴 이름의 `FirstSlice`는 과거 이름이며 현재 전체 한국어를 포함한다. 이름만 보고 다시 만들면 승인된 화면과 자산 GUID가 달라질 수 있다. 실제 glyph와 static atlas를 검사하고 새 문구의 누락만 보완한다.
- Blender 재질 기록의 `linearBaseColor`를 Unity `_BaseColor`에 그대로 넣으면 의도한 팔레트와 달라진다. 실제 채택은 `baseColorSrgb`/`authoredSRGB`를 사용하고 URP의 색 공간 변환에 맡겼다. 거칠기는 smoothness=1−roughness, 금속성은 원본 값을 사용하며 승인 메시·팔레트를 다시 제작하지 않는다.
- Light의 Soft 설정만 바꿔도 URP의 soft 지원이 꺼져 있으면 실제 그림자가 나오지 않는다. 현재 Sun은 따뜻한 색 (1, .97, .91), 강도 1.3·Soft strength .55이며 URP는 1024·1 cascade·Low soft·거리 30이다. 실제 같은 보드의 shadow-off/soft-shadow 화면 대조로 확인했다. 설정 존재만으로 렌더 결과를 통과로 쓰지 않는다.
- 넓은 새 지면과 보존된 바닥 Collider는 가림 범위가 다르다. yaw 210도·pitch −45도·거리 15의 지면 아래 시점에서 여섯 Raycast의 첫 바닥 hit가 동일해도 새 지면 뒷면은 보드를 더 많이 가린다. 실제 원본/새 지면 A/B와 카메라 값은 `artifacts/verification/VisualUpgrade/FinalProduct/EditorCapture/belowground-raycast-comparison.txt` 및 같은 폴더의 두 PNG에 남겼다.
- Editor 자원 기록의 active MeshFilter 합계에는 Renderer가 꺼진 원래 바닥도 포함된다. 제출 GPU 삼각형 수가 아니며 Editor 전체 texture memory에는 폰트·RenderTexture도 포함된다. Camera.Render의 CPU wall time을 Android FPS나 실기기 성능으로 환산하지 않는다.
## 제작 도구의 수명
초기 자산 builder는 현재 완성된 씬·스테이지·얼굴·음성 참조를 재작성할 수 있다. `ProjectBootstrap.Prepare/ConnectApp`, `CompositionAssets.Build`, `PersistenceAssets.Build`, `ContentAssets.Build`, `PresentationAssets.Build`를 정상 프로젝트 열기·검사 전 준비 작업으로 실행하지 않는다. 변경 대상과 생성 diff를 먼저 확인하고 승인된 기존 자산을 보존할 수 있을 때만 사용한다.
+28 -5
View File
@@ -1,8 +1,31 @@
# T8 최종 검증 기록
# 최종 검증 기록
## 통합 dev의 최종 검사 (2026-10-07)
## 승인 모델 적용의 최종 실행 (2026-10-09 KST)
최신 완료 검사는 루트 `C:/git/MagnetismHeroes`, 고정 소스 `ea2ad4506ce2288f7777c0eb017833723679f487`에서 수행했다. 아래 작업 디렉터리의 이전 결과와 구분한다. 네 실제 명령의 외부 종료가 모두 0이고 실행 전후 tracked 변경과 소스 변경이 없다.
제품 소스는 `83182e7f3e86926bf130817d401a331829401fac`다. 네 단계 실제 종료 0을 확인했다. 최종 제품 전체의 새 사용자 승인은 별도이며 2026-10-08 KST의 승인은 모델 다섯 묶음·원본 2개·FBX 23개의 정확한 바이트에만 적용한다.
| 실제 명령 | 결과 | 실제 외부 종료 |
|---|---|---|
| `pwsh -NoProfile -File tools/verify.ps1 -Phase EditMode -Milestone Final` | 103/103 | 0 |
| `pwsh -NoProfile -File tools/verify.ps1 -Phase PlayMode -Milestone Final` | 52/52 | 0 |
| `pwsh -NoProfile -File tools/verify.ps1 -Phase AndroidBuild -Milestone Final` | ARM64 IL2CPP APK 생성 | 0 |
| `pwsh -NoProfile -File tools/verify.ps1 -Phase AndroidSmoke -Milestone Final` | 226/226, 네 child 종료 0 | 0 |
현재 빌드 [APK](../artifacts/android/MagnetismHeroes.apk)는 57,215,937바이트, SHA-256 `BEE8E80E03C4205EDEBF616A18940D58654E9115FDC91EE0A80F47DEA91559EA`다. 표준 사본·Final 사본·Fresh30의 실제 설치 후 가져온 APK는 같은 바이트다. 실제 APK의 승인 44개 PCM과 고지 3개의 정확한 바이트를 대조했다. 실행 소스·시각·실제 종료 원문은 [completion.json](../artifacts/verification/VisualUpgrade/FinalProduct/completion.json), 별도 오프라인 원문 대조는 [문서 근거 확인](../artifacts/verification/VisualUpgrade/FinalProduct/documentation-final-evidence-audit.json)에 연결한다.
성공한 Smoke는 2026-10-08 15:31:53.7694461~15:47:20.6303343 UTC에 실행했다. Fresh30 151/151, FinalBoundary 37/37, RapidBoundary 39/39, ContentBoundary 69/69가 각각 종료 0이다. 하위 수를 독립 제품 기능 수로 합산하지 않는다. 새 저장에서 실제 입력으로 1~30을 순서대로 해결했으며 저장 push는 0회다. 각 단계 실제 성공·전체 구 ID 보존, 두 미완료 퍼즐과 최근 자유 놀이·부분 계수·카메라의 독립 복원, 0..10·반납·재공급·취소·손상 복구·오프라인·전체 숫자 발화·마지막 발화 보존을 확인했다. 별도 빠른 계수·경계 QA 상태는 정상 진행 증거와 구분한다.
세 자연 테마, 2+3 합체·떨어진 선택 구의 분리, 10개 단독/한 묶음, 0·재공급·재진입의 현재 Editor 화면은 `artifacts/verification/VisualUpgrade/FinalProduct/EditorCapture`에 있다. [적용 검수 갤러리](../artifacts/verification/VisualUpgrade/FinalProduct/index.html)는 실제 Unity 렌더링의 스마트폰 2400×1080·태블릿 1600×1000 모의 viewport와 Android AVD 화면을 구분한다. 합성 Core 검수 상태는 정상 30단계 진행 증거가 아니다. 이전 101개 시각 검수의 원문은 [GameReview](../artifacts/verification/VisualUpgrade/GameReview/visual-review.json)이며 소스 b4d8854의 이력으로 보존한다.
자원 측정은 active hierarchy의 상주 MeshFilter 인덱스 합계이며 Renderer가 꺼진 원래 바닥을 포함한다. GPU 제출 삼각형 수가 아니다. 전체 Editor-loaded texture의 메모리·치수와 Camera.Render CPU wall time은 Android FPS·GPU 비용·실기기 성능을 증명하지 않는다.
원래 30개 비시각 정의·구 ID/총량/초기 위치·기존 GUID·44개 음성·6표정·폰트·UI·Mixer·Core·저장 경계를 유지했다. yaw 210도·pitch −45도·거리 15의 지면 아래 시점에서 새 지면 뒷면은 원래 Island보다 보드를 더 많이 가린다. 같은 여섯 물리 Raycast가 원래 바닥을 먼저 맞아도 시각적 가림이 같다는 뜻은 아니다. 실제 대조는 `FinalProduct/EditorCapture/belowground-raycast-comparison.txt`와 같은 폴더의 원본/새 지면 PNG에 있다. 기존 카메라·pick·초기 배치 보존을 우선했으며 카메라 범위·복귀 동작은 별도 UX 결정으로 남겼다. 실제 기기·아이 대상 사용성·iOS·스토어 검증은 후속이다.
이전 Final 원문은 [PreviousFinal 보존 목록](../artifacts/verification/VisualUpgrade/PreviousFinal/manifest.json)에 2,517개 파일과 SHA로 보존했다. 첫 Smoke는 실제 종료 1이며 원문 113개를 `FinalProduct/FailedAndroidAttempt1`에 보존했다. Unity 빌드 뒤 서로 다른 SDK의 ADB daemon 연결이 막힌 실행 소유자는 daemon을 재연결하고 실제 device/boot를 확인한 뒤 같은 clean 소스·APK로 실패한 Smoke만 재실행했다. 실패 결과를 통과로 바꾸지 않았다. [보존·정리 원문](../artifacts/verification/VisualUpgrade/FinalProduct/FailedAndroidAttempt1/preservation-and-pruning.json)은 과거 잔여 2,480개를 고정 사본과 정확한 SHA 대조 후 제거한 기록이다. 현재 실행 UTC·소스·APK가 맞는 새 원문만 현재 결과로 채택한다.
## T8 이전 통합 dev 검사 (2026-10-07)
당시 완료 검사는 루트 `C:/git/MagnetismHeroes`, 고정 소스 `ea2ad4506ce2288f7777c0eb017833723679f487`에서 수행했다. 아래 작업 디렉터리의 이전 결과와 구분한다. 네 실제 명령의 외부 종료가 모두 0이고 실행 전후 tracked 변경과 소스 변경이 없다.
| 실제 명령 | 결과 | 외부 종료 |
|---|---|---|
@@ -13,7 +36,7 @@
Smoke는 2026-10-06 17:46:54.093493~18:03:58.028723 UTC에 실행됐다. 새 저장·실제 입력의 Fresh30 151/151, FinalBoundary 37/37, RapidBoundary 39/39, ContentBoundary 69/69가 통과했다. 정상 1~30 진행에는 저장 push나 완료 기록 주입이 없다. 두 미완료 퍼즐·최근 자유 놀이 독립 복원과 부분 계수·카메라, 별도 명시 QA 상태의 빠른 계수·전체 숫자 발화·마지막 발화 보존, 취소·손상 복구·오프라인을 확인했다.
최신 [APK](../artifacts/android/MagnetismHeroes.apk)·Final 사본·이번 설치 후 가져온 APK의 SHA-256은 **`0D341465FD2DC4809DF8FA423490A9CFB3BA755220A8685479399CACBD9BDDE8`**다. 아래 이전 작업 APK `223F...`는 별도 보존본이다. 이번 실제 APK에서도 승인 44개 PCM, 원본/편집본/runtime 132개 해시와 고지 3개의 정확한 일치를 확인했다. 효과음·배경음악은 제외하며 한국어 음성은 유지한다.
당시 [고정 APK](../artifacts/verification/T8/BaseEa2/artifacts/android/Final/MagnetismHeroes.apk)·Final 사본·그때 설치 후 가져온 APK의 SHA-256은 **`0D341465FD2DC4809DF8FA423490A9CFB3BA755220A8685479399CACBD9BDDE8`**다. 아래 이전 작업 APK `223F...`는 별도 보존본이다. 당시 실제 APK에서도 승인 44개 PCM, 원본/편집본/runtime 132개 해시와 고지 3개의 정확한 일치를 확인했다. 효과음·배경음악은 제외하며 한국어 음성은 유지한다.
실제 원문은 `artifacts/verification/Final`의 `*-outer.json`, phase 기록·XML·네 child report와 JSON/PNG/PCM이다. [고정 보존 목록](../artifacts/verification/T8/BaseEa2/manifest.json)은 2,527개 파일의 SHA를 대조한 사본이다. [독립 원문 확인](../artifacts/verification/T8/independent-base-evidence-ea2.json)은 실제 234개 조건과 종료 0을 기록한다. 이전 작업 원문 16,032개는 `Implementation5eb`, 실패한 첫 통합 검사와 진단 1,146개는 `BaseD9Failure`에 따로 보존했다.
@@ -51,7 +74,7 @@ Fresh30은 각 단계의 실제 완료 JSON·원래 구 ID·목표 묶음을 확
## APK와 음성
[이전 작업의 고정 APK](../artifacts/verification/T8/Implementation5eb/artifacts/android/Final/MagnetismHeroes.apk)와 그 작업의 표준 사본·Fresh30 설치 후 가져온 `installed-base.apk`는 모두 다음 SHA-256이었다. 현재 배포용 파일은 위 통합본의 APK다.
[이전 작업의 고정 APK](../artifacts/verification/T8/Implementation5eb/artifacts/android/Final/MagnetismHeroes.apk)와 그 작업의 표준 사본·Fresh30 설치 후 가져온 `installed-base.apk`는 모두 다음 SHA-256이었다. 당시 배포용 파일은 위 통합본의 APK였다.
`223F26C5E2EFAE6A7C50A36CF654195C7EF3AD37DCCDC3001B8CF6E3A515C8C7`
+14 -2
View File
@@ -1,12 +1,24 @@
# MagnetismHeroes 개발 인수인계
## 최신 재개·최종 검사 상태 (2026-10-07)
## 승인 모델 적용 인수인계 (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개를 대조했다.
- 당시 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/`에 보존한 뒤 통합된 임시 작업을 정리한다.
+5 -1
View File
@@ -46,7 +46,11 @@ AndroidSmoke 전에 `Medium_Phone_API_37.0` AVD를 Android Studio Device Manager
## 새 자산 제작
모델을 바꿀 때만 Blender `5.2.2 LTS`에서 `tools/models/build_playgrounds.py`를 실행한다. 저장소 루트에서 Blender의 `--background --python tools/models/build_playgrounds.py`를 사용하면 `.blend`와 13개 FBX를 재작성한다. 자동 생성 전에 기존 소품 변경을 보존하고 실제 내보내기 diff·방향·바닥 피벗·콜라이더를 확인한다.
기존 `tools/models/build_playgrounds.py`는 과거 소품 원본과 13 FBX를 재작성하는 도구다. 현재 자연 테마를 실행하거나 검증하기 위해 재실행하지 않는다. 새 모델 제작 도구는 Blender `5.2.2 LTS`의 `tools/models/build_hero.py`와 `tools/models/build_meadow.py`이며 승인된 원본·FBX는 재생성 없이 사용한다. 새 후보를 만들 때만 별도 제작·검수 회차를 준비하고 기존 승인 바이트를 보존한다.
모델 채택은 원본 2개·FBX 23개의 사용자 승인 SHA와 실제 Unity 방향·재질·대표 장비·선택 경계를 확인한 뒤 수행한다. 대상이 제한된 `VisualUpgradeAssets.Apply`는 `MAGNETISM_VISUAL_APPROVAL`의 승인 JSON과 `MAGNETISM_VISUAL_EVIDENCE`의 별도 증거 경로를 요구하는 채택용 Editor API다. 정상 프로젝트 열기나 검사 전 준비 명령이 아니다. 후보 provenance의 과거 상태를 고쳐 승인으로 만들지 않고 별도 active-adoption에 원본·입력·도구·Unity 참조·검수 해시를 연결한다.
재검증 전에는 이전 Final의 로그·화면·PCM·APK 대응 기록을 해시 목록과 함께 고정 사본으로 보존한다. 같은 경로에 남은 과거 파일을 이번 결과로 세지 않는다. 현재 실행의 소스·UTC·설치 APK SHA가 맞는 phase/child 결과만 채택한다. 이번 이전 증거는 `artifacts/verification/VisualUpgrade/PreviousFinal/manifest.json`, 새 실행 연결은 `VisualUpgrade/FinalProduct/completion.json`에 있다.
음성 제작은 conda `qwen3-tts`의 CUDA 환경과 고정 1.7B CustomVoice/Sohee를 사용한다. 이미 승인된 44개는 그대로 사용한다. 새 대본이 필요할 때만 선택 ID를 별도로 생성한다.
@@ -6,7 +6,7 @@
## 결정
Unity에서 공유 구·대표 얼굴 배치·숫자·효과·프리팹을 만들고 Blender에서 작은 배경 소품을 제작한다. AI 이미지의 실제 채택은 투명 얼굴 atlas이며 한국어·숫자는 TMP로 표시한다. 원본과 Unity 입력 파일을 분리하고 출처·생성 입력·수정·검수·사용 조건을 보존한다.
Unity가 대표 얼굴 배치·숫자·효과·프리팹과 상태 연결을 소유하고, Blender에서 구 몸체·대표 친구의 기사 장비·자연 배경을 제작한다. 2026-10-08 KST 사용자 승인 원본 2개·FBX 23개를 정확한 해시로 채택했다. 구 몸체는 반경 0.5를 유지하며 장비는 묶음당 한 벌이다. 기존 얼굴·마스크·빛 리본과 구 ID·위치·수학·저장 경계는 유지한다. AI 이미지의 실제 채택은 투명 얼굴 atlas이며 한국어·숫자는 TMP로 표시한다. 원본과 Unity 입력 파일을 분리하고 출처·생성 입력·수정·검수·사용 조건을 보존한다.
## 대안
@@ -15,3 +15,5 @@ Unity 기본 도형만 사용하면 제작 부담은 줄지만 배경 소품 표
## 결과
FBX 방향·피벗·콜라이더와 PNG alpha·구 위의 표정 위치를 각각 검수해야 한다. 생성 이미지에 독점권을 주장하거나 도구가 공개하지 않은 모델 ID를 추측할 수 없다. 얼굴 장식은 별도 머리나 구가 아니며 숫자를 그림에 굳히지 않는다. 테마 소품·배치의 다양성은 학습 정답 조건을 늘리는 근거가 아니다.
2026-10-09 KST 적용은 `SourceAssets/Models/{Heroes,Meadow}/active-adoption.json`과 `artifacts/verification/VisualUpgrade/ModelReview/user-approval.json`의 정확한 원본·FBX·Unity 참조 해시를 따른다. 초기 Unity 기본 구와 13개 Blender 소품은 제작 이력으로 보존한다. 현재 세 테마는 맑은 초원·꽃 언덕·바위 언덕이며 Garden/Cloud/Workshop 식별자를 바꾸지 않는다. import root 회전과 sRGB 재질 변환을 실제 Unity 결과로 검수한다. yaw 210도·pitch −45도·거리 15의 지면 아래 시점에서는 넓어진 지면 뒷면이 보드를 더 많이 가리며 실제 대조는 `artifacts/verification/VisualUpgrade/FinalProduct/EditorCapture/belowground-raycast-comparison.txt`에 있다. 카메라 제한이나 앞쪽 Collider 무시를 이번 미술 채택에 섞지 않고 후속 카메라 UX 결정으로 남겼다.
+13 -1
View File
@@ -1,3 +1,15 @@
# 미해결 문제
2026-10-07 통합본의 규칙·화면 연결·저장·AVD 진행 검증 범위에서 재현되는 미해결 결함은 없다. 발견한 입력 검사·저장 관찰·녹음 수명 문제는 수정 후 실제 사례로 확인했다. 실기기 사용성·성능과 iOS는 아직 검사하지 않았으며 관찰된 결함으로 기록하지 않는다.
2026-10-07 통합본의 당시 규칙·저장·AVD 진행 검증에서는 재현되는 미해결 결함이 없었다. 아래는 2026-10-09 KST 승인 모델 적용에서 확인한 제한이며 과거 결과를 모든 시점의 무결함 보장으로 확대하지 않는다.
## 지면 아래 카메라에서 넓어진 지면이 보드를 가림
재현: 실제 Main의 Stage21 초기 6구를 유지한 상태에서 기존 카메라를 yaw 210도·pitch −45도·거리 15로 이동한다. 기존 무제한 회전은 카메라가 지면 아래로 갈 수 있으며 새 넓은 초원 지면의 뒷면이 원래 작은 Island보다 보드를 더 넓게 가린다. 실제 원본 렌더러/새 지면의 같은 보드·카메라 A/B는 `artifacts/verification/VisualUpgrade/FinalProduct/EditorCapture/belowground-original-island.png`, `belowground-approved-clearing.png`에 있다.
영향: 이 시점에서 일부 구·얼굴·숫자를 확인하기 어렵다. 카메라를 다시 위쪽으로 회전해 탐색할 수 있으나 모든 각도에서의 가독성을 보장하지 않는다. 초기 구를 이동하거나 구 ID·수량·저장을 바꾸지 않았다. 새 지면의 시각적 가림을 원래 지면과 동일하다고 주장하지 않는다.
물리 대조: `belowground-raycast-comparison.txt`의 s21-b01..06 여섯 실제 Raycast는 양쪽 모두 보존된 PlaygroundIsland를 먼저 맞았다. 바닥 hit 거리는 12.24272~13.68166, 구 hit 거리는 13.46607~15.75898이었다. 원래 바닥 Collider를 새 지면 크기로 확대하지 않았고 앞쪽 hit를 우회하지 않는다. 기존 엄격한 55구 탐색·Collider pick·drag 검사는 통과했지만 일부 기록은 음의 pitch이며 모든 사례가 지면 위 시점이라는 뜻은 아니다.
현재 미수정 이유: 이번 적용은 기존 카메라·pick·초기 배치 보존을 우선했으며 pitch 제한·입력 hit 우회·초기 구 이동을 추가하지 않았다. 카메라 회전 범위와 복귀 동작의 변경 여부는 별도 UX 결정으로 남겼다. 후속 결정 뒤 원본/새 지면·모든 구 탐색·직접 조작·저장 복원을 함께 검증한다.
실제 스마트폰·태블릿의 손가락 조작·가독성·성능·발열·배터리, 5~7세 사용 관찰·학습 효과, iOS·스토어 게시의 미검증은 후속 범위이며 재현된 결함으로 계산하지 않는다.
+13 -1
View File
@@ -1,5 +1,17 @@
# 현재 구현과 검증 범위
2026-10-09 KST. 한국어·Android·가로 화면·오프라인 체험판의 기존 30개 스테이지와 성공 후 자유 놀이를 유지하며 승인 모델을 적용했다. 아래 2026-10-07 제품 승인·검사 결과는 이전 외형의 이력이며 새 제품 전체의 사용자 승인으로 확대하지 않는다.
청록색 구 몸체와 대표 친구의 투구·무딘 검·둥근 방패 한 벌, 정원 1..10의 맑은 초원·구름 11..20의 꽃 언덕·별 작업실 21..30의 바위 언덕을 연결했다. 원본 2개·새 FBX 23개와 Unity 재질 31개는 `SourceAssets/Models/{Heroes,Meadow}/active-adoption.json`에 해시로 연결한다. 기존 13 FBX·원본·후보 provenance는 보존한다. 기존 Garden/Cloud/Workshop 식별자, 30개 비시각 정의·구 ID/초기 위치/총량·GUID·44개 승인 음성·6표정·UI·폰트·Mixer·Core·저장은 유지한다.
현재 제품 소스 `83182e7f3e86926bf130817d401a331829401fac`의 최종 실행은 `artifacts/verification/VisualUpgrade/FinalProduct/completion.json`과 `documentation-final-evidence-audit.json`에 연결한다. EditMode 103/103·PlayMode 52/52·Android 226/226, 하위 Fresh30 151·FinalBoundary 37·RapidBoundary 39·ContentBoundary 69개가 각각 종료 0이며 하위 수를 독립 제품 기능 수로 합산하지 않는다. 네 단계 실제 종료 0을 확인했다. 현재 APK SHA-256은 `BEE8E80E03C4205EDEBF616A18940D58654E9115FDC91EE0A80F47DEA91559EA`다. 스마트폰·태블릿 Editor 비율 화면과 실제 AVD 결과를 구분한다.
기존 무제한 카메라의 yaw 210도·pitch −45도·거리 15에서는 넓어진 지면 뒷면이 보드를 더 많이 가린다. 실제 대조는 `artifacts/verification/VisualUpgrade/FinalProduct/EditorCapture/belowground-raycast-comparison.txt`에 있다. 엄격한 실제 구 탐색·Collider pick/drag·숫자 가독성 검사를 유지했지만 모든 시점 가독성을 보장하지 않는다. 기존 카메라·pick·초기 배치 보존을 우선했으며 카메라 범위·복귀 동작은 별도 UX 결정으로 남겼다.
실제 Android 스마트폰·태블릿의 손가락 조작·가독성·성능·발열·배터리, 5~7세 사용 관찰·학습 효과, iOS·스토어 배포는 후속 범위다. SFX/BGM은 사용자의 첫 버전 제외 결정대로다.
## 이전 제품 승인 이력 (2026-10-07)
2026-10-07. 한국어·Android·가로 화면·오프라인 체험판을 구현했다. 수 세기 10개와 합체·분리·혼합 20개, 순차 해금·재플레이·도움·시범·성공 후 자유 놀이가 연결됐다. 자유 놀이는 공급·묶음 반납·빈 보드와 10개 한도를 지원한다. 미완료 퍼즐별 저장과 최근 자유 놀이 하나, 손상 파일 복구를 구현했다.
독립 최종 검토에서 완료를 막는 문제와 남은 개선 지적이 없음을 확인했고, 사용자가 2026-10-07 최종 결과와 개발 문서를 승인했다.
@@ -23,4 +35,4 @@ Unity 자석 구·얼굴/마스크·연결 빛·망토, Blender 소품 13개,
3. iPhone·iPad는 Mac/Xcode와 실제 기기를 확보한 뒤 별도 빌드·조작·저장 검증을 수행한다. 스토어 배포·서명·AAB 준비도 후속 범위다.
4. 생활 장치·소풍 열차 등 영웅 미션과 곱셈·나눗셈 확장은 검토 아이디어다. 정해진 장치 배치나 새 성공 조건을 현재 퍼즐에 이미 구현한 것으로 취급하지 않는다.
효과음·배경음악 추가는 후속 요청과 사용자 파일 선정으로 진행한다. 추가 언어, 계정·동기화, 여러 작품 보관함, 넓은 탐험 월드, 광고·결제는 현재 구현 범위가 아니며 도입 여부부터 별도로 결정한다. 현재 승인 범위의 실행을 막는 미해결 문제는 없다.
효과음·배경음악 추가는 후속 요청과 사용자 파일 선정으로 진행한다. 추가 언어, 계정·동기화, 여러 작품 보관함, 넓은 탐험 월드, 광고·결제는 현재 구현 범위가 아니며 도입 여부부터 별도로 결정한다. 당시 승인 범위의 실행을 막는 미해결 문제는 없었다. 새 적용의 시점 제한은 위 현재 기록을 따른다.