add documents
This commit is contained in:
@@ -0,0 +1,24 @@
|
||||
{
|
||||
"status": "approved",
|
||||
"recordedUtc": "2026-10-09T14:14:19.8102344Z",
|
||||
"userStatement": "완성본을 최종 승인합니다",
|
||||
"scope": "완성 제품과 변경된 제작·채택·운영·검증 문서",
|
||||
"branch": "dryforge/hero-meadow",
|
||||
"approvedHead": "0d992d9dcc94843a72489b454ca4e8137178bc56",
|
||||
"testedProductSource": "3346eb559bdfba24332feb4d9be4b7104520233e",
|
||||
"productFilesUnchanged": 732,
|
||||
"apk": "artifacts/android/MagnetismHeroes.apk",
|
||||
"apkSha256": "DA533F235A9869E5A68F4A244AF9A89E34A8E6FB9E7C7F2F57D830939507B829",
|
||||
"gallery": "artifacts/verification/VisualUpgrade/FinalProduct/index.html",
|
||||
"finalReview": "artifacts/verification/VisualUpgrade/FinalProduct/final-review.json",
|
||||
"finalReviewSha256": "F11A355FF4316FADBA7D5532C481A5215F7CBF722F6C207D86D0781906A846EA",
|
||||
"archive": ".dryforge/002",
|
||||
"integration": "merged-local-dev",
|
||||
"unityEditor": "정리 중 에디터 종료나 설정 변경 명령을 실행하지 않음",
|
||||
"editorObservation": {
|
||||
"observedUtc": "2026-10-09T14:15:23.2646118Z",
|
||||
"pipelineInstances": 0,
|
||||
"runningEditorDetected": false
|
||||
},
|
||||
"integrationEvidence": "artifacts/verification/VisualUpgrade/FinalProduct/dev-integration.json"
|
||||
}
|
||||
@@ -0,0 +1,186 @@
|
||||
{
|
||||
"documents": [
|
||||
{
|
||||
"source": "C:\\git\\MagnetismHeroes\\.dryforge\\handoff.md",
|
||||
"archive": "C:\\git\\MagnetismHeroes\\.dryforge\\002\\handoff.md",
|
||||
"sha256": "F29029B4AD620E8830408C5A4497A98193259DA709580F98A25343C360648982"
|
||||
},
|
||||
{
|
||||
"source": "C:\\git\\MagnetismHeroes\\.dryforge\\spec.md",
|
||||
"archive": "C:\\git\\MagnetismHeroes\\.dryforge\\002\\spec.md",
|
||||
"sha256": "7F2B2E656B31AEF0124916A5EEA49E6DBF44A93C09C2009B1B59B7CD250FBE1F"
|
||||
},
|
||||
{
|
||||
"source": "C:\\git\\MagnetismHeroes\\.dryforge\\plan.md",
|
||||
"archive": "C:\\git\\MagnetismHeroes\\.dryforge\\002\\plan.md",
|
||||
"sha256": "3074AB3A71C136530933ACA4ABAA52BBD001C52B97D5EB15D53AFC8125FE64EE"
|
||||
}
|
||||
],
|
||||
"executionSupport": [
|
||||
{
|
||||
"original": "reference/cartoon-landscape.png",
|
||||
"archive": ".dryforge/002/execution-support/reference/cartoon-landscape.png",
|
||||
"sha256": "6D26FA1B3232FB0A78963A4D7BA140F610B69B073C99FDD0707E08DAB06DF442"
|
||||
},
|
||||
{
|
||||
"original": "reviews/final-review.json",
|
||||
"archive": ".dryforge/002/execution-support/reviews/final-review.json",
|
||||
"sha256": "F11A355FF4316FADBA7D5532C481A5215F7CBF722F6C207D86D0781906A846EA"
|
||||
},
|
||||
{
|
||||
"original": "reviews/horizon-fix-conformance.json",
|
||||
"archive": ".dryforge/002/execution-support/reviews/horizon-fix-conformance.json",
|
||||
"sha256": "5EBA704C16AB4E7319C10AAD8E337B8737E974DF99966FF4B9D05040F3AC3E22"
|
||||
},
|
||||
{
|
||||
"original": "reviews/model-conformance-T1.json",
|
||||
"archive": ".dryforge/002/execution-support/reviews/model-conformance-T1.json",
|
||||
"sha256": "C134B8ACB71ED8A95F6B4A094B9D85670EED69AAA5FA97098EEC5C1B680B9AA0"
|
||||
},
|
||||
{
|
||||
"original": "reviews/model-conformance-T2.json",
|
||||
"archive": ".dryforge/002/execution-support/reviews/model-conformance-T2.json",
|
||||
"sha256": "C65F5BB38C25EBFAFB09FD1032A8ECBD5994B19CD4D01C68BC9A08CA5BCD3BE2"
|
||||
},
|
||||
{
|
||||
"original": "reviews/unity-conformance-T4.json",
|
||||
"archive": ".dryforge/002/execution-support/reviews/unity-conformance-T4.json",
|
||||
"sha256": "2C67D6BC681F614BB73B0BFA80A4968FD7CA259B9EDEFDDEED219E250AC8385F"
|
||||
},
|
||||
{
|
||||
"original": "reviews/unity-conformance-T5.json",
|
||||
"archive": ".dryforge/002/execution-support/reviews/unity-conformance-T5.json",
|
||||
"sha256": "7CE20CD8554FD7BF99F8FDD939E2162E9F32815AE1381600431DAAE8174EB336"
|
||||
},
|
||||
{
|
||||
"original": "audit-final-product.py",
|
||||
"archive": ".dryforge/002/execution-support/audit-final-product.py",
|
||||
"sha256": "870C2FBE370BA8C7AF67A3359FCF1D7F6DCA700673B1703AB8087BDF1C6C94AA"
|
||||
},
|
||||
{
|
||||
"original": "execution.json",
|
||||
"archive": ".dryforge/002/execution-support/execution.json",
|
||||
"sha256": "E2A5CC7A7E19023C6A6C3ED01BA35DBD09795E5485B7402E63537D15E0A59224",
|
||||
"previousSha256": "0317C3BB8866D341B355BF278EA1DB8D30A3E37B001A1D7E8532E1CB25B0886F",
|
||||
"updateReason": "사용자 승인에 따른 로컬 dev 병합 완료 기록"
|
||||
},
|
||||
{
|
||||
"original": "final-product-checks.ps1",
|
||||
"archive": ".dryforge/002/execution-support/final-product-checks.ps1",
|
||||
"sha256": "E46FD552A3E7C1B75FA7B0357D5B264FDABD2597E0A27B350DCC64EB566771AA"
|
||||
},
|
||||
{
|
||||
"original": "preserve-before-horizon-fix.py",
|
||||
"archive": ".dryforge/002/execution-support/preserve-before-horizon-fix.py",
|
||||
"sha256": "920B812B0E4724FE38EEE8BE1D4F114825D4511DA66AB9E3728AA12A3952B9D4"
|
||||
},
|
||||
{
|
||||
"original": "preserve-failed-smoke-and-prune-stale.py",
|
||||
"archive": ".dryforge/002/execution-support/preserve-failed-smoke-and-prune-stale.py",
|
||||
"sha256": "35E995C03C067A73ADD4748AC7D974C797DBC17627013CBC39A239E65A91AA77"
|
||||
},
|
||||
{
|
||||
"original": "preserve-horizon-failed-smoke.py",
|
||||
"archive": ".dryforge/002/execution-support/preserve-horizon-failed-smoke.py",
|
||||
"sha256": "A7C077D9CE75F3CDA5C857CA14607DD15F080A3FF25F8326ED6C67600995FDDC"
|
||||
},
|
||||
{
|
||||
"original": "preserve-previous-final.py",
|
||||
"archive": ".dryforge/002/execution-support/preserve-previous-final.py",
|
||||
"sha256": "017023C3852D7A687BE2707B7E5C28C1AA73A0662E44F5479402843DFB531EE3"
|
||||
},
|
||||
{
|
||||
"original": "record-final-user-gate.py",
|
||||
"archive": ".dryforge/002/execution-support/record-final-user-gate.py",
|
||||
"sha256": "EB584202EDF13CCE5CB13A1A2DB67154B32E2022FD19F46B1903B104AF2874F2"
|
||||
},
|
||||
{
|
||||
"original": "record-horizon-integration.py",
|
||||
"archive": ".dryforge/002/execution-support/record-horizon-integration.py",
|
||||
"sha256": "AB851721DC0C4FF2191799C8D338923BA13C595B7CF49DEB70ED3370318A5BE8"
|
||||
},
|
||||
{
|
||||
"original": "record-model-approval.py",
|
||||
"archive": ".dryforge/002/execution-support/record-model-approval.py",
|
||||
"sha256": "2CCF692FE021EF1CBB6858676BEFA02E650DE318E6CEA9C3F5D091D2E15544FE"
|
||||
},
|
||||
{
|
||||
"original": "record-new-completion.py",
|
||||
"archive": ".dryforge/002/execution-support/record-new-completion.py",
|
||||
"sha256": "A3261E88C43C986072637BF3F996014F0C3B92BD98DCB0360A3DCF5237C97AA2"
|
||||
},
|
||||
{
|
||||
"original": "stage-visual-boundary.py",
|
||||
"archive": ".dryforge/002/execution-support/stage-visual-boundary.py",
|
||||
"sha256": "25AD7E9EC7D952C47E3875556A024DF54EA3B18F6090B6C95D17FA7779A4AAF8"
|
||||
},
|
||||
{
|
||||
"original": "verify-model-integration.py",
|
||||
"archive": ".dryforge/002/execution-support/verify-model-integration.py",
|
||||
"sha256": "DCD39C0FA4B58E2B9BA3A82298B27D24D76D9D3191EB6F4D79A4A34D010E5196"
|
||||
}
|
||||
],
|
||||
"worktrees": [
|
||||
{
|
||||
"path": "C:\\git\\MagnetismHeroes\\.dryforge\\worktrees\\T1",
|
||||
"commit": "7d7efbe6b6a1a419ac998f37e3e019a75570a9e5",
|
||||
"clean": true,
|
||||
"ancestor": true
|
||||
},
|
||||
{
|
||||
"path": "C:\\git\\MagnetismHeroes\\.dryforge\\worktrees\\T2",
|
||||
"commit": "80be80566a309eab8cb333ea9774218c816efc30",
|
||||
"clean": true,
|
||||
"ancestor": true
|
||||
},
|
||||
{
|
||||
"path": "C:\\git\\MagnetismHeroes\\.dryforge\\worktrees\\T4",
|
||||
"commit": "ef03611628cb395d377cf56abd951bbf62cfa29c",
|
||||
"clean": true,
|
||||
"ancestor": true
|
||||
},
|
||||
{
|
||||
"path": "C:\\git\\MagnetismHeroes\\.dryforge\\worktrees\\T6",
|
||||
"commit": "620c73cbd24d936231bee5cb3469e5cff3424cd9",
|
||||
"clean": true,
|
||||
"ancestor": true
|
||||
}
|
||||
],
|
||||
"taskBranches": [
|
||||
{
|
||||
"branch": "dryforge/hero-model",
|
||||
"commit": "7d7efbe6b6a1a419ac998f37e3e019a75570a9e5",
|
||||
"mergedIntoApprovedHead": true
|
||||
},
|
||||
{
|
||||
"branch": "dryforge/meadow-model",
|
||||
"commit": "80be80566a309eab8cb333ea9774218c816efc30",
|
||||
"mergedIntoApprovedHead": true
|
||||
},
|
||||
{
|
||||
"branch": "dryforge/unity-visual-upgrade",
|
||||
"commit": "43b22d67886bc5715d3543fefda2dc24dead299f",
|
||||
"mergedIntoApprovedHead": true
|
||||
},
|
||||
{
|
||||
"branch": "dryforge/visual-verification",
|
||||
"commit": "b4d88546a2e9c44e9b6babcc54acaf69a01c75b4",
|
||||
"mergedIntoApprovedHead": true
|
||||
},
|
||||
{
|
||||
"branch": "dryforge/final-delivery",
|
||||
"commit": "a906be69a0c1211f01d5a3d1bc7fdcf5554efafb",
|
||||
"mergedIntoApprovedHead": true
|
||||
},
|
||||
{
|
||||
"branch": "dryforge/horizon-seam-fix",
|
||||
"commit": "ef03611628cb395d377cf56abd951bbf62cfa29c",
|
||||
"mergedIntoApprovedHead": true
|
||||
},
|
||||
{
|
||||
"branch": "dryforge/horizon-final-delivery",
|
||||
"commit": "620c73cbd24d936231bee5cb3469e5cff3424cd9",
|
||||
"mergedIntoApprovedHead": true
|
||||
}
|
||||
]
|
||||
}
|
||||
@@ -0,0 +1,25 @@
|
||||
{
|
||||
"status": "completed",
|
||||
"finishedUtc": "2026-10-09T14:14:24.8264555Z",
|
||||
"archive": ".dryforge/002",
|
||||
"documentsMovedAndHashVerified": 3,
|
||||
"executionSupportFilesPreserved": 20,
|
||||
"removedMergedWorktrees": 4,
|
||||
"removedMergedTaskBranches": 7,
|
||||
"productFileHashesUnchanged": 732,
|
||||
"headUnchanged": "0d992d9dcc94843a72489b454ca4e8137178bc56",
|
||||
"protectedDevUnchanged": "58410281e015c6600dc543c4e093fd95c036288c",
|
||||
"remainingDryforgeItems": [
|
||||
"001",
|
||||
"002",
|
||||
"status.json"
|
||||
],
|
||||
"integration": "merged-local-dev",
|
||||
"unityEditorUnmodifiedByCleanup": true,
|
||||
"editorObservation": {
|
||||
"observedUtc": "2026-10-09T14:15:23.2646118Z",
|
||||
"pipelineInstances": 0,
|
||||
"runningEditorDetected": false
|
||||
},
|
||||
"integrationEvidence": "artifacts/verification/VisualUpgrade/FinalProduct/dev-integration.json"
|
||||
}
|
||||
@@ -0,0 +1,58 @@
|
||||
import hashlib
|
||||
import json
|
||||
import subprocess
|
||||
import xml.etree.ElementTree as ET
|
||||
from pathlib import Path
|
||||
|
||||
root = Path('C:/git/MagnetismHeroes')
|
||||
proof = root / 'artifacts/verification/VisualUpgrade/FinalProduct'
|
||||
final = root / 'artifacts/verification/Final'
|
||||
def read(path):
|
||||
return json.loads(path.read_text(encoding='utf-8-sig'))
|
||||
def sha(path):
|
||||
return hashlib.sha256(path.read_bytes()).hexdigest().upper()
|
||||
completion = read(proof / 'completion.json')
|
||||
source = '3346eb559bdfba24332feb4d9be4b7104520233e'
|
||||
assert completion['status'] == 'passed' and completion['sourceCommit'] == source
|
||||
assert len(completion['phases']) == 4 and completion['productHashesUnchanged']
|
||||
for phase in completion['phases']:
|
||||
assert phase['exitCode'] == 0 and phase['status'] == 'passed'
|
||||
assert phase['sourceCommit'] == source and phase['sourceDirty'] is False and phase['sourceDirtyEnd'] is False
|
||||
raw = read(Path(phase['evidence']))
|
||||
assert raw['status'] == 'passed' and raw['exitCode'] == 0 and raw['sourceCommit'].strip() == source
|
||||
counts = {}
|
||||
for mode, count in [('editmode', 103), ('playmode', 53)]:
|
||||
cases = ET.parse(final / (mode + '.xml')).findall('.//test-case')
|
||||
assert len(cases) == count and all(case.get('result') == 'Passed' for case in cases)
|
||||
counts[mode] = count
|
||||
apk_hash = sha(root / 'artifacts/android/Final/MagnetismHeroes.apk')
|
||||
assert sha(root / 'artifacts/android/MagnetismHeroes.apk') == apk_hash
|
||||
for path, count in [
|
||||
('android-final-evidence.json', 226),
|
||||
('Fresh30/android-final-progression-evidence.json', 151),
|
||||
('FinalBoundary/android-final-boundary-evidence.json', 37),
|
||||
('RapidBoundary/android-final-rapid-evidence.json', 39),
|
||||
('ContentBoundary/android-content-evidence.json', 69),
|
||||
]:
|
||||
data = read(final / path)
|
||||
assert data['status'] == 'passed' and data['sourceCommit'].strip() == source
|
||||
assert data['apkSha256'].upper() == apk_hash and data['sourceDirty'] is False
|
||||
assert len(data['checks']) == count and all(check['passed'] for check in data['checks'])
|
||||
counts[path] = count
|
||||
before = read(proof / 'product-before.json')
|
||||
after = read(proof / 'product-after.json')
|
||||
assert before == after and len(before) == 732
|
||||
assert all(sha(root / path) == digest.upper() for path, digest in before.items())
|
||||
assert subprocess.check_output(['git', 'status', '--porcelain'], cwd=root).strip() == b''
|
||||
assert subprocess.check_output(['git', 'rev-parse', 'dev'], cwd=root).decode().strip() == '58410281e015c6600dc543c4e093fd95c036288c'
|
||||
for failure in completion.get('failedAttempts', []):
|
||||
assert failure['exitCode'] == 1 and failure['status'] == 'failed'
|
||||
archived = read(Path(failure['evidence']))
|
||||
assert archived['exitCode'] == 1 and archived['status'] == 'failed'
|
||||
assert Path(failure['outerLog']).is_file()
|
||||
report = {'status': 'PASS', 'testedProductSourceCommit': source,
|
||||
'currentHead': subprocess.check_output(['git', 'rev-parse', 'HEAD'], cwd=root).decode().strip(),
|
||||
'counts': counts, 'apkSha256': apk_hash, 'productFileHashesUnchanged': len(before),
|
||||
'failedAttemptsPreserved': len(completion.get('failedAttempts', [])), 'protectedDevUnchanged': True}
|
||||
(proof / 'root-final-product-audit.json').write_text(json.dumps(report, indent=2) + '\n', encoding='utf-8')
|
||||
print(json.dumps(report))
|
||||
@@ -0,0 +1,917 @@
|
||||
{
|
||||
"feature_branch": "dryforge/hero-meadow",
|
||||
"protected_base": "dev",
|
||||
"initial_commit": "58410281e015c6600dc543c4e093fd95c036288c",
|
||||
"started_utc": "2026-10-08T01:35:25.790795+09:00",
|
||||
"protected_product_hashes": {
|
||||
"Assets/InputSystem_Actions.inputactions": "1c6cbb519d65ecfe19a29231735b7f54741a20ac1a8ad4f46a18e1bfb28a3c39",
|
||||
"Assets/InputSystem_Actions.inputactions.meta": "3b4e424a80f5b4fa76b6abd774884a24285eaa61f22ff9bb20e5ad505fd8b569",
|
||||
"Assets/MagnetismHeroes.meta": "a4234b3a59055b04475ba74daad6190a023683099de4cb4fd08644651843dd9c",
|
||||
"Assets/MagnetismHeroes/Core.meta": "de2805e10269b6d5230d5737d514ba7bd882aeed21c9709061a04d418758a09e",
|
||||
"Assets/MagnetismHeroes/Core/AGENTS.md": "a80bb0bf851d469e6ed975e95a5849d6888d8f01a0991725b96a5cdcdc1bc715",
|
||||
"Assets/MagnetismHeroes/Core/AGENTS.md.meta": "c40cb22815e8ed2264dabd920de5ba7a261cfa19f7bf1def141dbaf8eebbad36",
|
||||
"Assets/MagnetismHeroes/Core/AssemblyInfo.cs": "7b8cc02b8a3798cddf7f944256f8ec7caf4ad5110df2203fa94c12b0159a9ae2",
|
||||
"Assets/MagnetismHeroes/Core/AssemblyInfo.cs.meta": "1192dd1392f04fe3b208df16c762396e8d918e0f0d2bd26cba932ee8bde01aa3",
|
||||
"Assets/MagnetismHeroes/Core/BoardHint.cs": "cc3dc3f021d8a8de5d99e3c4d2f8c4fdec5de75ebbafaf5e0777e64629c4de79",
|
||||
"Assets/MagnetismHeroes/Core/BoardHint.cs.meta": "cfc017f9dc78f2993b29af89fe8b2ca81bf225613e6b9456abcc6757306f4762",
|
||||
"Assets/MagnetismHeroes/Core/BoardRules.cs": "e1bba538b0dc9176ce451c5a940a6cde6c5004590a8e669949425d1162772920",
|
||||
"Assets/MagnetismHeroes/Core/BoardRules.cs.meta": "1c790281e4d8ed75501199425d97d417a31c512eaaf68df1cc5d50c5483ab065",
|
||||
"Assets/MagnetismHeroes/Core/GameData.cs": "854912cffe249a4cf23013a103a1750b15016ca3fcd9c6360f388d806e6a1942",
|
||||
"Assets/MagnetismHeroes/Core/GameData.cs.meta": "4049c18bdf2bc1650039a7e761253b188488304840f5cbd1fb27109fd28d16ba",
|
||||
"Assets/MagnetismHeroes/Core/GameSession.cs": "d5ac5b37f5e133614cb574a191929432f1802a9887ff08154b2280eb9f644c97",
|
||||
"Assets/MagnetismHeroes/Core/GameSession.cs.meta": "967e33fafdd69d6df8afd63a79a76ee5a6b81c35c55a3481dee8a5aeccdf09fd",
|
||||
"Assets/MagnetismHeroes/Core/MagnetismHeroes.Core.asmdef": "a3b77330b9bd624393eb31b5123c1b311f5ad168a9286afe24cb07b5051c5f3b",
|
||||
"Assets/MagnetismHeroes/Core/MagnetismHeroes.Core.asmdef.meta": "59f47f86977a939fc944ae8235ef8c3ab9567edf17d0205477c614a2807fb5ac",
|
||||
"Assets/MagnetismHeroes/Core/SaveValidator.cs": "339c27b556d2ec1f279da9cb211bcc46fc5e1cb99df4103618fa1633ecc04baa",
|
||||
"Assets/MagnetismHeroes/Core/SaveValidator.cs.meta": "7bb6a48c26b24e8c4ee8b12a69906b22367b232f0fabf5f11663085c68be8bfb",
|
||||
"Assets/MagnetismHeroes/Editor.meta": "392ee7b3635d4a43568a780cee7b982d3e21c9bc45533d9452c31448611fe1ff",
|
||||
"Assets/MagnetismHeroes/Editor/AGENTS.md": "c448aa32d82c999d294634eb10fda77b2a570e0cdbe2ba9314991517f900fd60",
|
||||
"Assets/MagnetismHeroes/Editor/AGENTS.md.meta": "6a1ced2b558b739144f509d5574f93c6b1db650dd1ec34f55803ce0db0ac1df8",
|
||||
"Assets/MagnetismHeroes/Editor/AndroidBuildSanitizer.cs": "9946d40e8d6d8450a51155f9183d35bc789084f44f4a685b51774914cb055d49",
|
||||
"Assets/MagnetismHeroes/Editor/AndroidBuildSanitizer.cs.meta": "30f7c19b85d5d3d554c82ec97c1495a7f59a19cf4acf9dfc45de901302eec2bc",
|
||||
"Assets/MagnetismHeroes/Editor/CompositionAssets.cs": "5c03d7a80205b9c83b680ab4bfd41e016f3c53bd534ecd2a10cd0c4c91eb9562",
|
||||
"Assets/MagnetismHeroes/Editor/CompositionAssets.cs.meta": "3e4f8eba6f5af6977d896574eb348aac946d6ee81405add081411f960a8df20f",
|
||||
"Assets/MagnetismHeroes/Editor/ContentAssets.cs": "f79ec21a4868c7bbff8ebfc7777e7ed7fed574797658f730e2d70643ac8b2d43",
|
||||
"Assets/MagnetismHeroes/Editor/ContentAssets.cs.meta": "21c02d17dc78f57386f8de2f244d1a53a145977fa3b658049838cdc7ad423332",
|
||||
"Assets/MagnetismHeroes/Editor/FirstSliceAssets.cs": "1641225508a07451bd283682bc25c4f24ac21fdab18a873ceb5a02994eb2f819",
|
||||
"Assets/MagnetismHeroes/Editor/FirstSliceAssets.cs.meta": "b989e9614c406e1313593508980e50e3ddd846d5a43cb01d51e29e2d6569f9ed",
|
||||
"Assets/MagnetismHeroes/Editor/MagnetismHeroes.Editor.asmdef": "f2b62ac5f1186367e40021d12c878b6f057fc3ce7b4672adfcb2211189a32762",
|
||||
"Assets/MagnetismHeroes/Editor/MagnetismHeroes.Editor.asmdef.meta": "c139a049cb5cbad7782d39566fcc2cf6f13a5822524640c5d4df3ef8b1c033e1",
|
||||
"Assets/MagnetismHeroes/Editor/PackageInstaller.cs": "738a95b580c4bf70ae095dc52962b711661192fbdfb9c5206d9c51d8b3309d21",
|
||||
"Assets/MagnetismHeroes/Editor/PackageInstaller.cs.meta": "a30063297a6235e8be9eebbf28f13e97ee3a7f68e40c9ba84483a93699f7a197",
|
||||
"Assets/MagnetismHeroes/Editor/PersistenceAssets.cs": "a9e3d3e7d70b6d458904f92a82af2faac8fdc06d597a77c26b724d7367c128d5",
|
||||
"Assets/MagnetismHeroes/Editor/PersistenceAssets.cs.meta": "00e7a48d1e203ae7e0c5c8337d797992ab5efb34ac17a470d638e9b934eaeb8c",
|
||||
"Assets/MagnetismHeroes/Editor/PresentationAssets.cs": "a530b8fe72f26b242fd8482a83082b1bd99743b5538b713bfdeeb56b87f84a13",
|
||||
"Assets/MagnetismHeroes/Editor/PresentationAssets.cs.meta": "46e6e43a82ab1141f43b30781673cd56a2f25b84efdbae27847e39e0bde85ed8",
|
||||
"Assets/MagnetismHeroes/Editor/PresentationProof.cs": "1c350672efcd719302a92b91f8528cd0331ae483d37f4d7053491d603f798f0b",
|
||||
"Assets/MagnetismHeroes/Editor/PresentationProof.cs.meta": "da0a39a723e2436d923b2312120a0e309b9f64c5948f69f1c9fbe5cb73cce089",
|
||||
"Assets/MagnetismHeroes/Editor/ProjectBootstrap.cs": "0b8b95d8cb5c93bff3721fa8b34e97b2a8658df8ce75c9ceb75b30c1ad29384a",
|
||||
"Assets/MagnetismHeroes/Editor/ProjectBootstrap.cs.meta": "079d1d993195e12ddd9c273345915818561459869397ba016416161efd69c81e",
|
||||
"Assets/MagnetismHeroes/Scenes.meta": "b08de2ba7963250cc8201e9602085974164758f6cd7486d6702b191cdcfdb27c",
|
||||
"Assets/MagnetismHeroes/Scenes/Main.unity": "26154649ce0c4cdd160d053227c1fd6f0190e9ae829f2be0ccb427f5deeb357a",
|
||||
"Assets/MagnetismHeroes/Scenes/Main.unity.meta": "fb9e84bc5440c5d697e941526e912df3c08bb066b4078b9d027f0ad3b8412120",
|
||||
"Assets/MagnetismHeroes/Tests.meta": "18ce57c5f66e3efa85146b4d53a0454630d77d2c9ab1a1ca67501541132eb7d4",
|
||||
"Assets/MagnetismHeroes/Tests/EditMode.meta": "a101782b25f079b6daca580215b74d05651604f56daa24bbb62d11b635136869",
|
||||
"Assets/MagnetismHeroes/Tests/EditMode/CompositionAssetTests.cs": "671d8d1a790d531eb7684b71de92d3503a6d7eba91d24701613cc55dfdb79aac",
|
||||
"Assets/MagnetismHeroes/Tests/EditMode/CompositionAssetTests.cs.meta": "18afc2728da017b757b6bc8092e4eb1d5866bc0b1d614e702bfdd72c4b563738",
|
||||
"Assets/MagnetismHeroes/Tests/EditMode/CompositionSessionTests.cs": "52eaa3b3edc993e0e916e96eaf2144b72f4dbed0738ff1f3cb8e16e3eecf0454",
|
||||
"Assets/MagnetismHeroes/Tests/EditMode/CompositionSessionTests.cs.meta": "73c88128561e5328bafb35e579e86c265f5df73ea33d52ce4f0398a7631c0a11",
|
||||
"Assets/MagnetismHeroes/Tests/EditMode/ContentAssetTests.cs": "d7ead26afbcaba631f58bcfbb0e84b9c58c79f61915c05df3caaf829afe13ec9",
|
||||
"Assets/MagnetismHeroes/Tests/EditMode/ContentAssetTests.cs.meta": "c2e30ce735635744a27aedacf054129cdc017b736839314bc8f03b871d7f5c99",
|
||||
"Assets/MagnetismHeroes/Tests/EditMode/ContentSessionTests.cs": "53b28af4e7ef50a80f35815948ff7e58e4eaed3581bf9b1ba4fda9b687f17afc",
|
||||
"Assets/MagnetismHeroes/Tests/EditMode/ContentSessionTests.cs.meta": "fd12187acbe9ae1a53c0b4a8ce27755abd1f171d4a223a8e5fc16497f3bb8b9e",
|
||||
"Assets/MagnetismHeroes/Tests/EditMode/ContentVoiceTests.cs": "0a98907804ae976dbac37bf1d2b2211905f17059871b490b870f79712f45591b",
|
||||
"Assets/MagnetismHeroes/Tests/EditMode/ContentVoiceTests.cs.meta": "95cf38a75101caaedf3c7f7b59328460bbccbbc7bd82c96be5e34a816518c240",
|
||||
"Assets/MagnetismHeroes/Tests/EditMode/Core.meta": "be46851d141c126a9706049aee91e375c76dd3747ca109271d881f2015e748ab",
|
||||
"Assets/MagnetismHeroes/Tests/EditMode/Core/BoardRulesTests.cs": "0466ffa2f94a3ec59cddea4267ca7591f1a2f585343902e85666302fee548a17",
|
||||
"Assets/MagnetismHeroes/Tests/EditMode/Core/BoardRulesTests.cs.meta": "04dcdd8030b52c7350d1249dcfb457259655049a6ef46e030f22960d80eac21f",
|
||||
"Assets/MagnetismHeroes/Tests/EditMode/Core/SaveValidatorTests.cs": "141f1f53aa66aa9e7372828c2e8ee6f4237c6ec20356ca201164dc014f88e1e9",
|
||||
"Assets/MagnetismHeroes/Tests/EditMode/Core/SaveValidatorTests.cs.meta": "1254a358e3bd9efeb86212abded98d50ee54a594cf61b1e07f01d1ff1f1ff505",
|
||||
"Assets/MagnetismHeroes/Tests/EditMode/Core/StageLayoutTests.cs": "310ebf2b56eb4d6fdf1e23ef24b7714ef3a069f1ea6610f07a5d7e02ab7b1708",
|
||||
"Assets/MagnetismHeroes/Tests/EditMode/Core/StageLayoutTests.cs.meta": "4c8ba2f93312e3661a919c843c889c89bd52d16133efa1c5924653bde25c921c",
|
||||
"Assets/MagnetismHeroes/Tests/EditMode/FirstSliceAssetTests.cs": "7ebe9bb7eec107502c765c952ba066e89f6677674888579b840f2ec915a144c3",
|
||||
"Assets/MagnetismHeroes/Tests/EditMode/FirstSliceAssetTests.cs.meta": "189dba50e2a632b9c9a823f13a8ab402b8f71860ec75b67fb337c7d3f3f2eb17",
|
||||
"Assets/MagnetismHeroes/Tests/EditMode/GameSessionTests.cs": "eebeb7e6aaafc6f1cbb7cd1a263e5612b2a86db83a4b4fc03fbf71f9697ec4b0",
|
||||
"Assets/MagnetismHeroes/Tests/EditMode/GameSessionTests.cs.meta": "4bfeea0e3c0ca73ed34013fec015adbb3826e402484dfd536c44c41c76c475be",
|
||||
"Assets/MagnetismHeroes/Tests/EditMode/LocalProgressStoreTests.cs": "c21e95031974cc68ec624627176c2d30b75aba5ff724794b07737c9f1aeb7051",
|
||||
"Assets/MagnetismHeroes/Tests/EditMode/LocalProgressStoreTests.cs.meta": "185b21bbc833a65793a8cd42f50fdd16c42f171f6150f82004c190d0fd053dd5",
|
||||
"Assets/MagnetismHeroes/Tests/EditMode/MagnetismHeroes.EditModeTests.asmdef": "6ea5923da2fe43e9a968be26502c504e7730913b357944a40c061e131b78ee56",
|
||||
"Assets/MagnetismHeroes/Tests/EditMode/MagnetismHeroes.EditModeTests.asmdef.meta": "0f437b8a74cc8240882f01b2b649ef8087e8c3ef66b4a4a9a8f412d0bf9dae50",
|
||||
"Assets/MagnetismHeroes/Tests/EditMode/PersistenceSessionTests.cs": "f5445798e640239142161cd83b7c9b321d309b4f6ed8ab1433b740f8d7053ff5",
|
||||
"Assets/MagnetismHeroes/Tests/EditMode/PersistenceSessionTests.cs.meta": "5913c492b66095714d8e0150192d0f7672bd923b79339ce96b56d8c260152549",
|
||||
"Assets/MagnetismHeroes/Tests/EditMode/PresentationAssetTests.cs": "58efeba812f22c28b2dd721ca3fe94afcea220f4b87e2a9f58672ed393903ff4",
|
||||
"Assets/MagnetismHeroes/Tests/EditMode/PresentationAssetTests.cs.meta": "0bd7661784fb24aae755f6b2722360b2fc1a15cec75cc2760f3f5f29f66090fe",
|
||||
"Assets/MagnetismHeroes/Tests/PlayMode.meta": "d4fdb69ba2114665648c9465fb5377289690098ff5ad75d13c79c4af6a7bd669",
|
||||
"Assets/MagnetismHeroes/Tests/PlayMode/CompositionPlayTests.cs": "8fb76df4bcbb777ebfa163b7d99ce755625cf3dbc12775a161732ff13a0a660d",
|
||||
"Assets/MagnetismHeroes/Tests/PlayMode/CompositionPlayTests.cs.meta": "f24b1269ff391a00693dcdd856e1ea64901f74ec4b14cf44ff300f6d3986b91a",
|
||||
"Assets/MagnetismHeroes/Tests/PlayMode/ContentPlayTests.cs": "55be21e779132f693d05cf28780d5c7d4b2d190cf0b5bdf5395923efaf0f849f",
|
||||
"Assets/MagnetismHeroes/Tests/PlayMode/ContentPlayTests.cs.meta": "2f260827c964055294d2d2f155a67f4a0951ebe4a6fe470b1f13bb8e35bbe550",
|
||||
"Assets/MagnetismHeroes/Tests/PlayMode/FirstPuzzlePlayTests.cs": "38d28d56d02e46ff190d347936119232cbde3e0c748c875cdb075cb44dcb0d1a",
|
||||
"Assets/MagnetismHeroes/Tests/PlayMode/FirstPuzzlePlayTests.cs.meta": "722c0e3a05254eafb1206303cc0b412aff57d8f1ec26a76b30a0eeb46069d4af",
|
||||
"Assets/MagnetismHeroes/Tests/PlayMode/MagnetismHeroes.PlayModeTests.asmdef": "06c4bfc9c973f9d1610560687fed27d3505ea0807a626744d5da5544733d8790",
|
||||
"Assets/MagnetismHeroes/Tests/PlayMode/MagnetismHeroes.PlayModeTests.asmdef.meta": "9518a4247dfe92ac5b4a3fa1e262dcd4997a20ea636fde37d9a77af71587aa61",
|
||||
"Assets/MagnetismHeroes/UnityRuntime.meta": "33a905e7ef9b11f270fbc5f086714d34edc7ba2bbfff4353f69fe7e295ea1a58",
|
||||
"Assets/MagnetismHeroes/UnityRuntime/AGENTS.md": "0f6ffc45d7b1c894a791320e8bce1b80e9bac9aa225202176e4edab123b5db90",
|
||||
"Assets/MagnetismHeroes/UnityRuntime/AGENTS.md.meta": "1670b8878b8c1c14f2ef35ad51a3888821bb382f67d3bd401bd3a8d5c52c8c49",
|
||||
"Assets/MagnetismHeroes/UnityRuntime/AssemblyInfo.cs": "4b227cad2c5dcd6e90da3c32640259466a124890e51a2ae343023c758c7840a2",
|
||||
"Assets/MagnetismHeroes/UnityRuntime/AssemblyInfo.cs.meta": "410c26c65fc3833181d8c0809416f38e4eebb691efac8c61da702eecc40d805b",
|
||||
"Assets/MagnetismHeroes/UnityRuntime/Bootstrap.meta": "f50ddba1d8572fdf2c9f1d4ee3114da1d69bb8e70a4a80132c56b7d85e7bc7b9",
|
||||
"Assets/MagnetismHeroes/UnityRuntime/Bootstrap/GameApp.cs": "54fff47f4c6bc9a7c3809027ce15f57e6f1f4a90f8095852149451619a4d07a5",
|
||||
"Assets/MagnetismHeroes/UnityRuntime/Bootstrap/GameApp.cs.meta": "bd7997f83ee94e0669fcc3d18ef25e8bc290c5e1b03a1f9c66bd76fddb7253d2",
|
||||
"Assets/MagnetismHeroes/UnityRuntime/Interaction.meta": "8c347d091439696bc3d3b2852c87696c9b410554cbc9a65abbd1648c3f49731f",
|
||||
"Assets/MagnetismHeroes/UnityRuntime/Interaction/BoardInput.cs": "41823185afead383900aabe85a99b2fda73a4a70ccd768e55418876b4f98b0f9",
|
||||
"Assets/MagnetismHeroes/UnityRuntime/Interaction/BoardInput.cs.meta": "1211f814ccc275b79080807db6b6014d703a08e49a8504035fd7e7cc4417c3a5",
|
||||
"Assets/MagnetismHeroes/UnityRuntime/Interaction/OrbitCamera.cs": "78d71cab34243d4fe68a51ebddc41a2adab1b40b1e58c10bd94a2f16bd62f223",
|
||||
"Assets/MagnetismHeroes/UnityRuntime/Interaction/OrbitCamera.cs.meta": "c0962976f8ab5219d74f02d0a8058b77358f18a44a6bca0ccbf9721ef727fcd0",
|
||||
"Assets/MagnetismHeroes/UnityRuntime/MagnetismHeroes.UnityRuntime.asmdef": "8e618272389c248dc28d7e0261ea52d45387ac90bc46a7821576c9c1a17bca52",
|
||||
"Assets/MagnetismHeroes/UnityRuntime/MagnetismHeroes.UnityRuntime.asmdef.meta": "78d46f2e1f511baada1b617c328ad0374e1880545ca27764f7dba8a52157ec24",
|
||||
"Assets/MagnetismHeroes/UnityRuntime/Persistence.meta": "e08035f8440cffe9537c612b97c72b580bb27474d7de66cd81b013ae5784fd25",
|
||||
"Assets/MagnetismHeroes/UnityRuntime/Persistence/LocalProgressStore.cs": "535278ccc141990f00342d6d32b12bff039e6e742fe494b82adbd39f74de46d0",
|
||||
"Assets/MagnetismHeroes/UnityRuntime/Persistence/LocalProgressStore.cs.meta": "7ac5e2b29573063595f1e15bed404acdc04b1b0c45f90d75808b9746a1b7ff79",
|
||||
"Assets/MagnetismHeroes/UnityRuntime/Presentation.meta": "093df3389c613b936dd393cf3625ff0f26bfd408d0f7047b37eeb94762b702f9",
|
||||
"Assets/MagnetismHeroes/UnityRuntime/Presentation/Audio.meta": "d0a391ffadaef257630a38e23f5aaa923f616b600ea2655ff24c59ab88230344",
|
||||
"Assets/MagnetismHeroes/UnityRuntime/Presentation/Audio/GameAudio.mixer": "54ab67ac0e2ac14ad3cfdcb10ce1ff4ab08f921a0f31fd5bc9d4a651f5594247",
|
||||
"Assets/MagnetismHeroes/UnityRuntime/Presentation/Audio/GameAudio.mixer.meta": "bddf1fe71193cbade06c9e1e013f4ac127b95e1060df840ceff2f556984cadd1",
|
||||
"Assets/MagnetismHeroes/UnityRuntime/Presentation/Audio/Voice.meta": "085d19326a2646680cac08c6a5f4cf7c94b84971955696375fe3ebc7dacc5361",
|
||||
"Assets/MagnetismHeroes/UnityRuntime/Presentation/Audio/Voice/count_01.wav": "13a882ce1620140d447635e14f2d4758045d5e348960c17386df1c720050c100",
|
||||
"Assets/MagnetismHeroes/UnityRuntime/Presentation/Audio/Voice/count_01.wav.meta": "485dd82a353c2fb267ddb8b13d92ee77344049ac04040df98fb4ffae3d3d3a1a",
|
||||
"Assets/MagnetismHeroes/UnityRuntime/Presentation/Audio/Voice/count_02.wav": "278dd0b6e96f2abca2237ff98eda453a011fa0b2e78d5575b7ddc9c9b3028b32",
|
||||
"Assets/MagnetismHeroes/UnityRuntime/Presentation/Audio/Voice/count_02.wav.meta": "39e0960145943bda38822ed7942ab58d4c22c24414bc571a214eb6b9c4e89c57",
|
||||
"Assets/MagnetismHeroes/UnityRuntime/Presentation/Audio/Voice/count_03.wav": "4133b0150aa08e26f1b93b11d29ecab1282bbff236b3c92f8416e781109188c1",
|
||||
"Assets/MagnetismHeroes/UnityRuntime/Presentation/Audio/Voice/count_03.wav.meta": "fba28c38f33a759b2224f5c4c52a9ac4c7aaed42339733b7752fd8d5fde03d40",
|
||||
"Assets/MagnetismHeroes/UnityRuntime/Presentation/Audio/Voice/count_04.wav": "c5c8c78ccd89011050d7317960a854130e3e445c8b92d23e9520eeb7490aa300",
|
||||
"Assets/MagnetismHeroes/UnityRuntime/Presentation/Audio/Voice/count_04.wav.meta": "8f12f33d293025d7738539b5de2350221e8c63aa3ea3bf7869af786406a2f216",
|
||||
"Assets/MagnetismHeroes/UnityRuntime/Presentation/Audio/Voice/count_05.wav": "700b9827ea827adeae0ebfc3b4af2b9125d7d3eddc699c63c0ce5c1ba5cbd04c",
|
||||
"Assets/MagnetismHeroes/UnityRuntime/Presentation/Audio/Voice/count_05.wav.meta": "718c3625f6cfa26459a58cfd39200b5bfbbbe26c5b6c28071320fba2e6a00db8",
|
||||
"Assets/MagnetismHeroes/UnityRuntime/Presentation/Audio/Voice/count_06.wav": "d4800a23a73d1315987d9129d260baa0680621d6502351137845a6ee351c6274",
|
||||
"Assets/MagnetismHeroes/UnityRuntime/Presentation/Audio/Voice/count_06.wav.meta": "deef2078506c24ccd884be8427bf9cb7e72391e430c7354dcfac5003fd2319b2",
|
||||
"Assets/MagnetismHeroes/UnityRuntime/Presentation/Audio/Voice/count_07.wav": "7d4ba785ccb28b8f2bf0d8f66053dc8adf1a19d332bedfab3bffd596208fe829",
|
||||
"Assets/MagnetismHeroes/UnityRuntime/Presentation/Audio/Voice/count_07.wav.meta": "394160eee1e91790b2608ec186693cc4b319fe39608cf5cb6eb7930c8112b625",
|
||||
"Assets/MagnetismHeroes/UnityRuntime/Presentation/Audio/Voice/count_08.wav": "fa8034948f6ac3e289e8e7e9fb447943760d4ed5ac577c8ab0c961c608fe49c2",
|
||||
"Assets/MagnetismHeroes/UnityRuntime/Presentation/Audio/Voice/count_08.wav.meta": "bda6f2d81d14dd0607c738ff5b36fc451bd0bd5f6c273f9d6db39d572c357d8a",
|
||||
"Assets/MagnetismHeroes/UnityRuntime/Presentation/Audio/Voice/count_09.wav": "4a921bc405ed5181e26365764ef94c2d311af45ed5508b27ffd7ac6d53d83802",
|
||||
"Assets/MagnetismHeroes/UnityRuntime/Presentation/Audio/Voice/count_09.wav.meta": "13cc0421fcfd58e85c6c0d32e7ce27f422d35d0c6ed778f672ab3c44fdcf36f4",
|
||||
"Assets/MagnetismHeroes/UnityRuntime/Presentation/Audio/Voice/count_10.wav": "b16ebccea20aedf93b884299edb0dd430f67e4deef069fb354b482f21b8e5fb8",
|
||||
"Assets/MagnetismHeroes/UnityRuntime/Presentation/Audio/Voice/count_10.wav.meta": "9e4047deae1118cc646c3f4bfe60766522cd63f187bb7b93a68707da384c709e",
|
||||
"Assets/MagnetismHeroes/UnityRuntime/Presentation/Audio/Voice/demo_composition.wav": "570452e9fa15ec545b126cd8bdba504a3db6f30b74a95405ee228015368761e7",
|
||||
"Assets/MagnetismHeroes/UnityRuntime/Presentation/Audio/Voice/demo_composition.wav.meta": "253482825f08dad867f1d0edab230bde3e27fcc7a3216535ea92c7eb4c4a5aec",
|
||||
"Assets/MagnetismHeroes/UnityRuntime/Presentation/Audio/Voice/demo_merge6.wav": "6300c5490442c3168a52611888568ce37fdaffa82b1b72780e5c9eb5ce81fa53",
|
||||
"Assets/MagnetismHeroes/UnityRuntime/Presentation/Audio/Voice/demo_merge6.wav.meta": "de3a9691371d5f3e2d27f22228651e2e6d1e8e0c8a50d9213fc56305fa8ff5f5",
|
||||
"Assets/MagnetismHeroes/UnityRuntime/Presentation/Audio/Voice/demo_split10.wav": "6bc2d42b24170fa0dda48ed8c5a24b147219e7237d9989432026cbf028e81712",
|
||||
"Assets/MagnetismHeroes/UnityRuntime/Presentation/Audio/Voice/demo_split10.wav.meta": "ae826ee7337d2dc3eb69159a6a693053a4daefb03d94434506927c94ea543c9b",
|
||||
"Assets/MagnetismHeroes/UnityRuntime/Presentation/Audio/Voice/guide_collect.wav": "62e15c9e38c36f4094a6c7e9c5148510141290b5f41db5aad9dc1d8f1a158594",
|
||||
"Assets/MagnetismHeroes/UnityRuntime/Presentation/Audio/Voice/guide_collect.wav.meta": "efed428f46d5019e3e55c6f5a8942f35b2bbd6762d0a34719bb52394f1a8e65f",
|
||||
"Assets/MagnetismHeroes/UnityRuntime/Presentation/Audio/Voice/guide_count.wav": "debe29b89f3e2856f2bf4c5e01707a5f0a0657e5768c03be385ec88fa2328b40",
|
||||
"Assets/MagnetismHeroes/UnityRuntime/Presentation/Audio/Voice/guide_count.wav.meta": "b5cc454fb99ec1d96b026d472cff2e11dcf461a50b4ee72ee5d9547424991774",
|
||||
"Assets/MagnetismHeroes/UnityRuntime/Presentation/Audio/Voice/guide_find.wav": "14de802d534e95053b89c93f8ddd86510e1f68ac4bbf790f8b1f5274c2c34c41",
|
||||
"Assets/MagnetismHeroes/UnityRuntime/Presentation/Audio/Voice/guide_find.wav.meta": "2f4ada332bdd1f4e0a1093c8a9b9bd6d9888de52851a251b3fbc9589ec405b9c",
|
||||
"Assets/MagnetismHeroes/UnityRuntime/Presentation/Audio/Voice/guide_merge.wav": "522db037e0358b01b84dfc68f13e62073495a011a96d8ca407be28f36e98e16d",
|
||||
"Assets/MagnetismHeroes/UnityRuntime/Presentation/Audio/Voice/guide_merge.wav.meta": "737f730ba365c64a03f00c72075ac3ff1f9c1508c38739c07bf3f4a8e6f43ec5",
|
||||
"Assets/MagnetismHeroes/UnityRuntime/Presentation/Audio/Voice/guide_split.wav": "72df6edc53a6e320e48b6bae18ba6bed43034028795021ff48d6f04bc4dc7649",
|
||||
"Assets/MagnetismHeroes/UnityRuntime/Presentation/Audio/Voice/guide_split.wav.meta": "6734167fefec385cb723dc63ce4af9a17231b163aeb468cb9191485771a00a12",
|
||||
"Assets/MagnetismHeroes/UnityRuntime/Presentation/Audio/Voice/guide_split_10_1.wav": "045b2e2065ba0eb44fc5c49405227b7dc042a0a20e88b5aeae87bbea24d0a0c7",
|
||||
"Assets/MagnetismHeroes/UnityRuntime/Presentation/Audio/Voice/guide_split_10_1.wav.meta": "e3cd6effc9df1ba883dcf97d15c94a4d10fdb5a676883adc9e3cff6fec08ab1e",
|
||||
"Assets/MagnetismHeroes/UnityRuntime/Presentation/Audio/Voice/guide_split_10_2.wav": "f3d7912563c761ca8ebace355000ceb1522f6f31a2e15735c712c0d26d011ed6",
|
||||
"Assets/MagnetismHeroes/UnityRuntime/Presentation/Audio/Voice/guide_split_10_2.wav.meta": "fdf14437e475f79953de36042796674e8d1dc7fef7f4a641c3e196b8904e9d93",
|
||||
"Assets/MagnetismHeroes/UnityRuntime/Presentation/Audio/Voice/guide_split_10_3.wav": "dc7f9f9750379fae5b7e8067d467cf6704a6501c3f1a57f4b50a93191ac7140f",
|
||||
"Assets/MagnetismHeroes/UnityRuntime/Presentation/Audio/Voice/guide_split_10_3.wav.meta": "2847f192b3ca561be8157d325de552df3ac40627eb52efb13f0a9672617dfb33",
|
||||
"Assets/MagnetismHeroes/UnityRuntime/Presentation/Audio/Voice/guide_split_10_4.wav": "d1ad45d2432befcfc4d78c29c5c355bdd42eb02492c6ed668c3c0d8ce9c0822d",
|
||||
"Assets/MagnetismHeroes/UnityRuntime/Presentation/Audio/Voice/guide_split_10_4.wav.meta": "2e433be17e683beb83da1edb21b729a23b37ee0ae3f450dd1d8a5ff18f5002d9",
|
||||
"Assets/MagnetismHeroes/UnityRuntime/Presentation/Audio/Voice/guide_split_10_5.wav": "28680c94450411fc93022830c08c2922257df144b0c22f592915988f741f60ca",
|
||||
"Assets/MagnetismHeroes/UnityRuntime/Presentation/Audio/Voice/guide_split_10_5.wav.meta": "aa6403aa649b2b7d43ccad35915411b5b659fb65ed1a95c6316801764399331e",
|
||||
"Assets/MagnetismHeroes/UnityRuntime/Presentation/Audio/Voice/guide_split_2_1.wav": "305c4fe9bc09ac9785fad869420a37b0f15cdbe62e70d877b58774e15d16722b",
|
||||
"Assets/MagnetismHeroes/UnityRuntime/Presentation/Audio/Voice/guide_split_2_1.wav.meta": "54515a0762846e96bb0edc360ecc5e3ddc570ef03742949242c9b0f7cc564691",
|
||||
"Assets/MagnetismHeroes/UnityRuntime/Presentation/Audio/Voice/guide_split_3_1.wav": "ba409cd9f8d69111bb6a1a376cd56d98e1b88cd93f6e383662fcfb3430205ffc",
|
||||
"Assets/MagnetismHeroes/UnityRuntime/Presentation/Audio/Voice/guide_split_3_1.wav.meta": "b7486818c8bbb7240f6847df04fa901d1411ba13277105be57c8f6cc752986c1",
|
||||
"Assets/MagnetismHeroes/UnityRuntime/Presentation/Audio/Voice/guide_split_4_1.wav": "c6a33664da7a8d0ee722fae4c6e7ea3aabc002c6d914a1939f3273d7ce07be64",
|
||||
"Assets/MagnetismHeroes/UnityRuntime/Presentation/Audio/Voice/guide_split_4_1.wav.meta": "e802449958d87aecfd9d1eb5cf4ee78f0fecb4d66584a0197160bf6fdb8cf149",
|
||||
"Assets/MagnetismHeroes/UnityRuntime/Presentation/Audio/Voice/guide_split_4_2.wav": "520c0d11b828f1420c704e42e7b1790902b5fbec4726c369d6272827f36bfc03",
|
||||
"Assets/MagnetismHeroes/UnityRuntime/Presentation/Audio/Voice/guide_split_4_2.wav.meta": "e709a090e093a3525c90bd5df3fca5c3bc0d2068ac3f75f1ee99f147959c459e",
|
||||
"Assets/MagnetismHeroes/UnityRuntime/Presentation/Audio/Voice/guide_split_5_1.wav": "d5bcee96fc42217494e525fec51f20cd2f1188070e2e5aeb20b5fc50f58be80f",
|
||||
"Assets/MagnetismHeroes/UnityRuntime/Presentation/Audio/Voice/guide_split_5_1.wav.meta": "cb15d69d846645dfb58c73f6a12201bef2bd0b0e9dbb92c0d933a9e07368f796",
|
||||
"Assets/MagnetismHeroes/UnityRuntime/Presentation/Audio/Voice/guide_split_5_2.wav": "b946cda17c260eda8409d97ba13dee9f9b5fdf1f587ec623f047d0cf96a2e8b6",
|
||||
"Assets/MagnetismHeroes/UnityRuntime/Presentation/Audio/Voice/guide_split_5_2.wav.meta": "23203e0d9fb94c44b39dd4c07ec378b03fc0ec62cb768a0200b1b396cc0da9d1",
|
||||
"Assets/MagnetismHeroes/UnityRuntime/Presentation/Audio/Voice/guide_split_6_1.wav": "da9e39659a60eaf930f0ac0a7f41ebfc50508893d67ca0d1b7f6a0dfa0f773aa",
|
||||
"Assets/MagnetismHeroes/UnityRuntime/Presentation/Audio/Voice/guide_split_6_1.wav.meta": "62157babc4c09a4f22df86c962ce4c71c0d62a485217467c7fc80ecd2c9218bf",
|
||||
"Assets/MagnetismHeroes/UnityRuntime/Presentation/Audio/Voice/guide_split_6_2.wav": "6b634d5cf24b3d5eca2e9f6ab21519d31ef299b1e0204e9d767a106d9ec3ecf7",
|
||||
"Assets/MagnetismHeroes/UnityRuntime/Presentation/Audio/Voice/guide_split_6_2.wav.meta": "e14203226cc3e4e4d641dd527a9f5719321bd1389c4b04375d55a216278c8911",
|
||||
"Assets/MagnetismHeroes/UnityRuntime/Presentation/Audio/Voice/guide_split_6_3.wav": "9dfed6560f52343b57de209194a6342d41da444d1a3f2dcf5dabec7e93d23fa0",
|
||||
"Assets/MagnetismHeroes/UnityRuntime/Presentation/Audio/Voice/guide_split_6_3.wav.meta": "5a551cfbbec6f74a44f78a1866db8d9f988eb414a649e681a43fede0b2d255ab",
|
||||
"Assets/MagnetismHeroes/UnityRuntime/Presentation/Audio/Voice/guide_split_7_1.wav": "89f5600677849bb96c519bd2ef67776a0408df72c6d94d513263ac31193a69c1",
|
||||
"Assets/MagnetismHeroes/UnityRuntime/Presentation/Audio/Voice/guide_split_7_1.wav.meta": "6b36d19507a1d9a2f6acd290e568109db7d25f3322a6a7375589bc794482262f",
|
||||
"Assets/MagnetismHeroes/UnityRuntime/Presentation/Audio/Voice/guide_split_7_2.wav": "818a8fc291bce3fe7253fbd47b36607e097669ba2a03c6b0262a2647e25e4a16",
|
||||
"Assets/MagnetismHeroes/UnityRuntime/Presentation/Audio/Voice/guide_split_7_2.wav.meta": "33c91f50bcef8b190464bc0bc08ba8b037cff46ebf81034cff6bf98f29c94ea0",
|
||||
"Assets/MagnetismHeroes/UnityRuntime/Presentation/Audio/Voice/guide_split_7_3.wav": "07296ac45990a214efa6fe18c5924456304aa128c364abbe3e00d539d63f7363",
|
||||
"Assets/MagnetismHeroes/UnityRuntime/Presentation/Audio/Voice/guide_split_7_3.wav.meta": "eb994c14db669fb0772a0b128b4e1db1f24802c2489b8d970dfb2b7c9857a9d4",
|
||||
"Assets/MagnetismHeroes/UnityRuntime/Presentation/Audio/Voice/guide_split_8_1.wav": "eb1e903011bb3c82674c8b30f74683715dd988d22db2085db00fce4db697cfcc",
|
||||
"Assets/MagnetismHeroes/UnityRuntime/Presentation/Audio/Voice/guide_split_8_1.wav.meta": "1d218fd1b9975e14c8c37682cb03d018c6f939f3805dd6b12c188f975b3e5313",
|
||||
"Assets/MagnetismHeroes/UnityRuntime/Presentation/Audio/Voice/guide_split_8_2.wav": "c6e2211492e15196fb183e81845fab102f8c9cf1dcb82c29331d24403f9e68e3",
|
||||
"Assets/MagnetismHeroes/UnityRuntime/Presentation/Audio/Voice/guide_split_8_2.wav.meta": "4b4072d9e54fa8aaf56fcfa975e57a7da0e8f4fc9eed88c99f572235152334b7",
|
||||
"Assets/MagnetismHeroes/UnityRuntime/Presentation/Audio/Voice/guide_split_8_3.wav": "c7cf1eff30dde038774b40d895bb833d9dd9c640730ae679711aa48f453e8d90",
|
||||
"Assets/MagnetismHeroes/UnityRuntime/Presentation/Audio/Voice/guide_split_8_3.wav.meta": "20661c608a6a6205176012ea499a7efc1429ede524a75e8c5fae96b23a94bac3",
|
||||
"Assets/MagnetismHeroes/UnityRuntime/Presentation/Audio/Voice/guide_split_8_4.wav": "8c2254bf1d3d7fb773717f9cb006868f8978a91b2d926c49875c29d0af3a4db1",
|
||||
"Assets/MagnetismHeroes/UnityRuntime/Presentation/Audio/Voice/guide_split_8_4.wav.meta": "555a78775fdeaec2aae7b722b823dd5d53c68cd282ee893503a35f6add5c22ca",
|
||||
"Assets/MagnetismHeroes/UnityRuntime/Presentation/Audio/Voice/guide_split_9_1.wav": "c6a2a5a8b15795f40907629aafe639b18b28cdb4d1f574d32ad5324b8db35050",
|
||||
"Assets/MagnetismHeroes/UnityRuntime/Presentation/Audio/Voice/guide_split_9_1.wav.meta": "4f456b9e08c0dded33ae30d9128617b02d9be592dc51110cde8561fc391d278d",
|
||||
"Assets/MagnetismHeroes/UnityRuntime/Presentation/Audio/Voice/guide_split_9_2.wav": "80f290977d76cf097f1be04e3e8a33f5fc677a6213fa4865b876e25d5933e1e7",
|
||||
"Assets/MagnetismHeroes/UnityRuntime/Presentation/Audio/Voice/guide_split_9_2.wav.meta": "bb37d2fd948344a96325c1925ad5e2c40b3785cb3c049d1899dd2238d432b349",
|
||||
"Assets/MagnetismHeroes/UnityRuntime/Presentation/Audio/Voice/guide_split_9_3.wav": "c0a32bb1e7845d3b45c48b60ecab903670107ae0018cfd11e6a975f952feefd1",
|
||||
"Assets/MagnetismHeroes/UnityRuntime/Presentation/Audio/Voice/guide_split_9_3.wav.meta": "fd11dd1afe2c673a8684b33df002aa647564f3b9bff5c711f87082a9fbcfe9bc",
|
||||
"Assets/MagnetismHeroes/UnityRuntime/Presentation/Audio/Voice/guide_split_9_4.wav": "1d2bb033451a248b4a516da13a2e53dc89f4e5590a232ad978896845c8286168",
|
||||
"Assets/MagnetismHeroes/UnityRuntime/Presentation/Audio/Voice/guide_split_9_4.wav.meta": "e80d31a8edcbfb8b0d4eedd48cdad73af4cac8e868803bc4843a9e3a946b7545",
|
||||
"Assets/MagnetismHeroes/UnityRuntime/Presentation/Audio/Voice/guide_uncounted.wav": "00eaa41c80725e45d62cc4f5a6b83ef2fce1a5810a8e74f8d60263e022d18575",
|
||||
"Assets/MagnetismHeroes/UnityRuntime/Presentation/Audio/Voice/guide_uncounted.wav.meta": "8f41ae04e9b097b83fe7dc6033473640477585b002710d824df2501efc6f477e",
|
||||
"Assets/MagnetismHeroes/UnityRuntime/Presentation/BallView.cs": "4a577b14c39ef9fb47e8dbc64d22d13f6d3438522fe0b7eaf61b8676f5ec2837",
|
||||
"Assets/MagnetismHeroes/UnityRuntime/Presentation/BallView.cs.meta": "807faf0e796f33a9e8106ca18c33efa2f6a7841e65af55b1cc197ff3eede605a",
|
||||
"Assets/MagnetismHeroes/UnityRuntime/Presentation/BoardEnvironment.cs": "f2946d9b9ca66d9970c3f523d909170d96f06301cc1ab8b8ef2a060e6f299cc0",
|
||||
"Assets/MagnetismHeroes/UnityRuntime/Presentation/BoardEnvironment.cs.meta": "56746fd3f9461d3bb0377f3f3270a3d589469c1f78b1d7be088579a03e4c4480",
|
||||
"Assets/MagnetismHeroes/UnityRuntime/Presentation/BoardPresenter.cs": "6ebeefcd7c24bc4bd8147cddc430b4d86f8daf3296a8931ef1253880e25214a5",
|
||||
"Assets/MagnetismHeroes/UnityRuntime/Presentation/BoardPresenter.cs.meta": "f27b2aa532ccc921c68f336b700d51793d9b360a65cc887e506c03cf70f3ab1e",
|
||||
"Assets/MagnetismHeroes/UnityRuntime/Presentation/ContactPlacement.cs": "c891dfe3d14c3177e1916587b315b3d50636f7406086e35ccdbe66a761ff4b5a",
|
||||
"Assets/MagnetismHeroes/UnityRuntime/Presentation/ContactPlacement.cs.meta": "b00c57375fa2c06d781b808141942e97f61e321f7993ebe724a570e45eac1d99",
|
||||
"Assets/MagnetismHeroes/UnityRuntime/Presentation/Fonts.meta": "7c2a6083ab8776b52f141988f3de71c075215c80181f133896da6fca99ba2308",
|
||||
"Assets/MagnetismHeroes/UnityRuntime/Presentation/Fonts/NotoSansCJKkr-FirstSlice.asset": "bd66a789f4f0ede93cac08ebae2e620343239d69554df4126d554127538b8489",
|
||||
"Assets/MagnetismHeroes/UnityRuntime/Presentation/Fonts/NotoSansCJKkr-FirstSlice.asset.meta": "2f79c0a2ff26ea8102b0bb62c9e135318c264c46067dcb9ee1913fa26fb5854e",
|
||||
"Assets/MagnetismHeroes/UnityRuntime/Presentation/Fonts/NotoSansCJKkr-Regular.otf": "6bcb2a0703aa137e874fc2dffa85f6c21ba9a67fa329e81b8c801663af7e992a",
|
||||
"Assets/MagnetismHeroes/UnityRuntime/Presentation/Fonts/NotoSansCJKkr-Regular.otf.meta": "b759c2f33ba8ca1b436ec49b17871ea3d5009a255ce8e68e3b9e7d302d321076",
|
||||
"Assets/MagnetismHeroes/UnityRuntime/Presentation/GameSound.cs": "bf868753d16839b282814d711ff1f38ad3a8e26985487bb5ca21fa3d54bd6f48",
|
||||
"Assets/MagnetismHeroes/UnityRuntime/Presentation/GameSound.cs.meta": "07a87b900105b362c304de5454bd609ce8dd1bacbacdf15ad041d287d21c73f3",
|
||||
"Assets/MagnetismHeroes/UnityRuntime/Presentation/GhostDemonstration.cs": "b79a1627f74aaf86d183a754c619b285104eba247ae810a588c052c94c4500eb",
|
||||
"Assets/MagnetismHeroes/UnityRuntime/Presentation/GhostDemonstration.cs.meta": "496e5ee6b79aebe8e3cfb4fb36ab7d3f191cd61748ca1db6ec5a6f5fb738b4d4",
|
||||
"Assets/MagnetismHeroes/UnityRuntime/Presentation/GroupBadge.cs": "892c06ec47633e442dc51f28e3f6882b6cbdebe55eac24a69ea8e1ae35c98f9d",
|
||||
"Assets/MagnetismHeroes/UnityRuntime/Presentation/GroupBadge.cs.meta": "a96898260fc7e70e6c406681f03a8766e7b222aa63f37eff8f691da1bf0f4d15",
|
||||
"Assets/MagnetismHeroes/UnityRuntime/Presentation/Materials.meta": "1f41c8d430d0819835feaadcc7139d96cc9128492324c13b9768035151472e43",
|
||||
"Assets/MagnetismHeroes/UnityRuntime/Presentation/Materials/BlockArch.mat": "3a8da3d88895a82da83dc9a7b1f7cad650312de02591deb5571dd2b0f41200c8",
|
||||
"Assets/MagnetismHeroes/UnityRuntime/Presentation/Materials/BlockArch.mat.meta": "3c3a1e35d7e0eada07c99fa665fee5a18aa88257b0f92f9ab2ea3db5dd0fe4c1",
|
||||
"Assets/MagnetismHeroes/UnityRuntime/Presentation/Materials/CloudMoon.mat": "9b2e101df885e78b9450b72c4a3fe4cc3e3b0378baf86be76ba497e71eb6bc3e",
|
||||
"Assets/MagnetismHeroes/UnityRuntime/Presentation/Materials/CloudMoon.mat.meta": "c0963cc353a50ec1eb7ce1dd67f6b28ae3e596dc2d9bc45aa3181ea60ad589f8",
|
||||
"Assets/MagnetismHeroes/UnityRuntime/Presentation/Materials/CloudPuff.mat": "0a63dbe8eefaa8fcac38f300e0199b1747abdf11683d5c81106a3b3df6e8b4c5",
|
||||
"Assets/MagnetismHeroes/UnityRuntime/Presentation/Materials/CloudPuff.mat.meta": "6264e59a31c12fcf962075094a3c183189b64e69ac9df860d6839d7f6e7cb451",
|
||||
"Assets/MagnetismHeroes/UnityRuntime/Presentation/Materials/CloudRainbow.mat": "3e4ac5b656dfb84f11b4f22f9e6b3bc45763aebf767bc5c8dd2fbb6719d9f76f",
|
||||
"Assets/MagnetismHeroes/UnityRuntime/Presentation/Materials/CloudRainbow.mat.meta": "487f3abb4eb624ceab24eec7dcecdd46cdebfa973268eba9f0c4cf93587e68fa",
|
||||
"Assets/MagnetismHeroes/UnityRuntime/Presentation/Materials/CountGold.mat": "941df001007b3e747b3d7484e89e0d288aaf1fb41768430bb75e0dc188322798",
|
||||
"Assets/MagnetismHeroes/UnityRuntime/Presentation/Materials/CountGold.mat.meta": "bb03c4d8981b02696f6e83c90b9b778ee41035a4ae04838f8ded8440d7b44902",
|
||||
"Assets/MagnetismHeroes/UnityRuntime/Presentation/Materials/FaceInk.mat": "142a13b20f6746af2434864f308d0b41395535bdefc21288cfc14187084e8daa",
|
||||
"Assets/MagnetismHeroes/UnityRuntime/Presentation/Materials/FaceInk.mat.meta": "42b5473ae103f270fd0740b8c68c2907adb1643ebb9e5a08c1aa3aeae0bc57ce",
|
||||
"Assets/MagnetismHeroes/UnityRuntime/Presentation/Materials/GardenFlower.mat": "db4ad9607a853d755681b2f923ab58329bd1db21dbe0bbd3ad608f5faeefffd7",
|
||||
"Assets/MagnetismHeroes/UnityRuntime/Presentation/Materials/GardenFlower.mat.meta": "af14abbd00e1a68dc3d5b1c0830721d1dcf967e9ef534502d3d66a02f115a51c",
|
||||
"Assets/MagnetismHeroes/UnityRuntime/Presentation/Materials/GardenLeaf.mat": "514aa1ffc7a62f332c29fade163f77a47f3d63e5701cba5832c87e6895e77a3d",
|
||||
"Assets/MagnetismHeroes/UnityRuntime/Presentation/Materials/GardenLeaf.mat.meta": "6b4097e6c28136ab810cfd8541b63491426f83b270e5c7cbf919d46a7cce00d2",
|
||||
"Assets/MagnetismHeroes/UnityRuntime/Presentation/Materials/GardenMushroom.mat": "0d8099b05f77be9d926ad23b7050eca92bc30ae7d38d1dcc18e365ed7f4b480b",
|
||||
"Assets/MagnetismHeroes/UnityRuntime/Presentation/Materials/GardenMushroom.mat.meta": "8fda5b5e013751d3f566bcf66380c2a1b88ca2eaf7c9a142c0ec7718ffed1500",
|
||||
"Assets/MagnetismHeroes/UnityRuntime/Presentation/Materials/Island.mat": "20b0ef32184fbdd29ec920933d6e0c572ef9a3f54670b7df7c52a934f34de333",
|
||||
"Assets/MagnetismHeroes/UnityRuntime/Presentation/Materials/Island.mat.meta": "87bfec5e623fb07752bad467669559504b4099faca2a5456296d2ba2b5a96b15",
|
||||
"Assets/MagnetismHeroes/UnityRuntime/Presentation/Materials/LightRibbon.mat": "39dccc2ecda6829783e895770b989a51cc6864e2d98611d8f09beeede10ac1a5",
|
||||
"Assets/MagnetismHeroes/UnityRuntime/Presentation/Materials/LightRibbon.mat.meta": "380f05b6766fb3f421e293c0eb0f753c36a5b9c14429670329a8a48c2d073848",
|
||||
"Assets/MagnetismHeroes/UnityRuntime/Presentation/Materials/MagnetBlue.mat": "43649bf100681a19f4ba2e777ab3fbaf4159a35e229e9f40f2ee7451fb2321d2",
|
||||
"Assets/MagnetismHeroes/UnityRuntime/Presentation/Materials/MagnetBlue.mat.meta": "f07d502c79c004b9d04aa856048cbf03da6a0e7cfa4f53cc2fd04ce31bfead29",
|
||||
"Assets/MagnetismHeroes/UnityRuntime/Presentation/Materials/NumberOutline.mat": "f028a4c27574331f2d84a66bb8000bde992d357f93fba233f03f30d969aa2282",
|
||||
"Assets/MagnetismHeroes/UnityRuntime/Presentation/Materials/NumberOutline.mat.meta": "7e4e9454223f2c1f661056933d81922a5592df24da3675c37aefd834b222340c",
|
||||
"Assets/MagnetismHeroes/UnityRuntime/Presentation/Materials/Pebbles.mat": "92face663cc8caaba73010a59dcde838bfece1f45567633df7ffc7c29c415aa2",
|
||||
"Assets/MagnetismHeroes/UnityRuntime/Presentation/Materials/Pebbles.mat.meta": "d37151fdf4d2cc2dd2a507474980f6e97e1963875a7165b97ebee9bbd69b21ba",
|
||||
"Assets/MagnetismHeroes/UnityRuntime/Presentation/Materials/PlaygroundMint.mat": "900353f1c1756dec0238567ef22c6c067383df882fb5c4ca706556dcbe2da54d",
|
||||
"Assets/MagnetismHeroes/UnityRuntime/Presentation/Materials/PlaygroundMint.mat.meta": "a5b4cc539a11039bdfb22d0dccf076abfd1793581f308d6b093d556e84122105",
|
||||
"Assets/MagnetismHeroes/UnityRuntime/Presentation/Materials/ToyCoral.mat": "f9bcb12f8e69deff81050deee91ad413f10b86071b5b593ff0485c445d343749",
|
||||
"Assets/MagnetismHeroes/UnityRuntime/Presentation/Materials/ToyCoral.mat.meta": "e94d66896607f78b3585de171cab6321e3110ef0e7e192fa0dad3e071139e4b1",
|
||||
"Assets/MagnetismHeroes/UnityRuntime/Presentation/Materials/ToySteps.mat": "b648bddae1df2293f8bd90c23b6325c25f62dd51f23b5b239963cef33f290a73",
|
||||
"Assets/MagnetismHeroes/UnityRuntime/Presentation/Materials/ToySteps.mat.meta": "ab012a56bfb0024f6d8dbba0bb35bafb4b847f0219f2c90618a49b9c735930c8",
|
||||
"Assets/MagnetismHeroes/UnityRuntime/Presentation/Materials/WorkshopCrystals.mat": "42093594e5667838deed9c5317795137ea60aaf6055324f453a3c30db203ac9c",
|
||||
"Assets/MagnetismHeroes/UnityRuntime/Presentation/Materials/WorkshopCrystals.mat.meta": "589218049940045258786613242c836154dc9a560119b74c5ff5ee0a9d4a2fce",
|
||||
"Assets/MagnetismHeroes/UnityRuntime/Presentation/Materials/WorkshopGear.mat": "6b38dfddea22b4e48576891be9e362c9430097c2072cedca628b98d6ec30359c",
|
||||
"Assets/MagnetismHeroes/UnityRuntime/Presentation/Materials/WorkshopGear.mat.meta": "2cd5e2025f5806a3f0f5f57b35dcb36068bb1b087b0372e2e1cab37d8add47d5",
|
||||
"Assets/MagnetismHeroes/UnityRuntime/Presentation/Materials/WorkshopStar.mat": "c7d684bf7d3806a259ef144723ae4afed8af2c842f1d51fb2f77c73100a62e82",
|
||||
"Assets/MagnetismHeroes/UnityRuntime/Presentation/Materials/WorkshopStar.mat.meta": "c2d67cfd68f24ab9cbb2f459e5e1356211a5bb4992bb1d3657e81c2b39d97c49",
|
||||
"Assets/MagnetismHeroes/UnityRuntime/Presentation/Models.meta": "a059fd86f9d8ab894e2621ba1219855701cb81d1134f136539e73e095a9ece91",
|
||||
"Assets/MagnetismHeroes/UnityRuntime/Presentation/Models/BlockArch.fbx": "b1ff050d9fbd670608aa10e1d08b73958ab2cea881e19f942a04ed8b7cbe861b",
|
||||
"Assets/MagnetismHeroes/UnityRuntime/Presentation/Models/BlockArch.fbx.meta": "117bb55562d5594bd130d4aa86e9454f1ad279b37c29f8c9038c9eeadc02874a",
|
||||
"Assets/MagnetismHeroes/UnityRuntime/Presentation/Models/CloudMoon.fbx": "4b459067f63c44f235209528af4a54d518fb4fbb853e717c9000dad48d7bc847",
|
||||
"Assets/MagnetismHeroes/UnityRuntime/Presentation/Models/CloudMoon.fbx.meta": "5a0d323147d151b6fe0b5a750cb79533acf05e1cab91709f641e13b57f55b6d7",
|
||||
"Assets/MagnetismHeroes/UnityRuntime/Presentation/Models/CloudPuff.fbx": "b30b350df8f659e22aac886fce6e93ec212fbab51bbadd6015d505524e344354",
|
||||
"Assets/MagnetismHeroes/UnityRuntime/Presentation/Models/CloudPuff.fbx.meta": "3ddc039b14c9f67188963c5258639add67e8d55aa17dcf6eb543ab0a23be78f3",
|
||||
"Assets/MagnetismHeroes/UnityRuntime/Presentation/Models/CloudRainbow.fbx": "0e83d9844040003a121b4a521386c4f7ff6ab78a18c29125d78ca374657e9884",
|
||||
"Assets/MagnetismHeroes/UnityRuntime/Presentation/Models/CloudRainbow.fbx.meta": "df7d5057eaa0dcc03d880e12e7898dc80cd3f7d2e649f37f3772e7f34a98992e",
|
||||
"Assets/MagnetismHeroes/UnityRuntime/Presentation/Models/GardenFlower.fbx": "34b20a629ae3c2b067b5c8cfdaa6d89b191ad9fe8f85d5eaea6cd28a240615d7",
|
||||
"Assets/MagnetismHeroes/UnityRuntime/Presentation/Models/GardenFlower.fbx.meta": "152cfccee68c7f9ecd5eda550054dd82fa7ff97f6f908f496075bebd026a1292",
|
||||
"Assets/MagnetismHeroes/UnityRuntime/Presentation/Models/GardenLeaf.fbx": "3de135bc7a5fef6866654061c38634d6bfcc4d7e5f5aaaa4019bbbefa400aea9",
|
||||
"Assets/MagnetismHeroes/UnityRuntime/Presentation/Models/GardenLeaf.fbx.meta": "31236db8fde4f760247c36f6ce27e4c56b523781a9082ace5f9a70a2245d436e",
|
||||
"Assets/MagnetismHeroes/UnityRuntime/Presentation/Models/GardenMushroom.fbx": "e6cd92801bc0c4995a0d6eead1efd30453fa69e6f6074398e6fe67e72058ce80",
|
||||
"Assets/MagnetismHeroes/UnityRuntime/Presentation/Models/GardenMushroom.fbx.meta": "d7e699ad2357a726e1c3adb15a48b7e071642e2b6d2a0464e57b7a012956d30a",
|
||||
"Assets/MagnetismHeroes/UnityRuntime/Presentation/Models/Island.fbx": "425a81f9ae6ce69dbf73a38b4b929b19872f74777f7c6aa7d84ac7da5f2c465a",
|
||||
"Assets/MagnetismHeroes/UnityRuntime/Presentation/Models/Island.fbx.meta": "4c4c9204cfebe1f93ca84361ab9dbcdc491f0703c586032aeb1919210e7bda8e",
|
||||
"Assets/MagnetismHeroes/UnityRuntime/Presentation/Models/Pebbles.fbx": "14a28f6ac632c47c1a9483bdc77e8ef8184a7cac8265fff535e8671fe800f060",
|
||||
"Assets/MagnetismHeroes/UnityRuntime/Presentation/Models/Pebbles.fbx.meta": "a77b88ed65acb67d02760053642c4c0a973dd7578cfd89a3d0fbef2e25cca8b5",
|
||||
"Assets/MagnetismHeroes/UnityRuntime/Presentation/Models/ToySteps.fbx": "98f0399b60cbbcde3c53ca38e5d97fb979416400c9882cb3c55113208459c292",
|
||||
"Assets/MagnetismHeroes/UnityRuntime/Presentation/Models/ToySteps.fbx.meta": "76a12048830a4b38bba1a9286287a98abbfab2b3e33b32d9a2c0e0fc62caa79c",
|
||||
"Assets/MagnetismHeroes/UnityRuntime/Presentation/Models/WorkshopCrystals.fbx": "f5fc07a401cc8e0d4ab5505697de5f6b8a97001cf757a513ecc50259627147b5",
|
||||
"Assets/MagnetismHeroes/UnityRuntime/Presentation/Models/WorkshopCrystals.fbx.meta": "b786ed1d98e613fd7dedb3fefabb9f850e118ada35e27da82a0056b22dfb02be",
|
||||
"Assets/MagnetismHeroes/UnityRuntime/Presentation/Models/WorkshopGear.fbx": "3310e609caf37c206f62f28c392ac2081a93356dd82857677bc3c512d96a7813",
|
||||
"Assets/MagnetismHeroes/UnityRuntime/Presentation/Models/WorkshopGear.fbx.meta": "ba65bba9dcf915313bac98b68a4978aa735337f5d21cc5b5fb2c56d3c0a0cb37",
|
||||
"Assets/MagnetismHeroes/UnityRuntime/Presentation/Models/WorkshopStar.fbx": "48c36cae1d4e4a35ce486757992c4f41f5cdb6a94e8a54d672f88c290692e618",
|
||||
"Assets/MagnetismHeroes/UnityRuntime/Presentation/Models/WorkshopStar.fbx.meta": "428732c2cdfd985ced0ab3186ce8533468aacd7e38d93eb64b24f4eb3db8aeb6",
|
||||
"Assets/MagnetismHeroes/UnityRuntime/Presentation/Prefabs.meta": "ca2788db895e69b7fabc76f2603950037ee0250e5db9e6d9279fca48a207846f",
|
||||
"Assets/MagnetismHeroes/UnityRuntime/Presentation/Prefabs/GameApp.prefab": "d722503dcce59a467a1cd4db2286c1e95e84b5f6f614a03b586d0eec866d8394",
|
||||
"Assets/MagnetismHeroes/UnityRuntime/Presentation/Prefabs/GameApp.prefab.meta": "248f9572123fca7ee45d9d56358e2e89a67c2a78b4c27cb74c4281170ace1db6",
|
||||
"Assets/MagnetismHeroes/UnityRuntime/Presentation/Prefabs/GroupBadge.prefab": "ec66def535f920fab2ba641867756ee9519c016d9b7b16c136233d53062e192e",
|
||||
"Assets/MagnetismHeroes/UnityRuntime/Presentation/Prefabs/GroupBadge.prefab.meta": "b76c78e7133454e8bf325948bcbc9f392c96c10fb4eb5a78b01eefac2109c8d7",
|
||||
"Assets/MagnetismHeroes/UnityRuntime/Presentation/Prefabs/MagnetFriend.prefab": "2de9d4f7cd65b4178cde35a32da6b6eeb3f81e3d53f8b520b09f4a6ebac9f098",
|
||||
"Assets/MagnetismHeroes/UnityRuntime/Presentation/Prefabs/MagnetFriend.prefab.meta": "5e31161dac1026b55ff8b8c40fec85f1acdf7f154efb573036cda67c7e99139b",
|
||||
"Assets/MagnetismHeroes/UnityRuntime/Presentation/Prefabs/Scenery.meta": "ed564f9e76e6d693e99b00d8b0f18e63864cb58e822a0480cb193039c594c9ee",
|
||||
"Assets/MagnetismHeroes/UnityRuntime/Presentation/Prefabs/Scenery/BlockArch.prefab": "250f7470e2ba7e832e5fc3585345915a1ad1c9182ef8712230fbb7ac04a87a95",
|
||||
"Assets/MagnetismHeroes/UnityRuntime/Presentation/Prefabs/Scenery/BlockArch.prefab.meta": "5572e39c13ba4cdf63760957a8240bca000b9e0ffee530abbc3c4851a7a32974",
|
||||
"Assets/MagnetismHeroes/UnityRuntime/Presentation/Prefabs/Scenery/CloudMoon.prefab": "726139fa7dd50f3f99e5f9174583bc85cbacd5d5da654850870dad6f5ab5c832",
|
||||
"Assets/MagnetismHeroes/UnityRuntime/Presentation/Prefabs/Scenery/CloudMoon.prefab.meta": "aec8ddd9916ca8d7c1bfaf7f6b5ca6a5372a34119770f7bf16835933ad8ec6df",
|
||||
"Assets/MagnetismHeroes/UnityRuntime/Presentation/Prefabs/Scenery/CloudPuff.prefab": "62dea540dc831ede0224ed9d61dfb0a61966367d88423bef71882837ebc3582d",
|
||||
"Assets/MagnetismHeroes/UnityRuntime/Presentation/Prefabs/Scenery/CloudPuff.prefab.meta": "dd91846026bf30763e8497ed0ec8c1b0caae1c49d666639e83420884278cb9da",
|
||||
"Assets/MagnetismHeroes/UnityRuntime/Presentation/Prefabs/Scenery/CloudRainbow.prefab": "1f1b7ebc8b795380f98147247090926857c6bbb831778f9c0b969d8b01463b1c",
|
||||
"Assets/MagnetismHeroes/UnityRuntime/Presentation/Prefabs/Scenery/CloudRainbow.prefab.meta": "34e9b08fa7d42e6c5c7a8150135000679b60a940b23f7756b8c937c7dfb5371f",
|
||||
"Assets/MagnetismHeroes/UnityRuntime/Presentation/Prefabs/Scenery/GardenFlower.prefab": "e505ec53cc4056a112b22f16606cd025fd6aaa3b34f7d0f45f427214e9b2b938",
|
||||
"Assets/MagnetismHeroes/UnityRuntime/Presentation/Prefabs/Scenery/GardenFlower.prefab.meta": "58ea83681053709ddbfdfab0bca2bb47f59fad4ff171b46d4b585f4eadd0835a",
|
||||
"Assets/MagnetismHeroes/UnityRuntime/Presentation/Prefabs/Scenery/GardenLeaf.prefab": "827cde31118765c12f5f3941943d42a3a45cd06adbb931074b8cf5074b788f47",
|
||||
"Assets/MagnetismHeroes/UnityRuntime/Presentation/Prefabs/Scenery/GardenLeaf.prefab.meta": "91ab44e0cd8cdd5114c98389412c05737016538ac1b7444b0ff1efe2e00b7e0d",
|
||||
"Assets/MagnetismHeroes/UnityRuntime/Presentation/Prefabs/Scenery/GardenMushroom.prefab": "991ac63529f56cd751c39e1e2170452b43b157894cba79155f24f620f006acf5",
|
||||
"Assets/MagnetismHeroes/UnityRuntime/Presentation/Prefabs/Scenery/GardenMushroom.prefab.meta": "5bfb10ca8abfd9799e579b608c343326482fd120a2a4553ae646f9f8dffe312b",
|
||||
"Assets/MagnetismHeroes/UnityRuntime/Presentation/Prefabs/Scenery/Island.prefab": "20763c6440f318b731f2cf4c5a35e830ea547b2bb8346d670f86c4ee7e1d6e4c",
|
||||
"Assets/MagnetismHeroes/UnityRuntime/Presentation/Prefabs/Scenery/Island.prefab.meta": "712a50247312e191576423d7d2ae808fbcd70b8d60ff1be330f4dee7e04bc2de",
|
||||
"Assets/MagnetismHeroes/UnityRuntime/Presentation/Prefabs/Scenery/Pebbles.prefab": "3fe5b6fe8f2c233b3dbdbca4d9a9ea2d81e197ddda17cec7e4f5ca3dcccaf3da",
|
||||
"Assets/MagnetismHeroes/UnityRuntime/Presentation/Prefabs/Scenery/Pebbles.prefab.meta": "08cd7af820b59000b3a85182e6c7dfc900098316a5109ca3f5b61a864f66ee73",
|
||||
"Assets/MagnetismHeroes/UnityRuntime/Presentation/Prefabs/Scenery/ToySteps.prefab": "3bc8671ddf862163caee66cd766c3c4bd99b815ae93ca0feb479244b04223987",
|
||||
"Assets/MagnetismHeroes/UnityRuntime/Presentation/Prefabs/Scenery/ToySteps.prefab.meta": "0d2b1099bb0f347d24958aec2fa8782b3fd51c48558246e1536db23c39557fdc",
|
||||
"Assets/MagnetismHeroes/UnityRuntime/Presentation/Prefabs/Scenery/WorkshopCrystals.prefab": "60a4ad67b6f438a03615826d236145c92ce9e906b7eda7a301490d27bad5c845",
|
||||
"Assets/MagnetismHeroes/UnityRuntime/Presentation/Prefabs/Scenery/WorkshopCrystals.prefab.meta": "eeac924def9abc8108451dc2953ea01733100041525981b5d77770d331c2e2d6",
|
||||
"Assets/MagnetismHeroes/UnityRuntime/Presentation/Prefabs/Scenery/WorkshopGear.prefab": "fd681a1058097b933e84630685b52a0b9c2c3e49e3edc9d417167b02e5d2fe59",
|
||||
"Assets/MagnetismHeroes/UnityRuntime/Presentation/Prefabs/Scenery/WorkshopGear.prefab.meta": "a169341b2bd3066f0e07e187c5f2a68758444a741421ecac7422a34cd897329f",
|
||||
"Assets/MagnetismHeroes/UnityRuntime/Presentation/Prefabs/Scenery/WorkshopStar.prefab": "c82f9f5ac524e6ee7586a664cc929b0420ec55154f049bc5f9a03cbb162acc4c",
|
||||
"Assets/MagnetismHeroes/UnityRuntime/Presentation/Prefabs/Scenery/WorkshopStar.prefab.meta": "d6469e653195714d64aab2e701e761710ae1a08c772ab17aa668b1846526542c",
|
||||
"Assets/MagnetismHeroes/UnityRuntime/Presentation/SafeAreaPanel.cs": "5726a0c8d7ebedc73106f84aa7f111bd42ec92d2132d7f82cbd9a67950b079d1",
|
||||
"Assets/MagnetismHeroes/UnityRuntime/Presentation/SafeAreaPanel.cs.meta": "1e5251eb0e7cc4ceee8bb9edf223a5ab6d368ad1a1e8d8f778223bc5aff26e12",
|
||||
"Assets/MagnetismHeroes/UnityRuntime/Presentation/Sprites.meta": "98be287bf6ac2323f98b136c72effb20bf1ab79d00ef6f181cdc516aaa70c865",
|
||||
"Assets/MagnetismHeroes/UnityRuntime/Presentation/Sprites/Face0.asset": "a351d09aef580f8bf3d73401008aa93c7fffb250ea010595824dff15766dfcf6",
|
||||
"Assets/MagnetismHeroes/UnityRuntime/Presentation/Sprites/Face0.asset.meta": "f5613e301fff9c03223664e15a8db068a7f81f1b7642b992814265e8bef6ff36",
|
||||
"Assets/MagnetismHeroes/UnityRuntime/Presentation/Sprites/Face1.asset": "a555b81eb573044b53edc7c57bbc2937ba1e7d789527bae02f97686cce6ff816",
|
||||
"Assets/MagnetismHeroes/UnityRuntime/Presentation/Sprites/Face1.asset.meta": "6fadefb2d906d9f49a0fe756a94136787f8ffd033c006ad66c08e63c6288c568",
|
||||
"Assets/MagnetismHeroes/UnityRuntime/Presentation/Sprites/Face2.asset": "6c8cfcc79bf7ab2781b39303ebd6e723fd0f96aec9f30378c7197bb73720d020",
|
||||
"Assets/MagnetismHeroes/UnityRuntime/Presentation/Sprites/Face2.asset.meta": "ca2f2a3457ef05baeae23ca772e3304aa2c6a3e24eedb563c2bda398825560ec",
|
||||
"Assets/MagnetismHeroes/UnityRuntime/Presentation/Sprites/Face3.asset": "9130d438849dc678504cc939f51c9ea91c5b1dff97b7f7f9248b2f617af4da26",
|
||||
"Assets/MagnetismHeroes/UnityRuntime/Presentation/Sprites/Face3.asset.meta": "ca2b60c0c08de47ebf47018eca26be410fec9f91ecd973c6a80db58668039e9f",
|
||||
"Assets/MagnetismHeroes/UnityRuntime/Presentation/Sprites/Face4.asset": "8325c280f8fd83b1f55102593dc772153a3953a70e818467894d7ac98c9f87c0",
|
||||
"Assets/MagnetismHeroes/UnityRuntime/Presentation/Sprites/Face4.asset.meta": "7cf23edcc41e7415eba57c4aa9ead5990d7352f349377536c43b0172d4ecd693",
|
||||
"Assets/MagnetismHeroes/UnityRuntime/Presentation/Sprites/Face5.asset": "a63967c62e7f1ddebe5cfa073b536992b1e02f2ff3aeacd515dc9cb230dca321",
|
||||
"Assets/MagnetismHeroes/UnityRuntime/Presentation/Sprites/Face5.asset.meta": "fbe31b7a354bd949d46e160f600a021cbf13e79988e8aa55dfc2afc0a39f2046",
|
||||
"Assets/MagnetismHeroes/UnityRuntime/Presentation/Textures.meta": "aa7b7000d0c56dc9f71e811146d1f1f8ccfc3f3f55d47a94eb7da9ec526686fb",
|
||||
"Assets/MagnetismHeroes/UnityRuntime/Presentation/Textures/FaceExpressions.png": "0e3c115619c4ae68cf8859ccbc6d4bfb3a26a1a247b3ddb41327c46829540c98",
|
||||
"Assets/MagnetismHeroes/UnityRuntime/Presentation/Textures/FaceExpressions.png.meta": "1aadbba03b4a8d91e87c663a2e30ae981a57aa524d4ba653fbef34922f1b4f63",
|
||||
"Assets/MagnetismHeroes/UnityRuntime/Presentation/VoicePlayer.cs": "4920dd894f407dbe6d20c4eb6370d328ec7c30eece2fdd5e35d45a5e81fb74a3",
|
||||
"Assets/MagnetismHeroes/UnityRuntime/Presentation/VoicePlayer.cs.meta": "03ae52a503737d680db99709bd712bd82a29f3d97c7cefddc8c1535e19cf64c3",
|
||||
"Assets/MagnetismHeroes/UnityRuntime/StageAssets.meta": "c148a837438ba800381dbbcc7916fd21c5e5ffef228a9588cd72013eed071ac6",
|
||||
"Assets/MagnetismHeroes/UnityRuntime/StageAssets/Stage01.asset": "9882a93e25a70b8eda53656a500c1200efc8ff1a51b5bc138f0406371545799d",
|
||||
"Assets/MagnetismHeroes/UnityRuntime/StageAssets/Stage01.asset.meta": "d191758be4296341ea14ef824080bffa7b6503c2707b83684c73573e57ff3576",
|
||||
"Assets/MagnetismHeroes/UnityRuntime/StageAssets/Stage02.asset": "737657dc2a8a73fb435c8e9e0f4ca0abe33c2bef939c5b57a7571d2df0f113ea",
|
||||
"Assets/MagnetismHeroes/UnityRuntime/StageAssets/Stage02.asset.meta": "0c4b446bddb0344d5f4100ce68123ee08d75f39f1e883535347b604a756ab3c6",
|
||||
"Assets/MagnetismHeroes/UnityRuntime/StageAssets/Stage03.asset": "cd32f32c67549cfde6428a3baefe3004e0729c2a7c4d93416f7ff1d60f58e622",
|
||||
"Assets/MagnetismHeroes/UnityRuntime/StageAssets/Stage03.asset.meta": "fbb526f0736e1e9a0863f50093a8b0323ae647bb6d10b81cfcfc2289eef1bfe7",
|
||||
"Assets/MagnetismHeroes/UnityRuntime/StageAssets/Stage04.asset": "e3e17be5881fdf25ea309ccc0ef122b0617c348b3c1a8f77f888c637da4b4cd0",
|
||||
"Assets/MagnetismHeroes/UnityRuntime/StageAssets/Stage04.asset.meta": "1bf89aa74b745936305791de5ffefdcfef3dee678e6a15506dd6a3284444db4e",
|
||||
"Assets/MagnetismHeroes/UnityRuntime/StageAssets/Stage05.asset": "7c0fb53d06c73a32efcac26063dfeccdb17eedf257e3eeebbaf93d802ccd5cc2",
|
||||
"Assets/MagnetismHeroes/UnityRuntime/StageAssets/Stage05.asset.meta": "dce6799d114e5f82ddeb662a632db10b145e177600a3475efd049d116d54e245",
|
||||
"Assets/MagnetismHeroes/UnityRuntime/StageAssets/Stage06.asset": "aac367d6c3f388f505aa3a25f2b295d30c7b67a0853875b77477c4f87fa9015d",
|
||||
"Assets/MagnetismHeroes/UnityRuntime/StageAssets/Stage06.asset.meta": "81b5cc34fa2e14288468f6d524ff5423f29cdf453af1a6860f8b92fafdfabeae",
|
||||
"Assets/MagnetismHeroes/UnityRuntime/StageAssets/Stage07.asset": "812f206b917e30b4e11950e959ebc1aee3e22f2e815b5126ef4629a2ff137aa4",
|
||||
"Assets/MagnetismHeroes/UnityRuntime/StageAssets/Stage07.asset.meta": "12ec2ae9d4b3cd4ebdc72f422da385208e994ab0542422c03f29b58eed6b8da4",
|
||||
"Assets/MagnetismHeroes/UnityRuntime/StageAssets/Stage08.asset": "8b64735052d78a785e8e76fb079ef2e68206643b86045dc7f986f0e246d94c12",
|
||||
"Assets/MagnetismHeroes/UnityRuntime/StageAssets/Stage08.asset.meta": "fa7787c13df551525c7a247b0913bd0edc3f9d302a8b1c61aeaa9b7ff4b215b4",
|
||||
"Assets/MagnetismHeroes/UnityRuntime/StageAssets/Stage09.asset": "400f3353afe5928772dd87a0d5361dd7cdd1074e64d5db2347a5c7622784cccd",
|
||||
"Assets/MagnetismHeroes/UnityRuntime/StageAssets/Stage09.asset.meta": "290ea5f8135079a754f9441b7db5a844f96a3880fa160dfdd029cabdfe6699d9",
|
||||
"Assets/MagnetismHeroes/UnityRuntime/StageAssets/Stage10.asset": "7746b8afc229340f13159f1b4a7c829d8f9eb2eccd74fcbde837841adbb95d2c",
|
||||
"Assets/MagnetismHeroes/UnityRuntime/StageAssets/Stage10.asset.meta": "667f87d6f986a344e3bdbb38806a9092b03313153d36512535451cc413183102",
|
||||
"Assets/MagnetismHeroes/UnityRuntime/StageAssets/Stage11.asset": "26f13a567794e20295e9318630b0489718ea054ded0316654791091df24e26f2",
|
||||
"Assets/MagnetismHeroes/UnityRuntime/StageAssets/Stage11.asset.meta": "d96ec6ce25ca5936703f3796d2d5fa946b0014a5b48a0b1d8f624cdc019ff486",
|
||||
"Assets/MagnetismHeroes/UnityRuntime/StageAssets/Stage12.asset": "eb65552aef9bfecef99be50768eddf2a527452f17466b118fc7192bd5f3518a5",
|
||||
"Assets/MagnetismHeroes/UnityRuntime/StageAssets/Stage12.asset.meta": "6b07067267abb134f1f2547ded3b5ecdad3a75a95e391aab4b08ef55983003ba",
|
||||
"Assets/MagnetismHeroes/UnityRuntime/StageAssets/Stage13.asset": "5a6d563e300476d591e0d872802ffec4f5a60bd1b8ab73ec63ae9370e8b463a9",
|
||||
"Assets/MagnetismHeroes/UnityRuntime/StageAssets/Stage13.asset.meta": "2b3abc72f2011fa59d9c4a0779ad6226dcc0120519b1e14ba3be4f8d7aa03093",
|
||||
"Assets/MagnetismHeroes/UnityRuntime/StageAssets/Stage14.asset": "ae9bf566f387858b7b2e557c61bd8f0ce8b61a5b36e8dd882bce7ca6469a0ba2",
|
||||
"Assets/MagnetismHeroes/UnityRuntime/StageAssets/Stage14.asset.meta": "18204258707d0bc2b083c4fa8e73fec77a603e7a50d804ec318f4c220eb11710",
|
||||
"Assets/MagnetismHeroes/UnityRuntime/StageAssets/Stage15.asset": "714cfe769f0d672db29d16586dd9a40643afd3d288c1e5917393cb07f0508135",
|
||||
"Assets/MagnetismHeroes/UnityRuntime/StageAssets/Stage15.asset.meta": "145360f4018881ca8724b752a8f2024005f64064bd4bb142dc57e07e038a2b1a",
|
||||
"Assets/MagnetismHeroes/UnityRuntime/StageAssets/Stage16.asset": "ca16d92aa28be84d4a08c40795cf1469407c51788a6ac4e195a810ea41f04571",
|
||||
"Assets/MagnetismHeroes/UnityRuntime/StageAssets/Stage16.asset.meta": "87a0aeb1f8f50b2dc2137e7ce8c45fab93e741cb66e97b10ad8833a40077d2d9",
|
||||
"Assets/MagnetismHeroes/UnityRuntime/StageAssets/Stage17.asset": "3fc87afbc987382799f0c62986edf42e6de55250e387557620d7b86db6d0c898",
|
||||
"Assets/MagnetismHeroes/UnityRuntime/StageAssets/Stage17.asset.meta": "f2cde45482d15f85beecde6e1ef37a17c4b32fd3d44d7fa09cdb48e298bc422d",
|
||||
"Assets/MagnetismHeroes/UnityRuntime/StageAssets/Stage18.asset": "4a779dbb012b8791202deb192ff21459395dc94a451edb226cc83ec05d52b3d8",
|
||||
"Assets/MagnetismHeroes/UnityRuntime/StageAssets/Stage18.asset.meta": "f8126d37d854fffda38b12d036218c78855ac2ea895460f879e9b0ddd7819da1",
|
||||
"Assets/MagnetismHeroes/UnityRuntime/StageAssets/Stage19.asset": "db69f150e92d3782dc4f34f998b07a5b4ed84257786469bd9b1f2900b8685335",
|
||||
"Assets/MagnetismHeroes/UnityRuntime/StageAssets/Stage19.asset.meta": "d2204076f08b08a6d8c173c7af67d2dfe142c2a048fd8fcb3cacbc17bea8ff8b",
|
||||
"Assets/MagnetismHeroes/UnityRuntime/StageAssets/Stage20.asset": "49c496c2a8c99b7670c12697d8c835f92c6dd46fc818c8c89902d668cc2dbc94",
|
||||
"Assets/MagnetismHeroes/UnityRuntime/StageAssets/Stage20.asset.meta": "eef5da97f2f010db711b0fbdd7e68864343d5cd41de8809ff4b0d61c3e2f45fe",
|
||||
"Assets/MagnetismHeroes/UnityRuntime/StageAssets/Stage21.asset": "8afd3c87e8080bd9baf3f2f85276b824f3a3d60c16ca22b7ace5575ee4ef5808",
|
||||
"Assets/MagnetismHeroes/UnityRuntime/StageAssets/Stage21.asset.meta": "397ce3a027feee2145e77951099bb9b920e440a619815036b693a43f80104bb4",
|
||||
"Assets/MagnetismHeroes/UnityRuntime/StageAssets/Stage22.asset": "d94bb8d2b1ab88a75223f71db4a62bc6bc8103c6d8079bfc8205181df16578a8",
|
||||
"Assets/MagnetismHeroes/UnityRuntime/StageAssets/Stage22.asset.meta": "5b7467670a320b3b916c034f167d5726f9ec1b2c6abe3f22250a7138907124ab",
|
||||
"Assets/MagnetismHeroes/UnityRuntime/StageAssets/Stage23.asset": "56bce6a82d4271b8919d733ee475760e43c3f8bf4035e2c1e79096c8dfb22823",
|
||||
"Assets/MagnetismHeroes/UnityRuntime/StageAssets/Stage23.asset.meta": "57761e15155453551024afb329aefd26f9743fbda9f8c4c0dfc30542aa4bbe58",
|
||||
"Assets/MagnetismHeroes/UnityRuntime/StageAssets/Stage24.asset": "98637095636b98dda4e53fe959b8787ab45e63ffa82a5379b0d52010edf6fc3d",
|
||||
"Assets/MagnetismHeroes/UnityRuntime/StageAssets/Stage24.asset.meta": "5d6a6e2aa5c779ec46656bcd4895ef4c6849b657e34ba666b1cfbcf260f44615",
|
||||
"Assets/MagnetismHeroes/UnityRuntime/StageAssets/Stage25.asset": "fbe23e52ef379f1d1009973d42da9c4616370b1a8fb3f2f5adcc5b2f66db6d33",
|
||||
"Assets/MagnetismHeroes/UnityRuntime/StageAssets/Stage25.asset.meta": "6614ddd6e162508445a38ae49e8b14ac6c9b686be3a44ea42f24cd2913554dc4",
|
||||
"Assets/MagnetismHeroes/UnityRuntime/StageAssets/Stage26.asset": "eb36ade8ef35fb89c490df4c75340763bc102e9cb15f98dda1a27e7e3234fc79",
|
||||
"Assets/MagnetismHeroes/UnityRuntime/StageAssets/Stage26.asset.meta": "29e80e3ae35acdd5ea865fa4f39fdcd2974c460d02084b327abe3332826a85ea",
|
||||
"Assets/MagnetismHeroes/UnityRuntime/StageAssets/Stage27.asset": "c14d49d11809e59c8e82d15d257efa9f79b951e2f231cca90147d58b5dcbbe9c",
|
||||
"Assets/MagnetismHeroes/UnityRuntime/StageAssets/Stage27.asset.meta": "025fc99567d27b618db5c7c292afac980db4ed14626a62cfa94f685e66e0839a",
|
||||
"Assets/MagnetismHeroes/UnityRuntime/StageAssets/Stage28.asset": "5c304cf2a5af710b072d9ad3a9ba83613e0a4149dc7d7e3245b2431419300700",
|
||||
"Assets/MagnetismHeroes/UnityRuntime/StageAssets/Stage28.asset.meta": "2bfca1e2842f0ecb24ee94966228058e23729b0709e7755e7c7752bb5eaaea89",
|
||||
"Assets/MagnetismHeroes/UnityRuntime/StageAssets/Stage29.asset": "0a2687bbd6ee2605dffadc50356fd56d9329f54d9713df6882f29d5999447f08",
|
||||
"Assets/MagnetismHeroes/UnityRuntime/StageAssets/Stage29.asset.meta": "3414f5ce22d691417e16217f7d8881f100b966489443a8ec2f48a08acb26f234",
|
||||
"Assets/MagnetismHeroes/UnityRuntime/StageAssets/Stage30.asset": "bd05de078e3625b955b147f12aea1b055d5a8513c98af06fc828e9e5a0bcb840",
|
||||
"Assets/MagnetismHeroes/UnityRuntime/StageAssets/Stage30.asset.meta": "7135b990186907960b62c20cb41c11a7ae881c12adace71995bf29d3b4d44529",
|
||||
"Assets/MagnetismHeroes/UnityRuntime/StageAssets/StageAsset.cs": "83ee09cdf36e27fb293cd2a5ec4cf599096a67044f335028b5070d34763b2793",
|
||||
"Assets/MagnetismHeroes/UnityRuntime/StageAssets/StageAsset.cs.meta": "38c224d68c81217a9a043ff683882e2593cc19fdc9dda6b67b37ff48a7e3cfa1",
|
||||
"Assets/Settings.meta": "73c8e19843240273facb0af6bdbf430d719e397aded705629594060ce25ce7ad",
|
||||
"Assets/Settings/DefaultVolumeProfile.asset": "bda0e0edfaac8afb004c90a2e0fe1b7797d1f2027f329cae5026f5b83727b14f",
|
||||
"Assets/Settings/DefaultVolumeProfile.asset.meta": "efbcb026cee6b8e32fdf27018c06b0515296a6ccbb43969e792fea270310700a",
|
||||
"Assets/Settings/Mobile_RPAsset.asset": "839fe528b015841bb60bba04d1c5830ef7b56eb2d78f61692db102de625460f3",
|
||||
"Assets/Settings/Mobile_RPAsset.asset.meta": "53ea46647712c615fd1a3f2e0dddfa8559eeedc649e9a1dbf93ff913de28544c",
|
||||
"Assets/Settings/Mobile_Renderer.asset": "aa93274c9521fa941170becec9e87c5fa36b8587eefd5eeb5c0eed0d1d4b1dbe",
|
||||
"Assets/Settings/Mobile_Renderer.asset.meta": "a148ee2b4987b05b8ff7ae5f9bf84916184f77aefddc821dceb551f5a69f8179",
|
||||
"Assets/Settings/PC_RPAsset.asset": "65b657b87062616fca959aecbb64b4b01dfd3b0051ac1119fb65be615539df96",
|
||||
"Assets/Settings/PC_RPAsset.asset.meta": "bb469b9b6f318e9e9bed29c3b2e73e79371c04743c6f95dd6603941f1cd3e53e",
|
||||
"Assets/Settings/PC_Renderer.asset": "3d0b01d8ded3327263b6690be128a3de58d17c514943ae42fe743a3e084a9c79",
|
||||
"Assets/Settings/PC_Renderer.asset.meta": "b5df8ddb2708c6ed4c133a5ff9ee95a75cc20e4ee3ed6181366a61aedbaf31ec",
|
||||
"Assets/Settings/SampleSceneProfile.asset": "a8677d4bac051d24caa11cd622e39f968155ee277bfce132274f1de225692fe9",
|
||||
"Assets/Settings/SampleSceneProfile.asset.meta": "2e23abc214069f0adbf2b2207f1db54be7876629ec2a3681d0f4aa5b61622ef0",
|
||||
"Assets/Settings/UniversalRenderPipelineGlobalSettings.asset": "831586bf4833c130db534749c7901260f2aa193ce1a2c3cccfe062a8cf6a38f8",
|
||||
"Assets/Settings/UniversalRenderPipelineGlobalSettings.asset.meta": "f61661d8bc8dbe531daf09f6211ef978c7ba145c9207c8e76524396ae0722d7c",
|
||||
"Assets/StreamingAssets.meta": "e7055ff841742399b7e3992ebdc41054bcab446ff7cc9c97d494b3d24e8eafc8",
|
||||
"Assets/StreamingAssets/Notices.meta": "0ae917dd89ec866c890a0f49f7f587bc89c658a6362057736d317cbfebdbdc1f",
|
||||
"Assets/StreamingAssets/Notices/NotoSansCJK-OFL.txt": "88f117575237307bdd86a17ef15e21790fc9a662fe4dfb103ca1ca077f0d9982",
|
||||
"Assets/StreamingAssets/Notices/NotoSansCJK-OFL.txt.meta": "73549968dc8eaf85a156f3f82379ff0a210ed54e4ede31e56b930a1ed0fb628a",
|
||||
"Assets/StreamingAssets/Notices/TTS-Apache-2.0.txt": "7137274bab133744763a3906ace2a13844c2b34635136fc6d4454c25bfd76eda",
|
||||
"Assets/StreamingAssets/Notices/TTS-Apache-2.0.txt.meta": "c90234c623bb02c38471fc9f8088e9e9059d6fbf079f4a59d3424d6a0a0de448",
|
||||
"Assets/StreamingAssets/Notices/TTS-model-card.txt": "2157466302fcaf8e4979d0505aa4b648ad32468aff98b3e964046db05e574f3c",
|
||||
"Assets/StreamingAssets/Notices/TTS-model-card.txt.meta": "d6ed52dda74a6f3e2b1d0c343c7fc4997613401c6fe7d3aad6853aef0f62d65e",
|
||||
"Assets/TextMesh Pro.meta": "01c98712be33191460d4eba7720f3b157d163deba149053aade1400d8197d8f9",
|
||||
"Assets/TextMesh Pro/Fonts.meta": "8c596298d518c27d3f42a08e9849e679a66d62b8e79823a6d3b48525290ed647",
|
||||
"Assets/TextMesh Pro/Fonts/LiberationSans - OFL.txt": "a130e89b7b2326b599c4b2bbd873eaae63feda407541a2899cb8acb306723de6",
|
||||
"Assets/TextMesh Pro/Fonts/LiberationSans - OFL.txt.meta": "1b8062370a3bb2be74a46b0ae08688c87cd207cad602fcc77a750cafb106c9af",
|
||||
"Assets/TextMesh Pro/Fonts/LiberationSans.ttf": "e5b0af421ea2bfbc1ac8d251d647268087ae82786234c57f757d1f0b90fa8b49",
|
||||
"Assets/TextMesh Pro/Fonts/LiberationSans.ttf.meta": "58603424f5d1f468af3f0c031c288cc9eaa96cb3fb82a0429b16a204a18a5012",
|
||||
"Assets/TextMesh Pro/Resources.meta": "4bc87da5a85b45fb3252482a603b56e3d34b2174973c527940b225e0b6d9f062",
|
||||
"Assets/TextMesh Pro/Resources/Fonts & Materials.meta": "124f26d6401f350502d4ea38e1b27353dfbd9905ebf50a1b813cd695c2c4eefe",
|
||||
"Assets/TextMesh Pro/Resources/Fonts & Materials/LiberationSans SDF - Drop Shadow.mat": "73f941d7702c761483bb184fad6e262648032969f0f310344155758b8fad764f",
|
||||
"Assets/TextMesh Pro/Resources/Fonts & Materials/LiberationSans SDF - Drop Shadow.mat.meta": "fa0b8ba96378d1fed663d2206054a5e48139892e3d1c6a6ece97808a6869d70d",
|
||||
"Assets/TextMesh Pro/Resources/Fonts & Materials/LiberationSans SDF - Fallback.asset": "6cd2faa131f346f601036104691f0223744c5806a51ceec454e6d4ff3bb6831d",
|
||||
"Assets/TextMesh Pro/Resources/Fonts & Materials/LiberationSans SDF - Fallback.asset.meta": "0a7cce8a8d21c28bc719e5842c3fb8a3de8eac864a577160d7413d1df08d79d1",
|
||||
"Assets/TextMesh Pro/Resources/Fonts & Materials/LiberationSans SDF - Outline.mat": "4a07f16fcfa697f984d78b7acc005985fe45a256b4bf8b7907faea08075b4961",
|
||||
"Assets/TextMesh Pro/Resources/Fonts & Materials/LiberationSans SDF - Outline.mat.meta": "cb8f2abe533ef11a46ab112cf8dbefb44cb01fa4b7262060a3c480862824d1fb",
|
||||
"Assets/TextMesh Pro/Resources/Fonts & Materials/LiberationSans SDF.asset": "0c990817a90dbe8cc2c54e699e187fe4a27986811ba742050885c92c364626a1",
|
||||
"Assets/TextMesh Pro/Resources/Fonts & Materials/LiberationSans SDF.asset.meta": "eef709d8a9d8b4c781c532712a61aa28f3ef123b902f6b5a8903f0ea61845b50",
|
||||
"Assets/TextMesh Pro/Resources/LineBreaking Following Characters.txt": "3a73e5ffe2510756dd3c2e982fdc1218b4be82c6e21abde88070d6860e1bc8e6",
|
||||
"Assets/TextMesh Pro/Resources/LineBreaking Following Characters.txt.meta": "64ef1da1e73f25ba842200e26d43908685c4b9be66856d47103a26c1cae94fa9",
|
||||
"Assets/TextMesh Pro/Resources/LineBreaking Leading Characters.txt": "62d3f4d5f64aaf885692d2d13a8313f6918e6e4c5aeb3990a43f614652bfd89c",
|
||||
"Assets/TextMesh Pro/Resources/LineBreaking Leading Characters.txt.meta": "92a36fb59ae49c6974d4ef75b41ffe4c1612110c4b49ed7af5539dcb35e86e8f",
|
||||
"Assets/TextMesh Pro/Resources/Style Sheets.meta": "9029980ffd3af688190a28cb7f0397a82efe9bd3a8861ed40dfc9018e76d5933",
|
||||
"Assets/TextMesh Pro/Resources/Style Sheets/Default Style Sheet.asset": "49c813b42ff25580e3934554e3550e7bdb78bcfb2c3562bf1191f0d42f4da141",
|
||||
"Assets/TextMesh Pro/Resources/Style Sheets/Default Style Sheet.asset.meta": "b652bfc488ebea2ac241cc440ad73c4a9af993c265c800fe0f7cc4917286d0b0",
|
||||
"Assets/TextMesh Pro/Resources/TMP Settings.asset": "dafd957b416fdad34f611c30ee60d5f603497099f847b83fd688f883a56a3e72",
|
||||
"Assets/TextMesh Pro/Resources/TMP Settings.asset.meta": "7e88f07fd05c1c4f829c55d8d7660d7ac572e906a5d7152857ef12a574d13375",
|
||||
"Assets/TextMesh Pro/Shaders.meta": "6fc503950579b274e6745f9f18698f6b23d61ae9e3b8f208f023586c609d9d98",
|
||||
"Assets/TextMesh Pro/Shaders/SDFFunctions.hlsl": "aa8b32660f8bfd9c1166d94539034437bb0332db6062122d074cd8645fbb98f4",
|
||||
"Assets/TextMesh Pro/Shaders/SDFFunctions.hlsl.meta": "b35c24e7cc242687d24e1b99a0e921259defd305f2c73873173871b62f4c748f",
|
||||
"Assets/TextMesh Pro/Shaders/TMP_Bitmap-Custom-Atlas.shader": "4fde41f9b01df2f31d54c5ddfa7703ca63ec89bba6615ea439c63e76f84f7b4b",
|
||||
"Assets/TextMesh Pro/Shaders/TMP_Bitmap-Custom-Atlas.shader.meta": "41009354edccdb35431e595694e97cda8592094bebf607896161c769b66b3591",
|
||||
"Assets/TextMesh Pro/Shaders/TMP_Bitmap-Mobile.shader": "d90e395a82303e7c048fe708f8cc76d2c4b304d723c942e8c1c85c30a28acdff",
|
||||
"Assets/TextMesh Pro/Shaders/TMP_Bitmap-Mobile.shader.meta": "162e6113de4ff13e40bb6bc51f46542f5fc338c65facf395264db261e5d59847",
|
||||
"Assets/TextMesh Pro/Shaders/TMP_Bitmap.shader": "1d88cbc0fd9f6d1189e6883b6a41433397a8d7fa2c6c267664af89f87687f050",
|
||||
"Assets/TextMesh Pro/Shaders/TMP_Bitmap.shader.meta": "5278837021cc26fc254d06fdd87012bcc7d1e0521bfe068fbf24ef5481c9eff7",
|
||||
"Assets/TextMesh Pro/Shaders/TMP_SDF Overlay.shader": "09602d3dd3834e7495fa233ee09a32c0af2e072db6f832b882c2b72014c56d6d",
|
||||
"Assets/TextMesh Pro/Shaders/TMP_SDF Overlay.shader.meta": "1288285d5a6a95bb5405cc789d7f44139772e3ab9c8ec5fe9a919b3878055682",
|
||||
"Assets/TextMesh Pro/Shaders/TMP_SDF SSD SpaceWarp.shader": "3819a806df61e6edd0835d26f4915c78726a7d563ff5b453e0af4c15302856ad",
|
||||
"Assets/TextMesh Pro/Shaders/TMP_SDF SSD SpaceWarp.shader.meta": "7dbcf714e8b6525bc79d53b8393f58e6bd7919e4ecadf5ca70f484c85a9bc7a8",
|
||||
"Assets/TextMesh Pro/Shaders/TMP_SDF SSD.shader": "02651d722125000a33ef3eedb32773038f878f6d8563b3e2b45af1e38859cdf4",
|
||||
"Assets/TextMesh Pro/Shaders/TMP_SDF SSD.shader.meta": "12bfe855479eca270552d907ee15b8ce54f2276f15af3127bfc592706d4075a7",
|
||||
"Assets/TextMesh Pro/Shaders/TMP_SDF SpaceWarp.shader": "f6156e7c6ed7146efdb49728a44474f3fad1ea1a848ada09858c7f761a182a86",
|
||||
"Assets/TextMesh Pro/Shaders/TMP_SDF SpaceWarp.shader.meta": "ab64b44ebbacf053b1de937c83f78c593306988e3e9b77c84d54fff1ed86d4fb",
|
||||
"Assets/TextMesh Pro/Shaders/TMP_SDF-HDRP LIT.shadergraph": "5d6bc7a7e8c31cf498e54c9828435815f18e044b898139eb9b491f08461f80a1",
|
||||
"Assets/TextMesh Pro/Shaders/TMP_SDF-HDRP LIT.shadergraph.meta": "a8b46dd48416668b865839947e4f9079b3677e9da00befc5f7fc9fb7fd4b0306",
|
||||
"Assets/TextMesh Pro/Shaders/TMP_SDF-HDRP UNLIT.shadergraph": "2506122540a83f3fbd7fecc073ca4eb6ed43a58a9d8b59caa135e66580b0c956",
|
||||
"Assets/TextMesh Pro/Shaders/TMP_SDF-HDRP UNLIT.shadergraph.meta": "a1e19eef571b0f72337600d9758b51749b68a91ce3b25ede90a679c56e73dc7b",
|
||||
"Assets/TextMesh Pro/Shaders/TMP_SDF-Mobile Masking.shader": "b3eae5be517f376299ed9152d78fbd6879e2c9a8f35a4b9a133b65bb9254ce18",
|
||||
"Assets/TextMesh Pro/Shaders/TMP_SDF-Mobile Masking.shader.meta": "c4adca1c50f7380adf32fddcf1f37614d0c7829500e42c6247021a391f3d595c",
|
||||
"Assets/TextMesh Pro/Shaders/TMP_SDF-Mobile Overlay.shader": "2ab40b8067e36d4b6f262bb3485203788b6b0e9c7521bae69cc47b2a05fb2b0a",
|
||||
"Assets/TextMesh Pro/Shaders/TMP_SDF-Mobile Overlay.shader.meta": "2a3232392e8d038fd478b3f1704b66362b5e763afb50b3f16ac899c888de73ed",
|
||||
"Assets/TextMesh Pro/Shaders/TMP_SDF-Mobile SSD SpaceWarp.shader": "79499fcf3da028943a71abd4bd4a2b71f9be5c29d88c9fceeab576373c45df5d",
|
||||
"Assets/TextMesh Pro/Shaders/TMP_SDF-Mobile SSD SpaceWarp.shader.meta": "7392dad6b3a53b4847ee463883b44ed0f03865f582297f43c86a9b3006d299bd",
|
||||
"Assets/TextMesh Pro/Shaders/TMP_SDF-Mobile SSD.shader": "c8de13a7886eddfc4f6994ea40b4042721f1238eee89a0ff4c29e32d33faefa2",
|
||||
"Assets/TextMesh Pro/Shaders/TMP_SDF-Mobile SSD.shader.meta": "3e5f543ae95f82c5ed5738585d6dbf54008a98ae9a627d39b0dce9eb3ddb8374",
|
||||
"Assets/TextMesh Pro/Shaders/TMP_SDF-Mobile SpaceWarp.shader": "17c4c1960194dae24402700c1a7d5f750843f320545d20a80829a0558648e6e4",
|
||||
"Assets/TextMesh Pro/Shaders/TMP_SDF-Mobile SpaceWarp.shader.meta": "0cb8e3a86972bb1b099be459bd72c00631936ff733a27d7d98737339d6d3face",
|
||||
"Assets/TextMesh Pro/Shaders/TMP_SDF-Mobile-2-Pass.shader": "e8cb1c858b51ef6e304e0d5b6b3197ea1ff8cfcc70c3ab89ee7d0d7bd499404f",
|
||||
"Assets/TextMesh Pro/Shaders/TMP_SDF-Mobile-2-Pass.shader.meta": "80f392cea8fca4c1f5d50a334a40f87afc5cacbf1f2ff432a8992a601b39c007",
|
||||
"Assets/TextMesh Pro/Shaders/TMP_SDF-Mobile.shader": "ea5bb3f5540de2fba59704d7f31382cf884595980e0b99c05a083873b9e26e3b",
|
||||
"Assets/TextMesh Pro/Shaders/TMP_SDF-Mobile.shader.meta": "58eff2947dcabefbe4161ed7496b9be052221801758589fa4af452e09632b71c",
|
||||
"Assets/TextMesh Pro/Shaders/TMP_SDF-Surface-Mobile.shader": "0c2db2ea36e79e533e52ab847bc39bebab06285246955a4b2ff6ea546ee7a1b3",
|
||||
"Assets/TextMesh Pro/Shaders/TMP_SDF-Surface-Mobile.shader.meta": "507add334f0f385e78c2760b73b8cbb4d1bd60347d8bba1dcb38911302924b49",
|
||||
"Assets/TextMesh Pro/Shaders/TMP_SDF-Surface.shader": "f10ece0fce4433a45f601fd84b79b74ae82b275910be8d9aa7c09390aa58a668",
|
||||
"Assets/TextMesh Pro/Shaders/TMP_SDF-Surface.shader.meta": "d849ca253d0f8e0124e5a192f921eef2ea411e78c1bf5bac71c28bb7fec59604",
|
||||
"Assets/TextMesh Pro/Shaders/TMP_SDF-URP Lit.shadergraph": "d7816ac9c8e4c6bfb579b3101c1826c46f333279c96f69f5734160fc8f68e80a",
|
||||
"Assets/TextMesh Pro/Shaders/TMP_SDF-URP Lit.shadergraph.meta": "3ae03e3081c0353a098954d842ddd5760dfffa17af6bc8963ce3b60801e6b249",
|
||||
"Assets/TextMesh Pro/Shaders/TMP_SDF-URP Unlit.shadergraph": "73c1cc198de82cb5b7522618d29ffc47a307f0dfb5cb34ab9c86bf9a84d26e4d",
|
||||
"Assets/TextMesh Pro/Shaders/TMP_SDF-URP Unlit.shadergraph.meta": "6bfd35c29cd78389fb93663f4bc1bb9b1402e0a0d35b67a86094671c72d796af",
|
||||
"Assets/TextMesh Pro/Shaders/TMP_SDF.shader": "142c6e313f6731976cad18cfb5b283b3942cce97dd6345ac4fe5a7cf572e7fd5",
|
||||
"Assets/TextMesh Pro/Shaders/TMP_SDF.shader.meta": "e77b8946de1f5eb76f2e1dd47ccaadc84ff67d30904b8f5bcb998203cdd61396",
|
||||
"Assets/TextMesh Pro/Shaders/TMP_Sprite.shader": "b8606378647fc693029a0ad8ea7c3d162e1bfe1ff54f2f53f4ab158c9ddb6199",
|
||||
"Assets/TextMesh Pro/Shaders/TMP_Sprite.shader.meta": "16f167e5dcf135fea9c31def18a5f639f9614bcf15d9f3a48986475858c9d7c0",
|
||||
"Assets/TextMesh Pro/Shaders/TMPro.cginc": "7b5e42e957e80ddac2c42cd49d15dc48c50b97a0e263248be8a074d1b3c79543",
|
||||
"Assets/TextMesh Pro/Shaders/TMPro.cginc.meta": "eb95df25958b25d82e30b5a6c543d368209b4a9af73105282537323f132c9cb8",
|
||||
"Assets/TextMesh Pro/Shaders/TMPro_Mobile.cginc": "e3d42e5e7c32dad5b41ffb4f03d4e7d9382924aff35d470f46e31d291230385a",
|
||||
"Assets/TextMesh Pro/Shaders/TMPro_Mobile.cginc.meta": "71adfbbc6aa5e2b27d3ab1317d6ef31b9cb4353dec581490d70de4eebe34db7c",
|
||||
"Assets/TextMesh Pro/Shaders/TMPro_Properties.cginc": "18d4fa11c9b205459b6bc217b703c5fdea9875d7a022f6394a0dd18ac3cd0be4",
|
||||
"Assets/TextMesh Pro/Shaders/TMPro_Properties.cginc.meta": "4a35e4e340b3fcf0d84abc3635db52dd4c34bead8e5cd547255ec39f09c9cbf5",
|
||||
"Assets/TextMesh Pro/Shaders/TMPro_Surface.cginc": "3441f62bfb1f6f186118296f5cfd73e84f84776d0551b5195f18542e459b8f4b",
|
||||
"Assets/TextMesh Pro/Shaders/TMPro_Surface.cginc.meta": "f155b9d0f2c80151af8c99b9c32835f178b71d150e208af7d1716648e4ca10d9",
|
||||
"Packages/manifest.json": "2193aa859774807d3550546a26217199f1cae5d93b2754afb0d56b85e9d8b320",
|
||||
"Packages/packages-lock.json": "f0fa7fd2aebf606379f17d8b5fb9f9580d413d3e561387b236c9c99068bed54b",
|
||||
"ProjectSettings/AudioManager.asset": "aeedeb3243f07b61dbbe854aa08b5ef6f0b5274dd9852ad9f6129dde3e105a31",
|
||||
"ProjectSettings/ClusterInputManager.asset": "40e65dd214bf254955d2c8829ca8ce2130fd3510485560ce012e9a1ddd93e623",
|
||||
"ProjectSettings/DynamicsManager.asset": "bf017b547bb77ce3443dd5287ddf2516a74fd167f4f2ee5d798340694f51776d",
|
||||
"ProjectSettings/EditorBuildSettings.asset": "5504d1c1ab64c6cd972eeba1c23d5310ebe50c01960c976b150ad2d9bb8c6cfc",
|
||||
"ProjectSettings/EditorSettings.asset": "bbedcf93c32bca12eaba9ed61189ab13f064217e9f2984a66772719fa73c56b5",
|
||||
"ProjectSettings/GraphicsSettings.asset": "2bbc2cce157a41d0ac0ad69d529c31f3d3abb0250ed4d6e7a84611c0b6a6a61f",
|
||||
"ProjectSettings/InputManager.asset": "7a1bb836a1008d26d0860d143e9d9df7ca41731d30a72901b518063819c62df2",
|
||||
"ProjectSettings/MemorySettings.asset": "1e8379a461b10ae09f3f696911088c16875d63e87ed5f2d95df9e1892703f9fd",
|
||||
"ProjectSettings/MultiplayerManager.asset": "aba89fd1a1ddad182727ad82727e536d27372e90328a8196da2a4560398983dd",
|
||||
"ProjectSettings/NavMeshAreas.asset": "80106cfa7e6181a1928b142c075f3e510d527441e3d79bc83590e4ac91e7cd66",
|
||||
"ProjectSettings/PackageManagerSettings.asset": "f281d96e785df430d30ce0a515f4fe5c625ef44467125879f4b9f4cb087e1578",
|
||||
"ProjectSettings/Physics2DSettings.asset": "d57a0fe55659c33879e8b70bc01c5ea9cdf082069dab649905c6c5138531e6eb",
|
||||
"ProjectSettings/PhysicsCoreProjectSettings2D.asset": "bedc5339a832c60dc3f11b84abc4f4384dbfa20b0cd9ad6c444b907e751fc35e",
|
||||
"ProjectSettings/PresetManager.asset": "29c125923fe6e29f90190d4fce1c82d660e7051546e2c9d02908d18c9cf2436c",
|
||||
"ProjectSettings/ProjectAuditorSettings.asset": "9e68444b9bda981e2927a98df9edf69ea88362f0c6b7f3c81b39b9d515d2a416",
|
||||
"ProjectSettings/ProjectSettings.asset": "17eb93d5d705ba05c86e4fe80e0d9e7678313266fdcaec03a41512efc255ea96",
|
||||
"ProjectSettings/ProjectVersion.txt": "87289075c168cdd875e46a5fc308d15c686987848a70c7ce47faf40196ac0e20",
|
||||
"ProjectSettings/QualitySettings.asset": "da30e325eae700ccd115f079d586886b460a35bc843c698110072e225720b738",
|
||||
"ProjectSettings/SceneTemplateSettings.json": "bb9098b3bfcde78d93e264b96f7b77b5430e64e8c57a7aad7f5a5d9c3945e16a",
|
||||
"ProjectSettings/ShaderGraphSettings.asset": "cdba1e5d65bcf6e3269d76ed3e60b6c21f98322002996642c9d74f1eb89f6b91",
|
||||
"ProjectSettings/TagManager.asset": "23fc56b484aa3d7edf5914cd3591f7a823ccef5e3f3496f8a51f30388ead63dc",
|
||||
"ProjectSettings/TimeManager.asset": "1a83e54adbbda7c9f4851103a0c6ab7f6448a3343d4ea5b7620452fa08416ecd",
|
||||
"ProjectSettings/URPProjectSettings.asset": "596d5c8bf4f957b03684c949bebc252ae1918f25415a1147a00684c4b086efda",
|
||||
"ProjectSettings/UnityConnectSettings.asset": "7f2112b8c6ea0885dcc72b312c9726ffcd909f2e89d1eead61889274a4e5d1c0",
|
||||
"ProjectSettings/VFXManager.asset": "f066c6483919961332415ee64204f74fe52f38c02e82892eb02b7a5b2e381f0e",
|
||||
"ProjectSettings/VersionControlSettings.asset": "e7bda45bf7a394745fee1316e6c71fa676004d591ad1f3aa247fd3e4ceb86071",
|
||||
"ProjectSettings/XRSettings.asset": "edd2beb4a2e388312b4b7da241aa51070434005d82c59363f1237dd2e567585f"
|
||||
},
|
||||
"waves": [
|
||||
[
|
||||
"T1",
|
||||
"T2"
|
||||
],
|
||||
[
|
||||
"T3"
|
||||
],
|
||||
[
|
||||
"T4"
|
||||
],
|
||||
[
|
||||
"T5"
|
||||
],
|
||||
[
|
||||
"T6"
|
||||
]
|
||||
],
|
||||
"verification_plan": {
|
||||
"modeling": "Actual Blender create/save/reopen/export/assert/render, Python syntax; capture commands and exit codes. Central Blender execution owner; independent script work in separate worktrees.",
|
||||
"intermediate_integration": "Reopen and verify both merged asset packs plus confirm pre-existing product file hashes unchanged before human approval. Full game verification follows runtime wiring.",
|
||||
"completion": [
|
||||
"pwsh -NoProfile -File tools/verify.ps1 -Phase EditMode -Milestone Final",
|
||||
"pwsh -NoProfile -File tools/verify.ps1 -Phase PlayMode -Milestone Final",
|
||||
"pwsh -NoProfile -File tools/verify.ps1 -Phase AndroidBuild -Milestone Final",
|
||||
"pwsh -NoProfile -File tools/verify.ps1 -Phase AndroidSmoke -Milestone Final"
|
||||
],
|
||||
"shared_resources": "Blender/Unity/ADB/recording commands serialized by orchestrator. No candidate adoption before T3 explicit user approval."
|
||||
},
|
||||
"tasks": {
|
||||
"T1": "completed_model_candidate",
|
||||
"T2": "completed_model_candidate",
|
||||
"T3": "completed_explicit_user_approval",
|
||||
"T4": "completed_merged_independently_reviewed",
|
||||
"T5": "terrain_continuity_fixed_independently_reviewed",
|
||||
"T6": "verified_delivered_independently_reviewed"
|
||||
},
|
||||
"model_integration": {
|
||||
"status": "PASS",
|
||||
"scope": "Model candidates only; user approval pending",
|
||||
"checkedUtc": "2026-10-08T02:07:58.003206+09:00",
|
||||
"featureCommit": "5185d9463163ee4c3ce456a6ec5414cc1448f10b",
|
||||
"protectedBaseCommit": "58410281e015c6600dc543c4e093fd95c036288c",
|
||||
"protectedProductFilesUnchanged": 533,
|
||||
"candidateFilesAdded": 32,
|
||||
"provenanceResourceHashesChecked": 26,
|
||||
"commands": [
|
||||
{
|
||||
"command": "Blender --background --python-exit-code 1 --python tools/models/build_hero.py -- --verify-only",
|
||||
"exitCode": 0,
|
||||
"log": "Heroes/integrated-verify.log",
|
||||
"assertion": "ASSERTIONS_OK and REOPEN_AND_FBX_REIMPORT_OK evaluated"
|
||||
},
|
||||
{
|
||||
"command": "Blender --background --python-exit-code 1 --python tools/models/build_meadow.py -- --verify-only --review-dir artifacts/verification/VisualUpgrade/ModelReview/Meadow",
|
||||
"exitCode": 0,
|
||||
"log": "Meadow/integrated-verify.log",
|
||||
"assertion": "MEADOW_VERIFY_PASS evaluated; 21 assets and 23 resources"
|
||||
},
|
||||
{
|
||||
"command": "python .dryforge/verify-model-integration.py",
|
||||
"exitCode": 0,
|
||||
"assertion": "533 protected product hashes, 32 additions, candidate provenance hashes, clean tree and protected dev checked"
|
||||
}
|
||||
],
|
||||
"userApproval": "PENDING",
|
||||
"unityGameplayAndroid": "NOT_RUN; awaits explicit model approval"
|
||||
},
|
||||
"model_approval": {
|
||||
"status": "APPROVED",
|
||||
"userResponse": "승인합니다",
|
||||
"confirmedUtc": "2026-10-08T23:05:56.585939+09:00",
|
||||
"scope": "All five model groups presented in the immediately preceding review",
|
||||
"groups": [
|
||||
"body",
|
||||
"knightEquipment",
|
||||
"clearMeadow",
|
||||
"flowerHills",
|
||||
"stoneHills"
|
||||
],
|
||||
"reviewPacketSha256": "4787e5679d1fe940060a889ffee42020258587ffb19eff32696ea6fc2f48cc99",
|
||||
"reviewPacket": "review-packet.json",
|
||||
"approvedFiles": [
|
||||
{
|
||||
"kind": "BLENDER_SOURCE",
|
||||
"relativePath": "../../../../SourceAssets/Models/Heroes/MagneticKnight.blend",
|
||||
"repositoryRelativePath": "SourceAssets/Models/Heroes/MagneticKnight.blend",
|
||||
"bytes": 1833499,
|
||||
"sha256": "7ce1272dfe861aee986609cdb899f0edf8b8f2f0f17269c0eda472c8aa90ee3a"
|
||||
},
|
||||
{
|
||||
"kind": "BLENDER_SOURCE",
|
||||
"relativePath": "../../../../SourceAssets/Models/Meadow/MeadowCandidates.blend",
|
||||
"repositoryRelativePath": "SourceAssets/Models/Meadow/MeadowCandidates.blend",
|
||||
"bytes": 1350505,
|
||||
"sha256": "2d95f1797c1a1042e32bb2588d0bde735b6e109a5f947b1f0720c7537bda6ea9"
|
||||
},
|
||||
{
|
||||
"kind": "FBX",
|
||||
"relativePath": "../../../../Assets/MagnetismHeroes/UnityRuntime/Presentation/Models/Heroes/HeroBody.fbx",
|
||||
"repositoryRelativePath": "Assets/MagnetismHeroes/UnityRuntime/Presentation/Models/Heroes/HeroBody.fbx",
|
||||
"bytes": 60076,
|
||||
"sha256": "56f3301176c612ebeab3fdaaba5c019674beeb0f727f97ed27dd67e32ff50a40"
|
||||
},
|
||||
{
|
||||
"kind": "FBX",
|
||||
"relativePath": "../../../../Assets/MagnetismHeroes/UnityRuntime/Presentation/Models/Heroes/KnightEquipment.fbx",
|
||||
"repositoryRelativePath": "Assets/MagnetismHeroes/UnityRuntime/Presentation/Models/Heroes/KnightEquipment.fbx",
|
||||
"bytes": 222764,
|
||||
"sha256": "a8059a020e79e080635e7326bb91576010cad10c60ee931d95536d47fe76e61c"
|
||||
},
|
||||
{
|
||||
"kind": "FBX",
|
||||
"relativePath": "../../../../Assets/MagnetismHeroes/UnityRuntime/Presentation/Models/Meadow/DaisyColony.fbx",
|
||||
"repositoryRelativePath": "Assets/MagnetismHeroes/UnityRuntime/Presentation/Models/Meadow/DaisyColony.fbx",
|
||||
"bytes": 179196,
|
||||
"sha256": "a646a875d99b7cbcef727723b45c6a1e5d6231255ef100689fe69db2e55af63c"
|
||||
},
|
||||
{
|
||||
"kind": "FBX",
|
||||
"relativePath": "../../../../Assets/MagnetismHeroes/UnityRuntime/Presentation/Models/Meadow/DistantRidge.fbx",
|
||||
"repositoryRelativePath": "Assets/MagnetismHeroes/UnityRuntime/Presentation/Models/Meadow/DistantRidge.fbx",
|
||||
"bytes": 67788,
|
||||
"sha256": "af68a4b08e0696cb0b56acf92bf0753d288ad6ba89fd4f19b183995f4ed6fd0c"
|
||||
},
|
||||
{
|
||||
"kind": "FBX",
|
||||
"relativePath": "../../../../Assets/MagnetismHeroes/UnityRuntime/Presentation/Models/Meadow/FarHorizon.fbx",
|
||||
"repositoryRelativePath": "Assets/MagnetismHeroes/UnityRuntime/Presentation/Models/Meadow/FarHorizon.fbx",
|
||||
"bytes": 66924,
|
||||
"sha256": "fcfb4a768ca33ab9ccd166f7e4b3a96cbc918d1a564f59144b0fab399cb7c179"
|
||||
},
|
||||
{
|
||||
"kind": "FBX",
|
||||
"relativePath": "../../../../Assets/MagnetismHeroes/UnityRuntime/Presentation/Models/Meadow/FernCluster.fbx",
|
||||
"repositoryRelativePath": "Assets/MagnetismHeroes/UnityRuntime/Presentation/Models/Meadow/FernCluster.fbx",
|
||||
"bytes": 202508,
|
||||
"sha256": "9153c91cb71a762c54bc0bc3c5e6fcfe2650185defaf60b5da75e25d78aa4911"
|
||||
},
|
||||
{
|
||||
"kind": "FBX",
|
||||
"relativePath": "../../../../Assets/MagnetismHeroes/UnityRuntime/Presentation/Models/Meadow/GentleHill.fbx",
|
||||
"repositoryRelativePath": "Assets/MagnetismHeroes/UnityRuntime/Presentation/Models/Meadow/GentleHill.fbx",
|
||||
"bytes": 67420,
|
||||
"sha256": "356d3baa0927264f7807e13f3acb717b0c040ae09b23b8feac67e717142d3a19"
|
||||
},
|
||||
{
|
||||
"kind": "FBX",
|
||||
"relativePath": "../../../../Assets/MagnetismHeroes/UnityRuntime/Presentation/Models/Meadow/GrassTuftGold.fbx",
|
||||
"repositoryRelativePath": "Assets/MagnetismHeroes/UnityRuntime/Presentation/Models/Meadow/GrassTuftGold.fbx",
|
||||
"bytes": 72908,
|
||||
"sha256": "0b2a3d68909b56ecdd3324503d3a6bc2b2f9dc8e1d173536dfe52ca96e49521f"
|
||||
},
|
||||
{
|
||||
"kind": "FBX",
|
||||
"relativePath": "../../../../Assets/MagnetismHeroes/UnityRuntime/Presentation/Models/Meadow/GrassTuftMint.fbx",
|
||||
"repositoryRelativePath": "Assets/MagnetismHeroes/UnityRuntime/Presentation/Models/Meadow/GrassTuftMint.fbx",
|
||||
"bytes": 72700,
|
||||
"sha256": "650e02dab0ae3a0f05d036e2d58846cb97a93b77864cbc2c704b4364c26d9962"
|
||||
},
|
||||
{
|
||||
"kind": "FBX",
|
||||
"relativePath": "../../../../Assets/MagnetismHeroes/UnityRuntime/Presentation/Models/Meadow/LavenderLupineColony.fbx",
|
||||
"repositoryRelativePath": "Assets/MagnetismHeroes/UnityRuntime/Presentation/Models/Meadow/LavenderLupineColony.fbx",
|
||||
"bytes": 250284,
|
||||
"sha256": "596266e001d7765634ff749deee33cbece1e5bb69ba693bf8c34da795f4f7bdb"
|
||||
},
|
||||
{
|
||||
"kind": "FBX",
|
||||
"relativePath": "../../../../Assets/MagnetismHeroes/UnityRuntime/Presentation/Models/Meadow/LowLimestone.fbx",
|
||||
"repositoryRelativePath": "Assets/MagnetismHeroes/UnityRuntime/Presentation/Models/Meadow/LowLimestone.fbx",
|
||||
"bytes": 47228,
|
||||
"sha256": "026abf6db9395751e7ad933455bacc96a06fe331a4bb777001ee29bf33f8417d"
|
||||
},
|
||||
{
|
||||
"kind": "FBX",
|
||||
"relativePath": "../../../../Assets/MagnetismHeroes/UnityRuntime/Presentation/Models/Meadow/MeadowClearing.fbx",
|
||||
"repositoryRelativePath": "Assets/MagnetismHeroes/UnityRuntime/Presentation/Models/Meadow/MeadowClearing.fbx",
|
||||
"bytes": 68284,
|
||||
"sha256": "78c307844de3ef5584aaa0bec3e57500f9115065dd643686473e52632d551a29"
|
||||
},
|
||||
{
|
||||
"kind": "FBX",
|
||||
"relativePath": "../../../../Assets/MagnetismHeroes/UnityRuntime/Presentation/Models/Meadow/MintShrub.fbx",
|
||||
"repositoryRelativePath": "Assets/MagnetismHeroes/UnityRuntime/Presentation/Models/Meadow/MintShrub.fbx",
|
||||
"bytes": 96012,
|
||||
"sha256": "f501d302845a6df4814076abf76bdd97f5ffd2f0527f2aff236e0b97e78e62da"
|
||||
},
|
||||
{
|
||||
"kind": "FBX",
|
||||
"relativePath": "../../../../Assets/MagnetismHeroes/UnityRuntime/Presentation/Models/Meadow/MossStoneSteps.fbx",
|
||||
"repositoryRelativePath": "Assets/MagnetismHeroes/UnityRuntime/Presentation/Models/Meadow/MossStoneSteps.fbx",
|
||||
"bytes": 155068,
|
||||
"sha256": "5a1bf51f80abde9a9a9e7a419ad30509ad62beac372244e0aba5681896a01739"
|
||||
},
|
||||
{
|
||||
"kind": "FBX",
|
||||
"relativePath": "../../../../Assets/MagnetismHeroes/UnityRuntime/Presentation/Models/Meadow/OpenStoneArch.fbx",
|
||||
"repositoryRelativePath": "Assets/MagnetismHeroes/UnityRuntime/Presentation/Models/Meadow/OpenStoneArch.fbx",
|
||||
"bytes": 34636,
|
||||
"sha256": "8835e7c96ca842ddece1c1f7c9d168a1eabf4f0555e5a025bf46637969dff243"
|
||||
},
|
||||
{
|
||||
"kind": "FBX",
|
||||
"relativePath": "../../../../Assets/MagnetismHeroes/UnityRuntime/Presentation/Models/Meadow/PebbleScatter.fbx",
|
||||
"repositoryRelativePath": "Assets/MagnetismHeroes/UnityRuntime/Presentation/Models/Meadow/PebbleScatter.fbx",
|
||||
"bytes": 32060,
|
||||
"sha256": "34748a549b40ebe8a53cb57d9638ccbf3e480e8b56453b686c378db8a069da8f"
|
||||
},
|
||||
{
|
||||
"kind": "FBX",
|
||||
"relativePath": "../../../../Assets/MagnetismHeroes/UnityRuntime/Presentation/Models/Meadow/PinkCosmosColony.fbx",
|
||||
"repositoryRelativePath": "Assets/MagnetismHeroes/UnityRuntime/Presentation/Models/Meadow/PinkCosmosColony.fbx",
|
||||
"bytes": 153516,
|
||||
"sha256": "6bfc69131ff2cde84f858aa50e3e11697679073d3cd1d0a39a15f4b02cc3afb6"
|
||||
},
|
||||
{
|
||||
"kind": "FBX",
|
||||
"relativePath": "../../../../Assets/MagnetismHeroes/UnityRuntime/Presentation/Models/Meadow/RoundCanopyTree.fbx",
|
||||
"repositoryRelativePath": "Assets/MagnetismHeroes/UnityRuntime/Presentation/Models/Meadow/RoundCanopyTree.fbx",
|
||||
"bytes": 147772,
|
||||
"sha256": "9a41dcb9cb40e080bf4be6418f68eb5893561d9454e54a79a402f936ceb59757"
|
||||
},
|
||||
{
|
||||
"kind": "FBX",
|
||||
"relativePath": "../../../../Assets/MagnetismHeroes/UnityRuntime/Presentation/Models/Meadow/RoundLimestone.fbx",
|
||||
"repositoryRelativePath": "Assets/MagnetismHeroes/UnityRuntime/Presentation/Models/Meadow/RoundLimestone.fbx",
|
||||
"bytes": 48700,
|
||||
"sha256": "eaff76573039ab66927749569e511d5031e90c9ceb7dd8d7cccd84ab7032ca36"
|
||||
},
|
||||
{
|
||||
"kind": "FBX",
|
||||
"relativePath": "../../../../Assets/MagnetismHeroes/UnityRuntime/Presentation/Models/Meadow/SageCanopyTree.fbx",
|
||||
"repositoryRelativePath": "Assets/MagnetismHeroes/UnityRuntime/Presentation/Models/Meadow/SageCanopyTree.fbx",
|
||||
"bytes": 147772,
|
||||
"sha256": "26665d557ef176a9fcce24107d19619b9848552538482eae4b35ebd9fbcd0aec"
|
||||
},
|
||||
{
|
||||
"kind": "FBX",
|
||||
"relativePath": "../../../../Assets/MagnetismHeroes/UnityRuntime/Presentation/Models/Meadow/SageShrub.fbx",
|
||||
"repositoryRelativePath": "Assets/MagnetismHeroes/UnityRuntime/Presentation/Models/Meadow/SageShrub.fbx",
|
||||
"bytes": 96108,
|
||||
"sha256": "fbfed3947cc3e05c82f5660bae9c864576839174c7f72c0cbf0a278d6847eefc"
|
||||
},
|
||||
{
|
||||
"kind": "FBX",
|
||||
"relativePath": "../../../../Assets/MagnetismHeroes/UnityRuntime/Presentation/Models/Meadow/SlateBoulder.fbx",
|
||||
"repositoryRelativePath": "Assets/MagnetismHeroes/UnityRuntime/Presentation/Models/Meadow/SlateBoulder.fbx",
|
||||
"bytes": 49852,
|
||||
"sha256": "48da619e712ba4ee21c55baea8d93ce656db8a1c30475f0d2cb6bfecfc3b0a84"
|
||||
},
|
||||
{
|
||||
"kind": "FBX",
|
||||
"relativePath": "../../../../Assets/MagnetismHeroes/UnityRuntime/Presentation/Models/Meadow/TallWindTree.fbx",
|
||||
"repositoryRelativePath": "Assets/MagnetismHeroes/UnityRuntime/Presentation/Models/Meadow/TallWindTree.fbx",
|
||||
"bytes": 116140,
|
||||
"sha256": "378cdb0fc1d67a980d67d51a469148a6d720a03c9e650b35979bcf98ddf6bcad"
|
||||
}
|
||||
]
|
||||
},
|
||||
"T4_commit": "43b22d67886bc5715d3543fefda2dc24dead299f",
|
||||
"T4_merge_commit": "2d4b4a88e3c72a501fc84f1c9f7933c73452160d",
|
||||
"T5_commit": "b4d88546a2e9c44e9b6babcc54acaf69a01c75b4",
|
||||
"T5_merge_commit": "b880cc196c02cac959bc5b195a6856048113903f",
|
||||
"T5_concerns": [
|
||||
"Shadow fixed and pixel-verified",
|
||||
"Belowground broader underside explicitly accepted as unchanged physical-floor/camera limitation",
|
||||
"Editor resource limitations retained",
|
||||
"Capture method advisory corrected before final checks"
|
||||
],
|
||||
"completion": {
|
||||
"productSourceCommit": "3346eb559bdfba24332feb4d9be4b7104520233e",
|
||||
"record": "artifacts/verification/VisualUpgrade/FinalProduct/completion.json",
|
||||
"recordSha256": "dd898f331a31fb49545e9c3ee2d1c5b52adca97d907f5cff1b0c21b1e6d429fd",
|
||||
"fourPhasesExitZero": true,
|
||||
"productFilesUnchanged": 732,
|
||||
"editMode": 103,
|
||||
"playMode": 53,
|
||||
"androidGates": 226,
|
||||
"apkSha256": "DA533F235A9869E5A68F4A244AF9A89E34A8E6FB9E7C7F2F57D830939507B829",
|
||||
"failedAttemptsPreserved": 1
|
||||
},
|
||||
"T6_commit": "a906be69a0c1211f01d5a3d1bc7fdcf5554efafb",
|
||||
"documentation_merge_commit": "da169df7c7c7215ce562f8f512d93fb4df2e39b7",
|
||||
"post_documentation_product_hashes_unchanged": 732,
|
||||
"final_followup": {
|
||||
"reason": "Thin sky/dark gaps beneath far hills in actual orbit captures",
|
||||
"branch": "dryforge/horizon-seam-fix",
|
||||
"approvedScope": "Far terrain placement only; model binaries/materials/colliders/camera/rules preserved",
|
||||
"previousProductEvidence": "artifacts/verification/VisualUpgrade/BeforeHorizonFix/manifest.json",
|
||||
"fixCommit": "ef03611628cb395d377cf56abd951bbf62cfa29c",
|
||||
"integratedProductCommit": "3346eb559bdfba24332feb4d9be4b7104520233e",
|
||||
"targetedActualExitCodes": {
|
||||
"EditMode": 0,
|
||||
"PlayMode": 0
|
||||
},
|
||||
"targetedEvaluatedCases": {
|
||||
"EditMode": 7,
|
||||
"PlayMode": 10
|
||||
},
|
||||
"scope": "Only FarHorizon visual x/z radius35 to27; unchanged height, scale, geometry, materials and gameplay",
|
||||
"geometryProof": "0 missing samples across central24m corridors in each of three worlds; actual same-camera images confirm reproduced gap removed",
|
||||
"premergeReview": ".dryforge/reviews/horizon-fix-conformance.json",
|
||||
"reviewSha256": "5eba704c16ab4e7319c10aad8e337b8737e974df99966ff4b9d05040f3ac3e22"
|
||||
},
|
||||
"previous_completion": {
|
||||
"productSourceCommit": "83182e7f3e86926bf130817d401a331829401fac",
|
||||
"record": "artifacts/verification/VisualUpgrade/FinalProduct/completion.json",
|
||||
"recordSha256": "587b92a7f4f63986bfa32af647bc184745b5b100deeed2b0ca4b7818ac309414",
|
||||
"fourPhasesExitZero": true,
|
||||
"productFilesUnchanged": 732,
|
||||
"editMode": 103,
|
||||
"playMode": 52,
|
||||
"androidGates": 226,
|
||||
"apkSha256": "BEE8E80E03C4205EDEBF616A18940D58654E9115FDC91EE0A80F47DEA91559EA"
|
||||
},
|
||||
"horizon_documentation_commit": "620c73cbd24d936231bee5cb3469e5cff3424cd9",
|
||||
"final_integrated_head": "0d992d9dcc94843a72489b454ca4e8137178bc56",
|
||||
"final_review": {
|
||||
"status": "approved",
|
||||
"blockingFindings": 0,
|
||||
"path": "artifacts/verification/VisualUpgrade/FinalProduct/final-review.json",
|
||||
"sha256": "f11a355ff4316fadba7d5532c481a5215f7cbf722f6c207d86d0781906a846ea"
|
||||
},
|
||||
"final_user_gate": {
|
||||
"status": "approved",
|
||||
"recordedUtc": "2026-10-09T14:14:19.8102344Z",
|
||||
"userStatement": "완성본을 최종 승인합니다",
|
||||
"scope": "완성 제품과 변경된 제작·채택·운영·검증 문서",
|
||||
"branch": "dryforge/hero-meadow",
|
||||
"approvedHead": "0d992d9dcc94843a72489b454ca4e8137178bc56",
|
||||
"testedProductSource": "3346eb559bdfba24332feb4d9be4b7104520233e",
|
||||
"productFilesUnchanged": 732,
|
||||
"apk": "artifacts/android/MagnetismHeroes.apk",
|
||||
"apkSha256": "DA533F235A9869E5A68F4A244AF9A89E34A8E6FB9E7C7F2F57D830939507B829",
|
||||
"gallery": "artifacts/verification/VisualUpgrade/FinalProduct/index.html",
|
||||
"finalReview": "artifacts/verification/VisualUpgrade/FinalProduct/final-review.json",
|
||||
"finalReviewSha256": "F11A355FF4316FADBA7D5532C481A5215F7CBF722F6C207D86D0781906A846EA",
|
||||
"archive": ".dryforge/002",
|
||||
"integration": "merged-local-dev",
|
||||
"unityEditor": "정리 중 에디터 종료나 설정 변경 명령을 실행하지 않음",
|
||||
"editorObservation": {
|
||||
"observedUtc": "2026-10-09T14:15:23.2646118Z",
|
||||
"pipelineInstances": 0,
|
||||
"runningEditorDetected": false
|
||||
},
|
||||
"integrationEvidence": "artifacts/verification/VisualUpgrade/FinalProduct/dev-integration.json"
|
||||
},
|
||||
"status": "complete",
|
||||
"integration": {
|
||||
"status": "merged-local-dev",
|
||||
"userStatement": "-dev에 병합",
|
||||
"startedUtc": "2026-10-09T14:27:19.2336807Z",
|
||||
"finishedUtc": "2026-10-09T14:27:20.7186100Z",
|
||||
"targetBranch": "dev",
|
||||
"sourceBranch": "dryforge/hero-meadow",
|
||||
"approvedFeatureCommit": "0d992d9dcc94843a72489b454ca4e8137178bc56",
|
||||
"previousDevCommit": "58410281e015c6600dc543c4e093fd95c036288c",
|
||||
"fetchedOriginDevCommit": "58410281e015c6600dc543c4e093fd95c036288c",
|
||||
"mergeCommit": "a54ae6fb230b0c87e1a2f08a1ad9e2cc2ceb0d73",
|
||||
"mergeParents": [
|
||||
"58410281e015c6600dc543c4e093fd95c036288c",
|
||||
"0d992d9dcc94843a72489b454ca4e8137178bc56"
|
||||
],
|
||||
"mergeCommand": "git -c core.autocrlf=false merge --no-ff dryforge/hero-meadow -F artifacts/verification/VisualUpgrade/FinalProduct/dev-merge-message.txt",
|
||||
"mergeExitCode": 0,
|
||||
"approvedTreeEqualsMergedTree": true,
|
||||
"testedProductFilesRawSha256Unchanged": 732,
|
||||
"verification": "제품 파일과 전체 Git tree가 승인본과 동일하므로 기존 실제 검증 증거 유지; 새 검사를 실행한 것으로 기록하지 않음",
|
||||
"testedProductSource": "3346eb559bdfba24332feb4d9be4b7104520233e",
|
||||
"completionEvidence": "artifacts/verification/VisualUpgrade/FinalProduct/completion.json",
|
||||
"currentBranch": "dev",
|
||||
"workingTreeClean": true,
|
||||
"mergedFeatureBranchRemoved": true,
|
||||
"remotePushExecuted": false
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,81 @@
|
||||
param([switch]$ResumeAndroidSmoke)
|
||||
$ErrorActionPreference = 'Stop'
|
||||
$projectRoot = 'C:/git/MagnetismHeroes'
|
||||
Set-Location -LiteralPath $projectRoot
|
||||
$env:PATH = 'C:/Users/baram/AppData/Local/Unity/bin;' + $env:PATH
|
||||
$evidence = Join-Path $projectRoot 'artifacts/verification/VisualUpgrade/FinalProduct'
|
||||
New-Item -ItemType Directory -Path $evidence -Force | Out-Null
|
||||
$sourceCommit = (& git rev-parse HEAD).Trim()
|
||||
if ([bool](& git status --porcelain)) { throw 'Final source must be clean.' }
|
||||
$productPaths = @(& git ls-files Assets Packages ProjectSettings tools)
|
||||
$before = [ordered]@{}
|
||||
foreach ($path in $productPaths) { $before[$path] = (Get-FileHash -LiteralPath $path -Algorithm SHA256).Hash }
|
||||
$beforePath = Join-Path $evidence 'product-before.json'
|
||||
if ($ResumeAndroidSmoke) {
|
||||
$originalBefore = Get-Content -LiteralPath $beforePath -Raw | ConvertFrom-Json -AsHashtable
|
||||
if (@($productPaths | Where-Object { $originalBefore[$_] -ne $before[$_] }).Count -ne 0) { throw 'Product source differs from the original final-check source.' }
|
||||
} else { $before | ConvertTo-Json -Depth 4 | Set-Content -LiteralPath $beforePath -Encoding utf8 }
|
||||
$env:MAGNETISM_VISUAL_EVIDENCE = Join-Path $evidence 'EditorCapture'
|
||||
$env:MAGNETISM_PROOF_COMMIT = $sourceCommit
|
||||
$env:MAGNETISM_PROOF_DIRTY = 'false'
|
||||
$record = [ordered]@{sourceCommit=$sourceCommit;startedUtc=[DateTime]::UtcNow.ToString('o');status='running';phases=@();productFiles=$productPaths.Count}
|
||||
$recordPath = Join-Path $evidence 'completion.json'
|
||||
$phases = @('EditMode','PlayMode','AndroidBuild','AndroidSmoke')
|
||||
function Confirm-AndroidReadiness {
|
||||
$sdkAdb = Join-Path $env:LOCALAPPDATA 'Android/Sdk/platform-tools/adb.exe'
|
||||
$readiness = [ordered]@{startedUtc=[DateTime]::UtcNow.ToString('o');serial='emulator-5554';adb=$sdkAdb;commands=@();status='running'}
|
||||
foreach ($arguments in @(@('kill-server'), @('start-server'), @('-s','emulator-5554','get-state'), @('-s','emulator-5554','shell','getprop','sys.boot_completed'))) {
|
||||
$step = $readiness.commands.Count
|
||||
$stdout = Join-Path $evidence "adb-readiness-$step.stdout.log"
|
||||
$stderr = Join-Path $evidence "adb-readiness-$step.stderr.log"
|
||||
$client = Start-Process -FilePath $sdkAdb -ArgumentList $arguments -WindowStyle Hidden -PassThru -RedirectStandardOutput $stdout -RedirectStandardError $stderr
|
||||
if (-not $client.WaitForExit(30000)) { Stop-Process -Id $client.Id; throw "ADB readiness command timed out: $arguments" }
|
||||
$client.Refresh()
|
||||
$output = (Get-Content -LiteralPath $stdout -Raw -ErrorAction SilentlyContinue)
|
||||
$readiness.commands += [ordered]@{arguments=$arguments;exitCode=$client.ExitCode;stdout=$stdout;stderr=$stderr;output=$output}
|
||||
$readiness | ConvertTo-Json -Depth 6 | Set-Content -LiteralPath (Join-Path $evidence 'android-readiness.json') -Encoding utf8
|
||||
if ($client.ExitCode -ne 0) { throw "ADB readiness command failed: $arguments" }
|
||||
if ($step -eq 2 -and $output.Trim() -ne 'device') { throw 'Dedicated AVD is not online.' }
|
||||
if ($step -eq 3 -and $output.Trim() -ne '1') { throw 'Dedicated AVD has not completed boot.' }
|
||||
}
|
||||
$readiness.status = 'passed'
|
||||
$readiness.finishedUtc = [DateTime]::UtcNow.ToString('o')
|
||||
$readiness | ConvertTo-Json -Depth 6 | Set-Content -LiteralPath (Join-Path $evidence 'android-readiness.json') -Encoding utf8
|
||||
}
|
||||
if ($ResumeAndroidSmoke) {
|
||||
$previous = Get-Content -LiteralPath $recordPath -Raw | ConvertFrom-Json -AsHashtable
|
||||
$passed = @($previous.phases | Where-Object { $_.phase -ne 'AndroidSmoke' })
|
||||
if ($previous.sourceCommit -ne $sourceCommit -or $passed.Count -ne 3 -or @($passed | Where-Object { $_.exitCode -ne 0 -or $_.status -ne 'passed' }).Count -ne 0) { throw 'Cannot resume without three successful phases on this source.' }
|
||||
$record.startedUtc = $previous.startedUtc
|
||||
$record.resumedUtc = [DateTime]::UtcNow.ToString('o')
|
||||
$record.phases = $passed
|
||||
$record.failedAttempts = @($previous.phases | Where-Object { $_.phase -eq 'AndroidSmoke' })
|
||||
$phases = @('AndroidSmoke')
|
||||
}
|
||||
try {
|
||||
foreach ($phase in $phases) {
|
||||
if ($phase -eq 'AndroidSmoke') { Confirm-AndroidReadiness }
|
||||
$outerLog = Join-Path $evidence ($phase.ToLowerInvariant() + '-outer.log')
|
||||
$started = [DateTime]::UtcNow.ToString('o')
|
||||
Write-Output "Starting $phase at $started"
|
||||
& pwsh -NoProfile -File tools/verify.ps1 -Phase $phase -Milestone Final *> $outerLog
|
||||
$actualExit = $LASTEXITCODE
|
||||
$phaseRecordPath = Join-Path $projectRoot ('artifacts/verification/Final/' + $phase.ToLowerInvariant() + '-evidence.json')
|
||||
$phaseRecord = Get-Content -LiteralPath $phaseRecordPath -Raw | ConvertFrom-Json
|
||||
$record.phases += [ordered]@{phase=$phase;command="pwsh -NoProfile -File tools/verify.ps1 -Phase $phase -Milestone Final";startedUtc=$started;finishedUtc=[DateTime]::UtcNow.ToString('o');exitCode=$actualExit;status=$phaseRecord.status;sourceCommit=$phaseRecord.sourceCommit;sourceDirty=$phaseRecord.sourceDirty;sourceDirtyEnd=$phaseRecord.sourceDirtyEnd;outerLog=$outerLog;evidence=$phaseRecordPath}
|
||||
$record | ConvertTo-Json -Depth 8 | Set-Content -LiteralPath $recordPath -Encoding utf8
|
||||
if ($actualExit -ne 0 -or $phaseRecord.status -ne 'passed' -or $phaseRecord.sourceCommit -ne $sourceCommit -or $phaseRecord.sourceDirty -or $phaseRecord.sourceDirtyEnd) { throw "$phase failed. See $outerLog" }
|
||||
Write-Output "$phase exit $actualExit, status $($phaseRecord.status)"
|
||||
}
|
||||
$after = [ordered]@{}
|
||||
foreach ($path in $productPaths) { $after[$path] = (Get-FileHash -LiteralPath $path -Algorithm SHA256).Hash }
|
||||
$after | ConvertTo-Json -Depth 4 | Set-Content -LiteralPath (Join-Path $evidence 'product-after.json') -Encoding utf8
|
||||
$changed = @($productPaths | Where-Object { $before[$_] -ne $after[$_] })
|
||||
$record.productHashesUnchanged = $changed.Count -eq 0
|
||||
$record.changedProducts = $changed
|
||||
if ($changed.Count -ne 0 -or [bool](& git status --porcelain) -or (& git rev-parse HEAD).Trim() -ne $sourceCommit) { throw 'Product source changed during final checks.' }
|
||||
$record.status = 'passed'
|
||||
} catch { $record.status='failed'; $record.error=$_.Exception.Message; Write-Output $record.error }
|
||||
finally { $record.finishedUtc=[DateTime]::UtcNow.ToString('o'); $record | ConvertTo-Json -Depth 8 | Set-Content -LiteralPath $recordPath -Encoding utf8 }
|
||||
if ($record.status -ne 'passed') { exit 1 }
|
||||
Write-Output 'All four final phases passed on the same clean integrated product source.'
|
||||
@@ -0,0 +1,28 @@
|
||||
import datetime
|
||||
import hashlib
|
||||
import json
|
||||
import pathlib
|
||||
import shutil
|
||||
|
||||
root = pathlib.Path('C:/git/MagnetismHeroes').resolve()
|
||||
backup = root / 'artifacts/verification/VisualUpgrade/BeforeHorizonFix'
|
||||
assert backup.is_relative_to(root / 'artifacts/verification/VisualUpgrade')
|
||||
backup.mkdir(exist_ok=True)
|
||||
sources = [root / 'artifacts/verification/Final', root / 'artifacts/verification/VisualUpgrade/FinalProduct']
|
||||
paths = [path for source in sources for path in source.rglob('*') if path.is_file()]
|
||||
paths += [root / 'artifacts/android/Final/MagnetismHeroes.apk', root / 'artifacts/android/MagnetismHeroes.apk']
|
||||
sha = lambda path: hashlib.sha256(path.read_bytes()).hexdigest()
|
||||
records = []
|
||||
for source in paths:
|
||||
target = backup / source.relative_to(root)
|
||||
target.parent.mkdir(parents=True, exist_ok=True)
|
||||
expected = sha(source)
|
||||
if target.exists():
|
||||
assert sha(target) == expected, target
|
||||
else:
|
||||
shutil.copy2(source, target)
|
||||
assert sha(target) == expected, target
|
||||
records.append({'source': source.relative_to(root).as_posix(), 'copy': target.relative_to(backup).as_posix(), 'bytes': source.stat().st_size, 'sha256': expected})
|
||||
result = {'status': 'PASS', 'preservedUtc': datetime.datetime.now(datetime.timezone.utc).isoformat(), 'productSourceCommit': '83182e7f3e86926bf130817d401a331829401fac', 'files': records}
|
||||
(backup / 'manifest.json').write_text(json.dumps(result, indent=2) + '\n', encoding='utf-8')
|
||||
print(json.dumps({'status': 'PASS', 'preservedFiles': len(records), 'preservedBytes': sum(item['bytes'] for item in records)}))
|
||||
@@ -0,0 +1,39 @@
|
||||
import datetime
|
||||
import hashlib
|
||||
import json
|
||||
import pathlib
|
||||
import shutil
|
||||
|
||||
root = pathlib.Path('C:/git/MagnetismHeroes').resolve()
|
||||
final = root / 'artifacts/verification/Final'
|
||||
visual = root / 'artifacts/verification/VisualUpgrade'
|
||||
previous = visual / 'PreviousFinal'
|
||||
failed = visual / 'FinalProduct/FailedAndroidAttempt1'
|
||||
failed.mkdir(parents=True, exist_ok=True)
|
||||
start = datetime.datetime.fromisoformat('2026-10-08T15:24:08+00:00').timestamp()
|
||||
sha = lambda path: hashlib.sha256(path.read_bytes()).hexdigest()
|
||||
copied = []
|
||||
for path in final.rglob('*'):
|
||||
if path.is_file() and path.stat().st_mtime >= start:
|
||||
target = failed / 'Final' / path.relative_to(final)
|
||||
target.parent.mkdir(parents=True, exist_ok=True)
|
||||
shutil.copy2(path, target)
|
||||
assert sha(path) == sha(target)
|
||||
copied.append({'source': str(path.relative_to(root)), 'copy': str(target.relative_to(failed)), 'sha256': sha(target)})
|
||||
for name in ['completion.json', 'androidsmoke-outer.log']:
|
||||
path = visual / 'FinalProduct' / name
|
||||
target = failed / name
|
||||
shutil.copy2(path, target)
|
||||
assert sha(path) == sha(target)
|
||||
removed = []
|
||||
old = json.loads((previous / 'manifest.json').read_text(encoding='utf-8'))
|
||||
for entry in old['files']:
|
||||
path = (root / entry['source']).resolve()
|
||||
if path.is_relative_to(final.resolve()) and path.is_file() and path.stat().st_mtime < start:
|
||||
backup = previous / entry['copy']
|
||||
assert sha(path) == entry['sha256'] == sha(backup), path
|
||||
removed.append({'source': entry['source'], 'sha256': entry['sha256'], 'preservedCopy': entry['copy']})
|
||||
path.unlink()
|
||||
record = {'status': 'PASS', 'failedAttemptPreserved': copied, 'stalePreviousFinalFilesRemovedAfterExactBackupProof': removed}
|
||||
(failed / 'preservation-and-pruning.json').write_text(json.dumps(record, indent=2) + '\n', encoding='utf-8')
|
||||
print(json.dumps({'status': 'PASS', 'failedAttemptFilesPreserved': len(copied), 'backedUpStaleFilesPruned': len(removed)}))
|
||||
@@ -0,0 +1,40 @@
|
||||
import hashlib
|
||||
import json
|
||||
import shutil
|
||||
from pathlib import Path
|
||||
|
||||
root = Path('C:/git/MagnetismHeroes')
|
||||
record_path = root / 'artifacts/verification/VisualUpgrade/FinalProduct/completion.json'
|
||||
record = json.loads(record_path.read_text(encoding='utf-8-sig'))
|
||||
assert record['sourceCommit'] == '3346eb559bdfba24332feb4d9be4b7104520233e'
|
||||
failed = [phase for phase in record['phases'] if phase['phase'] == 'AndroidSmoke']
|
||||
assert len(failed) == 1 and failed[0]['exitCode'] == 1 and failed[0]['status'] == 'failed'
|
||||
destination = root / 'artifacts/verification/VisualUpgrade/HorizonFailedSmokeAttempt1'
|
||||
files = list((root / 'artifacts/verification/Final/Fresh30').rglob('*'))
|
||||
files += [root / relative for relative in [
|
||||
'artifacts/verification/Final/androidsmoke-evidence.json',
|
||||
'artifacts/verification/Final/androidsmoke.log',
|
||||
'artifacts/verification/Final/android-final-evidence.json',
|
||||
'artifacts/verification/VisualUpgrade/FinalProduct/completion.json',
|
||||
'artifacts/verification/VisualUpgrade/FinalProduct/androidsmoke-outer.log',
|
||||
'artifacts/verification/VisualUpgrade/FinalProduct/android-readiness.json',
|
||||
]]
|
||||
manifest = {'status': 'preserved-failed-attempt', 'sourceCommit': record['sourceCommit'], 'phaseExitCode': 1, 'files': []}
|
||||
for source in sorted(set(path for path in files if path.is_file())):
|
||||
relative = source.relative_to(root)
|
||||
target = destination / relative
|
||||
target.parent.mkdir(parents=True, exist_ok=True)
|
||||
digest = hashlib.sha256(source.read_bytes()).hexdigest()
|
||||
if target.exists():
|
||||
assert hashlib.sha256(target.read_bytes()).hexdigest() == digest, str(target)
|
||||
else:
|
||||
shutil.copy2(source, target)
|
||||
assert hashlib.sha256(target.read_bytes()).hexdigest() == digest, str(target)
|
||||
manifest['files'].append({'path': relative.as_posix(), 'sha256': digest, 'bytes': source.stat().st_size})
|
||||
(destination / 'manifest.json').write_text(json.dumps(manifest, indent=2) + '\n', encoding='utf-8')
|
||||
for field in ['evidence', 'outerLog']:
|
||||
original = Path(failed[0][field])
|
||||
failed[0][field + 'OriginalPath'] = str(original)
|
||||
failed[0][field] = str(destination / original.relative_to(root))
|
||||
record_path.write_text(json.dumps(record, indent=2) + '\n', encoding='utf-8')
|
||||
print(json.dumps({'status': 'preserved', 'files': len(manifest['files']), 'phaseExitCode': 1}))
|
||||
@@ -0,0 +1,35 @@
|
||||
import hashlib
|
||||
import json
|
||||
import shutil
|
||||
from pathlib import Path
|
||||
from datetime import datetime, timezone
|
||||
|
||||
root = Path(__file__).resolve().parents[1]
|
||||
target = root / 'artifacts/verification/VisualUpgrade/PreviousFinal'
|
||||
assert not target.exists(), 'PreviousFinal already exists; do not overwrite evidence'
|
||||
target.mkdir(parents=True)
|
||||
records = []
|
||||
for source_dir, name in [(root / 'artifacts/verification/Final', 'verification'),
|
||||
(root / 'artifacts/android/Final', 'android')]:
|
||||
for source in sorted(source_dir.rglob('*')):
|
||||
if not source.is_file():
|
||||
continue
|
||||
dest = target / name / source.relative_to(source_dir)
|
||||
dest.parent.mkdir(parents=True, exist_ok=True)
|
||||
shutil.copy2(source, dest)
|
||||
actual = hashlib.sha256(dest.read_bytes()).hexdigest()
|
||||
assert hashlib.sha256(source.read_bytes()).hexdigest() == actual
|
||||
records.append({'source': source.relative_to(root).as_posix(),
|
||||
'copy': dest.relative_to(target).as_posix(), 'bytes': dest.stat().st_size, 'sha256': actual})
|
||||
standard = root / 'artifacts/android/MagnetismHeroes.apk'
|
||||
if standard.is_file():
|
||||
dest = target / 'android/standard-MagnetismHeroes.apk'
|
||||
shutil.copy2(standard, dest)
|
||||
actual = hashlib.sha256(dest.read_bytes()).hexdigest()
|
||||
assert actual == hashlib.sha256(standard.read_bytes()).hexdigest()
|
||||
records.append({'source': standard.relative_to(root).as_posix(), 'copy': dest.relative_to(target).as_posix(),
|
||||
'bytes': dest.stat().st_size, 'sha256': actual})
|
||||
assert len(records) > 2500
|
||||
(target / 'manifest.json').write_text(json.dumps({'status': 'PREVIOUS_RUN_PRESERVED_NOT_CURRENT_VERIFICATION',
|
||||
'preservedUtc': datetime.now(timezone.utc).isoformat(), 'files': records}, indent=2), encoding='utf-8')
|
||||
print(f'PREVIOUS_FINAL_PRESERVED files={len(records)} bytes={sum(r["bytes"] for r in records)} sha256_all_matched')
|
||||
@@ -0,0 +1,23 @@
|
||||
import hashlib
|
||||
import json
|
||||
from pathlib import Path
|
||||
|
||||
root = Path('C:/git/MagnetismHeroes')
|
||||
state_path = root / '.dryforge/execution.json'
|
||||
state = json.loads(state_path.read_text(encoding='utf-8-sig'))
|
||||
review_path = root / 'artifacts/verification/VisualUpgrade/FinalProduct/final-review.json'
|
||||
review = json.loads(review_path.read_text(encoding='utf-8-sig'))
|
||||
assert review['status'] == 'approved'
|
||||
digest = hashlib.sha256(review_path.read_bytes()).hexdigest()
|
||||
assert digest == 'f11a355ff4316fadba7d5532c481a5215f7cbf722f6c207d86d0781906a846ea'
|
||||
state['tasks']['T6'] = 'verified_delivered_independently_reviewed'
|
||||
state['horizon_documentation_commit'] = '620c73cbd24d936231bee5cb3469e5cff3424cd9'
|
||||
state['final_integrated_head'] = '0d992d9dcc94843a72489b454ca4e8137178bc56'
|
||||
state['post_documentation_product_hashes_unchanged'] = 732
|
||||
state['final_review'] = {'status': 'approved', 'blockingFindings': 0,
|
||||
'path': 'artifacts/verification/VisualUpgrade/FinalProduct/final-review.json', 'sha256': digest}
|
||||
state['final_user_gate'] = {'status': 'pending', 'scope': '완성 제품과 변경된 제작·채택·검증 문서',
|
||||
'gallery': 'artifacts/verification/VisualUpgrade/FinalProduct/index.html',
|
||||
'apk': 'artifacts/android/MagnetismHeroes.apk'}
|
||||
state_path.write_text(json.dumps(state, ensure_ascii=False, indent=2) + '\n', encoding='utf-8')
|
||||
print(json.dumps({'status': 'verified-and-reviewable', 'finalUserGate': 'pending', 'blockingFindings': 0}))
|
||||
@@ -0,0 +1,29 @@
|
||||
import hashlib
|
||||
import json
|
||||
from pathlib import Path
|
||||
|
||||
root = Path('C:/git/MagnetismHeroes')
|
||||
path = root / '.dryforge/execution.json'
|
||||
state = json.loads(path.read_text(encoding='utf-8-sig'))
|
||||
state['tasks']['T5'] = 'terrain_continuity_fixed_independently_reviewed'
|
||||
state['tasks']['T6'] = 'new_product_four_phase_verification_running'
|
||||
state['previous_completion'] = state['completion']
|
||||
state['completion'] = {
|
||||
'status': 'running',
|
||||
'productSourceCommit': '3346eb559bdfba24332feb4d9be4b7104520233e',
|
||||
'record': 'artifacts/verification/VisualUpgrade/FinalProduct/completion.json',
|
||||
}
|
||||
state['final_followup'].update({
|
||||
'fixCommit': 'ef03611628cb395d377cf56abd951bbf62cfa29c',
|
||||
'integratedProductCommit': '3346eb559bdfba24332feb4d9be4b7104520233e',
|
||||
'targetedActualExitCodes': {'EditMode': 0, 'PlayMode': 0},
|
||||
'targetedEvaluatedCases': {'EditMode': 7, 'PlayMode': 10},
|
||||
'scope': 'Only FarHorizon visual x/z radius35 to27; unchanged height, scale, geometry, materials and gameplay',
|
||||
'geometryProof': '0 missing samples across central24m corridors in each of three worlds; actual same-camera images confirm reproduced gap removed',
|
||||
'premergeReview': '.dryforge/reviews/horizon-fix-conformance.json',
|
||||
})
|
||||
review = root / '.dryforge/reviews/horizon-fix-conformance.json'
|
||||
if review.exists():
|
||||
state['final_followup']['reviewSha256'] = hashlib.sha256(review.read_bytes()).hexdigest()
|
||||
path.write_text(json.dumps(state, ensure_ascii=False, indent=2) + '\n', encoding='utf-8')
|
||||
print(json.dumps({'status': 'recorded', 'newProductVerification': 'running'}))
|
||||
@@ -0,0 +1,28 @@
|
||||
import hashlib
|
||||
import json
|
||||
from pathlib import Path
|
||||
from datetime import datetime, timezone
|
||||
|
||||
root = Path(__file__).resolve().parents[1]
|
||||
review = root / 'artifacts/verification/VisualUpgrade/ModelReview'
|
||||
packet_path = review / 'review-packet.json'
|
||||
packet = json.loads(packet_path.read_text(encoding='utf-8'))
|
||||
approved = [r for r in packet['files'] if r['relativePath'].lower().endswith(('.blend', '.fbx'))]
|
||||
assert len(approved) == 25, len(approved)
|
||||
for record in approved:
|
||||
path = (review / record['relativePath']).resolve()
|
||||
assert path.stat().st_size == record['bytes']
|
||||
assert hashlib.sha256(path.read_bytes()).hexdigest() == record['sha256'], str(path)
|
||||
now = datetime.now(timezone.utc).isoformat()
|
||||
approval = {'status': 'APPROVED', 'userResponse': '\uc2b9\uc778\ud569\ub2c8\ub2e4',
|
||||
'confirmedUtc': now, 'scope': 'All five model groups presented in the immediately preceding review',
|
||||
'groups': [g['id'] for g in packet['reviewGroups']],
|
||||
'reviewPacketSha256': hashlib.sha256(packet_path.read_bytes()).hexdigest(),
|
||||
'reviewPacket': 'review-packet.json', 'approvedFiles': approved}
|
||||
(review / 'user-approval.json').write_text(json.dumps(approval, ensure_ascii=False, indent=2), encoding='utf-8')
|
||||
state_path = root / '.dryforge/execution.json'
|
||||
state = json.loads(state_path.read_text(encoding='utf-8'))
|
||||
state['tasks']['T3'] = 'completed_explicit_user_approval'
|
||||
state['model_approval'] = approval
|
||||
state_path.write_text(json.dumps(state, ensure_ascii=False, indent=2), encoding='utf-8')
|
||||
print('EXPLICIT_USER_APPROVAL_RECORDED; 25 original/model hashes matched; 5 groups approved')
|
||||
@@ -0,0 +1,27 @@
|
||||
import hashlib
|
||||
import json
|
||||
from pathlib import Path
|
||||
|
||||
root = Path('C:/git/MagnetismHeroes')
|
||||
state_path = root / '.dryforge/execution.json'
|
||||
state = json.loads(state_path.read_text(encoding='utf-8-sig'))
|
||||
proof = root / 'artifacts/verification/VisualUpgrade/FinalProduct'
|
||||
record = json.loads((proof / 'completion.json').read_text(encoding='utf-8-sig'))
|
||||
audit = json.loads((proof / 'root-final-product-audit.json').read_text(encoding='utf-8-sig'))
|
||||
assert record['status'] == 'passed' and audit['status'] == 'PASS'
|
||||
assert record['sourceCommit'] == audit['testedProductSourceCommit']
|
||||
state['completion'] = {
|
||||
'productSourceCommit': record['sourceCommit'],
|
||||
'record': 'artifacts/verification/VisualUpgrade/FinalProduct/completion.json',
|
||||
'recordSha256': hashlib.sha256((proof / 'completion.json').read_bytes()).hexdigest(),
|
||||
'fourPhasesExitZero': True,
|
||||
'productFilesUnchanged': audit['productFileHashesUnchanged'],
|
||||
'editMode': 103, 'playMode': 53, 'androidGates': 226,
|
||||
'apkSha256': audit['apkSha256'],
|
||||
'failedAttemptsPreserved': audit['failedAttemptsPreserved'],
|
||||
}
|
||||
review_path = root / '.dryforge/reviews/horizon-fix-conformance.json'
|
||||
state['final_followup']['reviewSha256'] = hashlib.sha256(review_path.read_bytes()).hexdigest()
|
||||
state['tasks']['T6'] = 'new_four_phases_passed_documentation_refresh_running'
|
||||
state_path.write_text(json.dumps(state, ensure_ascii=False, indent=2) + '\n', encoding='utf-8')
|
||||
print(json.dumps({'status': 'recorded', 'completion': 'passed', 'finalUserGate': 'pending'}))
|
||||
Binary file not shown.
|
After Width: | Height: | Size: 964 KiB |
@@ -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
@@ -0,0 +1,37 @@
|
||||
import hashlib
|
||||
import json
|
||||
import re
|
||||
import subprocess
|
||||
import sys
|
||||
from pathlib import Path
|
||||
|
||||
root = Path(__file__).resolve().parents[1]
|
||||
folder = root / 'artifacts/verification/VisualUpgrade'
|
||||
path = folder / 'stage-nonvisual-baseline.json'
|
||||
def stage_fields():
|
||||
result = {}
|
||||
for stage in range(1, 31):
|
||||
name = f'Assets/MagnetismHeroes/UnityRuntime/StageAssets/Stage{stage:02}.asset'
|
||||
text = (root / name).read_text(encoding='utf-8')
|
||||
result[name] = {
|
||||
field: re.search(r'(?m)^ ' + field + r':.*(?:\n(?: - .*| .*))*', text).group(0)
|
||||
for field in ('_stageId', '_kind', '_initialGroups', '_targetGroups', '_ballPositions', '_theme')}
|
||||
result[name]['guid'] = re.search(r'(?m)^guid: (.+)$', (root / (name + '.meta')).read_text()).group(1)
|
||||
return result
|
||||
if '--capture' in sys.argv:
|
||||
assert not path.exists(), 'Baseline already captured'
|
||||
path.write_text(json.dumps(stage_fields(), indent=2), encoding='utf-8')
|
||||
print('CAPTURED_NONVISUAL_STAGE_FIELDS_AND_GUIDS count=30')
|
||||
else:
|
||||
baseline = json.loads(path.read_text(encoding='utf-8'))
|
||||
actual = stage_fields()
|
||||
for name, fields in baseline.items():
|
||||
assert actual[name] == fields, name
|
||||
approved = json.loads((folder / 'ModelReview/user-approval.json').read_text(encoding='utf-8'))
|
||||
for record in approved['approvedFiles']:
|
||||
assert hashlib.sha256((root / record['repositoryRelativePath']).read_bytes()).hexdigest() == record['sha256']
|
||||
report = {'status': 'PASS', 'stageNonvisualFieldsAndGuidsUnchanged': 30,
|
||||
'approvedModelHashesUnchanged': 25,
|
||||
'sourceCommit': subprocess.check_output(['git', 'rev-parse', 'HEAD'], cwd=root, text=True).strip()}
|
||||
(folder / 'stage-and-model-boundary-verification.json').write_text(json.dumps(report, indent=2), encoding='utf-8')
|
||||
print(json.dumps(report))
|
||||
@@ -0,0 +1,59 @@
|
||||
import hashlib
|
||||
import json
|
||||
import pathlib
|
||||
import subprocess
|
||||
from datetime import datetime, timezone
|
||||
|
||||
root = pathlib.Path(__file__).resolve().parents[1]
|
||||
state_path = root / '.dryforge/execution.json'
|
||||
state = json.loads(state_path.read_text(encoding='utf-8'))
|
||||
def git(*args):
|
||||
return subprocess.check_output(['git', *args], cwd=root, text=True).strip()
|
||||
def digest(path):
|
||||
return hashlib.sha256(path.read_bytes()).hexdigest()
|
||||
|
||||
assert git('branch', '--show-current') == state['feature_branch']
|
||||
assert git('rev-parse', state['protected_base']) == state['initial_commit']
|
||||
for name, expected in state['protected_product_hashes'].items():
|
||||
assert digest(root / name) == expected, name
|
||||
diff = git('diff', '--name-status', state['initial_commit'] + '...HEAD').splitlines()
|
||||
assert len(diff) == 32, len(diff)
|
||||
for line in diff:
|
||||
status, name = line.split('\t', 1)
|
||||
assert status == 'A', line
|
||||
assert name.startswith(('SourceAssets/Models/Heroes/', 'SourceAssets/Models/Meadow/',
|
||||
'Assets/MagnetismHeroes/UnityRuntime/Presentation/Models/Heroes/',
|
||||
'Assets/MagnetismHeroes/UnityRuntime/Presentation/Models/Meadow/')) or name in (
|
||||
'tools/models/build_hero.py', 'tools/models/build_meadow.py'), name
|
||||
checked = 0
|
||||
for group in ('Heroes', 'Meadow'):
|
||||
provenance = json.loads((root / f'SourceAssets/Models/{group}/provenance.json').read_text())
|
||||
for record in provenance['files']:
|
||||
path = root / record['path']
|
||||
assert path.stat().st_size == record['bytes'], record['path']
|
||||
assert digest(path) == record['sha256'], record['path']
|
||||
checked += 1
|
||||
subprocess.run(['git', 'diff', '--check', state['initial_commit'] + '...HEAD'], cwd=root, check=True)
|
||||
assert git('status', '--porcelain') == '', 'Unexpected tracked/untracked change'
|
||||
evidence = {
|
||||
'status': 'PASS', 'scope': 'Model candidates only; user approval pending',
|
||||
'checkedUtc': datetime.now(timezone.utc).isoformat(), 'featureCommit': git('rev-parse', 'HEAD'),
|
||||
'protectedBaseCommit': state['initial_commit'], 'protectedProductFilesUnchanged': len(state['protected_product_hashes']),
|
||||
'candidateFilesAdded': len(diff), 'provenanceResourceHashesChecked': checked,
|
||||
'commands': [
|
||||
{'command': 'Blender --background --python-exit-code 1 --python tools/models/build_hero.py -- --verify-only',
|
||||
'exitCode': 0, 'log': 'Heroes/integrated-verify.log',
|
||||
'assertion': 'ASSERTIONS_OK and REOPEN_AND_FBX_REIMPORT_OK evaluated'},
|
||||
{'command': 'Blender --background --python-exit-code 1 --python tools/models/build_meadow.py -- --verify-only --review-dir artifacts/verification/VisualUpgrade/ModelReview/Meadow',
|
||||
'exitCode': 0, 'log': 'Meadow/integrated-verify.log',
|
||||
'assertion': 'MEADOW_VERIFY_PASS evaluated; 21 assets and 23 resources'},
|
||||
{'command': 'python .dryforge/verify-model-integration.py', 'exitCode': 0,
|
||||
'assertion': '533 protected product hashes, 32 additions, candidate provenance hashes, clean tree and protected dev checked'}],
|
||||
'userApproval': 'PENDING', 'unityGameplayAndroid': 'NOT_RUN; awaits explicit model approval'
|
||||
}
|
||||
review = root / 'artifacts/verification/VisualUpgrade/ModelReview'
|
||||
(review / 'integration-verification.json').write_text(json.dumps(evidence, ensure_ascii=False, indent=2), encoding='utf-8')
|
||||
state['tasks'].update(T1='completed_model_candidate', T2='completed_model_candidate', T3='awaiting_explicit_user_model_approval')
|
||||
state['model_integration'] = evidence
|
||||
state_path.write_text(json.dumps(state, ensure_ascii=False, indent=2), encoding='utf-8')
|
||||
print(json.dumps({k: evidence[k] for k in ('status', 'featureCommit', 'protectedProductFilesUnchanged', 'candidateFilesAdded', 'provenanceResourceHashesChecked', 'userApproval')}, ensure_ascii=False))
|
||||
@@ -0,0 +1,45 @@
|
||||
# 자석 영웅과 맑은 초원 세계 — 실행 인계
|
||||
|
||||
## 문서 역할과 위치
|
||||
|
||||
| 문서 | 역할 |
|
||||
|---|---|
|
||||
| `.dryforge/spec.md` | 제작할 모습·게임 동작·유지 경계·완성 및 검증 조건 |
|
||||
| `.dryforge/plan.md` | 작업 대상·담당 경계·순서·작업별 검증과 실행 의존 관계 |
|
||||
| `.dryforge/handoff.md` | 위 문서를 실행할 때 지킬 공통 원칙과 인계 조건 |
|
||||
|
||||
결과의 모습과 동작에 충돌이 있으면 spec을 따른다. plan의 방법과 세부 작업 분할은 spec을 만족하는 범위에서 조정할 수 있다. spec의 요구 변경은 사용자와 확인한다. 기존 코드와 제작 도구는 구현 방식의 참고이며 새 외형의 요구를 대신하지 않는다. 프로젝트 지침의 수학·저장·자산 보호 경계는 유지한다.
|
||||
|
||||
현재 `.dryforge/status.json`이 존재하는 기존 프로젝트 작업이다. 프로젝트 자체의 새 기획·기반 구축은 하지 않는다. 과거 `.dryforge/001/` 문서와 기존 프로젝트 문서는 이전 결정·검증 이력으로 보존한다. 이번 문서가 지정한 새 기사 외형과 세 자연 풍경은 이전 시각 디자인을 교체한다.
|
||||
|
||||
## 실행 개요
|
||||
|
||||
편집 가능한 Blender 영웅 원본과 자연 세계 원본을 각각 제작하고, 구 몸체·기사 장비·초원·꽃 언덕·바위 언덕의 완성 모델을 사용자에게 검토받는다. 모든 대상에 대한 명시적 승인 후 한 담당자가 실제 Unity 게임에 연결한다. 실제 장면에서 조작·시각 품질을 확인하고 보정한 뒤, 같은 최종 소스의 Android 앱을 빌드·설치·검증한다. 원본·게임 파일·출처·검수 증거를 함께 납품한다.
|
||||
|
||||
사용자가 채택한 방향은 묶음당 기사 한 명, 둥근 구 몸체와 기존 표정·작은 반응, 투구·짧은 칼·방패, 전체 30개 스테이지의 초원·꽃 언덕·바위 언덕 교체, 게임 적용과 Android 시험용 앱 검증까지다. 이 네 방향은 다시 선택받을 필요가 없다.
|
||||
|
||||
참고 이미지는 `.dryforge/reference/cartoon-landscape.png`다. 색·형태·소재·빛의 방향을 참고하며 원작 캐릭터나 총을 복제하지 않는다. 영웅 장비뿐 아니라 구 몸체의 메시·재질 자체를 개선해야 한다. 모든 핵심 의도는 spec과 plan에 수록했으며 별도의 숨은 요구는 없다.
|
||||
|
||||
## 반드시 지킬 조건
|
||||
|
||||
- 모델링 완료 후 실제 원본의 렌더·편집 가능한 파일 링크·검토 대상 해시를 제시하고 사용자 승인을 기다린다. 무응답·일부 승인·자동 검사·제작 문서 승인은 전체 모델 승인이 아니다. 승인 전 기존 게임의 시각 참조 교체·런타임 채택·후속 APK 검증을 진행하지 않는다. 수정 요청에는 변경본을 다시 검토받고 승인 기록을 갱신한다. 적용 중 승인된 외형을 눈에 띄게 바꾸는 경우에도 해당 변경본을 다시 검토받는다.
|
||||
- 구 하나는 계속 1이고, 기본 크기·ID·총량·소속·아이 배열·수학 판정·기존 초기 위치를 보존한다. 기사 장비는 묶음당 한 벌이며 입력 대상이나 새 구가 아니다.
|
||||
- 구의 얼굴 여섯 표정·숫자·계수·선택·접촉 표시가 실제 화면에서 보이고 조작 가능해야 한다. 분리·대표 변경·취소·재입장 때 장식이 남거나 중복되지 않는다.
|
||||
- 30개 스테이지와 자유 놀이의 배경 전체를 같은 맑은 자연 세계로 교체한다. 내부 테마 값 `Garden`·`Cloud`·`Workshop`을 유지하면서 새 외형을 연결한다. 테마는 새로운 정답 조건이 아니다.
|
||||
- 실제 가림과 아치 빈틈을 유지하고 구 발견·선택을 확인한다. 앞 소품 hit를 무시하는 입력 우회나 구 초기 위치 변경으로 검사를 통과시키지 않는다.
|
||||
- 기존 진행과 JSON 저장 계약·복구·44개 승인 음성·한국어 UI·글꼴·오프라인을 보존한다. 새 음원·보행·전투·원격 전송·계정·광고·결제·플랫폼·게시를 추가하지 않는다.
|
||||
- 초기 전체 builder로 완성 씬·프리팹·StageAsset·승인 자산을 다시 만들지 않는다. Unity 자산은 Unity의 편집·생성 경로로 필요한 대상만 변경한다. 모델 축·피벗·imported root 회전과 Unity 생성 `.meta`를 확인한다.
|
||||
- 제작 원본과 과거 출처 이력을 보존한다. 새 원본·내보내기·런타임·검수의 경로·해시·사용 조건을 연결하고 제작 도구와 원본을 APK에 포함하지 않는다.
|
||||
- Blender 렌더만으로 품질을 완료 판정하지 않는다. 실제 게임의 영웅·세 풍경, 여러 구 배열·시점·화면 비율에서 시각 검토표와 조작 증거를 남긴다. 비용은 모바일 사용을 고려해 조정하며 Editor·AVD 측정을 실기기 성능 합격으로 기록하지 않는다.
|
||||
- 최종 제품 소스에서 spec의 네 단계 Final 검증을 실제 수행한다. 기존 증거를 보존하고 소스·제품 파일·APK·설치본 해시와 로그를 같은 실행으로 연결한다. 0개 검사·미평가·필수 사례 건너뜀은 통과가 아니다.
|
||||
- 수량이나 이어하기 손상, 미승인 채택·요청하지 않은 외부 전송을 발견하면 관련 변경을 멈추고 증거·영향을 즉시 알린다. 다른 문제는 먼저 재현·수정하고 해결할 수 없는 실제 재현 문제만 findings에 남긴다.
|
||||
|
||||
## 실행 소유와 완료 인계
|
||||
|
||||
영웅·자연 모델은 서로 다른 파일을 소유한다. T3는 사용자의 모델 검토·승인 단계이며 자료 준비만으로 완료 처리하지 않는다. 공통 Unity 프리팹·씬·StageAsset·재질은 승인 후 T4의 한 작성자가 연결한다. 검사·Editor·Blender 저장·ADB·녹음은 지정한 실행 소유자가 관리하며 같은 환경을 동시에 조작하지 않는다. T6이 공통 자산 등록·운영·상태 문서를 최종 갱신한다.
|
||||
|
||||
현재 환경의 Unity·Blender·Android 절차와 실기기 후속 경계는 `docs/operations.md`, `docs/tracking/status.md`를 따른다. 현재 Android 검증은 전용 AVD에서 수행하며 실제 사용자 기록을 초기화하지 않는다. 실제 스마트폰·태블릿 FPS·발열·배터리와 아이 사용성, iOS·스토어 배포는 이번 검증 완료 주장에 포함하지 않는다.
|
||||
|
||||
최종 인계에는 Blender 원본, 채택된 게임용 파일 목록과 출처, 영웅과 세 풍경의 실제 게임 화면, 시각 검토표·조작/자원 관찰 결과, 네 단계 검사 결과, APK와 설치 해시, 미검증 범위를 포함한다.
|
||||
|
||||
이 문서 작성 단계의 산출물은 제작 명세와 계획이다. 제품 자산 생성·교체·빌드·Git 커밋은 아직 수행하지 않는다. 세 문서 검토·승인 후 같은 대화에서 `dryforge:go`를 호출하여 실행한다.
|
||||
@@ -0,0 +1,27 @@
|
||||
{
|
||||
"status": "merged-local-dev",
|
||||
"userStatement": "-dev에 병합",
|
||||
"startedUtc": "2026-10-09T14:27:19.2336807Z",
|
||||
"finishedUtc": "2026-10-09T14:27:20.7186100Z",
|
||||
"targetBranch": "dev",
|
||||
"sourceBranch": "dryforge/hero-meadow",
|
||||
"approvedFeatureCommit": "0d992d9dcc94843a72489b454ca4e8137178bc56",
|
||||
"previousDevCommit": "58410281e015c6600dc543c4e093fd95c036288c",
|
||||
"fetchedOriginDevCommit": "58410281e015c6600dc543c4e093fd95c036288c",
|
||||
"mergeCommit": "a54ae6fb230b0c87e1a2f08a1ad9e2cc2ceb0d73",
|
||||
"mergeParents": [
|
||||
"58410281e015c6600dc543c4e093fd95c036288c",
|
||||
"0d992d9dcc94843a72489b454ca4e8137178bc56"
|
||||
],
|
||||
"mergeCommand": "git -c core.autocrlf=false merge --no-ff dryforge/hero-meadow -F artifacts/verification/VisualUpgrade/FinalProduct/dev-merge-message.txt",
|
||||
"mergeExitCode": 0,
|
||||
"approvedTreeEqualsMergedTree": true,
|
||||
"testedProductFilesRawSha256Unchanged": 732,
|
||||
"verification": "제품 파일과 전체 Git tree가 승인본과 동일하므로 기존 실제 검증 증거 유지; 새 검사를 실행한 것으로 기록하지 않음",
|
||||
"testedProductSource": "3346eb559bdfba24332feb4d9be4b7104520233e",
|
||||
"completionEvidence": "artifacts/verification/VisualUpgrade/FinalProduct/completion.json",
|
||||
"currentBranch": "dev",
|
||||
"workingTreeClean": true,
|
||||
"mergedFeatureBranchRemoved": true,
|
||||
"remotePushExecuted": false
|
||||
}
|
||||
@@ -0,0 +1,138 @@
|
||||
# 자석 영웅과 자연 배경 제작 계획
|
||||
|
||||
## 진행 방식
|
||||
|
||||
영웅과 자연 소품의 원본을 각각 완성한 뒤, 사용자에게 구 몸체·기사 장비와 세 풍경을 검토받는다. 명시적인 승인 후 한 담당자가 실제 게임에 연결한다. 연결된 장면에서 조작과 외형을 함께 확인하고 필요한 수정 후 최종 Android 앱을 검증한다. 모델링용 원본과 런타임 자산, 검수 자료를 구분하여 보존한다.
|
||||
|
||||
새 프로젝트 초기화나 패키지 업그레이드는 필요 없다. 시작 전에 대상 모듈의 AGENTS.md와 `docs/standards.md`, `docs/engineering-notes.md`, `docs/architecture.md`, `docs/operations.md`를 읽고 기존 소스·GUID·자산 해시와 검증 증거를 확인한다. 초기 전체 builder는 실행하지 않는다.
|
||||
|
||||
## T1 — Blender 영웅 원본과 게임용 모델
|
||||
|
||||
**목표와 계약:** R01·R02·R03·R06·R07에 따라 구 몸체 자체의 메시·재질과 투구·짧은 칼·방패를 제작한다. 편집 가능한 실제 `.blend`와 Unity용 FBX, 필요한 텍스처를 제공한다. 구 하나의 크기와 중심을 유지하고 장비는 별도 수량이나 입력 대상이 없는 묶음별 부착물로 만든다. 현재 얼굴 여섯 표정·마스크·리본 망토와 공존할 공간을 확보한다.
|
||||
|
||||
**작업 대상:** `SourceAssets/Models/Heroes/`, `tools/models/`의 영웅 전용 제작·내보내기 도구, `Assets/MagnetismHeroes/UnityRuntime/Presentation/Models/`의 영웅용 파일과 필요한 `Textures/` 파일. 해당 원본 영역에 별도 provenance를 두어 기존 `SourceAssets/Models/provenance.json`과 과거 자산 이력을 덮지 않는다.
|
||||
|
||||
**제작 판단의 근거:** 구 배열이 영웅의 몸이라는 기존 학습 표현을 유지하면서 기사 장비로 정체성을 강화한다. 모든 구를 개별 무장 캐릭터로 바꾸거나 팔·다리와 보행 애니메이션을 새로 만드는 방식은 채택된 모습과 다르다. 반사와 장식의 디테일은 작은 화면에서 먼저 읽히는 큰 형태를 위해 조정한다.
|
||||
|
||||
**검증:** Blender에서 원본을 실제로 열어 메시·재질·피벗·장비 구성을 확인하고 정면·옆면·뒷면 렌더와 내보내기 해시를 남긴다. FBX 내보내기 성공과 실제 존재·크기·메시 정보를 확인한다. T3의 사용자 검토에 제출하고 최종 Unity 적용 검수는 T4·T5에서 수행하며 원본 렌더만으로 게임 품질 합격을 주장하지 않는다.
|
||||
|
||||
**공유 파일 처리:** 프리팹·씬·StageAsset·공통 재질·자산 등록 문서는 수정하지 않는다. 영웅 원본·내보내기 범위만 소유한다. Blender 파일을 저장하고 내보내는 실행은 실행 담당자가 관리한다.
|
||||
|
||||
## T2 — Blender 자연 세계 원본과 게임용 소품
|
||||
|
||||
**목표와 계약:** R01·R04·R05·R06·R07에 따라 초원·꽃 언덕·바위 언덕에 필요한 지면·언덕·원경, 나무·수풀·풀·꽃·바위·자갈을 제작한다. 가까운 구조물의 가림·빈틈과 기존 구 초기 위치를 고려하여 기존 아치·단차의 자연 풍경용 대체 외형도 제공한다. 소품 변형과 배치 밀도는 실제 비용과 반복감을 보며 조정한다.
|
||||
|
||||
**작업 대상:** `SourceAssets/Models/Meadow/`, `tools/models/`의 자연 세계 전용 제작·내보내기 도구, `Assets/MagnetismHeroes/UnityRuntime/Presentation/Models/`의 자연 세계용 파일과 필요한 `Textures/` 파일, 별도 원본 provenance. 기존 `PlaygroundProps.blend`와 13개 FBX 원본 이력을 보존한다.
|
||||
|
||||
**제작 판단의 근거:** 요청한 밝은 언덕·평야를 전체 게임의 새 배경으로 만든다. 세 풍경은 서로 다른 세계가 아니라 식생·지형의 비중이 다른 같은 카툰 세계다. 수량을 헷갈리는 구형 캐릭터 소품이나 새 놀이 장치를 추가하지 않는다.
|
||||
|
||||
**검증:** 원본 파일의 편집 가능성과 메시·UV·노멀·다중 재질, 실제 바닥 피벗·축·내보내기 파일을 확인한다. 소품 목록 렌더와 세 풍경 구성 미리보기를 남긴다. 구멍을 가진 구조물의 메시가 실제 빈틈을 유지하는지 확인한다. T3의 사용자 검토에 제출하고 실제 구 발견·가림·입력은 T5에서 확인한다.
|
||||
|
||||
**공유 파일 처리:** T1과 다른 원본·텍스처·내보내기 파일명을 사용한다. 영웅 파일·프리팹·씬·StageAsset·공통 재질·자산 등록 문서는 수정하지 않는다. 원본 저장·내보내기 실행의 소유자는 한 명으로 유지한다.
|
||||
|
||||
## T3 — 완성 모델 제시와 사용자 검토·승인
|
||||
|
||||
**목표와 계약:** R10에 따라 T1·T2의 모델링 결과가 모두 준비되면 구 몸체·기사 장비·초원·꽃 언덕·바위 언덕을 사용자에게 제시하고 명시적인 승인을 받는다. 이 단계는 자료 생성만으로 끝나지 않으며 사용자 승인까지 완료되어야 T4를 시작할 수 있다.
|
||||
|
||||
**작업 대상:** `artifacts/verification/VisualUpgrade/ModelReview/`의 실제 Blender 렌더·검토 목록·파일 해시·승인 기록과 사용자 검토 대화. 구 몸체 단독 모습과 장비를 갖춘 영웅의 정면·옆면·뒷면, 세 풍경의 전체 장면과 주요 소품 상세 모습, 편집 가능한 원본 링크를 한 묶음으로 제공한다. 승인 기록은 검토 대상 원본·게임용 파일의 경로·SHA-256, 해당 자료에 대한 사용자 답변과 확인 시각을 연결한다.
|
||||
|
||||
**검토와 수정:** 사용자에게 귀여운 기사 모습·구 몸체·장비·세 풍경의 형태·색·재질·전체 조화를 검토받는다. 수정 요청이 있으면 대상만 보정하여 변경본과 갱신된 해시를 다시 제시한다. 이전 버전의 승인을 변경본에 재사용하지 않는다. 일부 승인이나 무응답 상태에서는 이 단계를 미완료로 유지하고 모든 대상의 승인까지 게임 적용을 기다린다.
|
||||
|
||||
**검증:** 구 몸체·기사 장비와 세 풍경 모두에 대해 최신 파일과 대응하는 명시적 사용자 승인이 있어야 완료다. 에이전트의 자체 평가·자동 검사·문서 승인으로 대체하지 않는다. 승인된 파일 목록을 T4에 인계한다. Blender 모델 검토와 이후 실제 게임의 시각·조작 검증은 각각 수행한다.
|
||||
|
||||
**공유 파일 처리:** 검토 대기 중 후보 원본·내보내기·검토 자료만 관리하고 기존 Main 씬·게임 프리팹·StageAsset 참조와 런타임 채택 상태를 유지한다. 후속 APK 검증은 시작하지 않는다. 이 승인 대기는 사용자가 요청한 모델 검토 단계이며 자동 진행으로 우회하지 않는다.
|
||||
|
||||
## T4 — Unity 장면과 30개 스테이지 적용
|
||||
|
||||
**목표와 계약:** R01~R06·R08·R10에 따라 T3에서 승인된 T1·T2의 자산을 실제 게임에 적용한다. 적용할 파일의 해시가 승인 기록과 일치하는지 확인한다. 대표 구에 영웅 장비 한 벌이 붙고 모든 구의 몸체가 개선된 모델·재질로 표시된다. 세 풍경이 1~10·11~20·21~30과 해당 자유 놀이에 연결된다. 장비 표시와 배경 연결에 필요한 표현 코드만 변경한다.
|
||||
|
||||
**작업 대상:** `Assets/MagnetismHeroes/Editor/`의 대상 한정 import·적용 경로, `UnityRuntime/Presentation/`의 재질·필요 텍스처·모델 import 설정·프리팹, `GroupBadge.cs`, `BallView.cs`, `BoardPresenter.cs`, 필요 시 `BoardEnvironment.cs`, `Bootstrap/GameApp.cs`, `StageAssets/Stage01.asset`~`Stage30.asset`, `Assets/MagnetismHeroes/Scenes/Main.unity`의 관련 표현 연결. 실제 변경이 필요한 파일만 수정한다.
|
||||
|
||||
**보존 계약:** 구 루트 크기·SphereCollider 반지름 0.5·ID·초기 위치·수학 목표를 유지한다. 영웅 장식에는 Collider를 붙이지 않는다. 묶음 얼굴·숫자·장비의 대표 위치와 수명을 맞추고 취소·합체·분리·재입장을 확정 상태에서 구성한다. 내부 테마 값 `Garden`·`Cloud`·`Workshop`과 기존 Stage·GameApp GUID를 유지한다. 승인 얼굴 여섯 표정·44개 음성·글꼴·UI·Mixer 참조를 보존한다.
|
||||
|
||||
**배경 계약:** 먼 지형·하늘과 가까운 식생까지 새 풍경으로 연결한다. 앞 소품의 실제 가림을 보존하되 구 발견과 입력을 막지 않도록 배치·Collider를 조정한다. 배경 가림을 무시하는 Raycast 우회로를 만들지 않는다. 아치 빈틈을 유지하고 저장된 구 배열을 새 배경에 맞추려고 재배치하지 않는다.
|
||||
|
||||
**검증:** Unity 실제 import와 초기화에서 누락 참조·셰이더·재질·좌표·피벗·축·GUID·콜라이더를 확인한다. 적용 전후 StageAsset의 비시각 필드와 음성·얼굴·글꼴 파일 해시를 대조한다. Main 씬에서 단일 구와 합체 묶음, 세 풍경과 자유 놀이를 실제 표시하고 초기 캡처를 남긴다. 변환 중 입력 간섭이나 구 수량 문제가 나오면 관련 변경을 멈추고 증거를 남긴다.
|
||||
|
||||
**공유 파일 처리:** 씬·프리팹·StageAsset·공통 재질·메타데이터는 이 단계의 한 작성자가 Unity API로 생성·수정·저장한다. `ProjectBootstrap.Prepare/ConnectApp`, `CompositionAssets.Build`, `PersistenceAssets.Build`, `ContentAssets.Build`, `PresentationAssets.Build`를 일반 준비 절차로 실행하지 않는다. 원본과 파일 생성은 T1·T2 결과를 사용한다.
|
||||
|
||||
## T5 — 시각 품질과 조작 회귀 검증·수정
|
||||
|
||||
**목표와 계약:** R03·R04·R05·R07·R08·R10에 따라 실제 연결된 프리팹과 장면에서 귀여운 기사와 세 풍경의 품질을 확인한다. 장식과 배경이 숫자·계수·선택·발견·분리·취소·저장 복원을 해치지 않아야 한다. 관찰한 결함은 최소 범위로 수정하고 영향을 받은 사례를 재검증한다. 승인된 형태·색·재질·풍경 구성을 눈에 띄게 바꾸는 수정은 해당 변경본을 사용자에게 다시 제시하고 승인 후 채택한다.
|
||||
|
||||
**작업 대상:** `Assets/MagnetismHeroes/Tests/EditMode/ContentAssetTests.cs`, `PresentationAssetTests.cs`, 필요 시 다른 영향받은 자산 검사, `Tests/PlayMode/ContentPlayTests.cs`, `CompositionPlayTests.cs`와 필요한 실제 프리팹 검사, `Editor/PresentationProof.cs` 또는 대상 한정 시각 증거 수집, `tools/android/`의 영향받은 배경·장비 검증, T1·T2·T4의 필요한 보정 파일, `artifacts/verification/VisualUpgrade/`.
|
||||
|
||||
**검사 갱신:** 기존 `Decorations.Count == 7`이나 옛 소품 이름·픽셀을 고정한 기대를 새 제작 목록에 맞춘다. 단순 존재 확인으로 낮추지 말고 각 풍경의 필수 자산 연결과 실제 구 발견·숫자 가독성을 계속 검사한다. 내부 테마 값이 유지되므로 이름 변경을 위한 제품 기능 수정은 하지 않는다. 기존 합체·분리·저장 검사를 없애거나 제품 판정을 완화하지 않는다.
|
||||
|
||||
**구체 사례:** 단일 구, 2+3 합체, 5의 떨어진 양 끝 두 구를 골라 2+3 분리, 10개 한 묶음과 10개 개별 구, 대표 변경, 취소·핀치·영역 이탈, 화면 이동·재입장·이어하기, 세 풍경의 0~10개 자유 놀이 공급·반납. 각 안정 묶음의 장비·얼굴·숫자가 하나인지와 모든 수집 구의 실제 Collider 선택 가능성을 확인한다.
|
||||
|
||||
**시각 자료:** 각 풍경의 대표 스테이지와 자유 놀이를 기본·회전·확대 시점, 스마트폰·태블릿 가로 비율에서 캡처한다. 검토표에는 실루엣·법선·UV·재질·관통·얼굴/숫자/계수 가독성·배경 경계·색과 빛의 조화에 대한 실제 관찰과 수정 결과를 적는다. 그림이 예쁜 것만으로 조작 가능성을 대신하지 않는다.
|
||||
|
||||
**모바일 비용:** 최대 구 상태의 메시 삼각형·텍스처 해상도/메모리·공유 재질·측정 가능한 렌더링 비용을 기록하고 과한 부분을 줄인다. 측정 도구와 환경, 측정 못한 항목을 명시한다. Editor 통계와 AVD를 실기기 성능 증거로 바꾸지 않는다.
|
||||
|
||||
**검증:** 영향받은 EditMode·PlayMode 사례가 실제로 평가되고 통과해야 한다. 색상이나 단순 재질 조정마다 구현을 복제하는 새 단위 검사를 작성하지 않는다. 시각 검토표와 원본/게임 화면 대조를 완료하고 발견한 수량·복원 결함이 없음을 확인한다. 최종 소스의 전체 네 단계와 APK는 T6에서 확정한다.
|
||||
|
||||
**공유 파일 처리:** Unity Editor·테스트 실행·캡처·ADB는 한 실행 담당자가 순서대로 관리한다. 보정으로 T1·T2·T4 파일이 바뀌면 원본·내보내기·Unity 연결·해시를 함께 갱신하고 R10의 재검토 경계를 따른다. 최종 APK 검증을 먼저 하고 제품 파일을 나중에 수정하지 않는다.
|
||||
|
||||
## T6 — 최종 Android 검증과 채택 이력·납품
|
||||
|
||||
**목표와 계약:** R06·R07·R08·R09에 따라 완성된 제품 소스의 네 단계 검증과 새 Android 설치본·시각 증거를 연결한다. 실제 제작 결과와 사용 조건을 문서에 반영하고 원본·게임 화면·시험용 APK를 납품한다.
|
||||
|
||||
**작업 대상:** 기존 `tools/verify.ps1`와 관련 Android 검증 경로의 실행, `artifacts/verification/Final/`, `artifacts/verification/VisualUpgrade/`, `artifacts/android/Final/MagnetismHeroes.apk`, `artifacts/android/MagnetismHeroes.apk`, `docs/asset-register.md`, `docs/tracking/decisions/0005-hybrid-assets.md`와 필요 시 관련 결정 기록, `docs/operations.md`, `docs/tracking/status.md`, 실제 재현 문제가 남을 때 `docs/tracking/findings.md`, 새 자산 provenance의 최종 검수 대응.
|
||||
|
||||
**실행:** 기존 Final 증거를 별도 사본과 해시로 보존한다. 최종 제품 변경이 반영되고 tracked 변경이 없는 검증 소스에서 아래 명령을 순서대로 실행한다. 소스 준비·커밋 등 Git 처리는 실행 단계의 절차를 따른다. 현재 문서 작성 단계에서는 커밋하지 않는다.
|
||||
|
||||
```powershell
|
||||
pwsh -NoProfile -File tools/verify.ps1 -Phase EditMode -Milestone Final
|
||||
pwsh -NoProfile -File tools/verify.ps1 -Phase PlayMode -Milestone Final
|
||||
pwsh -NoProfile -File tools/verify.ps1 -Phase AndroidBuild -Milestone Final
|
||||
pwsh -NoProfile -File tools/verify.ps1 -Phase AndroidSmoke -Milestone Final
|
||||
```
|
||||
|
||||
Unity Editor와 배치 검사가 같은 프로젝트를 동시에 사용하지 않게 한다. 전용 API37 AVD의 상태와 boot 완료를 확인하고, 실제 이용자 데이터를 초기화하지 않는다. 정상 30개 순차 진행은 완료 기록 주입 없이 검증한다. 각 단계 실제 종료 코드와 XML/JSON 평가 결과, 소스·APK·설치 해시, 실행 시각, 로그와 Android 화면을 보존한다. 승인 44개 음성과 필요한 고지의 실제 APK 포함을 기존 절차로 확인한다.
|
||||
|
||||
**검증:** 네 단계 종료 0과 필수 사례 실패·건너뜀·미확정 0, 실제 APK 설치·진행·복원·오프라인 재생, 새 세 풍경의 Android 화면, 새 자산의 원본→게임 파일→검수 해시 대응을 확인한다. 새로운 제품 수정이 생기면 영향을 받은 검사와 최종 빌드를 갱신한다. 문서만 변경했을 때 제품 파일 동일성을 확인한다. 원본·캡처·검토표·APK 링크와 실기기 미검증 범위를 최종 보고한다. 실행 불가나 해결 불가를 완료로 표현하지 않는다.
|
||||
|
||||
**공유 파일 처리:** 이 단계가 공통 자산 등록·운영·상태 문서의 최종 작성자다. 이전 단계는 해당 문서 대신 자기 자산의 provenance와 검수 자료를 남긴다. 원격 push·스토어 게시·유료 구매는 실행하지 않는다.
|
||||
|
||||
## 요구사항과 작업의 대응
|
||||
|
||||
| 요구사항 | 구현·확인 작업 |
|
||||
|---|---|
|
||||
| R01 미술 방향 | T1, T2, T4, T5 |
|
||||
| R02 구 몸체와 기사 | T1, T4, T5 |
|
||||
| R03 합체·분리와 표현 수명 | T1, T4, T5, T6 |
|
||||
| R04 세 풍경과 30개 스테이지 | T2, T4, T5, T6 |
|
||||
| R05 자연 소품과 조작 | T2, T4, T5, T6 |
|
||||
| R06 원본·게임 파일·출처 계약 | T1, T2, T4, T6 |
|
||||
| R07 시각 품질 합격 | T1, T2, T5, T6 |
|
||||
| R08 규칙·저장·음성·필수 검증 | T4, T5, T6 |
|
||||
| R09 변경 경계와 완료 보고 | T6 |
|
||||
| R10 완성 모델 사용자 검토·승인 | T3, T4, T5 |
|
||||
|
||||
## Execution Graph
|
||||
|
||||
T1·T2는 서로 다른 원본과 내보내기 파일을 제작하므로 독립이다. 파일 준비를 병행하더라도 Blender 저장·내보내기 실행은 한 소유자가 관리한다. T3는 두 제작 결과를 사용자에게 제시하며 모든 대상의 명시적 승인 전에는 완료되지 않는다. 실행 담당자는 승인 대기를 자동 검사나 작업 완료 보고로 대체하지 않고 T4~T6을 시작하지 않는다. T4는 승인된 자산을 실제 게임에 연결하고, T5는 연결된 게임을 검증·보정하며, T6은 보정된 최종 제품 소스와 증거를 확정한다. 전체 재생성 명령은 없고 각 제작의 내보내기·import는 해당 작업 안에서 처리한다.
|
||||
|
||||
```yaml
|
||||
tasks:
|
||||
- id: T1
|
||||
depends: []
|
||||
risk: RISKY
|
||||
- id: T2
|
||||
depends: []
|
||||
risk: RISKY
|
||||
- id: T3
|
||||
depends: [T1, T2]
|
||||
risk: RISKY
|
||||
- id: T4
|
||||
depends: [T3]
|
||||
risk: RISKY
|
||||
- id: T5
|
||||
depends: [T4]
|
||||
risk: RISKY
|
||||
- id: T6
|
||||
depends: [T5]
|
||||
risk: RISKY
|
||||
regen_barriers: []
|
||||
```
|
||||
@@ -0,0 +1,126 @@
|
||||
# 자석 영웅과 맑은 초원 세계의 시각 품질 개선
|
||||
|
||||
## 목표와 완성 범위
|
||||
|
||||
5~7세용 MagnetismHeroes의 구 자석과 배경을 하나의 완성된 카툰 세계로 만든다. 기본 도형으로 만든 시제품 수준에서 벗어나, 부드러운 곡면·정돈된 재질·일관된 색과 빛·의도적인 배경 구성을 갖춘 상업용 게임에 어울리는 외형을 목표로 한다.
|
||||
|
||||
Blender에서 구 몸체와 기사 장비, 지형과 자연 소품의 실제 3D 원본을 제작한다. 게임용 모델과 재질을 Unity에 적용하고 기존 30개 스테이지와 자유 놀이에서 사용한다. 최종 결과는 편집 가능한 원본, 게임에 연결된 자산, 시각 검수 자료와 검증된 Android 시험용 APK다. 이 문서는 제작할 결과를 정하며, 작성 자체가 모델 제작이나 앱 검증 완료를 뜻하지 않는다.
|
||||
|
||||
## R01 — 미술 방향
|
||||
|
||||
참고 이미지는 `.dryforge/reference/cartoon-landscape.png`에 보존한다. 밝은 청록색 하늘, 부드러운 녹색과 파스텔색 식생, 둥근 바위와 나무, 따뜻한 햇빛, 부드러운 그림자, 귀여운 장난감 같은 재질을 기준으로 삼는다. 참고 이미지의 캐릭터·총·화면 구성을 복제하는 요청은 아니다. 현재 게임의 회전·확대 가능한 퍼즐 시점을 유지한다.
|
||||
|
||||
영웅이 먼저 보이고, 가까운 자연 소품과 먼 언덕이 그 뒤를 받치도록 구성한다. 녹색 평야·꽃·바위가 같은 세계에 속한다는 인상을 준다. 구 자석과 헷갈리는 얼굴 달린 식물이나 빛나는 구형 배경 장식을 만들지 않는다.
|
||||
|
||||
색조·재질의 거칠기·장식 크기·광원 강도·원경의 거리와 식생 밀도는 실제 화면을 보며 조정한다. 이 값은 조정 가능하지만, 기사 형태·맑은 낮·세 자연 풍경·구 수량의 명확성은 고정한다.
|
||||
|
||||
## R02 — 구 몸체와 장난감 기사
|
||||
|
||||
구 몸체 자체를 Blender 제작 메시와 정돈된 재질로 개선한다. 투구·칼·방패를 추가하는 것만으로 몸체 개선을 대체하지 않는다. 낮은 분할로 생기는 각진 외곽, 얼룩진 법선, 눈에 띄는 이음새와 과한 반사를 없애고, 작게 표시되어도 구 하나를 구분할 수 있게 한다.
|
||||
|
||||
친구 한 묶음마다 영웅 한 명을 표시한다. 대표 구에 현재 얼굴을 살린 둥근 투구, 짧고 끝이 둥근 장난감 칼, 둥근 방패를 붙인다. 구가 영웅의 몸이고 장비는 부속 장식이다. 기본 구의 시각 반지름과 기존 SphereCollider 반지름 0.5, 루트 배율 1을 유지한다.
|
||||
|
||||
기존 얼굴의 여섯 표정과 얇은 마스크, 리본형 자력 망토, 연결 빛을 기사 장비와 조화시킨다. 투구가 눈·입을 가리지 않고, 칼·방패가 숫자·계수 표시·선택 강조를 가리지 않아야 한다. 새 팔·다리, 걷기용 리깅과 전투 동작은 이번 범위에 없다. 기존 표정 전환·시선·작은 흔들림·축하 반응을 활용한다.
|
||||
|
||||
칼과 방패를 가진 실루엣은 정면과 실제 조작 시점에서 알아볼 수 있어야 한다. 장비의 돌출은 이웃 구를 세거나 선택하는 데 방해가 되지 않도록 조절한다. 장비에는 별도 구 ID, 입력 Collider, Raycast 대상이나 수량을 추가하지 않는다.
|
||||
|
||||
## R03 — 합체·분리와 표현의 수명
|
||||
|
||||
구 하나는 계속 수량 1이다. 모든 구 ID와 총량, 소속, 기본 크기, 아이가 만든 배열을 유지한다. 합체가 여러 구를 큰 구 하나나 정해진 인체로 대체해서는 안 된다. 묶음의 숫자는 확정 소속 구 개수와 일치한다.
|
||||
|
||||
안정 상태에서 묶음마다 얼굴·기사 장비 한 벌·숫자·망토가 각각 하나다. 합체하면 새 묶음에 한 벌만 남고, 분리하면 두 묶음에 각각 한 벌이 생긴다. 떨어져 있는 선택 구도 기존 규칙대로 두 친구로 나눈다. 대표 구가 바뀌면 장비와 얼굴이 함께 옮겨지고 지난 대표의 장식이 남지 않는다.
|
||||
|
||||
드래그 중 장식은 표시 중인 묶음을 따라간다. 취소·핀치·영역 이탈에서는 기존 확정 상태로 복원한다. 화면 전환·재입장·저장 복원에서는 확정 상태로 영웅을 재구성하며 지난 선택·축하·미리보기 상태를 이어 붙이지 않는다. 미리보기나 흔들림을 진행 데이터로 저장하지 않는다.
|
||||
|
||||
## R04 — 세 자연 풍경과 30개 스테이지
|
||||
|
||||
기존 세 배경의 외형을 모두 교체한다. 스테이지 수와 순서, 종류, 초기 묶음·구 위치, 목표·해금·도움·시범·완료 규칙은 유지한다.
|
||||
|
||||
| 스테이지 | 새 풍경 | 중심 구성 | 유지하는 내부 테마 값 |
|
||||
|---|---|---|---|
|
||||
| 1~10 | 맑은 초원 | 열린 잔디 평야, 둥근 나무와 수풀, 작은 꽃과 먼 언덕 | `Garden` |
|
||||
| 11~20 | 꽃 언덕 | 완만한 언덕, 꽃 군락과 나무, 부드러운 색의 식생 | `Cloud` |
|
||||
| 21~30 | 바위 언덕 | 둥근 바위와 낮은 암벽, 잔디·수풀, 먼 언덕 | `Workshop` |
|
||||
|
||||
내부 테마 값은 기존 연결 호환성을 위한 식별자다. 화면에서는 새 자연 풍경이 보이며 기존 구름 놀이터·별 작업실 소품은 새 배경으로 대체한다. 새 테마 식별자나 저장 형식은 추가하지 않는다.
|
||||
|
||||
놀이터 바닥만 바꾸지 않고, 카메라 회전·확대 범위에서 보이는 주변 지형·나무·하늘·원경까지 이어지는 완성된 장면을 구성한다. 커다란 탐험 월드나 이동 가능한 캐릭터 월드를 추가하지 않는다. 성공 후 자유 놀이는 해당 스테이지의 새 풍경을 유지하고 재입장에도 같은 풍경을 복원한다.
|
||||
|
||||
## R05 — 배경 소품과 조작 가능성
|
||||
|
||||
제작 묶음에는 플레이 지면과 완만한 언덕, 원경 지형, 둥근 나무, 수풀, 풀 군락, 꽃 군락, 바위·자갈이 포함된다. 나무의 줄기·가지·수관, 꽃의 꽃잎·줄기·잎, 바위의 큰 덩어리와 면 변화가 각 재질과 함께 읽히도록 제작한다. 모든 소품을 같은 재질로 덮거나 기본 도형을 단순 나열한 결과로 완료하지 않는다. 변형 수·세부 식생 수·배치 밀도는 반복감과 모바일 비용을 보며 조정한다.
|
||||
|
||||
기존 아치·단차 등 발견과 가림에 관계된 구성은 새 풍경에 어울리는 외형으로 교체하고 실제 발견 가능성을 유지한다. 기존 구 초기 위치를 미술 배치에 맞추려고 변경하지 않는다. 배경이 구의 이동과 접촉 후보 판정에 새 장애를 만들지 않게 한다.
|
||||
|
||||
장식용 먼 지형과 작은 식생은 불필요한 입력 Collider를 만들지 않는다. 실제 가림을 맡는 가까운 소품은 보이는 형상에 맞는 Collider를 사용한다. 아치 구멍은 막힌 BoxCollider로 대체하지 않으며, 앞 소품의 hit를 무시해 뒤 구를 선택하는 방식으로 문제를 숨기지 않는다. 각 수집 구는 지원 카메라 조작으로 찾아 실제 구 Collider를 선택하고 끌어올 수 있어야 한다.
|
||||
|
||||
## R06 — 원본·게임 자산·출처 계약
|
||||
|
||||
| 산출물 | 위치와 계약 |
|
||||
|---|---|
|
||||
| 영웅 원본 | `SourceAssets/Models/Heroes/`: 구 몸체와 투구·칼·방패를 편집할 수 있는 `.blend`, 필요한 제작 텍스처·출처 기록 |
|
||||
| 자연 세계 원본 | `SourceAssets/Models/Meadow/`: 지형과 소품을 편집할 수 있는 `.blend`, 필요한 제작 텍스처·출처 기록 |
|
||||
| 게임용 파일 | `Assets/MagnetismHeroes/UnityRuntime/Presentation/` 아래 모델·재질·필요한 텍스처·프리팹. 게임은 이 파일만 참조하고 제작 원본은 참조하지 않음 |
|
||||
| 연결 결과 | 기존 `MagnetFriend.prefab`, `GroupBadge.prefab`, `GameApp.prefab`, Main 씬과 30개 StageAsset의 관련 시각 참조. 기존 GUID와 학습 데이터 유지 |
|
||||
| 제작 도구 | `tools/models/` 아래 대상이 분리된 재현용 Blender 제작·내보내기 경로. 기존 원본과 13개 FBX를 통째로 덮는 초기 builder를 준비 작업으로 실행하지 않음 |
|
||||
| 검수 자료 | `artifacts/verification/VisualUpgrade/`: 원본 렌더, Unity 실제 화면, Android 실제 화면, 조작·자원 관찰·해시 대응 자료 |
|
||||
| 최종 APK | 기존 검증 절차의 `artifacts/android/Final/MagnetismHeroes.apk` 및 `artifacts/android/MagnetismHeroes.apk`, 같은 실행의 설치본 해시와 연결 |
|
||||
|
||||
모델은 자체 제작한다. 각 채택 파일은 원본→내보낸 게임 파일→Unity 연결→검수 증거를 추적할 수 있어야 한다. 기존 provenance 형식을 참고하여 도구와 실제 버전, 생성·내보내기 설정, 저장소 상대 경로, 바이트 수와 SHA-256, 출처·사용 조건·검수 범위를 남긴다. 필요 텍스처도 같은 대응을 갖는다. 구매나 외부 자산 채택을 임의로 추가하지 않는다.
|
||||
|
||||
Blender는 미터·Z-up, FBX는 -Z forward/Y-up·적용된 scale·애니메이션 없음을 따른다. 자연 소품은 바닥 피벗, 구는 중심 피벗, 장비는 대표 구에 부착 가능한 기준점을 갖는다. Unity import scale 1과 축 변환, imported root 회전을 실제 장면에서 확인한다. 재질·UV·노멀 등 Blender에서 보이는 속성이 Unity에서도 제대로 연결되어야 한다. Blender 전용 재질 노드가 FBX에 그대로 옮겨진다고 가정하지 않는다.
|
||||
|
||||
씬·프리팹·StageAsset·메타데이터는 Unity 편집·생성 경로로 변경한다. 변경 대상만 처리하고 Main 씬·GameApp·음성·글꼴·UI를 초기 builder로 다시 작성하지 않는다. 기존 원본과 출처 이력은 보존하고 새 제작본은 별도 경로에 둔다.
|
||||
|
||||
## R10 — 모델링 완료 후 사용자 검토와 승인
|
||||
|
||||
구 몸체·투구·칼·방패와 초원·꽃 언덕·바위 언덕의 모델링·재질 제작을 모두 마친 뒤, 실제 게임에 적용하기 전에 사용자에게 완성 모델을 검토받는다. 제작 명세 승인이나 자동 검사 통과는 완성 모델에 대한 사용자 승인을 대신하지 않는다.
|
||||
|
||||
검토 자료는 실제 제작한 Blender 원본에서 렌더한 구 몸체 단독 모습, 장비를 갖춘 영웅의 정면·옆면·뒷면, 세 풍경 각각의 전체 장면과 주요 자연 소품의 상세 모습을 포함한다. 편집 가능한 `.blend` 링크와 검토 대상 원본·게임용 내보내기 파일의 목록·SHA-256도 함께 제공한다. 참고 이미지나 아직 만들지 않은 모델의 예상 이미지로 검토 자료를 대신하지 않는다. 자료는 `artifacts/verification/VisualUpgrade/ModelReview/`에 보존한다.
|
||||
|
||||
검토 자료를 제시한 뒤 사용자의 명시적인 승인을 기다린다. 모든 검토 대상의 승인이 확인되기 전에는 Main 씬·게임 프리팹·StageAsset의 기존 시각 참조 교체, 새 자산의 런타임 채택과 후속 APK 검증을 진행하지 않는다. 후보 원본과 게임용 파일의 제작·내보내기는 가능하며, 승인 대기 중 기존 게임 연결은 보존한다. 답변이 없거나 일부 대상만 승인된 상태를 전체 승인으로 취급하지 않는다.
|
||||
|
||||
수정 요청이 있으면 해당 모델·재질·풍경 구성을 수정하고 변경본을 다시 제시한다. 검토한 파일과 해시, 사용자 승인 또는 수정 요청, 확인 시각을 연결하여 기록한다. 수정 전 파일에 대한 승인은 변경본으로 자동 승계하지 않는다. 모두 승인되면 게임 적용과 실제 화면·조작 검증을 이어간다.
|
||||
|
||||
승인 후 게임 적용 중 외형을 유지하는 축·피벗·import·Collider 연결 보정은 기존 계약 안에서 수행한다. 승인된 모델의 형태·색·재질·풍경 구성을 눈에 띄게 변경해야 하면 해당 변경본을 다시 검토받고 승인 후 채택한다. 이 모델 검토는 R07의 실제 게임 화면 품질 확인과 R08의 규칙·저장·Android 검증을 대체하지 않는다.
|
||||
|
||||
## R07 — 실제 화면에서의 품질 합격
|
||||
|
||||
‘상업 퀄리티’는 모델 파일 생성이나 Blender 렌더 한 장만으로 판정하지 않는다. 다음 항목을 실제 게임 캡처와 검토표로 확인하고 발견한 결함을 수정한다.
|
||||
|
||||
- 구·투구·칼·방패의 외곽이 부드럽고 의도한 형태로 읽힌다. 깨진 면·튀는 법선·눈에 띄는 UV 이음새·재질 누락·분홍 셰이더·투명 사각 배경이 없다.
|
||||
- 얼굴·숫자·계수 표시·선택과 접촉 강조를 구별할 수 있다. 장식의 과한 돌출·관통·깜빡임·배경 색과의 혼동이 조작과 수량 이해를 방해하지 않는다.
|
||||
- 나무·꽃·바위·지형은 서로 조화되면서 각 소재를 구별할 수 있다. 가까운 소품과 원경이 이어지고 카메라 이동에서 배경이 갑자기 끊기거나 지형 뒤 빈 공간이 드러나지 않는다.
|
||||
- 세 풍경은 같은 세계의 다른 장소로 읽히며, 각 풍경의 특징이 실제 게임 화면에 보인다. 낮의 밝은 분위기와 부드러운 그림자가 영웅 가독성을 유지한다.
|
||||
- 단일 구, 2+3 합체, 5에서 떨어진 양 끝 두 구를 고른 2+3 분리, 10개 모음과 10개 개별 구 상태, 빈 보드와 재공급에서 외형과 표시에 문제가 없다. 모든 구가 항상 한 시점에 보여야 하는 조건은 추가하지 않는다.
|
||||
|
||||
각 풍경의 대표 스테이지와 자유 놀이를 실제 기본 시점 및 허용된 회전·확대 상태에서 확인한다. Editor의 스마트폰·태블릿 가로 비율과 Android 시험 환경의 실제 화면을 구별해 기록한다. Blender 영웅의 정면·옆면·뒷면과 소품 목록 렌더도 남겨 편집 가능한 자산 품질을 검토할 수 있게 한다. 최종 자료는 사용자가 의도한 귀여움과 완성도를 평가할 수 있도록 전달한다.
|
||||
|
||||
모바일용 메시·공유 재질·텍스처·필요한 상세도 절감으로 비용을 관리한다. 영웅과 배경의 삼각형 수, 텍스처 해상도·메모리, 관찰 가능한 렌더링 비용을 최대 구 상태에서 기록하고 중복 메시·과한 재질·과밀 식생을 줄인다. 구체적인 제작 예산은 조정 가능하며 영웅 가독성을 비용 절감 때문에 훼손하지 않는다. Editor 통계나 AVD 결과를 실기기 FPS·발열·배터리 합격으로 표현하지 않는다. 실기기 검증은 `docs/tracking/status.md`의 후속 범위를 유지한다.
|
||||
|
||||
## R08 — 규칙·저장·음성 보존과 필수 검증
|
||||
|
||||
Core가 수학 상태를 소유한다. 완료 기록·퍼즐별 미완료 상태·최근 자유 놀이를 혼합하지 않는다. 저장 JSON 계약과 복구 정책, 승인된 44개 음성 바이트·참조, 한국어 UI·글꼴·오프라인 동작을 유지한다. 효과음·배경음악 추가는 제외한다. 런타임 네트워크·마이크·계정·광고·결제·새 성공 조건을 추가하지 않는다.
|
||||
|
||||
기존 테마·소품 수를 고정한 검사가 새 미술 계약과 충돌하면 해당 기대값만 실제 제작 목록에 맞춰 갱신한다. 구 발견·Collider 선택·아치 빈틈·숫자 가독성·수량 보존·저장 복원을 약화하거나 검사를 건너뛰어 통과시키지 않는다. 묶음별 장비 수명과 장식의 입력 비간섭은 실제 프리팹을 사용하는 의미 있는 검사로 확인한다.
|
||||
|
||||
완성 APK 판정은 통합된 변경 소스에서 다음 명령을 순서대로 실행해 각 실제 종료 0, 양수 검사 수, 필수 사례의 실패·건너뜀·미확정 0을 확인한다.
|
||||
|
||||
```powershell
|
||||
pwsh -NoProfile -File tools/verify.ps1 -Phase EditMode -Milestone Final
|
||||
pwsh -NoProfile -File tools/verify.ps1 -Phase PlayMode -Milestone Final
|
||||
pwsh -NoProfile -File tools/verify.ps1 -Phase AndroidBuild -Milestone Final
|
||||
pwsh -NoProfile -File tools/verify.ps1 -Phase AndroidSmoke -Milestone Final
|
||||
```
|
||||
|
||||
현재 검증 환경은 Unity 6000.6.3f1, API37의 2400×1080 가로 AVD다. 최종 검사 대상 소스·제품 파일 해시·APK SHA·실제 설치본·실행 시각·로그를 같은 실행으로 연결한다. 기존 Final 증거는 재실행 전 별도 위치와 해시로 보존한다. Android 검사의 초기화는 전용 AVD 시험 앱에만 수행하며 실제 사용자 데이터를 지우지 않는다. 검사·Unity Editor·Blender 원본 저장·ADB·녹음의 실행 소유자를 각각 하나로 유지한다.
|
||||
|
||||
전체 30개 정상 진행과 미완료·자유 놀이 복원, 오프라인 음성, 0~10개 공급·반납, 취소·분리 경계는 기존 Final의 실제 사례로 재검증한다. 새 배경에서 수집 구 발견이 실패하면 시각 배치나 적절한 Collider를 수정하고 동일 사례로 다시 검사한다. 평가하지 못한 항목은 미검증과 원인을 남기며 완료로 기록하지 않는다.
|
||||
|
||||
## R09 — 변경 경계와 완료 보고
|
||||
|
||||
이번 작업은 영웅·자연 배경의 시각 품질과 필요한 연결·검증·제작 이력만 변경한다. Core 규칙·진행·저장 재설계, 플랫폼 추가, 광범위한 코드 정리, 새 UI 기능·새 음원·스토어 게시·유료 구매는 포함하지 않는다.
|
||||
|
||||
`docs/asset-register.md`, 관련 제작 결정, `docs/operations.md`, `docs/tracking/status.md`를 실제 채택 결과와 명령·검증 범위에 맞춰 갱신한다. 해결되지 않은 재현 문제는 원인과 영향·가능한 대응을 `docs/tracking/findings.md`에 남긴다. 단순히 실기기 검증이 아직 없다는 사실을 재현 결함으로 등록하지 않는다.
|
||||
|
||||
구 소실·복제, 잘못된 수량, 이어하기 손실·덮어쓰기, 미승인 자산 채택이나 요청하지 않은 외부 전송이 발견되면 관련 변경을 멈추고 증거와 영향을 즉시 알린다. 최종 보고에는 원본·게임용 자산·세 풍경 화면·APK·검증 결과·실기기 미검증 범위를 함께 제공한다.
|
||||
Reference in New Issue
Block a user