add documents

This commit is contained in:
NINI
2026-10-10 01:27:54 +09:00
parent a54ae6fb23
commit 9544f4bce5
32 changed files with 6280 additions and 1 deletions
@@ -0,0 +1,329 @@
{
"status": "approved",
"language": "ko",
"reviewedUtc": "2026-10-08T17:48:13.665069+00:00",
"summary": "독립 전체 네 관점 검토를 확정한다. 기존 전체 219파일 검토와 원경 32파일 delta 검토를 유지하고 새 제품 4단계 원문 및 최종 문서/채택 기록을 대조했다. 차단 0건이며 수용된 한계만 남아 있다.",
"scope": {
"mode": "읽기 전용 전체 검토 + 후속 delta/실제 원문 독립 대조",
"runtimeExecution": false,
"testsBuildUnityAdbBlenderRecordingStarted": false,
"onlyWrittenFile": ".dryforge/reviews/final-review.json",
"base": "58410281e015c6600dc543c4e093fd95c036288c",
"reviewedHead": "0d992d9dcc94843a72489b454ca4e8137178bc56",
"testedProductCommit": "3346eb559bdfba24332feb4d9be4b7104520233e",
"changedFilesFromProtectedDev": 219,
"latestDocumentationChangedFiles": 10,
"latestDocumentationPaths": [
"SourceAssets/Models/Heroes/active-adoption.json",
"SourceAssets/Models/Meadow/active-adoption.json",
"docs/asset-register.md",
"docs/content.md",
"docs/engineering-notes.md",
"docs/final-verification.md",
"docs/handoff.md",
"docs/operations.md",
"docs/tracking/decisions/0005-hybrid-assets.md",
"docs/tracking/status.md"
]
},
"repositoryChecks": {
"gitRootBefore": "C:/git/MagnetismHeroes",
"HEADBefore": "0d992d9dcc94843a72489b454ca4e8137178bc56",
"cleanBefore": true,
"HEADAfter": "0d992d9dcc94843a72489b454ca4e8137178bc56",
"cleanAfter": true,
"protectedDev": "58410281e015c6600dc543c4e093fd95c036288c",
"rootAndModuleInstructionsUnchanged": true,
"testedProductToCurrentAssetsPackagesProjectSettingsToolsDiff": "",
"beforeAfterRawProductHashCount": 732,
"beforeAfterDictionariesIdentical": true,
"currentRawProductHashesMatched": 732,
"acceptedGeneratedYamlWhitespaceCheckExit": 0,
"defaultCodeDocsWhitespaceCheckExit": 0
},
"rubric": [
{
"lens": "명세 준수",
"criteria": "R01~R10의 영웅 우선 장난감 외형·세 자연 테마·실제 지형 연결·승인 파일 동일성·수량/ID/배치/입력/저장 경계",
"result": "통과. 원래 전체 검토에서 승인 연결·대표 장비 lifecycle·30개 비시각 정의 보존을 확인했다. 유일한 원경 틈 차단 사항은 공통 radius27 배치로 수정되어 실제 A/B 및 최신 전체 화면에서 해결됐다. 전체 외곽/모든 각도 가시성을 보장하지 않는다."
},
{
"lens": "코드 품질",
"criteria": "기존 상태 소유와 취소·복원 경로 유지, scoped Unity API, 실제 메시/입력 검사 및 최소 변경",
"result": "통과. 원래 GroupBadge 3줄 변경은 기존 수명을 따르고 Core/input/persistence를 변경하지 않는다. 원경 helper는 y/scale/rotation/다른 props를 유지하며 generator와 같은 상수를 사용한다. 새 geometry 검사는 별도 PhysicsScene의 실제 sharedMesh hit이며 게임 collider/board 상태는 불변이다. 엄격한 55개 발견/pick/drag·아치 hole/side·95% label 검사를 유지한다."
},
{
"lens": "문서 내용·형식",
"criteria": "한국어 자기완결 설명, 현재/과거/미검증 범위 구분, 적절한 상세, 허위 통과·새 불필요 의존 금지",
"result": "통과. 최신 8개 docs는 source3346·103/53/226·새 APK 및 실패 시도/Smoke만 재실행을 실제 원문에 맞게 기술한다. ADR는 선택 이유 2문장으로 제한했다. 과거 83182 결과는 BeforeHorizonFix 이력으로 명시했다. 신규 cross-doc 링크 및 active 3문서 참조는 0이다."
},
{
"lens": "문서 완전성·소스 교차 확인",
"criteria": "원본/FBX→Unity GUID/재질→실제 증거/APK 해시, 실제 종료/소스/파일 동일성, 운영 API/필수 지침/최종 승인 구분",
"result": "통과. active-adoption 239개 SHA 기록(별도 승인 파일25개 포함 총264개 SHA 노드)·111 GUID/metaSHA가 실제 root 파일과 일치한다. gallery8Editor+3native 상대 링크 모두 유효하고 source/시각/카드수치가 일치한다. 문서 통합 이후 raw 제품732개 바이트가 동일하므로 문서만의 이유로 Unity 검사를 추가 요구하지 않는다. 제품 전체 사용자 최종 승인은 여전히 별도다."
}
],
"issues": [],
"advisory": [
{
"id": "기존-지면-아래-시점",
"location": "docs/tracking/findings.md:5",
"observation": "yaw210/pitch−45/distance15에서 새 넓은 지면 뒷면이 원래 Island보다 보드를 더 많이 가림을 실제 A/B로 확인했다. 여섯 first physical hit 동일성이 동일 시각 가림을 증명하지 않는다. 55구 탐색/직접 pick/drag 통과에는 음의 pitch 사례가 있다.",
"disposition": "명시적으로 수용된 이번 범위 제한. 기존 카메라/입력/배치 보존을 우선하고 별도 카메라 UX 결정으로 남긴 기록이 정확하다. 현재 변경의 추가 차단 항목으로 올리지 않는다."
},
{
"id": "실기기-및-얼굴-가시성-한계",
"location": "docs/tracking/status.md:11; FinalProduct/EditorCapture 캡처 metadata",
"observation": "실제 Stage21 기본 화면의 큰 묶음 얼굴 일부가 앞 구에 물리적으로 가려지며 숫자5와 다른 대표 얼굴은 보인다. Editor texture memory는 폰트/RT 포함이고 resident triangle 수는 꺼진 원래 floor도 포함한다. Camera.Render 시간은 Editor CPU wall time이다. AVD와 합성 viewport는 실제 모바일 GPU/FPS/열/배터리·아이 사용성·iOS를 증명하지 않는다.",
"disposition": "배치와 physical occlusion 보존에 따른 수용 제한·후속 검증 범위. 모든 각도/모든 얼굴 가시성 또는 실기기 성능 합격을 주장하지 않은 현재 문서를 유지한다."
},
{
"id": "원경-geometry-표본-범위",
"location": "docs/engineering-notes.md; DistantTerrainHasContinuousApronAcrossItsVisibleFootInsteadOfSkyGaps",
"observation": "0 누락 결과는 cardinal corridor lateral ±12m/방사 .25m/횡단2m 표본이며 actual foot 약±15.35m 전체 경계·픽셀·각도 증명이 아니다. FOV14는 비교용 임시 카메라이고 제품 FOV62는 유지한다.",
"disposition": "최종 문서의 표본 범위와 실제 close/full 시각 판단을 함께 근거로 사용한다. 현재 실제 관찰에서 중앙 틈은 해결되었고 양끝 평평한 림은 외곽 silhouette로 판정했다. 추가 차단 사항은 없다."
}
],
"resolvedIssues": [
{
"id": "원경-지형-연속성",
"previousStatus": "차단",
"resolution": "ef036 원경 배치 수정 및 3346 실제 전체 4단계 통과/현재 문서 반영",
"evidenceReview": ".dryforge/reviews/horizon-fix-conformance.json",
"reviewSha256": "5eba704c16ab4e7319c10aad8e337b8737e974df99966ff4b9d05040f3ac3e22",
"originalWholeReview": "artifacts/verification/VisualUpgrade/BeforeHorizonFix/final-review.json",
"originalReviewSha256": "2f4269c77224aea872289cf51f76a5f6cdb626ec7af1789a63f5fcfb91a0e5b0"
}
],
"capturedVerification": {
"phases": [
{
"phase": "EditMode",
"command": "pwsh -NoProfile -File tools/verify.ps1 -Phase EditMode -Milestone Final",
"outerExit": 0,
"rawExit": 0,
"sourceCommit": "3346eb559bdfba24332feb4d9be4b7104520233e",
"sourceCommitEnd": "3346eb559bdfba24332feb4d9be4b7104520233e",
"sourceDirty": false,
"sourceDirtyEnd": false,
"startedUtc": "2026-10-08T16:56:47.0526983Z",
"finishedUtc": "2026-10-08T16:57:10.801033Z",
"evidenceSha256": "c8e8b452df15fdf1a953d0b679af8f8f36b948668e75e4e6d7f76765b981dc14",
"outerLogSha256": "27b5747f628fe5968282f21fa7eb401c5280ad1dbf83967f45fdee5ac207abc2"
},
{
"phase": "PlayMode",
"command": "pwsh -NoProfile -File tools/verify.ps1 -Phase PlayMode -Milestone Final",
"outerExit": 0,
"rawExit": 0,
"sourceCommit": "3346eb559bdfba24332feb4d9be4b7104520233e",
"sourceCommitEnd": "3346eb559bdfba24332feb4d9be4b7104520233e",
"sourceDirty": false,
"sourceDirtyEnd": false,
"startedUtc": "2026-10-08T16:57:10.8088291Z",
"finishedUtc": "2026-10-08T16:57:54.4619847Z",
"evidenceSha256": "e279aa904d6852115df0204135caef908fdd3e74ae71a8ea8a5827b8c013a41b",
"outerLogSha256": "07316d712aa9e277134cb6a1a406b2718571b358da8a0a2186bd97e2c57f86ef"
},
{
"phase": "AndroidBuild",
"command": "pwsh -NoProfile -File tools/verify.ps1 -Phase AndroidBuild -Milestone Final",
"outerExit": 0,
"rawExit": 0,
"sourceCommit": "3346eb559bdfba24332feb4d9be4b7104520233e",
"sourceCommitEnd": "3346eb559bdfba24332feb4d9be4b7104520233e",
"sourceDirty": false,
"sourceDirtyEnd": false,
"startedUtc": "2026-10-08T16:57:54.4634842Z",
"finishedUtc": "2026-10-08T16:58:44.8633063Z",
"evidenceSha256": "ac136676b9052f84eeef31d40180e5cd6d91f8516b1e67f08d8134a5addf2dc5",
"outerLogSha256": "f3f115511da8d3e848d705f30789ee4a962ec0eb5709ebb7d7dfbd092e758ead"
},
{
"phase": "AndroidSmoke",
"command": "pwsh -NoProfile -File tools/verify.ps1 -Phase AndroidSmoke -Milestone Final",
"outerExit": 0,
"rawExit": 0,
"sourceCommit": "3346eb559bdfba24332feb4d9be4b7104520233e",
"sourceCommitEnd": "3346eb559bdfba24332feb4d9be4b7104520233e",
"sourceDirty": false,
"sourceDirtyEnd": false,
"startedUtc": "2026-10-08T17:04:22.9959710Z",
"finishedUtc": "2026-10-08T17:19:58.4677196Z",
"evidenceSha256": "0c1cbcd64170c4e3747aa40ea9de51e36dabf9621b13a09f46c974f51a399122",
"outerLogSha256": "50d4a2b0ee8dfe1891a02b236243aec79dec086cdad391f5d8b6bae66390fa1b"
}
],
"xmlActual": [
{
"name": "editmode",
"actualCaseCount": 103,
"actualPassed": 103,
"failed": 0,
"skipped": 0,
"inconclusive": 0,
"sha256": "5f5f187799de24fba7ec9db705306c38c86e69d944d61fc56d09d4413a146516"
},
{
"name": "playmode",
"actualCaseCount": 53,
"actualPassed": 53,
"failed": 0,
"skipped": 0,
"inconclusive": 0,
"sha256": "e8b3c90b13f4887126ef6a7d03711d3c8f48e678b6d5034fa9463ee95427e826"
}
],
"androidActual": [
{
"path": "android-final-evidence.json",
"count": 226,
"notPassed": 0,
"sourceCommit": "3346eb559bdfba24332feb4d9be4b7104520233e",
"sourceCommitEnd": "3346eb559bdfba24332feb4d9be4b7104520233e",
"sourceDirty": false,
"sourceDirtyEnd": false,
"apkSha256": "DA533F235A9869E5A68F4A244AF9A89E34A8E6FB9E7C7F2F57D830939507B829",
"sha256": "18ec499dd9d30cd0a00df16012e8e8021e0cbf77a97089611a3954ed5c00aa7b"
},
{
"path": "Fresh30/android-final-progression-evidence.json",
"count": 151,
"notPassed": 0,
"sourceCommit": "3346eb559bdfba24332feb4d9be4b7104520233e",
"sourceCommitEnd": "3346eb559bdfba24332feb4d9be4b7104520233e",
"sourceDirty": false,
"sourceDirtyEnd": false,
"apkSha256": "DA533F235A9869E5A68F4A244AF9A89E34A8E6FB9E7C7F2F57D830939507B829",
"sha256": "afe9adb99144f811761340586f27fdaff49d677c490f2bea8dad6a67afff066c"
},
{
"path": "FinalBoundary/android-final-boundary-evidence.json",
"count": 37,
"notPassed": 0,
"sourceCommit": "3346eb559bdfba24332feb4d9be4b7104520233e",
"sourceCommitEnd": "3346eb559bdfba24332feb4d9be4b7104520233e",
"sourceDirty": false,
"sourceDirtyEnd": false,
"apkSha256": "DA533F235A9869E5A68F4A244AF9A89E34A8E6FB9E7C7F2F57D830939507B829",
"sha256": "c3ea05c1b5d1041a3660af6063dfa21090e1d02857ac9e17d7cd72ade2bcf6eb"
},
{
"path": "RapidBoundary/android-final-rapid-evidence.json",
"count": 39,
"notPassed": 0,
"sourceCommit": "3346eb559bdfba24332feb4d9be4b7104520233e",
"sourceCommitEnd": "3346eb559bdfba24332feb4d9be4b7104520233e",
"sourceDirty": false,
"sourceDirtyEnd": false,
"apkSha256": "DA533F235A9869E5A68F4A244AF9A89E34A8E6FB9E7C7F2F57D830939507B829",
"sha256": "95a415c702a5f407a2fe86194ff22959a0584cb85328011ec83090b1ae5e42fe"
},
{
"path": "ContentBoundary/android-content-evidence.json",
"count": 69,
"notPassed": 0,
"sourceCommit": "3346eb559bdfba24332feb4d9be4b7104520233e",
"sourceCommitEnd": "3346eb559bdfba24332feb4d9be4b7104520233e",
"sourceDirty": false,
"sourceDirtyEnd": false,
"apkSha256": "DA533F235A9869E5A68F4A244AF9A89E34A8E6FB9E7C7F2F57D830939507B829",
"sha256": "bf93139c8b749c10c2c562b20888320b586edeaebe2ba6f27ff5bf214755a9e7"
}
],
"childrenActualExitCodes": [
0,
0,
0,
0
],
"freshSequentialActualSuccessChecks": 30,
"freshSavePushCommands": 0,
"apkCopies": {
"paths": [
"artifacts/android/MagnetismHeroes.apk",
"artifacts/android/Final/MagnetismHeroes.apk",
"artifacts/verification/Final/Fresh30/installed-base.apk"
],
"bytes": 57215937,
"sha256": "DA533F235A9869E5A68F4A244AF9A89E34A8E6FB9E7C7F2F57D830939507B829",
"allThreeIndependentlyMatched": true
},
"voicePayload": {
"actualApkDecodedRawReportPassed44": true,
"actualRuntimeWavShaPcmFormatIndependentlyRecomputedMatched": 44,
"apkRedeocodeByReviewer": false,
"newRecordingOrListeningByReviewer": false
},
"noticesZipExactHashes": {
"NotoSansCJK-OFL.txt": "88f117575237307bdd86a17ef15e21790fc9a662fe4dfb103ca1ca077f0d9982",
"TTS-Apache-2.0.txt": "7137274bab133744763a3906ace2a13844c2b34635136fc6d4454c25bfd76eda",
"TTS-model-card.txt": "2157466302fcaf8e4979d0505aa4b648ad32468aff98b3e964046db05e574f3c"
},
"forbiddenSourceToolCacheApkEntries": 0,
"approvedModelFileHashesMatched": 25,
"materialExactBytesAndValuesMatched": 31,
"stageNonvisualDefinitionsPreserved": 30,
"metadataShaNodesMatched": 264,
"metadataShaRecordsExcludingApproved25": 239,
"guidAndMetaShaMatched": 111,
"latestEditorCaptureCount": 119,
"galleryEditorCards": 8,
"galleryActualAvdCards": 3,
"galleryDeadLinks": 0,
"galleryRemoteLinks": 0,
"latestImagesPersonallyViewed": {
"artifacts/verification/Final/Fresh30/stage-1-enter.png": "24a1fee6f57ed238976dde803184895fbe4900e3ed218fc3064c9743ef9c7e63",
"artifacts/verification/Final/Fresh30/stage-10-next.png": "a17e8540e959fcad55fcde48ccee3654999647e59f7e245839e3872108776fc9",
"artifacts/verification/Final/Fresh30/stage-20-next.png": "79cf0d0bef7671ebc92c2d1cf1f9b557633f7832425b6fc01809944ea8b0b3b3",
"artifacts/verification/VisualUpgrade/FinalProduct/EditorCapture/world11-ten-one-group-tablet-orbitzoom.png": "31e8a98b730295f894f448a2a45e71d246c723354dece8d047013fc55495ebef",
"artifacts/verification/VisualUpgrade/FinalProduct/EditorCapture/world21-single-resupplied-phone-orbitzoom.png": "91683df326dfe70f269b56d02cd2beedd93f6350fb0957995199b1a54c812dad"
},
"previousWholeReviewImagesKeptAt": "artifacts\\verification\\VisualUpgrade\\BeforeHorizonFix\\final-review.json",
"horizonImagesPersonallyViewed8KeptAt": ".dryforge\\reviews\\horizon-fix-conformance.json"
},
"failureAndHistoryPreservation": {
"latestFailedAttemptSource": "3346eb559bdfba24332feb4d9be4b7104520233e",
"latestFailedAttemptActualExit": 1,
"koreanObservation": "Fresh30 stage5의 adb shell wm size가 localhost5037 연결에서 약21초 뒤 timeout10060으로 실제 실패했다. 게임 판정/AVD 충돌로 원인을 단정하지 않는다.",
"latestFailedAttemptArchivedFiles": 1257,
"latestFailedAttemptArchiveHashesIndependentlyMatched": 1257,
"previous83182ArchivedFiles": 2311,
"previousArchiveHashesIndependentlyMatched": 2311,
"retry": "같은 source/APK/732제품 바이트에서 AndroidSmoke만 실제 재실행했다. 새 Edit/Play/Build의 선행 통과를 재사용했으며 세 단계를 재실행했다고 주장하지 않는다. 최초 실패를 통과로 바꾸지 않았다.",
"successfulSmokeStartedUtc": "2026-10-08T17:04:22.9959710Z",
"successfulSmokeFinishedUtc": "2026-10-08T17:19:58.4677196Z",
"olderPreviousFinal2517And113FailedAttemptPreservation": "이전 전체 독립 검토의 원문/해시 확인을 그대로 보존한다."
},
"latestDocumentsRead": [
"docs/asset-register.md",
"docs/content.md",
"docs/engineering-notes.md",
"docs/final-verification.md",
"docs/handoff.md",
"docs/operations.md",
"docs/tracking/decisions/0005-hybrid-assets.md",
"docs/tracking/status.md"
],
"harnessRequiredFilesPresent": true,
"reviewerInstructionsRead": [
"reviewer-prompt.md",
"harness-review.md",
"harness-format.md"
],
"currentDocsReadRule": "기존 전체 검토에서 root/모듈 AGENTS와 적용 문서를 직접 읽었고 이번 8개 docs 전후 diff와 운영/결정/인수인계 현재 문맥 및 최신 원문을 다시 대조했다. 역사/범위 밖 문서 참조를 광범위 정리할 신규 요구로 만들지 않는다.",
"evidenceSha256": {
"artifacts\\verification\\VisualUpgrade\\FinalProduct\\completion.json": "dd898f331a31fb49545e9c3ee2d1c5b52adca97d907f5cff1b0c21b1e6d429fd",
"artifacts\\verification\\VisualUpgrade\\FinalProduct\\product-before.json": "c8232551e6b814b7eaadc343e95929ece779102b09daad3817253c847643213f",
"artifacts\\verification\\VisualUpgrade\\FinalProduct\\product-after.json": "c8232551e6b814b7eaadc343e95929ece779102b09daad3817253c847643213f",
"artifacts\\verification\\VisualUpgrade\\FinalProduct\\horizon-documentation-result.json": "816b1725a45bd0206c517a2a2a6b71153a9150d519152547872b3d3ce66a3a1b",
"artifacts\\verification\\VisualUpgrade\\FinalProduct\\horizon-documentation-audit.json": "0cc133ea881ccc9a96172edb40ad12ba7ed25ce00eec0b366119018e8aa6203d",
"artifacts\\verification\\VisualUpgrade\\FinalProduct\\documentation-final-evidence-audit.json": "14e62264a22f360f9afda94e1c8660507cda3b27c30d6f9916607889c2819e08",
"artifacts\\verification\\VisualUpgrade\\FinalProduct\\root-final-product-audit.json": "7f1c84d9fa0f593fe72e15e9d3970c6b10fcb329e71adda291cd07e1802a5b49",
"artifacts\\verification\\VisualUpgrade\\FinalProduct\\index.html": "c959897dce94e24ea3d54198864bcc49dcdc58965aac739930920e26194d79cc",
"artifacts\\verification\\Final\\VoicePayload\\apk-voice-payload.json": "a3c1fc9e0ef0170b3fcb60170ae4ca5b9ec640b644fd1f2b00fea591bdc28650",
"SourceAssets\\Models\\Heroes\\active-adoption.json": "3447de26a676872a4f1527dea9c0c642c90cc690569323f3e19554c31ea99cb5",
"SourceAssets\\Models\\Meadow\\active-adoption.json": "8d77a7fce5a847af64bbca8cb54d0997ab728ff5ca8bf0a9b6949f1df233b6b4"
},
"nextGate": "검토 승인·차단0. 최종 제품 사용자 승인과 dev 통합/원격 push는 이 리뷰가 수행하거나 대체하지 않는다."
}
@@ -0,0 +1,221 @@
{
"status": "approved",
"reviewType": "원경 틈 수정 pre-merge 독립 검토",
"language": "ko",
"reviewedAtUtc": "2026-10-08T16:57:49.857929+00:00",
"scope": {
"baselineCommit": "da169df7c7c7215ce562f8f512d93fb4df2e39b7",
"reviewedCommit": "ef03611628cb395d377cf56abd951bbf62cfa29c",
"worktree": "C:\\git\\MagnetismHeroes\\.dryforge\\worktrees\\T4",
"changedFiles": 32,
"changedStageAssets": 30,
"changedFarHorizonPositionRows": 120,
"runtimeExecutionByReviewer": false,
"permittedWrite": "리뷰 JSON만",
"nextGate": "root 통합 후 새 제품의 전체 4단계 및 갱신 문서/해시 검토는 별도 후속"
},
"preservedReview": {
"path": "artifacts\\verification\\VisualUpgrade\\BeforeHorizonFix\\final-review.json",
"sha256": "2f4269c77224aea872289cf51f76a5f6cdb626ec7af1789a63f5fcfb91a0e5b0",
"meaning": "기존 전체 네 관점 검토의 결과와 실제 원문 증거를 유지하며 이번 판단은 원경 수정 delta에 적용한다."
},
"rubric": [
{
"lens": "요구·코드 품질",
"result": "통과",
"checks": [
"R07 실제 화면 중앙 원경 하단의 하늘/검은 틈 제거",
"R03/R04 승인된 구 배치·그룹·목표·순서와 수학 유지",
"R06 승인 원본/FBX 25개 및 31개 재질 정확 해시 유지",
"R09 기존 Stage의 FarHorizon x/z 위치만 갱신하는 최소 수정"
]
},
{
"lens": "내용 형식",
"result": "통과",
"checks": [
"commands/result/preservation JSON과 XML이 실패 시도·통과 범위·소스·환경을 구분",
"캡처 metadata에 14도 foot 비교 FOV 명시"
]
},
{
"lens": "완전성",
"result": "통과(이번 좁은 범위)",
"checks": [
"세 세계 actual geometry probe와 실제 화면",
"targeted Edit 7개 및 Play 10개 원문",
"새 전체 4단계를 이미 수행했다고 기록하지 않음"
]
},
{
"lens": "교차 참조·원문",
"result": "통과",
"checks": [
"CLI command/exit 기록과 Unity 원문 종료 코드 및 XML 대조",
"기존 실패 366·trial28 실패6을 녹색으로 바꾸지 않음",
"승인/재질/비시각부 보존 보고서를 실제 파일·git delta와 대조"
]
}
],
"issues": [],
"resolvedBlocker": {
"requirement": "R07 자연스러운 지형 연결",
"location": "Assets/MagnetismHeroes/Editor/VisualUpgradeAssets.cs / 30 StageAssets FarHorizon 배치",
"cause": "radius35에서 파란 원경 아래 apron과의 겹침 부족",
"fix": "공통 FarHorizonRadius27 및 scoped Unity Editor API 배치 갱신",
"visualEvidence": [
"horizon-world11-foot-legacy-radius35.png",
"horizon-world11-foot-current.png",
"world11-ten-one-group-tablet-orbitzoom.png",
"world21-single-resupplied-phone-orbitzoom.png"
],
"judgment": "동일 카메라 legacy/current close foot 및 원래 지적된 두 전체 화면에서 중앙 sky/검은 slit가 사라졌다. 전체 화면 양끝의 평평한 원경 림은 관찰 범위에서 녹색 apron과 맞닿는 원래 mound 외곽 실루엣이며, 하늘이 발밑으로 관통하는 잔여 floating gap 근거는 없다."
},
"codeReview": {
"helper": "ApplyHorizonContinuity는 기존 30 Stage의 FarHorizon 네 개를 기대하고 x/z 방향을 정규화하여 공통 반경으로 옮기며 y/scales/rotation/다른 props를 유지한다. 반복 실행 결과가 같고 기존 generator가 같은 상수를 사용한다. StageSignature로 비시각부 보존을 검사한다.",
"newTest": "실제 imported sharedMesh를 별도 LocalPhysics3D Scene의 MeshCollider로 탐색하므로 반경 상수 복사만으로 통과하는 검사가 아니다. 실제 게임 계층에는 collider를 추가하지 않는다. board JSON 및 actual collider array 불변을 종료 시 검사하고 camera/FOV/임시 legacy 배치를 복원한다.",
"serializedDiff": "32개 파일은 scoped helper·Play geometry/capture metadata·30 Stage이며 120개의 FarHorizon x/z 행 외 다른 Stage 필드 변경이 없다. Unity API 저장 형태를 유지한다."
},
"preservation": {
"approvedBinaryShaMatched": 25,
"materialExactBytesAndColorMatched": 31,
"stagesNonvisualPrefixMatched": 30,
"unchanged": "승인 geometry/FBX/import metadata/재질·초기 구/그룹/ID/수학/카메라/입력/collider/다른 장식 배치",
"independentMethod": "실제 파일 SHA 비교와 baseline→immutable commit 전체 32파일 diff 검토"
},
"actualVerification": {
"xmlChecks": [
{
"path": "red-geometry.xml",
"result": "Failed(Child)",
"total": "1",
"passed": "0",
"failed": "1",
"skipped": "0",
"inconclusive": "0",
"actualCaseCount": 1,
"actualPassedCaseCount": 0
},
{
"path": "trial28.xml",
"result": "Failed(Child)",
"total": "1",
"passed": "0",
"failed": "1",
"skipped": "0",
"inconclusive": "0",
"actualCaseCount": 1,
"actualPassedCaseCount": 0
},
{
"path": "editmode.xml",
"result": "Passed",
"total": "7",
"passed": "7",
"failed": "0",
"skipped": "0",
"inconclusive": "0",
"actualCaseCount": 7,
"actualPassedCaseCount": 7
},
{
"path": "playmode.xml",
"result": "Passed",
"total": "10",
"passed": "10",
"failed": "0",
"skipped": "0",
"inconclusive": "0",
"actualCaseCount": 10,
"actualPassedCaseCount": 10
}
],
"editUnityExit": 0,
"editCliExit": 0,
"playUnityExit": 0,
"playCliExit": 0,
"redUnityExit": 2,
"redCliExit": 8,
"redMissingSamples": 366,
"trial28UnityExit": 2,
"trial28CliExit": 8,
"trial28MissingSamples": 6,
"initialCompileAttempt": {
"log": "red.log",
"exit": 1,
"evaluatedGeometry": false
},
"geometryFinalMissingByStage": {
"1": 0,
"11": 0,
"21": 0
},
"commandsVerifiedFrom": "commands.json + Unity log COMMAND LINE ARGUMENTS + test completion exit lines + XML actual cases",
"captureInventory": 119,
"personallyViewedNewPngCount": 8,
"all119ViewedClaim": false
},
"advisories": [
{
"id": "geometry-sampling-bound",
"severity": "정보",
"finding": "새 probe는 cardinal corridor lateral ±12m, radial 0..실제 배치 거리, step .25m/2m이다. 실제 원경 foot 폭 약 ±15.35m의 전체 경계나 모든 각도를 망라하지 않는다.",
"disposition": "표본 0만으로 전체 외곽 해결을 주장하지 않고, 독립 실제 화면 판정을 함께 근거로 사용했다. 향후 더 넓은 카메라/원경 범위를 도입할 때 probe 범위를 함께 검토한다."
},
{
"id": "existing-below-ground-camera",
"severity": "정보",
"finding": "기존 자유 Orbit의 지하 각도에서 넓은 clearing의 underside가 더 큰 화면 영역을 가릴 수 있다.",
"disposition": "기존 전체 리뷰의 수용 한계를 유지한다. 이번 변경이 카메라/물리/구 배치를 바꾸지 않으며 모든 각도 가시성을 주장하지 않는다. 별도 UX 결정 범위이다."
},
{
"id": "existing-device-and-physical-occlusion",
"severity": "정보",
"finding": "합성 Editor CPU/메모리는 실제 단말 FPS/GPU/열/배터리 검증이 아니며, 일부 초기 그룹의 얼굴은 다른 구에 물리적으로 가려질 수 있다.",
"disposition": "원래 리뷰와 문서의 한계를 유지한다. 현재 초기 배열과 label/55 구 발견·선택·드래그 조건을 보존한다. 실제 단말/아동/iOS는 이번 검토 범위 밖이다."
}
],
"gitChecks": {
"rootBefore": {
"gitRoot": "C:/git/MagnetismHeroes",
"HEAD": "da169df7c7c7215ce562f8f512d93fb4df2e39b7",
"clean": true,
"protectedDev": "58410281e015c6600dc543c4e093fd95c036288c"
},
"rootAfter": {
"HEAD": "3346eb559bdfba24332feb4d9be4b7104520233e",
"clean": true,
"protectedDev": "58410281e015c6600dc543c4e093fd95c036288c"
},
"worktreeAfter": {
"HEAD": "ef03611628cb395d377cf56abd951bbf62cfa29c",
"clean": true
},
"rootHeadChangeExplanation": "pre-merge clear를 parent에게 먼저 전달한 뒤 root가 통합을 진행하여 종료 체크의 root HEAD가 변했다. 본 판정 대상은 immutable ef036 commit이며 root 통합 전체 단계 승인을 뜻하지 않는다."
},
"evidenceSha256": {
"commands.json": "30aa2370d563444fb5354fd7aad6e4c996baa2d2bbfd5c67499931a314deea5e",
"result.json": "d3b70ae81c29b15582fe77b0c9c6636432c62f68606d39faff1da8d48da2f7a4",
"preservation.json": "cbab404eef5524a053cfca09be50a579f6bae858cfab78dc3dfdc6e2501ddb34",
"red-geometry.xml": "73b8dbd327c7ddc0618f0c2a10befe12033ae8d0a0585eb66d6dcc37d87a6fe3",
"red-geometry.log": "171a631aa96287796c0c795a4d4ef6662efa65a92707e3894930af5731bc94aa",
"trial28.xml": "da2f290364723076609dc513df06fcb454a9a4d75ac575cb56bd0ac94fa37a5b",
"trial28.log": "e7c9148d4e16fa208b77d222eb6f1443dd5820ec9c54e2f63579f98d9c5c1d0d",
"editmode.xml": "bf3826d56e130eb11264035d563029d1d0277f0a5630f56cdb1ffc4100260a3a",
"editmode.log": "ee4b615dc1f07c731d0774d2b958611afa530173b570f70cb0074090567d7d03",
"playmode.xml": "95e3a935c26803c2af29d94b60c5b674b4ad1c61359bfbcadc9a8d196237ea03",
"playmode.log": "4fe5cc4e76e937ab7d3fef7ce67f0c9f5dabc481e52ec08c9311d7b192ffc14a",
"apply27.log": "c306375c2de4b24a88d59d26924005e37baec7157ca91f40f47e414488c00b09"
},
"personallyViewedImageSha256": {
"horizon-world11-foot-legacy-radius35.png": "d6d23085030e82f21f48dce40aab221d3657c3ce76d9d3606ae1b256676d1944",
"horizon-world11-foot-current.png": "181a9b24cbeb8a0971b4bb2aa0b467899cce40c3116556cb6fa6e848219ba4cb",
"world11-ten-one-group-tablet-orbitzoom.png": "1ecebdd4677377b490f5836a0ae8cabed6308df9d9bd43f12038a5da31b87720",
"world21-single-resupplied-phone-orbitzoom.png": "9096a13e0cf4ccd9bb8e4b982b6278fbe9f648423676583cc98880d9cfc297da",
"horizon-world1-tablet-default.png": "7f977eb18af84fdf5f2825bcc3b65e8a6733776893870950bdef8d62c8406931",
"horizon-world21-phone-orbitzoom.png": "7255763644f98a36a973b3b17752e79ac83d7633cf9969d8058106e415ee3997",
"horizon-world1-foot-current.png": "66cc35a90ac0ab0bde5a5f1fc52e380b994251149e42335ad9a792ed801386c4",
"horizon-world21-foot-current.png": "05dbbf98e8e1961222ed8579f52768134939a6601148002d9246a0761907d2f9"
},
"boundedConclusion": "원경 수정 delta를 승인하며 차단 0건이다. 원래 전체 검토 결과를 보존하고 새 통합 제품의 전체 네 단계·문서/메타데이터 변경 검토를 별도 후속으로 남긴다. 최종 사용자 승인이나 dev merge/push의 승인이 아니다."
}
@@ -0,0 +1,77 @@
{
"schemaVersion": 1,
"reviewer": "model_conformance independent spec reviewer",
"base": "58410281e015c6600dc543c4e093fd95c036288c",
"reviewDateUtc": "2026-10-07T17:03:27.724783+00:00",
"status": "pass",
"blockers": [],
"readOnlyScope": "Repository and worktrees read-only; Python bytes/SHA/FBX parsing and image viewing only; no Blender/Unity/commit/runtime adoption. Writes limited to .dryforge/reviews evidence.",
"userApproval": "PENDING; this review does not approve runtime adoption",
"runtimeVerification": "NOT_RUN; later approved Unity integration must verify actual interaction, selection, 30-stage mapping and Android",
"task": "T1",
"branch": "dryforge/hero-model",
"commit": "7d7efbe6b6a1a419ac998f37e3e019a75570a9e5",
"worktree": "C:\\git\\MagnetismHeroes\\.dryforge\\worktrees\\T1",
"changedFiles": 7,
"evidenceRoot": "artifacts/verification/VisualUpgrade/ModelReview/Heroes",
"artifacts": [
{
"path": "SourceAssets/Models/Heroes/MagneticKnight.blend",
"bytes": 1833499,
"sha256": "7ce1272dfe861aee986609cdb899f0edf8b8f2f0f17269c0eda472c8aa90ee3a"
},
{
"path": "Assets/MagnetismHeroes/UnityRuntime/Presentation/Models/Heroes/HeroBody.fbx",
"bytes": 60076,
"sha256": "56f3301176c612ebeab3fdaaba5c019674beeb0f727f97ed27dd67e32ff50a40"
},
{
"path": "Assets/MagnetismHeroes/UnityRuntime/Presentation/Models/Heroes/KnightEquipment.fbx",
"bytes": 222764,
"sha256": "a8059a020e79e080635e7326bb91576010cad10c60ee931d95536d47fe76e61c"
}
],
"hashes": "Source/2 FBX/face atlas/six sprite records independently matched actual bytes",
"preservation": "13 original FBX byte-identical; existing provenance Git blobs unchanged; only 7 added candidate/tool/doc files; no manual meta or runtime wiring",
"findings": [
{
"spec": "Body mesh/material improvement, radius .5m and root scale1",
"evidence": [
"tools/models/build_hero.py:238",
"tools/models/build_hero.py:251",
"SourceAssets/Models/Heroes/verification.json",
"artifacts/verification/VisualUpgrade/ModelReview/Heroes/body_standalone.png"
],
"observed": "New smooth body mesh/material authored. Actual FBX 1986 vertices with radii .499999984 to .500000019m; 1 body mesh and 22 equipment meshes, default scale1 and shared origin."
},
{
"spec": "Rounded open helmet, short blunt sword, round shield; existing 6 expressions, thin blue mask and cape coexist",
"evidence": [
"artifacts/verification/VisualUpgrade/ModelReview/Heroes/hero_three_quarter.png",
"artifacts/verification/VisualUpgrade/ModelReview/Heroes/knight_front.png",
"artifacts/verification/VisualUpgrade/ModelReview/Heroes/knight_side.png",
"artifacts/verification/VisualUpgrade/ModelReview/Heroes/knight_back.png",
"artifacts/verification/VisualUpgrade/ModelReview/Heroes/expression_0_Neutral.png",
"artifacts/verification/VisualUpgrade/ModelReview/Heroes/expression_5_Celebrating.png"
],
"observed": "All 11 actual PNGs viewed. No face/eye/mouth occlusion or visible broken silhouette preventing the later interaction promise. Intentional attachment overlap is not treated as a solid-intersection-zero requirement."
},
{
"spec": "Editable source, export/reopen/mesh/SHA checks, source-to-game-file provenance; preview-only atlas reuse",
"evidence": [
"SourceAssets/Models/Heroes/README.md",
"SourceAssets/Models/Heroes/provenance.json",
"SourceAssets/Models/Heroes/verification.json",
"tools/models/build_hero.py:138",
"tools/models/build_hero.py:212",
"artifacts/verification/VisualUpgrade/ModelReview/Heroes/build-final.log",
"artifacts/verification/VisualUpgrade/ModelReview/Heroes/verify.log"
],
"observed": "Actual Blender5.2.2LTS reopen/FBX-import logs, named body/equipment/review collections, m Z-up to -Z-forward/Y-up, no animation. Face/ribbon not included in FBX and preserve source atlas SHA."
}
],
"remaining": [
"Full hero plus three-landscape presentation and explicit user model approval are still required before any runtime adoption.",
"One representative hero per group, quantity/ID/collider boundaries and scene selection are later Unity integration checks."
]
}
@@ -0,0 +1,602 @@
{
"schemaVersion": 1,
"reviewer": "model_conformance independent spec reviewer",
"base": "58410281e015c6600dc543c4e093fd95c036288c",
"reviewDateUtc": "2026-10-07T17:03:27.724783+00:00",
"status": "pass",
"blockers": [],
"readOnlyScope": "Repository and worktrees read-only; Python bytes/SHA/FBX parsing and image viewing only; no Blender/Unity/commit/runtime adoption. Writes limited to .dryforge/reviews evidence.",
"userApproval": "PENDING; this review does not approve runtime adoption",
"runtimeVerification": "NOT_RUN; later approved Unity integration must verify actual interaction, selection, 30-stage mapping and Android",
"task": "T2",
"branch": "dryforge/meadow-model",
"commit": "80be80566a309eab8cb333ea9774218c816efc30",
"worktree": "C:\\git\\MagnetismHeroes\\.dryforge\\worktrees\\T2",
"changedFiles": 25,
"evidenceRoot": "artifacts/verification/VisualUpgrade/ModelReview/Meadow",
"artifacts": [
{
"path": "SourceAssets/Models/Meadow/MeadowCandidates.blend",
"bytes": 1350505,
"sha256": "2d95f1797c1a1042e32bb2588d0bde735b6e109a5f947b1f0720c7537bda6ea9"
},
{
"path": "tools/models/build_meadow.py",
"bytes": 43245,
"sha256": "f0e7717a5154bf85eeff68639f6f21ca1f79f6d69af8fa0125acf43415f32db1"
},
{
"path": "Assets/MagnetismHeroes/UnityRuntime/Presentation/Models/Meadow/DaisyColony.fbx",
"bytes": 179196,
"sha256": "a646a875d99b7cbcef727723b45c6a1e5d6231255ef100689fe69db2e55af63c"
},
{
"path": "Assets/MagnetismHeroes/UnityRuntime/Presentation/Models/Meadow/DistantRidge.fbx",
"bytes": 67788,
"sha256": "af68a4b08e0696cb0b56acf92bf0753d288ad6ba89fd4f19b183995f4ed6fd0c"
},
{
"path": "Assets/MagnetismHeroes/UnityRuntime/Presentation/Models/Meadow/FarHorizon.fbx",
"bytes": 66924,
"sha256": "fcfb4a768ca33ab9ccd166f7e4b3a96cbc918d1a564f59144b0fab399cb7c179"
},
{
"path": "Assets/MagnetismHeroes/UnityRuntime/Presentation/Models/Meadow/FernCluster.fbx",
"bytes": 202508,
"sha256": "9153c91cb71a762c54bc0bc3c5e6fcfe2650185defaf60b5da75e25d78aa4911"
},
{
"path": "Assets/MagnetismHeroes/UnityRuntime/Presentation/Models/Meadow/GentleHill.fbx",
"bytes": 67420,
"sha256": "356d3baa0927264f7807e13f3acb717b0c040ae09b23b8feac67e717142d3a19"
},
{
"path": "Assets/MagnetismHeroes/UnityRuntime/Presentation/Models/Meadow/GrassTuftGold.fbx",
"bytes": 72908,
"sha256": "0b2a3d68909b56ecdd3324503d3a6bc2b2f9dc8e1d173536dfe52ca96e49521f"
},
{
"path": "Assets/MagnetismHeroes/UnityRuntime/Presentation/Models/Meadow/GrassTuftMint.fbx",
"bytes": 72700,
"sha256": "650e02dab0ae3a0f05d036e2d58846cb97a93b77864cbc2c704b4364c26d9962"
},
{
"path": "Assets/MagnetismHeroes/UnityRuntime/Presentation/Models/Meadow/LavenderLupineColony.fbx",
"bytes": 250284,
"sha256": "596266e001d7765634ff749deee33cbece1e5bb69ba693bf8c34da795f4f7bdb"
},
{
"path": "Assets/MagnetismHeroes/UnityRuntime/Presentation/Models/Meadow/LowLimestone.fbx",
"bytes": 47228,
"sha256": "026abf6db9395751e7ad933455bacc96a06fe331a4bb777001ee29bf33f8417d"
},
{
"path": "Assets/MagnetismHeroes/UnityRuntime/Presentation/Models/Meadow/MeadowClearing.fbx",
"bytes": 68284,
"sha256": "78c307844de3ef5584aaa0bec3e57500f9115065dd643686473e52632d551a29"
},
{
"path": "Assets/MagnetismHeroes/UnityRuntime/Presentation/Models/Meadow/MintShrub.fbx",
"bytes": 96012,
"sha256": "f501d302845a6df4814076abf76bdd97f5ffd2f0527f2aff236e0b97e78e62da"
},
{
"path": "Assets/MagnetismHeroes/UnityRuntime/Presentation/Models/Meadow/MossStoneSteps.fbx",
"bytes": 155068,
"sha256": "5a1bf51f80abde9a9a9e7a419ad30509ad62beac372244e0aba5681896a01739"
},
{
"path": "Assets/MagnetismHeroes/UnityRuntime/Presentation/Models/Meadow/OpenStoneArch.fbx",
"bytes": 34636,
"sha256": "8835e7c96ca842ddece1c1f7c9d168a1eabf4f0555e5a025bf46637969dff243"
},
{
"path": "Assets/MagnetismHeroes/UnityRuntime/Presentation/Models/Meadow/PebbleScatter.fbx",
"bytes": 32060,
"sha256": "34748a549b40ebe8a53cb57d9638ccbf3e480e8b56453b686c378db8a069da8f"
},
{
"path": "Assets/MagnetismHeroes/UnityRuntime/Presentation/Models/Meadow/PinkCosmosColony.fbx",
"bytes": 153516,
"sha256": "6bfc69131ff2cde84f858aa50e3e11697679073d3cd1d0a39a15f4b02cc3afb6"
},
{
"path": "Assets/MagnetismHeroes/UnityRuntime/Presentation/Models/Meadow/RoundCanopyTree.fbx",
"bytes": 147772,
"sha256": "9a41dcb9cb40e080bf4be6418f68eb5893561d9454e54a79a402f936ceb59757"
},
{
"path": "Assets/MagnetismHeroes/UnityRuntime/Presentation/Models/Meadow/RoundLimestone.fbx",
"bytes": 48700,
"sha256": "eaff76573039ab66927749569e511d5031e90c9ceb7dd8d7cccd84ab7032ca36"
},
{
"path": "Assets/MagnetismHeroes/UnityRuntime/Presentation/Models/Meadow/SageCanopyTree.fbx",
"bytes": 147772,
"sha256": "26665d557ef176a9fcce24107d19619b9848552538482eae4b35ebd9fbcd0aec"
},
{
"path": "Assets/MagnetismHeroes/UnityRuntime/Presentation/Models/Meadow/SageShrub.fbx",
"bytes": 96108,
"sha256": "fbfed3947cc3e05c82f5660bae9c864576839174c7f72c0cbf0a278d6847eefc"
},
{
"path": "Assets/MagnetismHeroes/UnityRuntime/Presentation/Models/Meadow/SlateBoulder.fbx",
"bytes": 49852,
"sha256": "48da619e712ba4ee21c55baea8d93ce656db8a1c30475f0d2cb6bfecfc3b0a84"
},
{
"path": "Assets/MagnetismHeroes/UnityRuntime/Presentation/Models/Meadow/TallWindTree.fbx",
"bytes": 116140,
"sha256": "378cdb0fc1d67a980d67d51a469148a6d720a03c9e650b35979bcf98ddf6bcad"
}
],
"directFbxVerification": [
{
"asset": "DaisyColony",
"fbxVersion": 7400,
"meshCount": 1,
"vertices": 3225,
"triangles": 6210,
"floorPivot": true,
"localScaleOne": true,
"localOriginZero": true,
"nativeBoundsMatch": true,
"uvPresent": true,
"finiteNormals": true,
"materialSlots": [
"Stem",
"LeafSage",
"PetalCream",
"PollenHoney"
],
"animationAbsent": true
},
{
"asset": "DistantRidge",
"fbxVersion": 7400,
"meshCount": 1,
"vertices": 1089,
"triangles": 2174,
"floorPivot": true,
"localScaleOne": true,
"localOriginZero": true,
"nativeBoundsMatch": true,
"uvPresent": true,
"finiteNormals": true,
"materialSlots": [
"RidgeTeal",
"RidgeLight",
"SoilWarm"
],
"animationAbsent": true
},
{
"asset": "FarHorizon",
"fbxVersion": 7400,
"meshCount": 1,
"vertices": 1089,
"triangles": 2174,
"floorPivot": true,
"localScaleOne": true,
"localOriginZero": true,
"nativeBoundsMatch": true,
"uvPresent": true,
"finiteNormals": true,
"materialSlots": [
"RidgeFar",
"SoilWarm"
],
"animationAbsent": true
},
{
"asset": "FernCluster",
"fbxVersion": 7400,
"meshCount": 1,
"vertices": 3906,
"triangles": 7504,
"floorPivot": true,
"localScaleOne": true,
"localOriginZero": true,
"nativeBoundsMatch": true,
"uvPresent": true,
"finiteNormals": true,
"materialSlots": [
"LeafSage",
"Stem"
],
"animationAbsent": true
},
{
"asset": "GentleHill",
"fbxVersion": 7400,
"meshCount": 1,
"vertices": 1089,
"triangles": 2174,
"floorPivot": true,
"localScaleOne": true,
"localOriginZero": true,
"nativeBoundsMatch": true,
"uvPresent": true,
"finiteNormals": true,
"materialSlots": [
"GroundMint",
"GroundSage",
"SoilWarm"
],
"animationAbsent": true
},
{
"asset": "GrassTuftGold",
"fbxVersion": 7400,
"meshCount": 1,
"vertices": 1026,
"triangles": 1976,
"floorPivot": true,
"localScaleOne": true,
"localOriginZero": true,
"nativeBoundsMatch": true,
"uvPresent": true,
"finiteNormals": true,
"materialSlots": [
"GrassGold",
"GrassMint"
],
"animationAbsent": true
},
{
"asset": "GrassTuftMint",
"fbxVersion": 7400,
"meshCount": 1,
"vertices": 1026,
"triangles": 1976,
"floorPivot": true,
"localScaleOne": true,
"localOriginZero": true,
"nativeBoundsMatch": true,
"uvPresent": true,
"finiteNormals": true,
"materialSlots": [
"GrassGold",
"GrassMint"
],
"animationAbsent": true
},
{
"asset": "LavenderLupineColony",
"fbxVersion": 7400,
"meshCount": 1,
"vertices": 4836,
"triangles": 9304,
"floorPivot": true,
"localScaleOne": true,
"localOriginZero": true,
"nativeBoundsMatch": true,
"uvPresent": true,
"finiteNormals": true,
"materialSlots": [
"Stem",
"LeafSage",
"PetalLavender"
],
"animationAbsent": true
},
{
"asset": "LowLimestone",
"fbxVersion": 7400,
"meshCount": 1,
"vertices": 536,
"triangles": 1068,
"floorPivot": true,
"localScaleOne": true,
"localOriginZero": true,
"nativeBoundsMatch": true,
"uvPresent": true,
"finiteNormals": true,
"materialSlots": [
"StoneCream",
"StoneLight",
"StoneShade"
],
"animationAbsent": true
},
{
"asset": "MeadowClearing",
"fbxVersion": 7400,
"meshCount": 1,
"vertices": 1089,
"triangles": 2174,
"floorPivot": true,
"localScaleOne": true,
"localOriginZero": true,
"nativeBoundsMatch": true,
"uvPresent": true,
"finiteNormals": true,
"materialSlots": [
"GroundMint",
"GroundSage",
"SoilWarm"
],
"animationAbsent": true
},
{
"asset": "MintShrub",
"fbxVersion": 7400,
"meshCount": 1,
"vertices": 1524,
"triangles": 2968,
"floorPivot": true,
"localScaleOne": true,
"localOriginZero": true,
"nativeBoundsMatch": true,
"uvPresent": true,
"finiteNormals": true,
"materialSlots": [
"BarkHoney",
"LeafMint",
"LeafLight",
"LeafShade"
],
"animationAbsent": true
},
{
"asset": "MossStoneSteps",
"fbxVersion": 7400,
"meshCount": 1,
"vertices": 3267,
"triangles": 6522,
"floorPivot": true,
"localScaleOne": true,
"localOriginZero": true,
"nativeBoundsMatch": true,
"uvPresent": true,
"finiteNormals": true,
"materialSlots": [
"StoneCream",
"StoneLight",
"StoneShade"
],
"animationAbsent": true
},
{
"asset": "OpenStoneArch",
"fbxVersion": 7400,
"meshCount": 1,
"vertices": 396,
"triangles": 788,
"floorPivot": true,
"localScaleOne": true,
"localOriginZero": true,
"nativeBoundsMatch": true,
"uvPresent": true,
"finiteNormals": true,
"materialSlots": [
"StoneCream",
"StoneLight",
"StoneShade"
],
"animationAbsent": true
},
{
"asset": "PebbleScatter",
"fbxVersion": 7400,
"meshCount": 1,
"vertices": 336,
"triangles": 656,
"floorPivot": true,
"localScaleOne": true,
"localOriginZero": true,
"nativeBoundsMatch": true,
"uvPresent": true,
"finiteNormals": true,
"materialSlots": [
"StoneCream",
"StoneLight"
],
"animationAbsent": true
},
{
"asset": "PinkCosmosColony",
"fbxVersion": 7400,
"meshCount": 1,
"vertices": 2685,
"triangles": 5170,
"floorPivot": true,
"localScaleOne": true,
"localOriginZero": true,
"nativeBoundsMatch": true,
"uvPresent": true,
"finiteNormals": true,
"materialSlots": [
"Stem",
"LeafSage",
"PetalPink",
"PollenHoney"
],
"animationAbsent": true
},
{
"asset": "RoundCanopyTree",
"fbxVersion": 7400,
"meshCount": 1,
"vertices": 2486,
"triangles": 4840,
"floorPivot": true,
"localScaleOne": true,
"localOriginZero": true,
"nativeBoundsMatch": true,
"uvPresent": true,
"finiteNormals": true,
"materialSlots": [
"BarkHoney",
"LeafMint",
"LeafLight",
"LeafShade",
"BarkLight"
],
"animationAbsent": true
},
{
"asset": "RoundLimestone",
"fbxVersion": 7400,
"meshCount": 1,
"vertices": 563,
"triangles": 1122,
"floorPivot": true,
"localScaleOne": true,
"localOriginZero": true,
"nativeBoundsMatch": true,
"uvPresent": true,
"finiteNormals": true,
"materialSlots": [
"StoneCream",
"StoneLight",
"StoneShade"
],
"animationAbsent": true
},
{
"asset": "SageCanopyTree",
"fbxVersion": 7400,
"meshCount": 1,
"vertices": 2486,
"triangles": 4840,
"floorPivot": true,
"localScaleOne": true,
"localOriginZero": true,
"nativeBoundsMatch": true,
"uvPresent": true,
"finiteNormals": true,
"materialSlots": [
"BarkHoney",
"LeafSage",
"LeafLight",
"LeafShade",
"BarkLight"
],
"animationAbsent": true
},
{
"asset": "SageShrub",
"fbxVersion": 7400,
"meshCount": 1,
"vertices": 1524,
"triangles": 2968,
"floorPivot": true,
"localScaleOne": true,
"localOriginZero": true,
"nativeBoundsMatch": true,
"uvPresent": true,
"finiteNormals": true,
"materialSlots": [
"BarkHoney",
"LeafSage",
"LeafLight",
"LeafShade"
],
"animationAbsent": true
},
{
"asset": "SlateBoulder",
"fbxVersion": 7400,
"meshCount": 1,
"vertices": 577,
"triangles": 1150,
"floorPivot": true,
"localScaleOne": true,
"localOriginZero": true,
"nativeBoundsMatch": true,
"uvPresent": true,
"finiteNormals": true,
"materialSlots": [
"StoneBlue",
"StoneLight",
"StoneShade"
],
"animationAbsent": true
},
{
"asset": "TallWindTree",
"fbxVersion": 7400,
"meshCount": 1,
"vertices": 1936,
"triangles": 3804,
"floorPivot": true,
"localScaleOne": true,
"localOriginZero": true,
"nativeBoundsMatch": true,
"uvPresent": true,
"finiteNormals": true,
"materialSlots": [
"BarkHoney",
"PineMint",
"LeafLight",
"LeafShade"
],
"animationAbsent": true
}
],
"hashes": "All 23 resource byte counts/SHA and all10 actual PNG SHA with recorded source SHA independently matched",
"preservation": "PlaygroundProps.blend plus 13 original FBX byte-identical; diff25 added candidate/tool/doc files only; no manual meta/runtime wiring",
"findings": [
{
"spec": "R01 cyan clear daytime / pastel natural cute cartoon coherent with reference",
"evidence": [
"artifacts/verification/VisualUpgrade/ModelReview/Meadow/Preview_ClearMeadow.png",
"artifacts/verification/VisualUpgrade/ModelReview/Meadow/Preview_FlowerHills.png",
"artifacts/verification/VisualUpgrade/ModelReview/Meadow/Preview_StoneHills.png",
"tools/models/build_meadow.py:376"
],
"observed": "Three actual overviews viewed: cyan sky, rounded foliage/ground/horizon, pastel flowers and warm soft daylight. Hero and natural scenery use a coherent rounded cartoon direction; no copied reference character/weapon/UI geometry."
},
{
"spec": "R04 three landscapes; R05 editable detailed nature and unobscured playable center",
"evidence": [
"tools/models/build_meadow.py:217",
"tools/models/build_meadow.py:249",
"tools/models/build_meadow.py:456",
"artifacts/verification/VisualUpgrade/ModelReview/Meadow/Closeup_BranchesAndLeaves.png",
"artifacts/verification/VisualUpgrade/ModelReview/Meadow/Closeup_PetalsStemsLeaves.png",
"artifacts/verification/VisualUpgrade/ModelReview/Meadow/Closeup_OpenArchAndTerraces.png"
],
"observed": "All10 PNGs independently viewed. Meadow, denser pink/cream/lavender flower hills and rock-heavy hills are distinct. Tree branches/root/canopy/leaves, shrub, individual grass/fern blades, flower petals/stems/leaves, rock planes, rolling ground and open arch are present. Central low-density play area remains readable in candidate composition."
},
{
"spec": "R06 native blend +21FBX floor pivots/unit scales/UV/material slots/hash/license and original preservation",
"evidence": [
"SourceAssets/Models/Meadow/provenance.json",
"SourceAssets/Models/Meadow/README.md",
"tools/models/build_meadow.py:550",
"tools/models/build_meadow.py:582",
"artifacts/verification/VisualUpgrade/ModelReview/Meadow/source-verification.json",
"artifacts/verification/VisualUpgrade/ModelReview/Meadow/verify-only.log",
"artifacts/verification/VisualUpgrade/ModelReview/Meadow/run-evidence.json"
],
"observed": "Source reopened and 21 actual FBX roundtrips are recorded with exit0. Independent FBX byte parsing verified single mesh per file, exact vertex/triangle counts and native bounds, floor minZ0, default scale1/origin0, UV and finite normals, exact named material slots, axis rotation and no animation. All23 source/tool/export records matched SHA/bytes."
},
{
"spec": "R07 no unintentional dark patches/checker faceting/ground seams harming readability/coherence",
"evidence": [
"artifacts/verification/VisualUpgrade/ModelReview/Meadow/Preview_ClearMeadow.png",
"artifacts/verification/VisualUpgrade/ModelReview/Meadow/Preview_FlowerHills.png",
"artifacts/verification/VisualUpgrade/ModelReview/Meadow/Preview_StoneHills.png",
"artifacts/verification/VisualUpgrade/ModelReview/Meadow/Catalog_RockPlanes.png",
"artifacts/verification/VisualUpgrade/ModelReview/Meadow/Closeup_BranchesAndLeaves.png"
],
"observed": "No unintended black patch/checkerboard or open ground gap across assembled center. Broad intentional rock planes and ordinary foliage/ground shadows are not classified as violations."
},
{
"spec": "R10 candidate review output and no adoption before explicit user approval",
"evidence": [
"SourceAssets/Models/Meadow/README.md",
"SourceAssets/Models/Meadow/provenance.json",
"artifacts/verification/VisualUpgrade/ModelReview/Meadow/render-manifest.json"
],
"observed": "Three overview, four catalog and three detail renders, editable source and exact SHA are available. Metadata marks approval/import/gameplay/mobile PENDING or NOT_RUN. No runtime refs or meta added."
}
],
"remaining": [
"Explicit user approval of hero plus all three landscape candidates before any actual-game reference replacement/runtime adoption.",
"30-stage runtime mapping, actual sphere-position preservation, near-prop collider/arch selection, camera/zoom readability and Android performance require later approved integration."
]
}
@@ -0,0 +1,375 @@
{
"task": "T4",
"review": "Independent read-only pinned-commit spec conformance",
"verdict": "specpass",
"status": "PASS",
"reviewedUtc": "2026-10-08T14:49:34.161360+00:00",
"sourceCommit": "43b22d67886bc5715d3543fefda2dc24dead299f",
"baselineCommit": "7c786c5435042f3f4b5e9a4fb370a4350bb2309e",
"worktree": "C:/git/MagnetismHeroes/.dryforge/worktrees/T4",
"blockingFindings": [],
"checks": [
{
"requirements": [
"R10",
"R06"
],
"result": "pass",
"evidence": "All five groups explicitly approved. Review packet SHA verified. All 25 source/FBX SHA values independently match pinned Git blobs. Apply checks approval and hashes before mutation."
},
{
"requirements": [
"R02",
"R03"
],
"result": "pass",
"evidence": "Actual imported body diameter 1, root scale 1, sole SphereCollider radius .5, one equipment bundle, no equipment collider/Animator/rig. Existing six expressions/mask/ribbon/number and count/contact references preserved in raw prefab diffs. Only runtime edit: 3 GroupBadge lines following existing representative body centre and camera."
},
{
"requirements": [
"R03"
],
"result": "pass",
"evidence": "Actual Main test asserts equipment count, position and camera rotation across preview/cancel, merge/split, rotated representative changes and free-play reentry. Existing badge lifecycle deactivates/destroys previous badges; no Core/save/input changes."
},
{
"requirements": [
"R04"
],
"result": "pass",
"evidence": "All 30 nonvisual serialized StageAsset prefixes identical to baseline. New meadow decoration references everywhere; Garden 1-10/Cloud 11-20/Workshop 21-30 retained. Actual Garden free-play and reentry preserve scene theme; existing source-stage environment path unchanged for other themes."
},
{
"requirements": [
"R05"
],
"result": "pass within T4",
"evidence": "Arch/steps use imported nonconvex shared MeshCollider; no blocked BoxCollider arch. Small/distant vegetation has no collider. GameApp raw diff only disables floor renderer and changes camera background; floor physics preserved. No input ray bypass or ball relocation."
},
{
"requirements": [
"R06",
"R08"
],
"result": "pass",
"evidence": "Scoped Editor source uses Unity import/prefab/serialization APIs and excludes initial builders. All 23 FBX meta settings: scale1/fileScale/axisConversion/noAnimation. Imported roots preserved. All 31 material RGB values match portable provenance. All 268 pre-existing meta blobs, 13 legacy FBXs and 289 protected Core/audio/font/face/atlas/mixer/prefab-meta blobs identical to baseline. No runtime UnityEditor, new network/audio/platform/UI feature."
},
{
"requirements": [
"T4 verification"
],
"result": "pass",
"evidence": "Final asset tests 2/2 and actual Main PlayMode 2/2, all failed/skipped/inconclusive 0; raw logs independently report test exit0. Red XML evaluates the same asset tests and fails on missing body/natural decoration refs; green evaluates and passes. Ten final PNGs independently viewed; JSON pinned to clean commit, correct fixture origins and equipment counts."
},
{
"requirements": [
"Source integrity"
],
"result": "pass",
"evidence": "858 current source files independently match pre-final-play exact hashes; git status clean. Pinned Git content comparison:369 raw exact,488 exact CRLF conversions; GroupBadge mixed endings normalize exactly to pinned commit and exact worktree hash matches manifest. Post-final summary records clean same commit/858 hashes matched."
}
],
"tests": [
{
"file": "import-red.xml",
"result": "Failed(Child)",
"total": 2,
"passed": 0,
"failed": 2,
"skipped": 0,
"inconclusive": 0,
"startUtc": "2026-10-08 14:10:25Z",
"endUtc": "2026-10-08 14:10:25Z",
"cases": [
{
"name": "MagnetismHeroes.Tests.VisualUpgradeAssetTests.AllThirtyStagesConnectNaturalThemesWithOpenNearMeshCollidersAndColliderFreeDistantDecor",
"result": "Failed"
},
{
"name": "MagnetismHeroes.Tests.VisualUpgradeAssetTests.ApprovedBodyAndOneEquipmentAssemblyAreConnectedWithoutChangingSelectionSphere",
"result": "Failed"
}
]
},
{
"file": "import-green.xml",
"result": "Passed",
"total": 2,
"passed": 2,
"failed": 0,
"skipped": 0,
"inconclusive": 0,
"startUtc": "2026-10-08 14:16:25Z",
"endUtc": "2026-10-08 14:16:25Z",
"cases": [
{
"name": "MagnetismHeroes.Tests.VisualUpgradeAssetTests.AllThirtyStagesConnectNaturalThemesWithOpenNearMeshCollidersAndColliderFreeDistantDecor",
"result": "Passed"
},
{
"name": "MagnetismHeroes.Tests.VisualUpgradeAssetTests.ApprovedBodyAndOneEquipmentAssemblyAreConnectedWithoutChangingSelectionSphere",
"result": "Passed"
}
]
},
{
"file": "import-final.xml",
"result": "Passed",
"total": 2,
"passed": 2,
"failed": 0,
"skipped": 0,
"inconclusive": 0,
"startUtc": "2026-10-08 14:37:23Z",
"endUtc": "2026-10-08 14:37:23Z",
"cases": [
{
"name": "MagnetismHeroes.Tests.VisualUpgradeAssetTests.AllThirtyStagesConnectNaturalThemesWithOpenNearMeshCollidersAndColliderFreeDistantDecor",
"result": "Passed"
},
{
"name": "MagnetismHeroes.Tests.VisualUpgradeAssetTests.ApprovedBodyAndOneEquipmentAssemblyAreConnectedWithoutChangingSelectionSphere",
"result": "Passed"
}
]
},
{
"file": "play-final.xml",
"result": "Passed",
"total": 2,
"passed": 2,
"failed": 0,
"skipped": 0,
"inconclusive": 0,
"startUtc": "2026-10-08 14:38:35Z",
"endUtc": "2026-10-08 14:38:36Z",
"cases": [
{
"name": "MagnetismHeroes.Tests.VisualUpgradePlayTests.ActualMainShowsThreeThemesAndEquipmentFollowsPreviewCancelMergeSplitAndReentry",
"result": "Passed"
},
{
"name": "MagnetismHeroes.Tests.VisualUpgradePlayTests.TenSingleGroupsAndOneTenBallGroupRenderActualImportedResourceCounts",
"result": "Passed"
}
]
}
],
"visualObservations": [
"Three default natural themes render imported smooth sphere bodies and open helmets/blunt swords/round shields, readable faces/numbers and intact Korean UI; no visible missing-material pink or missing references.",
"Selection highlight visible; merged two-sphere group has one bundle and split/reentry two bundles. Synthetic ten-ball fixtures show10 versus1 bundles retaining10 balls. Attachment overlap/ordinary neighbouring-ball occlusion is not treated as a zero-intersection violation.",
"Rotated close view keeps gear/face alignment and continuous terrain. Extreme below-ground view obscures board; see T5 follow-up."
],
"nonblockingFindings": [
{
"id": "T5-QUALITY-SHADOWS",
"owner": "T5",
"requirements": [
"R01",
"R07"
],
"observation": "Default captures lack visible soft contact shadows; existing configuration unchanged. Full lighting/soft-shadow quality acceptance is not claimed by T4."
},
{
"id": "T5-EXTREME-CAMERA-OCCLUSION",
"owner": "T5",
"requirements": [
"R05",
"R07"
],
"evidence": "final/orbit210-pitch-45-distance15.png",
"observation": "Physical terrain underside obscures board at pitch-45/distance15. One view does not establish a regression. T5 must compare original floor/new ground, physical occlusion and allowed alternate views; this review requests no arbitrary camera restrictions or hit bypass."
}
],
"pendingChecks": [
"T5 full Edit/Play regression and legacy decoration-count/mesh-name expectation updates",
"T5 actual collider selection, arch hole, collection discovery and below-ground original/new A/B",
"T5 complete R07 quality/lifecycle/camera checklist and soft shadows",
"T6 full Final EditMode/PlayMode/AndroidBuild/AndroidSmoke, installed APK/source/audio hashes and adoption documentation"
],
"scope": "T4 application and initial contract checks only. T5/T6 outstanding work is not treated as a T4 blocker; no full-quality/APK acceptance claimed. Reviewer did not run Unity/ADB/Blender or modify products.",
"evidenceHashes": [
{
"path": "artifacts/verification/VisualUpgrade/ModelReview/user-approval.json",
"bytes": 9870,
"sha256": "b539d582aa77d032918bbb580d10d2374f65be4bdd6868432a84ed1d23a46bc5"
},
{
"path": "artifacts/verification/VisualUpgrade/ModelReview/review-packet.json",
"bytes": 35970,
"sha256": "4787e5679d1fe940060a889ffee42020258587ffb19eff32696ea6fc2f48cc99"
},
{
"path": "artifacts/verification/VisualUpgrade/UnityApply/source-import.json",
"bytes": 20062,
"sha256": "4a8788aff69cd30befe5c20d94e63542ee9ad4a102710bfd7c208a8beb14f9a6"
},
{
"path": "artifacts/verification/VisualUpgrade/UnityApply/source-before-final-play.json",
"bytes": 161828,
"sha256": "0318ab6bd9a5864e75ac51f096687a9011941558c06e6c4a69dc822f5e720076"
},
{
"path": "artifacts/verification/VisualUpgrade/UnityApply/source-after-final-play.json",
"bytes": 195,
"sha256": "1359db7d0cf3448f0e35230315ada0bc1c6b927181f8bf90cf4aef4e4a396089"
},
{
"path": "artifacts/verification/VisualUpgrade/UnityApply/t4-result.json",
"bytes": 22622,
"sha256": "cb8fd5cb61666ecbe1ce7616357b8a067f660859fb0db79d9ac7e987893cd88b"
},
{
"path": "artifacts/verification/VisualUpgrade/UnityApply/import-red.xml",
"bytes": 5944,
"sha256": "dea3629d727730b2ead7d949abf05f82312045e199f2a080860870159d3f8930"
},
{
"path": "artifacts/verification/VisualUpgrade/UnityApply/import-red-editor.log",
"bytes": 1634226,
"sha256": "4f0f89e645e81199a0c668b87959647aa753b65e7e06134232e3de3270021fa7"
},
{
"path": "artifacts/verification/VisualUpgrade/UnityApply/import-green.xml",
"bytes": 4316,
"sha256": "0f138bd95ad09aa3b4bd7c75a1cf580676be3494470508a37fc7e1edc9bb4798"
},
{
"path": "artifacts/verification/VisualUpgrade/UnityApply/import-green-editor.log",
"bytes": 50407,
"sha256": "29a3c8b40a16ae0c751e051936515f27983d2a8423bb7f73ad6ac2d02dc8d21c"
},
{
"path": "artifacts/verification/VisualUpgrade/UnityApply/import-final.xml",
"bytes": 4317,
"sha256": "945b57b4c5dc054e55aef3eb412463163d96e9bdb530074600d1e62eb69aac1d"
},
{
"path": "artifacts/verification/VisualUpgrade/UnityApply/import-final-editor.log",
"bytes": 51431,
"sha256": "1b04061bda7e4eea4b5440c009b028cf1c451a22fe16f584533bb1b15b231529"
},
{
"path": "artifacts/verification/VisualUpgrade/UnityApply/play-final.xml",
"bytes": 4398,
"sha256": "2b841c77377b9549d79170aebd8ec536ac74e8f8c55bd985d105f9d3f0236f98"
},
{
"path": "artifacts/verification/VisualUpgrade/UnityApply/play-final-editor.log",
"bytes": 40236,
"sha256": "7af95099cc70249ec0e3765d13e8e679e1650f92bc97d131eaaba818bea09905"
},
{
"path": "artifacts/verification/VisualUpgrade/UnityApply/apply-03-editor.log",
"bytes": 108743,
"sha256": "940ac55c31f44609ca2954582c08eb6c90a962a1f8792fae169854008d984323"
},
{
"path": "artifacts/verification/VisualUpgrade/UnityApply/generated-whitespace-check.log",
"bytes": 56623,
"sha256": "07ff4e1b1a8285808cab6b443557a3a5a8d0c2b379ccfe031df7013cf93cc9ef"
}
],
"captures": [
{
"name": "merged-single-group.json",
"bytes": 906,
"sha256": "4a13899bb20d15a50732b6f91e427782281c67e3406cd9f4b2716d5049ddf11d"
},
{
"name": "merged-single-group.png",
"bytes": 185826,
"sha256": "5196638c35963365696f875d1f86d084c1b2aab6abc022b1fde5fbed0bbda464"
},
{
"name": "orbit210-pitch-45-distance15.json",
"bytes": 1057,
"sha256": "9c2c38a5c2d5fe1f3dba92ba7d009f7366f6468ba73dc0d9f8e8990a368e1888"
},
{
"name": "orbit210-pitch-45-distance15.png",
"bytes": 169446,
"sha256": "438aef5dd8b0f71349ef4fc86c5b2015d53af7b46404de8f49273891866e8ca2"
},
{
"name": "orbit95-pitch45-distance6.json",
"bytes": 1054,
"sha256": "6004a3d38432ac30bf18c95099849d9050a295636a8f8453efbdf2f8d53ec17f"
},
{
"name": "orbit95-pitch45-distance6.png",
"bytes": 285897,
"sha256": "b9125308cd45e80f044e5e8c434e371605c67665d5708e47717848409adbacbb"
},
{
"name": "selected-two-groups.json",
"bytes": 912,
"sha256": "f4ee5e2088668a701cd222e05c2a9de729a4b3c1cc3e765642572abfd6c3cae4"
},
{
"name": "selected-two-groups.png",
"bytes": 188246,
"sha256": "e73cfb13d3a56fd89d44a7156c70c147a377133c52e603fe6b0a29fe73cedb42"
},
{
"name": "split-reentered-two-groups.json",
"bytes": 928,
"sha256": "26a4bd7cdec640e6c19031e3413bbd61c5eb33a58a705df7e88b0383d3af4412"
},
{
"name": "split-reentered-two-groups.png",
"bytes": 193022,
"sha256": "ab8bbad3929d731ede4648324aee860fa20918da133709f4daf34c987869e0e8"
},
{
"name": "stage01.json",
"bytes": 918,
"sha256": "0bc3025d16b0ee0aea1eab4a2ad5384ef0b31c3a53a05cecfbff0850fc461de0"
},
{
"name": "stage01.png",
"bytes": 178823,
"sha256": "73be5d42d42edc4777147c6767d91122f626d6eb7aa4bedd200500fef2728e82"
},
{
"name": "stage11.json",
"bytes": 920,
"sha256": "7822bd5b12e514c33bf06dc682d93f74e008566d5e91565dff7185e05b3534df"
},
{
"name": "stage11.png",
"bytes": 187397,
"sha256": "5800767403c97bbfdcf2f594f1a6da0463327115eb63f9fa406d22a8fc8d8186"
},
{
"name": "stage21.json",
"bytes": 923,
"sha256": "ab795ce5072b4e8b1df554f43824fa3ec6830ea54437885b5e0a856263d6904d"
},
{
"name": "stage21.png",
"bytes": 174475,
"sha256": "03b07031bbb6b477537a3b3b80574348d60f2e8915d1a37560bbf5c29c1a0188"
},
{
"name": "ten-one-group.json",
"bytes": 947,
"sha256": "9330c1913eac3cca1082a478cc67a390345eac13e08d0328acd42d8b550fa5f1"
},
{
"name": "ten-one-group.png",
"bytes": 401560,
"sha256": "ce3383d3d6e3700d41be4783fdabd34b36df2d36a2bee31b22964eb3acef3983"
},
{
"name": "ten-single-groups.json",
"bytes": 953,
"sha256": "83c9c9d9cf1b27d61fb514c129eff79ceeee668509306c0f36841529c0ca50f3"
},
{
"name": "ten-single-groups.png",
"bytes": 493264,
"sha256": "36fc04827b6cab409a668607126e95037c7a2581f6a10f25b2e340236c5a5ba5"
}
]
}
File diff suppressed because it is too large Load Diff