[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill:01M6CBNJ3QHA96NXDZCSD7CSGN":3,"skill-same:01M6CBNJ3QHA96NXDZCSD7CSGN":44},{"skillNo":4,"name":5,"nameZh":6,"description":6,"descriptionZh":6,"repositoryFullName":7,"ownerLogin":8,"ownerAvatarUrl":9,"ownerAccountNo":10,"ownerDisplayName":11,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":15,"categories":16,"keywords":17,"publishedAt":19,"linkOnly":20,"markdownContent":21,"markdownBody":21,"frontMatter":22,"refName":23,"commitSha":24,"skillDirectory":25,"forksCount":13,"repositoryHtmlUrl":26,"repositoryHomepageUrl":6,"ownerHtmlUrl":27,"ownerBlogUrl":6,"ownerDescription":28,"updatedAt":29,"install":30,"resources":43},"01M6CBNJ3QHA96NXDZCSD7CSGN","10-achieve-manager",null,"devwinsoft\u002Fdevian","devwinsoft","https:\u002F\u002Favatars.githubusercontent.com\u002Fu\u002F22570160?v=4","01M6C6RR8W05NH8NPKQNCE3Q72","maoshy","01M6C6RRDJ5TJJCZXRTY801YDH",0,"MIT","https:\u002F\u002Fgithub.com\u002Fdevwinsoft\u002Fdevian\u002Fblob\u002Fmain\u002Fskills\u002Fdevian-unity\u002F50-mobile-package\u002F46-achieve-system\u002F10-achieve-manager\u002FSKILL.md",[],[18],"10 achieve manager","2026-11-10 10:12:30",false,"# 10-achieve-manager\n\nStatus: ACTIVE\nAppliesTo: v10\n\nMobilePackage 샘플의 `AchieveManager` 설계 문서다.\n\n---\n\n## Implementation Location (3-path mirror)\n\n| 파일 | UPM (정본) | Packages (sync) | Assets\u002FSamples (import) |\n|---|---|---|---|\n| `AchieveManager.cs` | `upm\u002Fcom.devian.foundation\u002FSamples~\u002FMobilePackage\u002FRuntime\u002FAchieve\u002F` | `Packages\u002Fcom.devian.foundation\u002FSamples~\u002FMobilePackage\u002FRuntime\u002FAchieve\u002F` | `Assets\u002FSamples\u002FDevian Samples\u002F{version}\u002FMobilePackage\u002FRuntime\u002FAchieve\u002F` |\n| `IAchievePlatformAdapter.cs` | 동일 경로 | 동일 경로 | 동일 경로 |\n\n---\n\n## Public API\n\n- `InitializeAsync(ct)` -> `Task\u003CCommonResult>`\n- `RefreshRuntimes()`\n- `GetRuntimeState(achievementId)` -> `MissionRuntimeState`\n- `ClaimAsync(achievementId, ct)` -> `Task\u003CGameResult>`\n- `Notify(msgType)`\n- `Notify(msgType, params object[] args)`\n- `Subcribe(EntityId, ACHIEVE_MESSAGE_TYPE, Handler)`\n- `SubcribeOnce(EntityId, ACHIEVE_MESSAGE_TYPE, Action\u003Cobject[]>)`\n- `UnSubcribe(EntityId)`\n- `UnlockAchievementAsync(achievementId, ct)` -> `Task\u003CCommonResult>`\n- `SyncAsync(ct)` -> `Task\u003CCommonResult>`\n- `ClearStorage()`\n\nEvents:\n- `OnRuntimeInitialized`\n- `OnRuntimeActive`\n- `OnRuntimeProgress`\n- `OnRuntimeClaimable`\n- `OnRuntimeLevelUp`\n- `OnRuntimeRewarded`\n- `OnAchievementUnlocked`\n\n---\n\n## Internal Responsibilities\n\n- `TB_ACHIEVE_SOCIAL` + `TB_ACHIEVE_PASS` 기반 runtime 생성\u002F복구\n- `ACHIEVE_TYPE` 기반 runtime 타입 분기(`AchieveRuntimeSocial`, `AchieveRuntimePass`)\n- `GameMessageManager` 구독 기반 runtime projection 동기화\n- `InventoryManager` 구독 기반 PASS runtime(`req_pass_id`) WAIT 전이 동기화\n- `ACHIEVE_MESSAGE_TYPE` 기반 외부 알림 트리거 publish\n- claim 보상 적용 및 level-up 처리\n- 플랫폼 adapter 연동 (`IAchievePlatformAdapter.cs`: Apple\u002FGoogle\u002FUnsupported)\n\n---\n\n## Hard Rules\n\n- 공개 API는 내부 `achievementId`만 사용\n- 초기화 시 `achieve_id` group 기준 runtime 항상 생성\n- `ACHIEVE_SOCIAL`의 `req_msg_id\u002Freq_value`, `ACHIEVE_PASS`의 `req_pass_id`\u002F`req_season_id` 설정 row는 `WAIT` 시작 후 req 충족 시 `ACTIVE` 전이\n- level-up 시 기존 stat 바인딩을 다음 level row로 교체\n- level-up 시에도 타입별 req 조건을 재평가해 `WAIT\u002FACTIVE` 시작 상태를 결정\n- `req_pass_id`가 있는 PASS runtime은 `InventoryManager` helper 구독으로 Pass 변경 콜백을 받아 재평가한다.\n- 플랫폼 unlock 실패는 claim 전체를 롤백하지 않는다(best-effort)\n- 플랫폼 unlock은 `ACHIEVE_TYPE.ONCE` runtime에만 수행한다.\n- 저장 실패는 claim 실패로 반환한다\n\n---\n\n## Related\n\n- [13-achieve-runtime](..\u002F13-achieve-runtime\u002FSKILL.md)\n- [14-achieve-storage](..\u002F14-achieve-storage\u002FSKILL.md)\n- [15-achieve-message-trigger](..\u002F15-achieve-message-trigger\u002FSKILL.md)\n- [22-inventory-system\u002F16-inventory-message-trigger](..\u002F..\u002F22-inventory-system\u002F16-inventory-message-trigger\u002FSKILL.md)\n",{},"main","8cb5bd877a3a7004867d2f55697cb9e4ff2f1734","skills\u002Fdevian-unity\u002F50-mobile-package\u002F46-achieve-system\u002F10-achieve-manager","https:\u002F\u002Fgithub.com\u002Fdevwinsoft\u002Fdevian","https:\u002F\u002Fgithub.com\u002Fdevwinsoft","Kim Hyong Joon","2026-04-12 18:44:10",{"source":7,"skillName":5,"commands":31,"prompt":41,"zipAvailable":42},[32,35,38],{"tool":33,"command":34},"npx","npx skills add devwinsoft\u002Fdevian --skill 10-achieve-manager",{"tool":36,"command":37},"bunx","bunx skills add devwinsoft\u002Fdevian --skill 10-achieve-manager",{"tool":39,"command":40},"pnpm","pnpm dlx skills add devwinsoft\u002Fdevian --skill 10-achieve-manager","安装技能，技能地址：https:\u002F\u002Fgithub.com\u002Fdevwinsoft\u002Fdevian\u002Fblob\u002Fmain\u002Fskills\u002Fdevian-unity\u002F50-mobile-package\u002F46-achieve-system\u002F10-achieve-manager\u002FSKILL.md",true,[],[45,51,59,67,76,83],{"skillNo":46,"name":47,"nameZh":6,"description":6,"descriptionZh":6,"repositoryFullName":7,"ownerLogin":8,"ownerAvatarUrl":9,"ownerAccountNo":10,"ownerDisplayName":11,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":48,"categories":49,"keywords":50,"publishedAt":19},"01M6CBX3K2JJV38ANHVGCAT8A0","devian","https:\u002F\u002Fgithub.com\u002Fdevwinsoft\u002Fdevian\u002Fblob\u002Fmain\u002Fskills\u002Fdevian\u002FSKILL.md",[],[47],{"skillNo":52,"name":53,"nameZh":6,"description":6,"descriptionZh":6,"repositoryFullName":7,"ownerLogin":8,"ownerAvatarUrl":9,"ownerAccountNo":10,"ownerDisplayName":11,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":54,"categories":55,"keywords":56,"publishedAt":19},"01M6CBX210BFMM8AMN770J9WY8","90-project-archive","https:\u002F\u002Fgithub.com\u002Fdevwinsoft\u002Fdevian\u002Fblob\u002Fmain\u002Fskills\u002Fdevian\u002F80-tools\u002F90-project-archive\u002FSKILL.md",[],[57,58],"archive","90 project archive",{"skillNo":60,"name":61,"nameZh":6,"description":6,"descriptionZh":6,"repositoryFullName":7,"ownerLogin":8,"ownerAvatarUrl":9,"ownerAccountNo":10,"ownerDisplayName":11,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":62,"categories":63,"keywords":64,"publishedAt":19},"01M6CBWZSGRR9R3YJZB3177667","30-env-management","https:\u002F\u002Fgithub.com\u002Fdevwinsoft\u002Fdevian\u002Fblob\u002Fmain\u002Fskills\u002Fdevian\u002F80-tools\u002F30-env-management\u002FSKILL.md",[],[65,66],"management","30 env management",{"skillNo":68,"name":69,"nameZh":6,"description":6,"descriptionZh":6,"repositoryFullName":7,"ownerLogin":8,"ownerAvatarUrl":9,"ownerAccountNo":10,"ownerDisplayName":11,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":70,"categories":71,"keywords":72,"publishedAt":19},"01M6CBWYD3TGWBQV7V35551THF","19-page-push-send","https:\u002F\u002Fgithub.com\u002Fdevwinsoft\u002Fdevian\u002Fblob\u002Fmain\u002Fskills\u002Fdevian\u002F80-tools\u002F20-operation\u002F19-page-push-send\u002FSKILL.md",[],[73,74,75],"push","page","19 page push send",{"skillNo":77,"name":78,"nameZh":6,"description":6,"descriptionZh":6,"repositoryFullName":7,"ownerLogin":8,"ownerAvatarUrl":9,"ownerAccountNo":10,"ownerDisplayName":11,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":79,"categories":80,"keywords":81,"publishedAt":19},"01M6CBWWRQ05A7604GHJKTPJTF","18-page-savedata","https:\u002F\u002Fgithub.com\u002Fdevwinsoft\u002Fdevian\u002Fblob\u002Fmain\u002Fskills\u002Fdevian\u002F80-tools\u002F20-operation\u002F18-page-savedata\u002FSKILL.md",[],[74,82],"18 page savedata",{"skillNo":84,"name":85,"nameZh":6,"description":6,"descriptionZh":6,"repositoryFullName":7,"ownerLogin":8,"ownerAvatarUrl":9,"ownerAccountNo":10,"ownerDisplayName":11,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":86,"categories":87,"keywords":88,"publishedAt":19},"01M6CBWVH4S2VF1V7B2GBTESCT","17-page-deobfuscate","https:\u002F\u002Fgithub.com\u002Fdevwinsoft\u002Fdevian\u002Fblob\u002Fmain\u002Fskills\u002Fdevian\u002F80-tools\u002F20-operation\u002F17-page-deobfuscate\u002FSKILL.md",[],[74,89],"17 page deobfuscate"]