{
 "generated": "2026-09-15T17:52:11+09:00",
 "checklist_sha": "8acae5eb38e0",
 "totals": {
  "items": 312,
  "done": 72,
  "pct": 23,
  "held": 2,
  "stages": 33
 },
 "release": {
  "items": 290,
  "done": 71,
  "pct": 24.5,
  "scope": "1~30단계"
 },
 "blockers": {
  "items": 39,
  "done": 1,
  "pct": 3,
  "left": [
   {
    "stage": 9,
    "text": "Migration 을 한 함수로 모음"
   },
   {
    "stage": 9,
    "text": "저장 실패 시 복구 경로"
   },
   {
    "stage": 9,
    "text": "DataStore 일시 오류 재시도"
   },
   {
    "stage": 9,
    "text": "저장 결과 불명확/중복 호출에도 데이터가 이중 반영되지 않는지 검증"
   },
   {
    "stage": 9,
    "text": "프로필 `schemaVersion` 명시 및 구버전 → 최신 Migration 회귀 테스트"
   },
   {
    "stage": 9,
    "text": "Job 잠금 비정상 종료 후 만료·재접속 복구 실측"
   },
   {
    "stage": 15,
    "text": "지은 이름에 Roblox 텍스트 필터 적용"
   },
   {
    "stage": 19,
    "text": "`ProcessReceipt` 구현"
   },
   {
    "stage": 19,
    "text": "`ProcessReceipt` 재호출·서버 이동·재접속에서도 동일 영수증 중복 지급 0건"
   },
   {
    "stage": 19,
    "text": "구매 처리 실패 시 `NotProcessedYet` 경로와 재처리 결과 검증"
   },
   {
    "stage": 19,
    "text": "구매 취소·플레이어 부재·알 수 없는 ProductId 처리 검증"
   },
   {
    "stage": 20,
    "text": "Server & Clients 4명 입장·퇴장"
   },
   {
    "stage": 20,
    "text": "동시 수령"
   },
   {
    "stage": 20,
    "text": "광장 동시 상호작용"
   },
   {
    "stage": 20,
    "text": "슬롯 회수"
   },
   {
    "stage": 20,
    "text": "늦은 입장/재입장 클라이언트의 월드·펫·시설 상태 동기화"
   },
   {
    "stage": 20,
    "text": "행동 도중 플레이어 퇴장 시 잠금·예약·임시 상태가 남지 않는지 검증"
   },
   {
    "stage": 21,
    "text": "§13.2 Functional 체크리스트 12항"
   },
   {
    "stage": 21,
    "text": "공개 서버 DataStore"
   },
   {
    "stage": 21,
    "text": "Regression 기준선 고정"
   },
   {
    "stage": 21,
    "text": "신규 계정·기존 계정·고진행 계정 3종 테스트 데이터 고정"
   },
   {
    "stage": 21,
    "text": "정상 플레이 30분 동안 의도하지 않은 error 로그 0건 기준 설정"
   },
   {
    "stage": 22,
    "text": "B-1 XP 무한 채굴 차단"
   },
   {
    "stage": 22,
    "text": "B-2 탐험 장식 게이트"
   },
   {
    "stage": 22,
    "text": "C-1·C-2 속도 제한 구멍 둘"
   },
   {
    "stage": 22,
    "text": "C-3 `fuseAll` 인자 검증"
   },
   {
    "stage": 22,
    "text": "거리 검사 신설"
   },
   {
    "stage": 22,
    "text": "Remote 27종 전체에 타입·범위·소유권·쿨다운·거리 검사 적용 여부 표로 감사"
   },
   {
    "stage": 23,
    "text": "기준 저사양 모바일 실기기 1종 확정"
   },
   {
    "stage": 23,
    "text": "성능 합격 기준 수치 확정"
   },
   {
    "stage": 23,
    "text": "기준 실기기에서 첫 입장 시간 측정"
   },
   {
    "stage": 23,
    "text": "펫·장식 최대 예상 배치 상태에서 클라이언트 FPS·메모리 측정"
   },
   {
    "stage": 23,
    "text": "서버 30분 이상 연속 실행 후 메모리 증가 추세 확인"
   },
   {
    "stage": 26,
    "text": "Published 게임의 서버에서 이벤트 발화 확인"
   },
   {
    "stage": 26,
    "text": "Creator Analytics 에서 이벤트 확인"
   },
   {
    "stage": 28,
    "text": "공개 직전 PlaceVersion 기록 및 즉시 되돌릴 이전 정상 버전 지정"
   },
   {
    "stage": 30,
    "text": "출시 직후 모니터링 당번"
   },
   {
    "stage": 30,
    "text": "롤백 담당·대상 PlaceVersion·판단 기준 확정"
   }
  ]
 },
 "milestones": [
  {
   "name": "내부 Alpha",
   "lo": 55,
   "hi": 60,
   "cond": "Core Loop·저장·기본 UI가 동작하고 진행 불능 버그가 없어야 함"
  },
  {
   "name": "Closed Beta",
   "lo": 70,
   "hi": 75,
   "cond": "멀티플레이·데이터 저장·튜토리얼·기본 보안·성능 검증이 시작되어야 함"
  },
  {
   "name": "Soft Launch",
   "lo": 82,
   "hi": 85,
   "cond": "실제 게시 환경의 DataStore·Analytics·멀티플레이·성능·경제 검증을 통과해야 함"
  },
  {
   "name": "Public Release",
   "lo": 90,
   "hi": 90,
   "cond": "아래 출시 차단 항목 100% 완료 + 치명 결함 0건"
  },
  {
   "name": "안정화 완료",
   "lo": 95,
   "hi": 95,
   "cond": "남은 항목이 추가 콘텐츠·문서 정리·출시 후 개선 위주인 상태"
  }
 ],
 "wbs": {
  "total": 44,
  "done": 2,
  "hold": 2
 },
 "gates": [
  {
   "id": "①",
   "name": "기획 승인",
   "status": "조건부 통과",
   "total": 39,
   "done": 22,
   "stages": 5,
   "pct": 56
  },
  {
   "id": "②",
   "name": "MVP 승인",
   "status": "통과",
   "total": 4,
   "done": 1,
   "stages": 1,
   "pct": 25
  },
  {
   "id": "③",
   "name": "기술설계 승인",
   "status": "대기",
   "total": 23,
   "done": 7,
   "stages": 3,
   "pct": 30
  },
  {
   "id": "④",
   "name": "Prototype 승인",
   "status": "미통과 — 다음 게이트",
   "total": 21,
   "done": 4,
   "stages": 3,
   "pct": 19
  },
  {
   "id": "⑤",
   "name": "Vertical Slice 승인",
   "status": "미착수",
   "total": 62,
   "done": 17,
   "stages": 4,
   "pct": 27
  },
  {
   "id": "⑥",
   "name": "Production 승인",
   "status": "미착수",
   "total": 34,
   "done": 7,
   "stages": 2,
   "pct": 21
  },
  {
   "id": "⑦",
   "name": "QA 승인",
   "status": "미착수",
   "total": 60,
   "done": 6,
   "stages": 6,
   "pct": 10
  },
  {
   "id": "⑧",
   "name": "Release 승인",
   "status": "미착수",
   "total": 69,
   "done": 8,
   "stages": 9,
   "pct": 12
  }
 ],
 "stages": [
  {
   "no": 1,
   "name": "아이디어·목표",
   "gate": "①",
   "items": [
    {
     "line": 43,
     "text": "한 줄 정의 확정",
     "note": "기획서 「최종 한 문장」",
     "desc": "게임을 처음 보는 사람도 한 문장만 읽고 핵심 재미와 차별점을 이해할 수 있어야 함. 기획·마케팅·튜토리얼 문구가 이 정의와 충돌하지 않는지 확인.",
     "wbs": null,
     "held": false,
     "blocker": false,
     "done": true
    },
    {
     "line": 45,
     "text": "장르 확정",
     "note": "펫 수집 인크리멘탈",
     "desc": "핵심 플레이가 어떤 장르 문법을 따르는지 고정하는 항목. 이후 기능 추가 시 장르 핵심 재미를 약화시키는 기능인지 판단하는 기준으로 사용.",
     "wbs": null,
     "held": false,
     "blocker": false,
     "done": true
    },
    {
     "line": 47,
     "text": "플랫폼 확정",
     "note": "모바일 중심",
     "desc": "주력 입력 방식·화면 크기·성능 예산을 결정하는 기준. 모바일 중심이면 터치 조작, 작은 화면, 저사양 기기에서의 가독성과 성능을 우선해야 함.",
     "wbs": null,
     "held": false,
     "blocker": false,
     "done": true
    },
    {
     "line": 49,
     "text": "BM 방향 확정",
     "note": "무료 보장 + 편의성·꾸미기",
     "desc": "무료 플레이의 기본 진행을 막지 않으면서 유료 요소의 역할을 명확히 하는 항목. 편의성·꾸미기 중심인지 실제 상품 구성까지 일관성 확인.",
     "wbs": null,
     "held": false,
     "blocker": false,
     "done": true
    },
    {
     "line": 51,
     "text": "타깃 연령대 확정",
     "note": null,
     "desc": "연령대별 이해도·UI 복잡도·텍스트량·수익화 표현을 결정. 한 개의 주 타깃과 보조 타깃을 명시하고 그 근거를 기록하면 완료.",
     "wbs": "G1-02",
     "held": false,
     "blocker": false,
     "done": true
    },
    {
     "line": 53,
     "text": "타깃 국가 확정",
     "note": null,
     "desc": "초기 언어·문화권·접속 시간대·가격 체감·마케팅 채널을 결정. 1차 출시 국가와 차후 확장 국가를 구분해 문서화하면 완료.",
     "wbs": "G1-02",
     "held": false,
     "blocker": false,
     "done": true
    },
    {
     "line": 55,
     "text": "목표 세션 길이 확정",
     "note": null,
     "desc": "한 번 접속했을 때 목표 플레이 시간을 분 단위로 정의. Core Loop 1회전과 일일 콘텐츠 소모 시간이 이 범위 안에 들어오는지 실측해야 함.",
     "wbs": "G1-02",
     "held": false,
     "blocker": false,
     "done": false
    },
    {
     "line": 57,
     "text": "개발 인원·주당 투입시간·Alpha/Beta/Public 목표 일정 명시",
     "note": null,
     "desc": "실제 제작 가능한 범위를 판단하기 위한 생산성 기준. 참여 인원, 주당 시간, 각 출시 단계 목표 날짜를 한 문서에서 확인할 수 있어야 함.",
     "wbs": null,
     "held": false,
     "blocker": false,
     "done": false
    },
    {
     "line": 59,
     "text": "출시 성공 기준 KPI 확정",
     "note": "D1 유지율·튜토리얼 완료율·평균 세션·오류율 등",
     "desc": "출시 후 성공/수정/중단을 판단할 수 있도록 각 KPI의 목표값과 최소 허용값을 수치로 고정해야 함. 단순 '관찰'이 아니라 판단 임계값이 필요.",
     "wbs": null,
     "held": false,
     "blocker": false,
     "done": false
    }
   ],
   "total": 9,
   "done": 6,
   "held": 0,
   "pct": 67
  },
  {
   "no": 2,
   "name": "시장·경쟁작 조사",
   "gate": "①",
   "items": [
    {
     "line": 64,
     "text": "장르별 일일 방문 수치",
     "note": "`data/research/D-01` 119~127행, Newzoo 5행",
     "desc": "시장 규모를 추정하기 위한 기초 자료. 동일 기준일·동일 단위인지 확인하고 자료 날짜가 오래되면 갱신.",
     "wbs": null,
     "held": false,
     "blocker": false,
     "done": true
    },
    {
     "line": 66,
     "text": "상위 10 CCU 표",
     "note": "`D-01` 133~146행, 합계 3.8M",
     "desc": "경쟁 강도와 장르 상한을 보기 위한 항목. CCU 측정 시점과 출처를 함께 유지하고 이벤트성 급등 여부를 구분.",
     "wbs": null,
     "held": false,
     "blocker": false,
     "done": true
    },
    {
     "line": 68,
     "text": "좋아요 비율 실측 1건",
     "note": "`D-02` 196행, Adopt Me 86.2%",
     "desc": "대표 경쟁작의 이용자 만족도 참고값. 단일 작품 수치이므로 시장 평균으로 해석하지 말고 비교용 기준으로만 사용.",
     "wbs": null,
     "held": false,
     "blocker": false,
     "done": true
    },
    {
     "line": 70,
     "text": "펫 장르 상위 5작 × 12항목 표",
     "note": null,
     "desc": "각 작품을 동일한 12개 기준으로 비교해 기능·경제·UX의 공통 패턴과 차별점을 찾는 표를 작성. 빈 칸 없이 5작 모두 채우면 완료.",
     "wbs": "G1-03",
     "held": false,
     "blocker": false,
     "done": false
    },
    {
     "line": 72,
     "text": "경쟁작 첫 5분 관찰 기록",
     "note": "첫 행동·첫 보상·첫 대기·첫 상점 노출 시점",
     "desc": "신규 이용자 온보딩을 직접 비교하는 항목. 첫 행동·보상·대기·상점 노출까지 실제 시간을 초/분 단위로 기록.",
     "wbs": null,
     "held": false,
     "blocker": false,
     "done": false
    },
    {
     "line": 74,
     "text": "경쟁작 상점 구성 조사",
     "note": "상품 유형·가격대·무료/유료 경계·첫 구매 유도 시점",
     "desc": "상품 종류, 가격 구간, 첫 노출 타이밍, 무료 대체 경로를 비교해 과금 압박 수준과 구매 동선을 파악.",
     "wbs": null,
     "held": false,
     "blocker": false,
     "done": false
    },
    {
     "line": 76,
     "text": "경쟁작 재방문 장치 조사",
     "note": "일일 보상·퀘스트·이벤트·수집·소셜",
     "desc": "일일 접속 이유를 만드는 장치를 경쟁작별로 분류. 단순 존재 여부뿐 아니라 해금 시점과 보상 강도도 함께 기록.",
     "wbs": null,
     "held": false,
     "blocker": false,
     "done": false
    },
    {
     "line": 78,
     "text": "경쟁작 썸네일·아이콘 패턴 정리",
     "note": null,
     "desc": "작은 화면에서 무엇이 강조되는지 분석. 캐릭터 크기, 배경 대비, 텍스트 사용, 감정 표현, 색상 패턴을 항목화하면 완료.",
     "wbs": null,
     "held": false,
     "blocker": false,
     "done": false
    }
   ],
   "total": 8,
   "done": 3,
   "held": 0,
   "pct": 38
  },
  {
   "no": 3,
   "name": "콘셉트 확정",
   "gate": "①",
   "items": [
    {
     "line": 83,
     "text": "조형 기준 문서",
     "note": "`design/pet-island-world-concept.md` (09-05 확정)",
     "desc": "맵·건물·색·재질·소품의 생김새 기준. **이름과 달리 세계관 문서가 아니다** — 09-14 실측에서 「세계관·스토리·이야기·서사」 낱말이 0회였다. 서사는 아래 스토리 문서가 맡는다.",
     "wbs": null,
     "held": false,
     "blocker": false,
     "done": true
    },
    {
     "line": 85,
     "text": "메인 스토리 초안",
     "note": "`design/pet-island-story.md` (09-15)",
     "desc": "「바다 건너 온 초대장」. 등불 우편 세 규칙 · 그림책 · 프롤로그~최종장 6장 · 인물 5 · 단서 6종. 11절에 기존 구현과의 대조가 있다. **전부 초안이고 코드 변경 0.**",
     "wbs": null,
     "held": false,
     "blocker": false,
     "done": true
    },
    {
     "line": 87,
     "text": "첫 토끼 이름",
     "note": "**플레이어가 짓는다** (09-15 사용자 결정)",
     "desc": "고정 후보(코코·하루)를 폐기했다. 토끼에게 원래 이름이 없는 것이 설정과 맞물린다 — 이름 없는 토끼가 이름 없는 편지를 띄웠고, 플레이어가 이름을 주는 순간이 이 섬에서 처음 「전해진 마음」이라 그림책 첫 장이 그때 그려진다.",
     "wbs": null,
     "held": false,
     "blocker": false,
     "done": true
    },
    {
     "line": 89,
     "text": "펫 등급 설명 축",
     "note": "**「마음의 깊이」** (09-15 사용자 결정)",
     "desc": "「거리」로 가면 소환 풀을 지역별로 가르는 밸런스 변경이 따라온다. 깊이로 가면 코드 변경 0 이고, 토끼가 커먼이면서 히든인 기존 모순도 풀린다 — 같은 동물이라도 어떤 마음을 타고 왔는지가 다르다. 5단계 표는 스토리 문서 7절.",
     "wbs": null,
     "held": false,
     "blocker": false,
     "done": true
    },
    {
     "line": 91,
     "text": "그림책",
     "note": "**새 UI 로 만든다** (09-15 사용자 결정)",
     "desc": "도감을 확장하지 않는다. 도감은 채워지는 조건이 수량이고 그림책은 「마음이 전해졌을 때」라서, 한 화면에 섞으면 두 규칙이 같은 자리에 놓인다.",
     "wbs": null,
     "held": false,
     "blocker": false,
     "done": true
    },
    {
     "line": 93,
     "text": "등대 제작 여부",
     "note": "**만든다** (09-15 사용자 결정)",
     "desc": "공용 광장에 짓는다. 평소에는 꺼져 있고 최종장에서 켜지는 것이 클라이맥스다. 실제 제작은 14단계 항목이다.",
     "wbs": null,
     "held": false,
     "blocker": false,
     "done": true
    },
    {
     "line": 95,
     "text": "아트 방향 확정",
     "note": "동화풍",
     "desc": "모든 모델·UI·VFX의 시각적 기준점. 색상·형태·재질·복잡도 수준이 '동화풍'이라는 말만으로 모호하지 않도록 세부 규칙과 연결.",
     "wbs": null,
     "held": false,
     "blocker": false,
     "done": true
    },
    {
     "line": 97,
     "text": "Core Pillar 5개 확정",
     "note": null,
     "desc": "게임이 반드시 지켜야 할 핵심 경험 5개를 짧은 문장으로 정의. 기능 하나가 어떤 Pillar를 강화하는지 설명 가능해야 함.",
     "wbs": "G1-01",
     "held": false,
     "blocker": false,
     "done": false
    },
    {
     "line": 99,
     "text": "재방문 콘텐츠 10개를 Core Pillar 하나씩에 매핑",
     "note": null,
     "desc": "재방문 콘텐츠가 핵심 경험과 분리되어 추가되지 않도록 각 콘텐츠를 하나 이상의 Pillar에 연결. 연결 이유까지 기록하면 완료.",
     "wbs": "G1-04",
     "held": false,
     "blocker": false,
     "done": false
    }
   ],
   "total": 9,
   "done": 7,
   "held": 0,
   "pct": 78
  },
  {
   "no": 4,
   "name": "Core Loop",
   "gate": "①",
   "items": [
    {
     "line": 104,
     "text": "1차 루프",
     "note": "수령 → 생산 → 배치 → 탐험 → 도감 (기획서 §2)",
     "desc": "플레이어가 반복하는 최소 행동 순서를 나타냄. 각 단계가 실제 플레이에서 끊김 없이 연결되고 보상 피드백이 있어야 함.",
     "wbs": null,
     "held": false,
     "blocker": false,
     "done": true
    },
    {
     "line": 106,
     "text": "메타 루프 설계",
     "note": "계정 레벨 → 섬 색상·장식 변화, 지름 160 고정 — 기획서 최신 섬 규칙·§5·§13.2 (2026-09-14 문서 대조)",
     "desc": "여러 세션에 걸친 성장 동기를 검증하는 항목. 계정 레벨 상승이 실제 섬 변화나 신규 기능 해금과 연결되는지 확인.",
     "wbs": null,
     "held": false,
     "blocker": false,
     "done": true
    },
    {
     "line": 108,
     "text": "장기 루프",
     "note": "출시 후 로드맵 8단계",
     "desc": "수주~수개월 단위의 장기 목표가 존재하는지 확인. 업데이트 로드맵과 게임 내 장기 성장 목표가 서로 이어져야 함.",
     "wbs": null,
     "held": false,
     "blocker": false,
     "done": true
    },
    {
     "line": 110,
     "text": "루프 1회전 실제 소요 시간 실측",
     "note": null,
     "desc": "신규/중간 진행 계정에서 Core Loop 한 바퀴 시간을 스톱워치로 측정. 대기시간과 메뉴 이동시간까지 포함.",
     "wbs": null,
     "held": false,
     "blocker": false,
     "done": false
    },
    {
     "line": 112,
     "text": "루프 목표 시간 ↔ 실측 시간 차이 기록 및 병목 구간 지목",
     "note": null,
     "desc": "목표값과 실제값을 비교해 가장 오래 걸리거나 반복 피로가 큰 구간을 명시. 차이가 허용 범위 내이거나 개선안이 정해지면 완료.",
     "wbs": null,
     "held": false,
     "blocker": false,
     "done": false
    }
   ],
   "total": 5,
   "done": 3,
   "held": 0,
   "pct": 60
  },
  {
   "no": 5,
   "name": "GDD",
   "gate": "①",
   "items": [
    {
     "line": 117,
     "text": "기획서 본문 13절",
     "note": "`design/pet-island-game-design.md` §1~13 및 출시 후 로드맵 (행 수 대신 절 기준)",
     "desc": "현재 게임 설계의 기준 문서가 존재한다는 의미. 구현 변경 후 GDD가 뒤처지지 않도록 정기적으로 대조.",
     "wbs": null,
     "held": false,
     "blocker": false,
     "done": true
    },
    {
     "line": 119,
     "text": "현재 구현 기준 대조본",
     "note": "09-10",
     "desc": "문서와 실제 빌드의 차이를 추적하는 기준. 대조 날짜와 대상 PlaceVersion을 함께 기록해야 재현 가능.",
     "wbs": null,
     "held": false,
     "blocker": false,
     "done": true
    },
    {
     "line": 121,
     "text": "GDD 08 Character 절 신설",
     "note": null,
     "desc": "플레이어·펫·NPC의 역할, 외형 규칙, 상태, 상호작용, 애니메이션 기준을 한 절에서 설명할 수 있도록 정리. 인물 성격·과거는 `design/pet-island-story.md` 5절에 이미 있으니 그걸 근거로 쓴다.",
     "wbs": null,
     "held": false,
     "blocker": false,
     "done": false
    },
    {
     "line": 123,
     "text": "기획서에 서사 절 신설",
     "note": "「서사 — 메인 스토리」 절 + 머리 확정 변경 블록 (09-15)",
     "desc": "정본은 `design/pet-island-story.md` 로 못 박고 기획서에는 요약만 뒀다. 둘이 갈리면 스토리 문서가 맞다. 「서식지 복구 서사」가 폐기된 개념임을 기획서 쪽에도 적었다.",
     "wbs": null,
     "held": false,
     "blocker": false,
     "done": true
    },
    {
     "line": 125,
     "text": "GDD 07 Economy Source/Sink 표",
     "note": null,
     "desc": "모든 재화 획득처와 소비처를 표로 연결하고 값·주기·제한을 기록. 경제 시뮬레이션의 입력값으로 사용할 수 있어야 함.",
     "wbs": "G6-03",
     "held": false,
     "blocker": false,
     "done": false
    },
    {
     "line": 127,
     "text": "GDD 19 Analytics 이벤트 명세",
     "note": null,
     "desc": "이벤트명, 발생 조건, 필드, 값 타입, 중복 방지 조건, 분석 목적을 표로 작성. 코드 구현자가 해석 없이 구현 가능해야 함.",
     "wbs": "G8-01",
     "held": false,
     "blocker": false,
     "done": false
    },
    {
     "line": 129,
     "text": "`WORKFLOW.md` 5절 대응표 오류 4건 정정",
     "note": "06·12·15·19행",
     "desc": "문서 간 절 번호·기능 대응이 잘못된 항목을 실제 파일과 대조해 수정. 수정 후 링크나 절 번호가 유효한지 재확인.",
     "wbs": null,
     "held": false,
     "blocker": false,
     "done": false
    },
    {
     "line": 131,
     "text": "GDD 변경 이력에 날짜·변경 사유·영향 시스템 기록",
     "note": null,
     "desc": "설계 변경 시 언제·왜·어떤 시스템이 영향받았는지 남기는 항목. 변경마다 날짜와 영향 범위가 기록되어야 완료.",
     "wbs": null,
     "held": false,
     "blocker": false,
     "done": false
    }
   ],
   "total": 8,
   "done": 3,
   "held": 0,
   "pct": 38
  },
  {
   "no": 6,
   "name": "MVP",
   "gate": "②",
   "items": [
    {
     "line": 136,
     "text": "§13 구현 범위표 작성",
     "note": "이전 완료 표시의 직접 근거 미기재; 2026-09-15 재확인 대상으로 전환",
     "desc": "MVP에 포함되는 기능을 고정해 범위 팽창을 막는 기준. 각 기능의 포함/제외 이유와 완료 정의가 있으면 좋음.",
     "wbs": null,
     "held": false,
     "blocker": false,
     "done": false
    },
    {
     "line": 138,
     "text": "게이트 ② 통과",
     "note": "09-10 「현재 구현 기준」 최신화",
     "desc": "현재 구현 범위가 승인 기준을 만족했다는 증거. 승인일과 기준 문서가 남아 있어야 이후 범위 변경을 추적 가능.",
     "wbs": null,
     "held": false,
     "blocker": false,
     "done": true
    },
    {
     "line": 140,
     "text": "§13 표 머리에 「기준 = Astra_test2.rbxl」 명시",
     "note": "현재 게임과 혼동된다",
     "desc": "표의 기준 빌드를 명시해 다른 Place/파일과 혼동하지 않도록 하는 항목. 파일명 또는 PlaceVersion을 표 머리에 고정하면 완료.",
     "wbs": null,
     "held": false,
     "blocker": false,
     "done": false
    },
    {
     "line": 142,
     "text": "MVP 제외 범위 명시",
     "note": "출시 전 하지 않을 기능을 목록으로 고정",
     "desc": "출시 전 하지 않을 기능을 명시해 일정 중 임의 추가를 막음. 제외 항목은 별도 Backlog로 이동하고 MVP 완료율 계산에서 분리.",
     "wbs": null,
     "held": false,
     "blocker": false,
     "done": false
    }
   ],
   "total": 4,
   "done": 1,
   "held": 0,
   "pct": 25
  },
  {
   "no": 7,
   "name": "기술 설계",
   "gate": "③",
   "items": [
    {
     "line": 147,
     "text": "서버 권위 구조",
     "note": "모든 행동이 `Remotes.Action` 한 줄기",
     "desc": "재화·인벤토리·성장 등 중요한 판정은 서버가 최종 결정해야 함. 클라이언트 값만 믿고 상태를 변경하는 경로가 없는지 유지 검증.",
     "wbs": null,
     "held": false,
     "blocker": false,
     "done": true
    },
    {
     "line": 149,
     "text": "`design/architecture.md` 작성",
     "note": "09-12",
     "desc": "현재 코드 구조와 Remote 흐름을 재현할 수 있는 수준의 기술 문서인지 확인. 구조 변경 시 같은 커밋/작업 단위에서 갱신.",
     "wbs": null,
     "held": false,
     "blocker": false,
     "done": true
    },
    {
     "line": 151,
     "text": "Remote 계약 문서화",
     "note": "RemoteFunction 1 + RemoteEvent 1",
     "desc": "Remote 이름, 방향, 인자 타입, 반환값, 실패 조건을 문서로 고정. 서버와 클라이언트가 같은 계약을 사용해야 함.",
     "wbs": null,
     "held": false,
     "blocker": false,
     "done": true
    },
    {
     "line": 153,
     "text": "`architecture.md:52` 「받는 25종」 → **27종** 정정 (같은 줄이 27개를 나열한다)",
     "note": null,
     "desc": "현재 코드 구조와 Remote 흐름을 재현할 수 있는 수준의 기술 문서인지 확인. 구조 변경 시 같은 커밋/작업 단위에서 갱신.",
     "wbs": null,
     "held": false,
     "blocker": false,
     "done": false
    },
    {
     "line": 155,
     "text": "사용자 검토·이의 없음",
     "note": null,
     "desc": "기술 설계에 대해 명시적인 검토가 끝났는지 확인. 보류 이슈가 없거나 보류 사유·후속 작업이 기록되면 완료.",
     "wbs": "G3-01",
     "held": false,
     "blocker": false,
     "done": false
    },
    {
     "line": 157,
     "text": "서버/클라이언트 책임 경계 표 작성",
     "note": "데이터 변경·판정·연출 주체 구분",
     "desc": "데이터 판정은 서버, 입력/표시는 클라이언트 등 책임을 기능별로 표로 정리. 동일 상태를 양쪽에서 따로 계산하는 위험을 줄임.",
     "wbs": null,
     "held": false,
     "blocker": false,
     "done": false
    },
    {
     "line": 159,
     "text": "Remote 실패 응답 규약 확정",
     "note": "잘못된 인자·쿨다운·소유권 실패·서버 오류",
     "desc": "실패 사유를 일관된 코드/형식으로 반환하도록 규약화. 클라이언트가 오류 유형별로 적절한 메시지와 재시도 동작을 할 수 있어야 함.",
     "wbs": null,
     "held": false,
     "blocker": false,
     "done": false
    }
   ],
   "total": 7,
   "done": 3,
   "held": 0,
   "pct": 43
  },
  {
   "no": 8,
   "name": "프로젝트 구조",
   "gate": "③",
   "items": [
    {
     "line": 164,
     "text": "Studio 트리 §8 재편",
     "note": "`asset/workflow-structure-20260912/`",
     "desc": "Explorer 구조가 문서 기준과 일치하고 파일 배치가 예측 가능해야 함. 구조 변경 시 기준 스냅샷도 갱신.",
     "wbs": "G3-02",
     "held": false,
     "blocker": false,
     "done": true
    },
    {
     "line": 166,
     "text": "재편본 저장 확인",
     "note": "09-14 Studio 재시작 후 트리 동일, 해시 22/23 일치",
     "desc": "Studio 재시작 후에도 구조가 유지되는지 확인한 항목. 임시 세션에서만 존재하는 변경이 아닌지 검증하는 증거.",
     "wbs": "G3-03",
     "held": false,
     "blocker": false,
     "done": true
    },
    {
     "line": 168,
     "text": "새 파일 배치 규칙 문서화",
     "note": "`architecture.md` 4절",
     "desc": "새 ModuleScript·Remote·Asset이 어디에 들어갈지 규칙을 고정. 팀원이 임의 위치에 추가하지 않도록 예외 기준도 포함.",
     "wbs": null,
     "held": false,
     "blocker": false,
     "done": true
    },
    {
     "line": 170,
     "text": "`GameService` 를 기능별 서비스로 분할",
     "note": null,
     "desc": "현재는 보류 항목. 분리 필요성이 커지는 조건(파일 길이, 책임 수, 변경 충돌 등)을 정해두면 추후 재평가가 쉬움.",
     "wbs": "G6-04",
     "held": true,
     "blocker": false,
     "done": false
    }
   ],
   "total": 3,
   "done": 3,
   "held": 1,
   "pct": 100
  },
  {
   "no": 9,
   "name": "데이터 구조",
   "gate": "③",
   "items": [
    {
     "line": 175,
     "text": "프로필 스키마",
     "note": "`S.New()` + `Ensure()` 백필",
     "desc": "신규 계정의 기본 데이터와 기존 계정의 누락 필드 보완이 안정적으로 동작해야 함. 필드 추가 시 기본값이 명시되어야 함.",
     "wbs": null,
     "held": false,
     "blocker": false,
     "done": true
    },
    {
     "line": 177,
     "text": "60초 자동 저장",
     "note": "이전 완료 표시의 직접 근거 미기재; 2026-09-15 재확인 대상으로 전환",
     "desc": "장시간 플레이 중 데이터 손실 범위를 제한하는 장치. 저장 호출이 너무 겹치거나 예산을 초과하지 않는지도 함께 확인.",
     "wbs": null,
     "held": false,
     "blocker": false,
     "done": false
    },
    {
     "line": 179,
     "text": "종료 시 저장",
     "note": "이전 완료 표시의 직접 근거 미기재; 2026-09-15 재확인 대상으로 전환",
     "desc": "PlayerRemoving/BindToClose 등 종료 경로에서 마지막 변경을 저장하는지 확인. 종료 시간 제한 안에 완료되지 못할 경우의 처리도 필요.",
     "wbs": null,
     "held": false,
     "blocker": false,
     "done": false
    },
    {
     "line": 181,
     "text": "Job 잠금 180초",
     "note": "이전 완료 표시의 직접 근거 미기재; 2026-09-15 재확인 대상으로 전환",
     "desc": "동일 프로필을 여러 서버가 동시에 수정하지 못하도록 하는 장치. 정상 이동·비정상 종료·잠금 만료 각각의 동작을 검증.",
     "wbs": null,
     "held": false,
     "blocker": false,
     "done": false
    },
    {
     "line": 183,
     "text": "재접속 경로",
     "note": "이전 완료 표시의 직접 근거 미기재; 2026-09-15 재확인 대상으로 전환",
     "desc": "끊김 후 다시 들어왔을 때 최신 데이터가 로드되고 잠금 때문에 장시간 막히지 않는지 확인.",
     "wbs": null,
     "held": false,
     "blocker": false,
     "done": false
    },
    {
     "line": 185,
     "text": "Migration 을 한 함수로 모음",
     "note": null,
     "desc": "스키마 변경 로직을 한곳에서 순서대로 실행해 누락을 막음. 버전별 Migration과 실패 로그가 추적 가능해야 함.",
     "wbs": "G3-04",
     "held": false,
     "blocker": true,
     "done": false
    },
    {
     "line": 187,
     "text": "Studio DataStore 스텁",
     "note": "지금은 `db` 가 nil 이라 회귀 테스트를 못 붙인다",
     "desc": "Studio에서도 저장/로드 성공·실패·충돌 시나리오를 재현할 수 있는 테스트 대역을 만들어 회귀 테스트 가능하게 하는 항목.",
     "wbs": "G7-11",
     "held": false,
     "blocker": false,
     "done": false
    },
    {
     "line": 189,
     "text": "저장 실패 시 복구 경로",
     "note": "현재 warn 한 줄뿐",
     "desc": "단순 warn이 아니라 재시도, 사용자 안내, 세션 데이터 보호, 종료 시 처리 등 복구 흐름이 있어야 함.",
     "wbs": "G7-15",
     "held": false,
     "blocker": true,
     "done": false
    },
    {
     "line": 191,
     "text": "저장 API 사용 기준 확정",
     "note": "충돌 가능 쓰기는 `UpdateAsync`, 단순 생성/교체만 별도 허용",
     "desc": "동시 쓰기 충돌 가능성이 있는 데이터는 안전한 갱신 패턴을 사용하도록 코드 규칙을 고정. 예외 사용처는 문서화.",
     "wbs": null,
     "held": false,
     "blocker": false,
     "done": false
    },
    {
     "line": 193,
     "text": "DataStore 일시 오류 재시도",
     "note": "최대 횟수·지수 백오프·jitter·중단 조건 명시",
     "desc": "일시 장애에 즉시 포기하지 않되 무한 재시도도 하지 않도록 최대 횟수와 간격을 명시. 실패 후 사용자 상태도 정의.",
     "wbs": null,
     "held": false,
     "blocker": true,
     "done": false
    },
    {
     "line": 195,
     "text": "저장 결과 불명확/중복 호출에도 데이터가 이중 반영되지 않는지 검증",
     "note": null,
     "desc": "같은 저장/보상 요청이 두 번 실행돼도 재화·아이템이 중복 증가하지 않는지 idempotency 관점에서 검증.",
     "wbs": null,
     "held": false,
     "blocker": true,
     "done": false
    },
    {
     "line": 197,
     "text": "프로필 `schemaVersion` 명시 및 구버전 → 최신 Migration 회귀 테스트",
     "note": null,
     "desc": "프로필 버전을 명시하고 과거 샘플 데이터를 최신 형식으로 변환하는 자동 테스트를 통과해야 함.",
     "wbs": null,
     "held": false,
     "blocker": true,
     "done": false
    },
    {
     "line": 199,
     "text": "Job 잠금 비정상 종료 후 만료·재접속 복구 실측",
     "note": null,
     "desc": "서버가 강제 종료된 상황을 가정해 잠금이 만료되고 정상 재접속 가능한지 실제 시간 기준으로 측정.",
     "wbs": null,
     "held": false,
     "blocker": true,
     "done": false
    }
   ],
   "total": 13,
   "done": 1,
   "held": 0,
   "pct": 8
  },
  {
   "no": 10,
   "name": "Greybox",
   "gate": "④",
   "items": [
    {
     "line": 204,
     "text": "Part 기반 월드",
     "note": "Workspace BasePart 639 (09-14 실측)",
     "desc": "Greybox 단계의 공간 규모와 이동 동선을 검증하기 위한 상태. 이후 아트 교체 시 Part 수와 충돌 구조가 크게 악화되지 않도록 비교.",
     "wbs": null,
     "held": false,
     "blocker": false,
     "done": true
    },
    {
     "line": 206,
     "text": "섬 10개 · 광장 · 부두",
     "note": "이전 완료 표시의 직접 근거 미기재; 2026-09-15 재확인 대상으로 전환",
     "desc": "핵심 지역 수와 연결 구조가 계획대로 존재하는지 확인. 각 섬의 역할과 접근 조건이 중복되지 않는지도 검토.",
     "wbs": null,
     "held": false,
     "blocker": false,
     "done": false
    },
    {
     "line": 208,
     "text": "동화풍 색·조명",
     "note": "09-10",
     "desc": "Greybox에서도 최종 분위기를 조기에 검증하기 위한 기준. 낮/밤/날씨 변화에서도 가독성이 유지되는지 확인.",
     "wbs": null,
     "held": false,
     "blocker": false,
     "done": true
    },
    {
     "line": 210,
     "text": "이동 불가 지형·끼임·낙하·카메라 가림 주요 동선 점검",
     "note": null,
     "desc": "주요 이동 경로에서 끼임, 낙하, 점프 악용, 카메라 차폐를 직접 플레이해 확인. 재현 가능한 문제는 위치와 좌표를 기록.",
     "wbs": null,
     "held": false,
     "blocker": false,
     "done": false
    }
   ],
   "total": 4,
   "done": 2,
   "held": 0,
   "pct": 50
  },
  {
   "no": 11,
   "name": "Core Prototype",
   "gate": "④",
   "items": [
    {
     "line": 215,
     "text": "먹이 → 성장 → 보상 루프가 돈다",
     "note": "이전 완료 표시의 직접 근거 미기재; 2026-09-15 재확인 대상으로 전환",
     "desc": "최소 핵심 재미가 실제로 한 사이클 돌아가는지 확인한 항목. 각 단계에 명확한 입력·피드백·보상이 있어야 함.",
     "wbs": null,
     "held": false,
     "blocker": false,
     "done": false
    },
    {
     "line": 217,
     "text": "Play 26행동 통과",
     "note": "`asset/workflow-structure-20260912/after/play-verification.txt`",
     "desc": "정해진 26개 행동이 현재 빌드에서 성공했다는 회귀 기준. 시스템 수정 후 같은 스크립트/절차를 다시 통과해야 함.",
     "wbs": null,
     "held": false,
     "blocker": false,
     "done": true
    },
    {
     "line": 219,
     "text": "**사용자 15분 플레이 판정**",
     "note": null,
     "desc": "개발자가 개입하지 않고 실제 사용자가 15분 플레이한 뒤 이해도·재미·막힘 여부를 기록. 치명적 막힘이 없고 핵심 루프를 이해하면 통과.",
     "wbs": "G4-01",
     "held": false,
     "blocker": false,
     "done": false
    },
    {
     "line": 221,
     "text": "첫 5분 실측",
     "note": "첫 소환·첫 강화·첫 탐험 소요 시간",
     "desc": "신규 이용자 기준으로 첫 소환·강화·탐험까지 걸리는 시간을 기록. 목표값을 초과하면 어느 화면/행동에서 지연됐는지 같이 남김.",
     "wbs": "G4-02",
     "held": false,
     "blocker": false,
     "done": false
    },
    {
     "line": 223,
     "text": "개발자 설명 없이 신규 사용자가 핵심 루프를 1회 완주하는지 관찰",
     "note": null,
     "desc": "튜토리얼과 UI만으로 핵심 루프를 이해할 수 있는지 검증. 관찰자는 답을 알려주지 않고 막힌 지점만 기록.",
     "wbs": null,
     "held": false,
     "blocker": false,
     "done": false
    }
   ],
   "total": 5,
   "done": 1,
   "held": 0,
   "pct": 20
  },
  {
   "no": 12,
   "name": "Vertical Slice",
   "gate": "⑤",
   "items": [
    {
     "line": 228,
     "text": "맵 1개가 걸어 다닐 수 있다",
     "note": "이전 완료 표시의 직접 근거 미기재; 2026-09-15 재확인 대상으로 전환",
     "desc": "Vertical Slice에서 탐색 가능한 완성형 공간이 최소 하나 있어야 함. 이동·상호작용·카메라·조명이 함께 동작하는지 확인.",
     "wbs": null,
     "held": false,
     "blocker": false,
     "done": false
    },
    {
     "line": 230,
     "text": "펫 35종 데이터",
     "note": "`Config.Pets` 35 (09-14 실측)",
     "desc": "데이터 정의 수와 실제 게임에서 참조 가능한 수가 일치해야 함. 중복 ID, 누락 아이콘/모델 참조가 없는지도 확인.",
     "wbs": null,
     "held": false,
     "blocker": false,
     "done": true
    },
    {
     "line": 232,
     "text": "장식 5 · 시설 5 · 타일 3",
     "note": "이전 완료 표시의 직접 근거 미기재; 2026-09-15 재확인 대상으로 전환",
     "desc": "배치·저장·로드·상호작용을 검증할 최소 콘텐츠 세트. 각 종류가 실제 UI와 월드에서 사용 가능해야 함.",
     "wbs": null,
     "held": false,
     "blocker": false,
     "done": false
    },
    {
     "line": 234,
     "text": "낚시 프로토타입 범위 기록",
     "note": "물고기 20 · 보물 10 · 일일 50회 — 기획서 §6.9 현재 구현 경계; 동행 펫·보물 도감은 제외",
     "desc": "`낚시`을 실제 Studio 플레이 또는 대표 기기에서 직접 확인. 시각적으로 존재하는 것만이 아니라 입력→처리→피드백→저장/복구까지 이어지는지 검증.",
     "wbs": null,
     "held": false,
     "blocker": false,
     "done": true
    },
    {
     "line": 236,
     "text": "방문자 의뢰 3 · 펫 부탁 3",
     "note": "이전 완료 표시의 직접 근거 미기재; 2026-09-15 재확인 대상으로 전환",
     "desc": "NPC 의뢰와 펫 부탁이 실제로 수락→진행→완료→보상 흐름을 갖는지 확인. 반복 시 상태 초기화도 검증.",
     "wbs": null,
     "held": false,
     "blocker": false,
     "done": false
    },
    {
     "line": 238,
     "text": "튜토리얼 성장 안내 8단계",
     "note": "이전 완료 표시의 직접 근거 미기재; 2026-09-15 재확인 대상으로 전환",
     "desc": "8단계가 순서대로 진행되고 각 단계의 트리거·보상·완료 표시가 정확한지 확인.",
     "wbs": null,
     "held": false,
     "blocker": false,
     "done": false
    },
    {
     "line": 240,
     "text": "반응형 UI",
     "note": "가로모드 분기 (09-13, `asset/responsive-ui-20260913/`)",
     "desc": "가로모드 분기 존재 자체뿐 아니라 실제 화면 크기에서 정보 우선순위가 유지되는지 확인. 단순 축소만으로 끝내지 않음.",
     "wbs": null,
     "held": false,
     "blocker": false,
     "done": true
    },
    {
     "line": 242,
     "text": "모달 뒤 입력 차단",
     "note": "`ContextActionService` (09-13, `asset/ui-guide-pass/`)",
     "desc": "모달이 열린 동안 뒤쪽 버튼·월드 조작이 실행되지 않아야 함. 닫힌 직후 입력이 정상 복구되는지도 확인.",
     "wbs": null,
     "held": false,
     "blocker": false,
     "done": true
    },
    {
     "line": 244,
     "text": "토스트 겹침 수정 코드 존재",
     "note": "모달 푸터 확보 — `asset/ui-toast-fix/after.luau`; 화면 회귀 검증은 §16 미완료 항목으로 분리",
     "desc": "알림이 모달 버튼이나 중요한 정보를 가리지 않도록 레이아웃 공간이 확보되었는지 다양한 길이의 문구로 확인.",
     "wbs": null,
     "held": false,
     "blocker": false,
     "done": true
    },
    {
     "line": 246,
     "text": "사운드 4종",
     "note": "UI 클릭·수령·소환·입질",
     "desc": "각 행동에 대응하는 효과음을 넣고 중복 재생·과도한 음량·지연이 없는지 확인. Settings 음량과도 연동되어야 함.",
     "wbs": "G5-02",
     "held": false,
     "blocker": false,
     "done": false
    },
    {
     "line": 248,
     "text": "VFX 2종",
     "note": "소환 연출·변이",
     "desc": "소환과 변이가 구분되는 시각 피드백을 제공해야 함. 저사양 기기에서 과도한 파티클/투명도 비용이 없는지도 확인.",
     "wbs": "G5-03",
     "held": false,
     "blocker": false,
     "done": false
    },
    {
     "line": 250,
     "text": "펫 모델 3종이 게임에 보인다",
     "note": null,
     "desc": "데이터만 존재하는 것이 아니라 실제 소환·배치·애니메이션 상태로 게임 화면에 보여야 완료.",
     "wbs": "G5-01",
     "held": false,
     "blocker": false,
     "done": false
    },
    {
     "line": 252,
     "text": "Device Emulator 3해상도 검수",
     "note": null,
     "desc": "지정된 3개 해상도에서 HUD·탭·모달·스크롤·입력 영역을 전부 확인하고 잘림/겹침 0건을 목표로 함.",
     "wbs": "G5-04",
     "held": false,
     "blocker": false,
     "done": false
    },
    {
     "line": 254,
     "text": "「실제 게임처럼 보이는가」 사용자 판정",
     "note": null,
     "desc": "외부 사용자에게 Vertical Slice를 보여주고 임시 프로토타입이 아니라 하나의 제품처럼 느껴지는지 평가. 부족한 요소를 구체적으로 기록.",
     "wbs": "G5-05",
     "held": false,
     "blocker": false,
     "done": false
    },
    {
     "line": 256,
     "text": "최초 입장 → 조작 가능까지 로딩 흐름 점검",
     "note": "빈 화면·멈춤·중복 UI 없음",
     "desc": "로딩 중 빈 화면, 중복 UI, 조작 불능 구간을 점검. 첫 입력 가능 시점과 전체 초기화 완료 시점을 구분해 기록하면 좋음.",
     "wbs": null,
     "held": false,
     "blocker": false,
     "done": false
    }
   ],
   "total": 15,
   "done": 5,
   "held": 0,
   "pct": 33
  },
  {
   "no": 13,
   "name": "아트 스타일",
   "gate": "⑤",
   "items": [
    {
     "line": 261,
     "text": "공통 조형 규칙",
     "note": "`world-concept.md` §1",
     "desc": "형태·비율·모서리·재질·색상 같은 공통 시각 규칙이 문서화돼 있어 신규 에셋 제작자가 그대로 적용할 수 있어야 함.",
     "wbs": null,
     "held": false,
     "blocker": false,
     "done": true
    },
    {
     "line": 263,
     "text": "토끼 PBR·털",
     "note": "09-11",
     "desc": "대표 펫 한 종에서 재질·털 표현의 기술 기준을 검증한 상태. 다른 펫으로 확장할 때 성능과 일관성 기준으로 사용.",
     "wbs": null,
     "held": false,
     "blocker": false,
     "done": true
    },
    {
     "line": 265,
     "text": "같은 규칙을 나머지 9종에 적용",
     "note": null,
     "desc": "대표 토끼와 동일한 비율·재질·색상·실루엣 원칙을 각 펫에 적용하고 예외가 있으면 이유를 기록.",
     "wbs": null,
     "held": false,
     "blocker": false,
     "done": false
    },
    {
     "line": 267,
     "text": "펫 실루엣·눈/얼굴 비율·재질·색상 팔레트 공통 기준표 고정",
     "note": null,
     "desc": "멀리서 보거나 작은 아이콘으로 봐도 종별 구분이 가능하도록 실루엣·얼굴 비율·팔레트를 기준표로 고정.",
     "wbs": null,
     "held": false,
     "blocker": false,
     "done": false
    }
   ],
   "total": 4,
   "done": 2,
   "held": 0,
   "pct": 50
  },
  {
   "no": 14,
   "name": "에셋 생산",
   "gate": "⑥",
   "items": [
    {
     "line": 272,
     "text": "Tripo FBX 10종 디스크 보유",
     "note": "`Pet world/` (09-02~03)",
     "desc": "원본 파일이 실제로 존재하고 열 수 있는지 확인한 자산 재고 항목. 파일명과 최종 사용 모델의 대응 관계를 유지.",
     "wbs": null,
     "held": false,
     "blocker": false,
     "done": true
    },
    {
     "line": 274,
     "text": "토끼 리토폴로지",
     "note": "이전 완료 표시의 직접 근거 미기재; 2026-09-15 재확인 대상으로 전환",
     "desc": "게임용 폴리곤 수와 변형 품질을 맞춘 상태인지 확인. 리깅 후 관절 변형이 깨지지 않는 토폴로지인지도 검증.",
     "wbs": null,
     "held": false,
     "blocker": false,
     "done": false
    },
    {
     "line": 276,
     "text": "토끼 리깅",
     "note": "Bone 25개",
     "desc": "필요한 동작을 표현할 Bone 구조와 가중치가 준비된 상태. 극단 포즈에서 메쉬 찢김·관절 붕괴가 없는지 확인.",
     "wbs": null,
     "held": false,
     "blocker": false,
     "done": true
    },
    {
     "line": 278,
     "text": "본 애니메이션 2클립",
     "note": "15fps, `Bone.Transform` 직접 재생 (에셋 업로드 불필요)",
     "desc": "실제 재생 경로에서 두 클립이 끊김 없이 재생되고 프레임 비용이 허용 범위인지 확인.",
     "wbs": null,
     "held": false,
     "blocker": false,
     "done": true
    },
    {
     "line": 280,
     "text": "토끼 Studio 템플릿 진입",
     "note": "`Assets.RabbitRiggedTemplate`",
     "desc": "모델·리그·애니메이션 참조가 Studio 자산 구조에 들어와 재사용 가능한 상태. 복제 후에도 참조가 깨지지 않아야 함.",
     "wbs": null,
     "held": false,
     "blocker": false,
     "done": true
    },
    {
     "line": 282,
     "text": "고양이 Studio 진입",
     "note": null,
     "desc": "고양이 모델이 Studio 구조에 들어오고 소환·애니메이션·충돌·스케일을 실제 게임에서 확인하면 완료.",
     "wbs": "G5-01",
     "held": false,
     "blocker": false,
     "done": false
    },
    {
     "line": 284,
     "text": "여우 Studio 진입",
     "note": null,
     "desc": "여우 모델이 Studio 구조에 들어오고 소환·애니메이션·충돌·스케일을 실제 게임에서 확인하면 완료.",
     "wbs": "G5-01",
     "held": false,
     "blocker": false,
     "done": false
    },
    {
     "line": 286,
     "text": "나머지 7종 Studio 진입",
     "note": null,
     "desc": "각 펫을 동일한 템플릿 규격으로 수입하고 누락 모델·애니메이션·아이콘 참조가 없는지 전수 확인.",
     "wbs": "G6-01",
     "held": false,
     "blocker": false,
     "done": false
    },
    {
     "line": 288,
     "text": "환경 소품 10종",
     "note": null,
     "desc": "최종 아트 스타일을 반영한 소품 10종을 Studio에 배치해 스케일·충돌·성능을 검증.",
     "wbs": "G6-02",
     "held": false,
     "blocker": false,
     "done": false
    },
    {
     "line": 290,
     "text": "등대 제작",
     "note": "`Plaza.Lighthouse` (0,−56) · 파트 17 · 높이 40.5 (09-15) — `asset/lighthouse-20260915/`",
     "desc": "조형 규칙 안에서 만들었다 — 재질 여섯·팔레트 17색·반사 없음. **유리 금지라 등실에 창이 없고 나무 기둥 사이가 뚫려 있다.** 겹침 0건 · BasePart 639→656 · 코드 해시 4개 전후 동일(코드 변경 0). 등불은 꺼진 채로 두었다.",
     "wbs": null,
     "held": false,
     "blocker": false,
     "done": true
    },
    {
     "line": 292,
     "text": "등대 점등 연출",
     "note": "최종장 클라이맥스",
     "desc": "`Lamp.LampLight.Enabled` 와 `Lighthouse` 의 `LightOn` 속성을 켜면 된다. **언제 켜는지가 최종장 진행 조건**이라 그림책 UI 가 정해진 뒤에 붙인다.",
     "wbs": null,
     "held": false,
     "blocker": false,
     "done": false
    },
    {
     "line": 294,
     "text": "등대 프롬프트에 서버 핸들러 연결",
     "note": null,
     "desc": "`Door.StoryPrompt`(「그림책 보기」)가 지금 아무것도 안 한다. 붙이려면 `Main` 에 액션이 하나 늘고 그건 코드 변경이다. 그림책 UI 와 같이 한다.",
     "wbs": null,
     "held": false,
     "blocker": false,
     "done": false
    },
    {
     "line": 296,
     "text": "등대를 `Modules.World` 에도 넣을지 판단",
     "note": null,
     "desc": "지금은 저장본에만 있다. `Main:17` 이 `MeadowWorld` 가 없을 때만 `W.Build()` 를 부르므로 평소엔 문제없지만, **누가 `MeadowWorld` 를 지우면 등대 없는 월드가 새로 만들어진다.** `World` 는 보안 감사 밖(33%)이라 손대는 판단을 따로 한다.",
     "wbs": null,
     "held": false,
     "blocker": false,
     "done": false
    },
    {
     "line": 298,
     "text": "Package 등록 · 재사용 2곳",
     "note": null,
     "desc": "반복 사용하는 에셋을 Package로 묶고 최소 2곳에서 같은 원본을 재사용. 업데이트 전파가 정상인지도 확인.",
     "wbs": null,
     "held": false,
     "blocker": false,
     "done": false
    },
    {
     "line": 300,
     "text": "에셋 공통 규격 확정",
     "note": "이름·스케일·Pivot·Collision·Material·텍스처 크기",
     "desc": "이름·스케일·Pivot·Collision·Material·텍스처 해상도를 수치와 규칙으로 문서화해 수입 품질 편차를 줄임.",
     "wbs": null,
     "held": false,
     "blocker": false,
     "done": false
    },
    {
     "line": 302,
     "text": "펫/환경 에셋 폴리곤·텍스처 예산을 기기 성능 기준과 연결",
     "note": null,
     "desc": "펫/환경의 최대 복잡도를 저사양 모바일 성능 목표와 연결. 한 개가 아니라 화면 동시 노출 수 기준으로 예산을 잡아야 함.",
     "wbs": null,
     "held": false,
     "blocker": false,
     "done": false
    },
    {
     "line": 304,
     "text": "「남은 9종」 명단 정리",
     "note": "강아지·곰·사슴·양·수달은 **원본 0개**, 두더지·너구리·다람쥐·흰족제비·늑대는 원본이 있는데 명단에 없다",
     "desc": "원본 보유 여부와 계획 목록이 서로 모순되는 부분을 정리. 최종 제작 대상 9종을 단일 목록으로 확정해야 함.",
     "wbs": null,
     "held": false,
     "blocker": false,
     "done": false
    }
   ],
   "total": 17,
   "done": 5,
   "held": 0,
   "pct": 29
  },
  {
   "no": 15,
   "name": "시스템 개발",
   "gate": "⑤",
   "items": [
    {
     "line": 309,
     "text": "Player · Inventory · Item",
     "note": "이전 완료 표시의 직접 근거 미기재; 2026-09-15 재확인 대상으로 전환",
     "desc": "플레이어 데이터, 인벤토리, 아이템 흐름이 연결되어 정상 추가·사용·저장·로드되는지 회귀 테스트 기준을 유지.",
     "wbs": null,
     "held": false,
     "blocker": false,
     "done": false
    },
    {
     "line": 311,
     "text": "NPC 방문자",
     "note": "`DailyLife`",
     "desc": "방문자 생성·대화·의뢰·퇴장 흐름이 정상이며 재접속/날짜 변경 시 상태가 꼬이지 않는지 확인.",
     "wbs": null,
     "held": false,
     "blocker": false,
     "done": true
    },
    {
     "line": 313,
     "text": "Quest · 성장 안내",
     "note": "이전 완료 표시의 직접 근거 미기재; 2026-09-15 재확인 대상으로 전환",
     "desc": "퀘스트 조건, 진행 카운트, 완료 보상, 중복 지급 방지까지 서버 기준으로 검증.",
     "wbs": null,
     "held": false,
     "blocker": false,
     "done": false
    },
    {
     "line": 315,
     "text": "Economy · Shop",
     "note": "꾸미기 상인",
     "desc": "상점 가격·구매 조건·재화 차감·아이템 지급이 원자적으로 처리되고 실패 시 일부만 반영되지 않아야 함.",
     "wbs": null,
     "held": false,
     "blocker": false,
     "done": true
    },
    {
     "line": 317,
     "text": "Interaction",
     "note": "ProximityPrompt 52개 (09-14 실측)",
     "desc": "52개 ProximityPrompt의 거리·키/터치 입력·중복 활성화·가림 문제를 주요 기기에서 확인.",
     "wbs": null,
     "held": false,
     "blocker": false,
     "done": true
    },
    {
     "line": 319,
     "text": "Level · XP",
     "note": "이전 완료 표시의 직접 근거 미기재; 2026-09-15 재확인 대상으로 전환",
     "desc": "XP 획득→레벨업→보상/해금 흐름을 경계값에서 검증. 한 번의 큰 XP 획득으로 여러 레벨을 넘을 때도 정상이어야 함.",
     "wbs": null,
     "held": false,
     "blocker": false,
     "done": false
    },
    {
     "line": 321,
     "text": "Save",
     "note": "DataStore",
     "desc": "`Save`을 실제 Studio 플레이 또는 대표 기기에서 직접 확인. 시각적으로 존재하는 것만이 아니라 입력→처리→피드백→저장/복구까지 이어지는지 검증.",
     "wbs": null,
     "held": false,
     "blocker": false,
     "done": true
    },
    {
     "line": 323,
     "text": "Tutorial",
     "note": "이전 완료 표시의 직접 근거 미기재; 2026-09-15 재확인 대상으로 전환",
     "desc": "튜토리얼 단계·보상·재접속 복구가 전체 흐름에서 정상이라는 의미. 관련 변경 시 17단계 테스트를 재실행.",
     "wbs": null,
     "held": false,
     "blocker": false,
     "done": false
    },
    {
     "line": 325,
     "text": "낚시",
     "note": "`Fishing`",
     "desc": "`낚시`을 실제 Studio 플레이 또는 대표 기기에서 직접 확인. 시각적으로 존재하는 것만이 아니라 입력→처리→피드백→저장/복구까지 이어지는지 검증.",
     "wbs": null,
     "held": false,
     "blocker": false,
     "done": true
    },
    {
     "line": 327,
     "text": "펫 놀이·사진첩",
     "note": "`PetMoments`",
     "desc": "상호작용 결과가 사진첩/기록 데이터에 정확히 남고 중복·누락이 없는지 확인.",
     "wbs": null,
     "held": false,
     "blocker": false,
     "done": true
    },
    {
     "line": 329,
     "text": "바닥 타일",
     "note": "이전 완료 표시의 직접 근거 미기재; 2026-09-15 재확인 대상으로 전환",
     "desc": "배치, 회전/위치, 저장, 재로드, 충돌/장식과의 겹침이 정상인지 확인.",
     "wbs": null,
     "held": false,
     "blocker": false,
     "done": false
    },
    {
     "line": 331,
     "text": "Settings 화면",
     "note": null,
     "desc": "사용자가 게임 내 오디오·연출 등 주요 설정을 조절할 화면을 구현. 값은 세션 또는 프로필에 의도대로 유지되어야 함.",
     "wbs": null,
     "held": false,
     "blocker": false,
     "done": false
    },
    {
     "line": 333,
     "text": "그림책",
     "note": "메인 스토리 진행 **새 UI** (09-15 확정)",
     "desc": "장이 채워지는 조건은 수량 달성이 아니라 「누군가의 마음이 전달됐을 때」다. 단서 6종을 그림책에 귀속시켜 인벤토리를 늘리지 않는다. 도감과 섞지 않는다 — 도감은 수량으로 열린다.",
     "wbs": null,
     "held": false,
     "blocker": false,
     "done": false
    },
    {
     "line": 335,
     "text": "첫 토끼 이름 짓기",
     "note": "플레이어 입력 UI",
     "desc": "프롤로그의 첫 상호작용이다. 길이 상한·빈 문자열·공백만 입력을 막고, 다시 짓기를 허용할지 정한다. 이름을 주면 그림책 첫 장이 그려지는 것이 설정상 같은 사건이다.",
     "wbs": null,
     "held": false,
     "blocker": false,
     "done": false
    },
    {
     "line": 337,
     "text": "지은 이름에 Roblox 텍스트 필터 적용",
     "note": "서버에서만",
     "desc": "이름이 광장·랭킹·친구 섬에서 남에게 보이므로 사용자 생성 텍스트다. `TextService:FilterStringAsync` → `GetNonChatStringForBroadcastAsync` 를 서버에서 부른다. **호출이 실패하면 이름을 저장하지 않는다** — 거르지 않은 문자열을 내보내면 심사에서 걸린다(28단계 Compliance 와 이어짐).",
     "wbs": null,
     "held": false,
     "blocker": true,
     "done": false
    },
    {
     "line": 339,
     "text": "펫 이름 필드 저장 + `Ensure()` 백필",
     "note": null,
     "desc": "프로필에 필드를 추가하면 기존 계정이 `nil` 을 만나 죽는다. 백필을 같이 넣는다. 지금 시작 펫 이름이 `\" 토끼\"`(앞 공백)라 표시 경로도 함께 손본다.",
     "wbs": null,
     "held": false,
     "blocker": false,
     "done": false
    },
    {
     "line": 341,
     "text": "장별 대화와 진행 상태 저장",
     "note": null,
     "desc": "프롤로그~최종장 6장의 진행 단계를 프로필에 남긴다. 필드를 늘리면 `Ensure()` 백필을 같이 넣는다 — 기존 계정이 nil 을 만나면 죽는다.",
     "wbs": null,
     "held": false,
     "blocker": false,
     "done": false
    },
    {
     "line": 343,
     "text": "Achievement",
     "note": null,
     "desc": "업적 조건·진행·보상·중복 달성을 정의하고 서버에서 판정. 출시 필수가 아니면 MVP 제외 여부를 명시.",
     "wbs": null,
     "held": false,
     "blocker": false,
     "done": false
    },
    {
     "line": 345,
     "text": "Settings 최소 항목 확정",
     "note": "BGM·SFX·연출 감소 등 게임 자체 설정",
     "desc": "최소 BGM·SFX·연출 감소의 의미와 기본값을 정하고 실제 설정 화면/저장 데이터와 연결.",
     "wbs": null,
     "held": false,
     "blocker": false,
     "done": false
    },
    {
     "line": 347,
     "text": "낚시 동행 펫 보너스",
     "note": null,
     "desc": "보너스 계산 조건과 배율을 서버에서 검증하고 UI 표시값과 실제 보상이 일치해야 함.",
     "wbs": "G6-05",
     "held": false,
     "blocker": false,
     "done": false
    },
    {
     "line": 349,
     "text": "낚시 보물 도감 등록 시점 확정",
     "note": "출시 전과 M+3 중 구현 시점 단일화",
     "desc": "보물 획득 시 도감 등록이 누락 없이 발생하고 재획득 시 중복 카운트 규칙이 의도대로 동작해야 함.",
     "wbs": "G6-05",
     "held": false,
     "blocker": false,
     "done": false
    },
    {
     "line": 351,
     "text": "Combat",
     "note": null,
     "desc": "현재 의도적 보류 기능. 다른 시스템이 Combat 존재를 전제로 하지 않도록 의존성을 확인하고 출시 범위에서 제외.",
     "wbs": null,
     "held": true,
     "blocker": false,
     "done": false
    },
    {
     "line": 354,
     "text": "기본 꽃·나무 회수·빈 공간 재사용·보관 재설치·중복 환불 방지 검증",
     "note": "기획서 최신 꾸미기 규칙",
     "desc": "2026-09-14 기획서 대조 보강. 대상 빌드·기대 결과·검증 로그를 남긴 후 완료 처리하며 문서 감사만으로 실행 통과를 인정하지 않는다.",
     "wbs": null,
     "held": false,
     "blocker": false,
     "done": false
    },
    {
     "line": 357,
     "text": "무료 타일 3종·맵 기본 흙길/잔디 재질 일치·장식 독립층·저장 보존 검증",
     "note": "최신 타일 규칙",
     "desc": "2026-09-14 기획서 대조 보강. 대상 빌드·기대 결과·검증 로그를 남긴 후 완료 처리하며 문서 감사만으로 실행 통과를 인정하지 않는다.",
     "wbs": null,
     "held": false,
     "blocker": false,
     "done": false
    },
    {
     "line": 360,
     "text": "상인 라라 5종 가격·거리·잔고·보관 지급·내 섬 설치 검증",
     "note": "상단 2026-09-11 규칙",
     "desc": "2026-09-14 기획서 대조 보강. 대상 빌드·기대 결과·검증 로그를 남긴 후 완료 처리하며 문서 감사만으로 실행 통과를 인정하지 않는다.",
     "wbs": null,
     "held": false,
     "blocker": false,
     "done": false
    },
    {
     "line": 363,
     "text": "개인 섬10·지름160/공용400·이웃 중심거리400·줌12~30·레벨 경계 장식 보존 검증",
     "note": "§10.1·§13.2",
     "desc": "2026-09-14 기획서 대조 보강. 대상 빌드·기대 결과·검증 로그를 남긴 후 완료 처리하며 문서 감사만으로 실행 통과를 인정하지 않는다.",
     "wbs": null,
     "held": false,
     "blocker": false,
     "done": false
    },
    {
     "line": 366,
     "text": "방문자 UTC 전환·주간 도장 이월·돌봄일 중복 방지·복귀 보고 중복 수령 방지 검증",
     "note": "§12.5~12.6",
     "desc": "2026-09-14 기획서 대조 보강. 대상 빌드·기대 결과·검증 로그를 남긴 후 완료 처리하며 문서 감사만으로 실행 통과를 인정하지 않는다.",
     "wbs": null,
     "held": false,
     "blocker": false,
     "done": false
    },
    {
     "line": 369,
     "text": "시간대·날씨·사진첩 최신 기준 정합화",
     "note": "4시간대 이력과 후속9시간대/10날씨 대조; 사진첩12기록 보존",
     "desc": "2026-09-14 기획서 대조 보강. 대상 빌드·기대 결과·검증 로그를 남긴 후 완료 처리하며 문서 감사만으로 실행 통과를 인정하지 않는다.",
     "wbs": null,
     "held": false,
     "blocker": false,
     "done": false
    }
   ],
   "total": 27,
   "done": 6,
   "held": 1,
   "pct": 22
  },
  {
   "no": 16,
   "name": "UI/UX",
   "gate": "⑤",
   "items": [
    {
     "line": 374,
     "text": "핵심 메뉴 5개 + 상세 메뉴·HUD 구조 코드",
     "note": "`asset/ui-guide-pass/final.luau` (생산·펫·탐험·꾸미기·메뉴); Studio 저장본 일치 재확인 필요",
     "desc": "현재 주요 정보 구조가 구현된 상태. 탭 간 이동 시 상태 보존, 중복 모달, 뒤로가기 동작을 계속 회귀 검증.",
     "wbs": null,
     "held": false,
     "blocker": false,
     "done": true
    },
    {
     "line": 376,
     "text": "꾸미기 편집기",
     "note": "이전 완료 표시의 직접 근거 미기재; 2026-09-15 재확인 대상으로 전환",
     "desc": "배치·이동·회전·취소·확정·저장/로드가 모두 이어지는지 확인. 모바일 드래그와 카메라 조작 충돌도 중요.",
     "wbs": null,
     "held": false,
     "blocker": false,
     "done": false
    },
    {
     "line": 378,
     "text": "화면 폭별 모달·5버튼 메뉴 크기 계산 코드",
     "note": "`asset/ui-guide-pass/final.luau`; 이전 책갈피/8탭 기록과 구분",
     "desc": "화면 폭에 따라 내비게이션 방식이 바뀌어도 동일 기능에 접근 가능하고 현재 탭 표시가 유지되어야 함.",
     "wbs": null,
     "held": false,
     "blocker": false,
     "done": true
    },
    {
     "line": 380,
     "text": "가로모드 분기",
     "note": "09-13",
     "desc": "분기 코드 존재뿐 아니라 실제 대표 해상도에서 요소 위치·크기·입력 영역이 적절한지 확인.",
     "wbs": null,
     "held": false,
     "blocker": false,
     "done": true
    },
    {
     "line": 382,
     "text": "UI 가 코드 생성",
     "note": "StarterGui 비어 있음 (설계 선택)",
     "desc": "`UI 가 코드 생성`을 실제 Studio 플레이 또는 대표 기기에서 직접 확인. 시각적으로 존재하는 것만이 아니라 입력→처리→피드백→저장/복구까지 이어지는지 검증.",
     "wbs": null,
     "held": false,
     "blocker": false,
     "done": true
    },
    {
     "line": 384,
     "text": "3해상도 검수",
     "note": "375×667 · 768×1024 · 1920×1080",
     "desc": "지정 해상도 각각에서 모든 주요 화면을 확인하고 스크린샷/결함 목록을 남김. 한 화면만 확인해서는 완료 처리하지 않음.",
     "wbs": "G5-04",
     "held": false,
     "blocker": false,
     "done": false
    },
    {
     "line": 386,
     "text": "09-13 UI 작업 3건 문서화",
     "note": "세 `asset/` 폴더에 README 가 없다",
     "desc": "각 asset 폴더에 변경 목적, 대상 파일, 검증 결과, 되돌리는 방법을 README로 남기면 완료.",
     "wbs": null,
     "held": false,
     "blocker": false,
     "done": false
    },
    {
     "line": 388,
     "text": "기획서 §2.2의 7탭·이전 8탭 ↔ 최신 5개 핵심 메뉴+상세 메뉴 정합화",
     "note": null,
     "desc": "기획서와 실제 UI 숫자를 일치시키고 어느 쪽이 기준인지 명확히 함. Analytics/튜토리얼 등 참조 문서도 함께 확인.",
     "wbs": null,
     "held": false,
     "blocker": false,
     "done": false
    },
    {
     "line": 390,
     "text": "터치 입력 검수",
     "note": "주요 버튼 오터치·스크롤 충돌·드래그 중 UI 입력 충돌 없음",
     "desc": "작은 버튼 오터치, 스크롤과 드래그 충돌, 월드 조작과 UI 조작의 동시 입력을 실제 터치로 점검.",
     "wbs": null,
     "held": false,
     "blocker": false,
     "done": false
    },
    {
     "line": 392,
     "text": "모바일 Safe Area·노치·상단바 침범 검수",
     "note": null,
     "desc": "노치·상단바·기기별 안전 영역 때문에 중요한 버튼이나 재화 표시가 가려지지 않아야 함.",
     "wbs": null,
     "held": false,
     "blocker": false,
     "done": false
    },
    {
     "line": 394,
     "text": "Roblox 선호 텍스트 크기 확대 시 잘림·겹침 없음",
     "note": null,
     "desc": "사용자가 텍스트 크기를 키웠을 때 줄바꿈·버튼 높이·스크롤이 대응하고 정보가 잘리지 않아야 함.",
     "wbs": null,
     "held": false,
     "blocker": false,
     "done": false
    },
    {
     "line": 396,
     "text": "번역으로 문자열 길이가 늘어나도 버튼·탭·모달 잘림·겹침 없음",
     "note": null,
     "desc": "긴 언어 문자열을 가정해 UI가 깨지지 않는지 확인. AutoSize/줄바꿈/최대 폭 정책을 화면별로 점검.",
     "wbs": null,
     "held": false,
     "blocker": false,
     "done": false
    },
    {
     "line": 398,
     "text": "마우스/키보드와 터치에서 동일 기능 접근 가능 여부 확인",
     "note": null,
     "desc": "주요 기능이 특정 입력 장치에만 묶이지 않는지 확인. 모바일 중심이어도 PC에서 기능 접근이 막히면 안 됨.",
     "wbs": null,
     "held": false,
     "blocker": false,
     "done": false
    },
    {
     "line": 401,
     "text": "모달 알림 푸터 짧은/긴 문구·연속 알림·소멸 후 본문 복구 검수",
     "note": "asset/ui-toast-fix/",
     "desc": "2026-09-14 기획서 대조 보강. 대상 빌드·기대 결과·검증 로그를 남긴 후 완료 처리하며 문서 감사만으로 실행 통과를 인정하지 않는다.",
     "wbs": null,
     "held": false,
     "blocker": false,
     "done": false
    },
    {
     "line": 404,
     "text": "전체 메뉴·내 정보의 상세 재화/접속시간 접근 및 닫기 후 입력 복구 검수",
     "note": "asset/ui-guide-pass/",
     "desc": "2026-09-14 기획서 대조 보강. 대상 빌드·기대 결과·검증 로그를 남긴 후 완료 처리하며 문서 감사만으로 실행 통과를 인정하지 않는다.",
     "wbs": null,
     "held": false,
     "blocker": false,
     "done": false
    },
    {
     "line": 407,
     "text": "UI 가이드 잔여 범위 결정",
     "note": "진행도 바·독립 정렬·전용 아이콘·전환 애니메이션",
     "desc": "2026-09-14 기획서 대조 보강. 대상 빌드·기대 결과·검증 로그를 남긴 후 완료 처리하며 문서 감사만으로 실행 통과를 인정하지 않는다.",
     "wbs": null,
     "held": false,
     "blocker": false,
     "done": false
    }
   ],
   "total": 16,
   "done": 4,
   "held": 0,
   "pct": 25
  },
  {
   "no": 17,
   "name": "튜토리얼",
   "gate": "④",
   "items": [
    {
     "line": 412,
     "text": "공용 등대 개인별 점등·동시 진행·늦은 입장·재접속 계약 확정",
     "note": null,
     "desc": "개인 진행을 다른 플레이어의 엔딩으로 덮어쓰거나 노출하지 않도록 표시 범위를 정한다. 공용 모델 제작과 서버 전체 점등 승인은 다르다.",
     "wbs": null,
     "held": false,
     "blocker": false,
     "done": false
    },
    {
     "line": 414,
     "text": "필수 편지 단서 비확률 획득 경로·중복 방지·기존 보물 연결 확정",
     "note": null,
     "desc": "old_letter 랜덤 보물 보유로 메인 진행을 잠그지 않는다. 확정 지급 또는 대체 활동의 구체 경로는 미결이다.",
     "wbs": null,
     "held": false,
     "blocker": false,
     "done": false
    },
    {
     "line": 417,
     "text": "성장 안내 8단계",
     "note": "`Config.JourneyGoals`",
     "desc": "각 단계의 트리거가 실제 행동과 연결되고 다음 단계로 정확히 진행되는지 확인. 완료된 단계가 되돌아가지 않아야 함.",
     "wbs": null,
     "held": false,
     "blocker": false,
     "done": true
    },
    {
     "line": 419,
     "text": "시작 퀘스트 3",
     "note": "이전 완료 표시의 직접 근거 미기재; 2026-09-15 재확인 대상으로 전환",
     "desc": "신규 플레이어가 첫 핵심 행동을 자연스럽게 배우도록 3개 퀘스트 순서와 보상을 검증.",
     "wbs": null,
     "held": false,
     "blocker": false,
     "done": false
    },
    {
     "line": 421,
     "text": "체험 소환권 지급 경로",
     "note": "이전 완료 표시의 직접 근거 미기재; 2026-09-15 재확인 대상으로 전환",
     "desc": "지급 조건, 수량, 인벤토리 반영, 사용 후 차감이 정확하고 중복 지급되지 않아야 함.",
     "wbs": null,
     "held": false,
     "blocker": false,
     "done": false
    },
    {
     "line": 423,
     "text": "첫 5분 실측",
     "note": null,
     "desc": "신규 이용자 기준으로 첫 소환·강화·탐험까지 걸리는 시간을 기록. 목표값을 초과하면 어느 화면/행동에서 지연됐는지 같이 남김.",
     "wbs": "G4-02",
     "held": false,
     "blocker": false,
     "done": false
    },
    {
     "line": 425,
     "text": "신규 계정 소환권 정수 0 + 소수 0.4 및 계정당 체험 지원 1장 경로 검증",
     "note": null,
     "desc": "기획서 §1.1·§12.5 기준. 과거 원본 8장을 직접 지급하도록 되돌리지 않는다. 기존 계정도 지원 미수령이면 1회 대상이며 재접속·연타 시 중복 지급이 없어야 함.",
     "wbs": "G7-07",
     "held": false,
     "blocker": false,
     "done": false
    },
    {
     "line": 427,
     "text": "튜토리얼 중 이탈·재접속 시 진행 단계와 지급 보상이 중복/유실되지 않는지 검증",
     "note": null,
     "desc": "각 단계에서 강제 종료/재접속을 반복해 진행 상태와 지급 보상이 정확히 복구되는지 확인.",
     "wbs": null,
     "held": false,
     "blocker": false,
     "done": false
    },
    {
     "line": 429,
     "text": "튜토리얼 UI를 닫거나 순서를 벗어나도 진행 불능 상태가 생기지 않는지 검증",
     "note": null,
     "desc": "사용자가 안내를 닫거나 예상과 다른 순서로 행동해도 진행 불능/보상 누락이 생기지 않아야 함.",
     "wbs": null,
     "held": false,
     "blocker": false,
     "done": false
    },
    {
     "line": 432,
     "text": "신규 토끼1마리·첫 시설 배치·기존 펫 보존 검증",
     "note": "§1.1",
     "desc": "2026-09-14 기획서 대조 보강. 대상 빌드·기대 결과·검증 로그를 남긴 후 완료 처리하며 문서 감사만으로 실행 통과를 인정하지 않는다.",
     "wbs": null,
     "held": false,
     "blocker": false,
     "done": false
    },
    {
     "line": 435,
     "text": "시작 퀘스트 이전 보상 수령 조건·다음 목표 표시·선행 행동 누적 검증",
     "note": "§2.1",
     "desc": "2026-09-14 기획서 대조 보강. 대상 빌드·기대 결과·검증 로그를 남긴 후 완료 처리하며 문서 감사만으로 실행 통과를 인정하지 않는다.",
     "wbs": null,
     "held": false,
     "blocker": false,
     "done": false
    },
    {
     "line": 438,
     "text": "단일/일괄 합성 배치 재료·필터·연속 합성·히든 허용 의도 검증",
     "note": "§13.1~13.2",
     "desc": "2026-09-14 기획서 대조 보강. 대상 빌드·기대 결과·검증 로그를 남긴 후 완료 처리하며 문서 감사만으로 실행 통과를 인정하지 않는다.",
     "wbs": null,
     "held": false,
     "blocker": false,
     "done": false
    }
   ],
   "total": 12,
   "done": 1,
   "held": 0,
   "pct": 8
  },
  {
   "no": 18,
   "name": "경제",
   "gate": "⑥",
   "items": [
    {
     "line": 443,
     "text": "보상 배율 범위 문서 확정",
     "note": "기획서 최신 적용 규칙·§6.1: 코인/일반 자원 25%, 일반 소환권/토큰 5%, 먹이 제작 100%; 출석·온라인 소환권·체험 지원 예외",
     "desc": "25%/5%/100% 값이 어떤 상황에 적용되는지 문서와 코드가 일치해야 함. 중첩 순서와 반올림 규칙도 확인.",
     "wbs": null,
     "held": false,
     "blocker": false,
     "done": true
    },
    {
     "line": 445,
     "text": "낚시 경제 분석",
     "note": "일일 50회 상한",
     "desc": "일일 상한이 전체 경제에서 차지하는 비중을 확인한 항목. 보상표 변경 시 다시 계산.",
     "wbs": null,
     "held": false,
     "blocker": false,
     "done": true
    },
    {
     "line": 447,
     "text": "Source / Sink 표",
     "note": null,
     "desc": "`Source / Sink 표`의 값과 규칙을 서버 기준으로 고정하고 중복 지급·재화 팽창·구매 실패 같은 경제적 예외를 포함해 시뮬레이션 또는 실측으로 검증.",
     "wbs": "G6-03",
     "held": false,
     "blocker": false,
     "done": false
    },
    {
     "line": 449,
     "text": "100레벨까지 코인 누적 시뮬레이션",
     "note": null,
     "desc": "레벨별 평균 플레이 가정을 두고 총 유입·소모·잔액을 시뮬레이션. 특정 구간에서 재화가 과잉/고갈되는지 확인.",
     "wbs": "G6-03",
     "held": false,
     "blocker": false,
     "done": false
    },
    {
     "line": 451,
     "text": "코인 sink 부족 구간 지목",
     "note": "현재 sink 가 시설 강화뿐",
     "desc": "시설 강화 외 소비처가 충분한지 레벨 구간별로 판단. 잔액이 계속 증가하는 시점을 지목하고 추가 sink 필요성을 결정.",
     "wbs": null,
     "held": false,
     "blocker": false,
     "done": false
    },
    {
     "line": 453,
     "text": "배율 경로 6곳 통일 여부 결정",
     "note": null,
     "desc": "같은 배율 규칙이 여러 코드 경로에서 다르게 계산되지 않도록 단일 규칙/함수로 통일할지 결정.",
     "wbs": "G7-07",
     "held": false,
     "blocker": false,
     "done": false
    },
    {
     "line": 455,
     "text": "신규/중간/후반 구간별 시간당 코인 유입·소모량 비교",
     "note": null,
     "desc": "신규·중간·후반 계정의 실제 시간당 획득/소비량을 동일 시간 기준으로 비교해 성장 속도 왜곡을 찾음.",
     "wbs": null,
     "held": false,
     "blocker": false,
     "done": false
    },
    {
     "line": 457,
     "text": "장기 미접속·일일 상한·보상 중첩 시 경제가 비정상 팽창하지 않는지 시뮬레이션",
     "note": null,
     "desc": "오프라인 보상, 일일 제한, 이벤트 보상이 겹치는 최악 조건에서도 재화가 폭증하지 않는지 시뮬레이션.",
     "wbs": null,
     "held": false,
     "blocker": false,
     "done": false
    },
    {
     "line": 460,
     "text": "출석 UTC·같은 날 재접속·누적5일마다 소환권3장·월 변경 검증",
     "note": "§6.2",
     "desc": "2026-09-14 기획서 대조 보강. 대상 빌드·기대 결과·검증 로그를 남긴 후 완료 처리하며 문서 감사만으로 실행 통과를 인정하지 않는다.",
     "wbs": null,
     "held": false,
     "blocker": false,
     "done": false
    },
    {
     "line": 463,
     "text": "온라인 10/30/50분 코인25·20/40/60분 소환권1·당일 재접속·UTC 초기화·중복 방지 검증",
     "note": "§6.3",
     "desc": "2026-09-14 기획서 대조 보강. 대상 빌드·기대 결과·검증 로그를 남긴 후 완료 처리하며 문서 감사만으로 실행 통과를 인정하지 않는다.",
     "wbs": null,
     "held": false,
     "blocker": false,
     "done": false
    },
    {
     "line": 466,
     "text": "오프라인 0/6/6시간 초과·50%·월 변경·친구/세션 보너스 제외 검증",
     "note": "§6.4",
     "desc": "2026-09-14 기획서 대조 보강. 대상 빌드·기대 결과·검증 로그를 남긴 후 완료 처리하며 문서 감사만으로 실행 통과를 인정하지 않는다.",
     "wbs": null,
     "held": false,
     "blocker": false,
     "done": false
    },
    {
     "line": 469,
     "text": "생산 수령 이중25% 방지·소수 보상 누적·도감 절반/완성 중복 수령 방지 검증",
     "note": "§6.1·§13.2",
     "desc": "2026-09-14 기획서 대조 보강. 대상 빌드·기대 결과·검증 로그를 남긴 후 완료 처리하며 문서 감사만으로 실행 통과를 인정하지 않는다.",
     "wbs": null,
     "held": false,
     "blocker": false,
     "done": false
    },
    {
     "line": 472,
     "text": "강화/제작 ×100 부분 실행·시설20레벨·펫150마리 상한 검증",
     "note": "§6.7~6.8·§13.2",
     "desc": "2026-09-14 기획서 대조 보강. 대상 빌드·기대 결과·검증 로그를 남긴 후 완료 처리하며 문서 감사만으로 실행 통과를 인정하지 않는다.",
     "wbs": null,
     "held": false,
     "blocker": false,
     "done": false
    },
    {
     "line": 475,
     "text": "친구·월 출석·세션 보너스 기획/구현 차이 결정",
     "note": "§6.6/기존§6.7의 3%/10%·31%/30%·3시간15%/100분100%",
     "desc": "2026-09-14 기획서 대조 보강. 대상 빌드·기대 결과·검증 로그를 남긴 후 완료 처리하며 문서 감사만으로 실행 통과를 인정하지 않는다.",
     "wbs": null,
     "held": false,
     "blocker": false,
     "done": false
    },
    {
     "line": 478,
     "text": "낚시 물고기20종·등급별5종·등급 내 균등 확률·판매가·판매 배율 제외 검증",
     "note": "§6.9",
     "desc": "2026-09-14 기획서 대조 보강. 대상 빌드·기대 결과·검증 로그를 남긴 후 완료 처리하며 문서 감사만으로 실행 통과를 인정하지 않는다.",
     "wbs": null,
     "held": false,
     "blocker": false,
     "done": false
    },
    {
     "line": 481,
     "text": "낚시 입질3~8초·입력2초·조기/늦은 탭 실패·일50회·UTC/재접속 검증",
     "note": "§6.9",
     "desc": "2026-09-14 기획서 대조 보강. 대상 빌드·기대 결과·검증 로그를 남긴 후 완료 처리하며 문서 감사만으로 실행 통과를 인정하지 않는다.",
     "wbs": null,
     "held": false,
     "blocker": false,
     "done": false
    },
    {
     "line": 484,
     "text": "보물 회당1%·임시 등급가중치 최종 승인·보물 도감 연동 검증",
     "note": "§6.9; 임시60/28/10/2를 확정값으로 취급하지 않음",
     "desc": "2026-09-14 기획서 대조 보강. 대상 빌드·기대 결과·검증 로그를 남긴 후 완료 처리하며 문서 감사만으로 실행 통과를 인정하지 않는다.",
     "wbs": null,
     "held": false,
     "blocker": false,
     "done": false
    }
   ],
   "total": 17,
   "done": 2,
   "held": 0,
   "pct": 12
  },
  {
   "no": 19,
   "name": "수익화",
   "gate": "⑧",
   "items": [
    {
     "line": 489,
     "text": "수익화 기획",
     "note": "기획서 §11",
     "desc": "판매 대상과 무료 플레이 경계를 문서로 갖춘 상태. 구현 단계에서 실제 상품이 이 원칙을 벗어나지 않는지 검증.",
     "wbs": null,
     "held": false,
     "blocker": false,
     "done": true
    },
    {
     "line": 491,
     "text": "상품 ID 등록",
     "note": null,
     "desc": "Creator Dashboard의 실제 상품 ID를 코드/설정에 연결하고 테스트 환경과 운영 환경 ID를 혼동하지 않도록 관리.",
     "wbs": null,
     "held": false,
     "blocker": false,
     "done": false
    },
    {
     "line": 493,
     "text": "`ProcessReceipt` 구현",
     "note": "현재 `MarketplaceService` 언급 0회",
     "desc": "``ProcessReceipt` 구현`의 값과 규칙을 서버 기준으로 고정하고 중복 지급·재화 팽창·구매 실패 같은 경제적 예외를 포함해 시뮬레이션 또는 실측으로 검증.",
     "wbs": null,
     "held": false,
     "blocker": true,
     "done": false
    },
    {
     "line": 495,
     "text": "구매 데이터 스키마",
     "note": null,
     "desc": "영수증 ID, 상품, 지급 상태, 지급 시점 등 중복 지급 방지에 필요한 최소 데이터를 정의.",
     "wbs": null,
     "held": false,
     "blocker": false,
     "done": false
    },
    {
     "line": 497,
     "text": "유료 소환이 무료와 같은 풀인지 코드로 확인",
     "note": null,
     "desc": "무료/유료 소환 풀과 확률이 의도대로 같은지 다른지 코드와 UI 설명을 대조. 플레이어 오해가 없도록 표시.",
     "wbs": null,
     "held": false,
     "blocker": false,
     "done": false
    },
    {
     "line": 499,
     "text": "`ProcessReceipt` 재호출·서버 이동·재접속에서도 동일 영수증 중복 지급 0건",
     "note": null,
     "desc": "같은 Receipt가 여러 번 전달되는 상황을 재현해 보상은 정확히 한 번만 지급되어야 함.",
     "wbs": null,
     "held": false,
     "blocker": true,
     "done": false
    },
    {
     "line": 501,
     "text": "구매 처리 실패 시 `NotProcessedYet` 경로와 재처리 결과 검증",
     "note": null,
     "desc": "일시 실패 시 완료로 잘못 처리하지 않고 재시도를 허용하는 경로를 검증. 이후 성공했을 때 한 번만 지급되어야 함.",
     "wbs": null,
     "held": false,
     "blocker": true,
     "done": false
    },
    {
     "line": 503,
     "text": "구매 취소·플레이어 부재·알 수 없는 ProductId 처리 검증",
     "note": null,
     "desc": "플레이어가 없거나 상품 ID가 잘못된 경우, 취소/오류 상황에서 재화가 임의 지급되지 않고 로그가 남아야 함.",
     "wbs": null,
     "held": false,
     "blocker": true,
     "done": false
    },
    {
     "line": 505,
     "text": "구매 이력/지급 상태를 사용자 데이터와 분리해 추적할지 결정",
     "note": null,
     "desc": "프로필 데이터와 영수증 처리 상태를 어떻게 분리/보관할지 결정해 데이터 손상이나 롤백 시 추적 가능하게 함.",
     "wbs": null,
     "held": false,
     "blocker": false,
     "done": false
    }
   ],
   "total": 9,
   "done": 1,
   "held": 0,
   "pct": 11
  },
  {
   "no": 20,
   "name": "멀티플레이 테스트",
   "gate": "⑦",
   "items": [
    {
     "line": 510,
     "text": "Server & Clients 4명 입장·퇴장",
     "note": null,
     "desc": "Studio 멀티클라이언트 또는 테스트 서버에서 4명이 반복 입장·퇴장해 슬롯·상태·데이터가 누수 없이 정리되는지 확인.",
     "wbs": "G7-02",
     "held": false,
     "blocker": true,
     "done": false
    },
    {
     "line": 512,
     "text": "동시 수령",
     "note": null,
     "desc": "같은 시점에 여러 플레이어가 보상을 수령해도 각자의 보상이 정확하고 중복/경합 문제가 없어야 함.",
     "wbs": "G7-02",
     "held": false,
     "blocker": true,
     "done": false
    },
    {
     "line": 514,
     "text": "광장 동시 상호작용",
     "note": null,
     "desc": "같은 NPC/상호작용 지점을 여러 명이 동시에 사용해도 상태가 서로 덮어쓰이지 않는지 검증.",
     "wbs": "G7-02",
     "held": false,
     "blocker": true,
     "done": false
    },
    {
     "line": 516,
     "text": "친구 생산 보너스 계산 일치",
     "note": null,
     "desc": "서버 계산 결과와 클라이언트 표시가 모든 참가자에게 동일하며 입장/퇴장 직후에도 즉시 갱신되어야 함.",
     "wbs": "G7-02",
     "held": false,
     "blocker": false,
     "done": false
    },
    {
     "line": 518,
     "text": "서버 랭킹 갱신",
     "note": null,
     "desc": "점수 변경 후 정렬·표시·동점 처리·퇴장 반영이 일정 주기 안에 정확히 갱신되어야 함.",
     "wbs": null,
     "held": false,
     "blocker": false,
     "done": false
    },
    {
     "line": 520,
     "text": "슬롯 회수",
     "note": "C-7 은 퇴장 후 최대 13초 고착",
     "desc": "퇴장 후 점유 슬롯이 허용 시간 안에 반환되는지 측정. 현재 최대 13초 고착 원인을 제거하거나 허용 기준을 명시.",
     "wbs": "G7-15",
     "held": false,
     "blocker": true,
     "done": false
    },
    {
     "line": 522,
     "text": "늦은 입장/재입장 클라이언트의 월드·펫·시설 상태 동기화",
     "note": null,
     "desc": "이미 진행 중인 서버에 들어온 플레이어가 현재 월드 상태를 완전하게 받아야 함. 기본값으로 되돌아간 오브젝트가 없어야 함.",
     "wbs": null,
     "held": false,
     "blocker": true,
     "done": false
    },
    {
     "line": 524,
     "text": "행동 도중 플레이어 퇴장 시 잠금·예약·임시 상태가 남지 않는지 검증",
     "note": null,
     "desc": "수령·배치·거래 같은 처리 중 퇴장해도 잠금/예약 상태가 남지 않고 다른 플레이어 진행을 막지 않아야 함.",
     "wbs": null,
     "held": false,
     "blocker": true,
     "done": false
    },
    {
     "line": 526,
     "text": "지연 환경에서 동시 행동 중복 처리 검증",
     "note": "인위적 latency 적용",
     "desc": "인위적인 latency에서 버튼 연타·동시 요청을 재현해 서버가 중복 요청을 한 번만 처리하는지 확인.",
     "wbs": null,
     "held": false,
     "blocker": false,
     "done": false
    }
   ],
   "total": 9,
   "done": 0,
   "held": 0,
   "pct": 0
  },
  {
   "no": 21,
   "name": "QA",
   "gate": "⑦",
   "items": [
    {
     "line": 531,
     "text": "단일 클라이언트 Play 26행동",
     "note": "이전 완료 표시의 직접 근거 미기재; 2026-09-15 재확인 대상으로 전환",
     "desc": "정해진 26개 행동이 현재 빌드에서 성공했다는 회귀 기준. 시스템 수정 후 같은 스크립트/절차를 다시 통과해야 함.",
     "wbs": null,
     "held": false,
     "blocker": false,
     "done": false
    },
    {
     "line": 533,
     "text": "경제",
     "note": "무한 복제 경로 탐색 결과 **0**",
     "desc": "`경제`을 재현 가능한 테스트 절차로 실행하고 로그·측정값·PlaceVersion을 남김. 치명/고위험 결함은 미해결 상태에서 다음 출시 게이트로 넘기지 않음.",
     "wbs": "G7-06",
     "held": false,
     "blocker": false,
     "done": true
    },
    {
     "line": 535,
     "text": "§13.2 Functional 체크리스트 12항",
     "note": null,
     "desc": "정의된 12개 기능 테스트를 동일 절차로 모두 통과하고 실패 항목 0개가 되어야 완료.",
     "wbs": "G7-01",
     "held": false,
     "blocker": true,
     "done": false
    },
    {
     "line": 537,
     "text": "Network 테스트",
     "note": null,
     "desc": "멀티플레이 동기화, Remote 지연/실패, 플레이어 입퇴장, 서버/클라이언트 상태 불일치를 포함한 테스트를 수행.",
     "wbs": null,
     "held": false,
     "blocker": false,
     "done": false
    },
    {
     "line": 539,
     "text": "공개 서버 DataStore",
     "note": "계정 2개",
     "desc": "Studio가 아닌 실제 Published 환경에서 최소 두 계정으로 저장·로드·재접속을 확인하고 테스트 데이터는 별도 관리.",
     "wbs": "G7-03",
     "held": false,
     "blocker": true,
     "done": false
    },
    {
     "line": 541,
     "text": "UI 해상도 테스트",
     "note": null,
     "desc": "UI/UX 단계의 지정 해상도 결과를 QA 관점에서도 회귀 기준으로 고정.",
     "wbs": "G5-04",
     "held": false,
     "blocker": false,
     "done": false
    },
    {
     "line": 543,
     "text": "Regression 기준선 고정",
     "note": null,
     "desc": "출시 전 반드시 통과해야 할 테스트 목록과 기대 결과를 버전으로 고정해 변경마다 비교 가능하게 함.",
     "wbs": null,
     "held": false,
     "blocker": true,
     "done": false
    },
    {
     "line": 545,
     "text": "신규 계정·기존 계정·고진행 계정 3종 테스트 데이터 고정",
     "note": null,
     "desc": "초기값, 이전 스키마, 고진행 상태 각각에서 동일 기능이 정상인지 테스트용 프로필 세트를 유지.",
     "wbs": null,
     "held": false,
     "blocker": true,
     "done": false
    },
    {
     "line": 547,
     "text": "정상 플레이 30분 동안 의도하지 않은 error 로그 0건 기준 설정",
     "note": null,
     "desc": "일반 플레이만 했는데 Error 로그가 발생하지 않는지 30분 이상 관찰. 허용할 경고가 있다면 별도 목록으로 분리.",
     "wbs": null,
     "held": false,
     "blocker": true,
     "done": false
    },
    {
     "line": 549,
     "text": "저장/로드 실패·Remote 거부·구매 실패의 사용자 표시 문구 확인",
     "note": null,
     "desc": "내부 오류가 발생했을 때 사용자에게 원인과 다음 행동을 이해할 수 있는 메시지가 표시되고 기술 로그와 분리되어야 함.",
     "wbs": null,
     "held": false,
     "blocker": false,
     "done": false
    }
   ],
   "total": 10,
   "done": 1,
   "held": 0,
   "pct": 10
  },
  {
   "no": 22,
   "name": "보안 검증",
   "gate": "⑦",
   "items": [
    {
     "line": 554,
     "text": "서버 권위 구조 감사",
     "note": "09-13",
     "desc": "재화·인벤토리·성장 등 중요한 판정은 서버가 최종 결정해야 함. 클라이언트 값만 믿고 상태를 변경하는 경로가 없는지 유지 검증.",
     "wbs": null,
     "held": false,
     "blocker": false,
     "done": true
    },
    {
     "line": 556,
     "text": "무한 복제 경로 0 확인",
     "note": "S·A 등급 0",
     "desc": "재화·아이템을 무제한 복제할 수 있는 알려진 경로가 없다는 상태. 경제/Remote 변경 후 반드시 재감사.",
     "wbs": null,
     "held": false,
     "blocker": true,
     "done": true
    },
    {
     "line": 558,
     "text": "레드팀 12건 문서화",
     "note": "`design/pet-island-security-spec.md`",
     "desc": "공격 시나리오와 결과가 문서화되어 재현 가능한 상태. 수정된 취약점은 재테스트 결과까지 남겨야 함.",
     "wbs": null,
     "held": false,
     "blocker": false,
     "done": true
    },
    {
     "line": 560,
     "text": "속도 제한 0.18초 · `validInt` · 소유 검사 존재 확인",
     "note": "이전 완료 표시의 직접 근거 미기재; 2026-09-15 재확인 대상으로 전환",
     "desc": "기본 방어 장치가 존재한다는 의미. 모든 액션에 동일 값이 적절한지보다 액션별 악용 가능성을 기준으로 검증.",
     "wbs": null,
     "held": false,
     "blocker": false,
     "done": false
    },
    {
     "line": 562,
     "text": "사양서 확정 오류 5건 정정",
     "note": "액션 수·`validInt` 호출 수·배율 경로·타일 상한·절 번호",
     "desc": "보안 문서와 실제 코드의 숫자/상한/절 번호 불일치를 제거해 감사 기준 자체의 신뢰성을 확보.",
     "wbs": null,
     "held": false,
     "blocker": false,
     "done": false
    },
    {
     "line": 564,
     "text": "`World`·`DayCycle`·`Weather` 감사",
     "note": "서버 도달 코드의 **33%가 미감사**",
     "desc": "``World`·`DayCycle`·`Weather` 감사`을 재현 가능한 테스트 절차로 실행하고 로그·측정값·PlaceVersion을 남김. 치명/고위험 결함은 미해결 상태에서 다음 출시 게이트로 넘기지 않음.",
     "wbs": null,
     "held": false,
     "blocker": false,
     "done": false
    },
    {
     "line": 566,
     "text": "B-1 XP 무한 채굴 차단",
     "note": null,
     "desc": "반복 호출이나 상태 위조로 XP를 무한 획득하는 경로를 막고 정상 플레이 상한/쿨다운도 서버에서 검증.",
     "wbs": "G7-08",
     "held": false,
     "blocker": true,
     "done": false
    },
    {
     "line": 568,
     "text": "B-2 탐험 장식 게이트",
     "note": null,
     "desc": "해금 전 장식/탐험 콘텐츠에 직접 Remote 호출로 접근할 수 없는지 서버가 조건을 다시 검사해야 함.",
     "wbs": "G7-09",
     "held": false,
     "blocker": true,
     "done": false
    },
    {
     "line": 570,
     "text": "C-1·C-2 속도 제한 구멍 둘",
     "note": null,
     "desc": "rate limit을 우회하는 두 경로를 막고 동일 패턴의 다른 액션도 검색해 재발 방지.",
     "wbs": "G7-10",
     "held": false,
     "blocker": true,
     "done": false
    },
    {
     "line": 572,
     "text": "C-3 `fuseAll` 인자 검증",
     "note": null,
     "desc": "클라이언트가 보낸 목록·수량·ID를 신뢰하지 않고 서버가 소유권·범위·중복을 모두 검증.",
     "wbs": "G7-12",
     "held": false,
     "blocker": true,
     "done": false
    },
    {
     "line": 574,
     "text": "거리 검사 신설",
     "note": null,
     "desc": "월드 상호작용은 서버에서도 플레이어와 대상 간 거리를 검증해 원격 악용을 차단.",
     "wbs": "G7-16",
     "held": false,
     "blocker": true,
     "done": false
    },
    {
     "line": 576,
     "text": "비정상 요청 로깅",
     "note": null,
     "desc": "거부된 Remote의 액션명·사유·빈도를 기록하되 개인정보/대량 로그 문제를 피하도록 필드를 제한.",
     "wbs": "G7-17",
     "held": false,
     "blocker": false,
     "done": false
    },
    {
     "line": 578,
     "text": "Remote 27종 전체에 타입·범위·소유권·쿨다운·거리 검사 적용 여부 표로 감사",
     "note": null,
     "desc": "27개 액션을 표로 나열하고 타입, 값 범위, 소유권, 쿨다운, 거리 검사가 각각 적용되는지 전수 체크.",
     "wbs": null,
     "held": false,
     "blocker": true,
     "done": false
    },
    {
     "line": 580,
     "text": "반복 비정상 요청 시 로그 폭주를 막는 rate limit 또는 집계 방식 확정",
     "note": null,
     "desc": "악성 사용자가 초당 수백 요청을 보내도 로그/저장 비용이 폭증하지 않도록 샘플링·집계·별도 rate limit 적용.",
     "wbs": null,
     "held": false,
     "blocker": false,
     "done": false
    },
    {
     "line": 582,
     "text": "C-4·C-5·C-9 에 작업 항목 신설",
     "note": "현재 WBS 에 없다",
     "desc": "보안 문서에 존재하지만 WBS에 없는 이슈를 실제 작업 항목으로 등록해 누락되지 않게 추적.",
     "wbs": null,
     "held": false,
     "blocker": false,
     "done": false
    }
   ],
   "total": 15,
   "done": 3,
   "held": 0,
   "pct": 20
  },
  {
   "no": 23,
   "name": "최적화",
   "gate": "⑦",
   "items": [
    {
     "line": 587,
     "text": "편집 시점 Part 수",
     "note": "BasePart 639 / 인스턴스 990 (09-14)",
     "desc": "현재 월드 기준 복잡도 기준선. 최종 에셋 적용 후 증가량을 비교할 수 있도록 동일 측정 방식 유지.",
     "wbs": null,
     "held": false,
     "blocker": false,
     "done": true
    },
    {
     "line": 589,
     "text": "StreamingEnabled 확인",
     "note": "true",
     "desc": "대형 월드의 메모리/로딩 최적화를 위한 기본 설정. 켜져 있다는 것만으로 끝내지 말고 실제 스트리밍 누락을 별도 테스트.",
     "wbs": null,
     "held": false,
     "blocker": false,
     "done": true
    },
    {
     "line": 591,
     "text": "런타임 Part 수",
     "note": "펫·장식 배치 후",
     "desc": "펫·장식이 실제 최대치에 가까운 상태에서 BasePart/Instance 수를 측정해 편집 시점 기준과 비교.",
     "wbs": null,
     "held": false,
     "blocker": false,
     "done": false
    },
    {
     "line": 593,
     "text": "1초 snapshot Remote 크기",
     "note": null,
     "desc": "주기적으로 전송되는 상태 데이터의 바이트 크기와 빈도를 측정해 네트워크 대역폭 낭비 여부를 판단.",
     "wbs": "G7-05",
     "held": false,
     "blocker": false,
     "done": false
    },
    {
     "line": 595,
     "text": "클라이언트/서버 메모리",
     "note": "Developer Console·Performance Stats",
     "desc": "대표 플레이 상황에서 메모리 사용량을 기록하고 시간 경과에 따라 계속 증가하는지 확인. 수치 기준을 별도 성능 합격선과 연결.",
     "wbs": "G7-05",
     "held": false,
     "blocker": false,
     "done": false
    },
    {
     "line": 597,
     "text": "MicroProfiler 프레임 병목",
     "note": "script·physics·render 구간 측정",
     "desc": "CPU 프레임에서 script·physics·render 중 어느 구간이 병목인지 캡처하고 가장 큰 비용 함수/작업을 지목.",
     "wbs": "G7-05",
     "held": false,
     "blocker": false,
     "done": false
    },
    {
     "line": 599,
     "text": "`AnimPlayer` 본 25개 갱신 비용",
     "note": "서버 `RunService` 구동",
     "desc": "서버에서 Bone 25개를 매 프레임 갱신할 때 펫 수 증가에 따른 CPU 비용을 측정. 클라이언트 이전 가능성도 비교.",
     "wbs": null,
     "held": false,
     "blocker": false,
     "done": false
    },
    {
     "line": 601,
     "text": "기준 저사양 모바일 실기기 1종 확정",
     "note": null,
     "desc": "실제 출시 타깃 중 최소 성능 기기 한 종을 기준기로 고정. 에뮬레이터만으로 성능 통과를 판단하지 않음.",
     "wbs": null,
     "held": false,
     "blocker": true,
     "done": false
    },
    {
     "line": 603,
     "text": "성능 합격 기준 수치 확정",
     "note": "FPS/프레임 시간·클라이언트 메모리·서버 메모리·입장 시간",
     "desc": "예: 최소 FPS, 최대 메모리, 입장 시간 등 숫자를 사전에 정해 주관적 '괜찮음' 판정을 제거.",
     "wbs": null,
     "held": false,
     "blocker": true,
     "done": false
    },
    {
     "line": 605,
     "text": "기준 실기기에서 첫 입장 시간 측정",
     "note": null,
     "desc": "앱/게임 진입부터 조작 가능 시점까지 시간을 재고 첫 실행·재실행 차이도 기록.",
     "wbs": null,
     "held": false,
     "blocker": true,
     "done": false
    },
    {
     "line": 607,
     "text": "펫·장식 최대 예상 배치 상태에서 클라이언트 FPS·메모리 측정",
     "note": null,
     "desc": "실제 플레이에서 가능한 높은 펫/장식 밀도를 재현해 최악 조건의 FPS와 메모리를 측정.",
     "wbs": null,
     "held": false,
     "blocker": true,
     "done": false
    },
    {
     "line": 609,
     "text": "서버 30분 이상 연속 실행 후 메모리 증가 추세 확인",
     "note": null,
     "desc": "시간이 지날수록 서버 메모리가 계속 증가하는지 관찰해 누수 가능성을 확인. 증가율과 시작/종료 수치를 기록.",
     "wbs": null,
     "held": false,
     "blocker": true,
     "done": false
    },
    {
     "line": 611,
     "text": "Streaming 이동 시 주요 오브젝트 pop-in·상호작용 누락 점검",
     "note": null,
     "desc": "빠른 이동/텔레포트 시 필수 오브젝트가 늦게 나타나 상호작용이 실패하지 않는지 주요 경로별로 확인.",
     "wbs": null,
     "held": false,
     "blocker": false,
     "done": false
    }
   ],
   "total": 13,
   "done": 2,
   "held": 0,
   "pct": 15
  },
  {
   "no": 24,
   "name": "Alpha",
   "gate": "⑦",
   "items": [
    {
     "line": 616,
     "text": "내부 플레이 참가자 모집",
     "note": null,
     "desc": "개발자 외의 내부 테스터를 확보하고 기기·숙련도 편향이 너무 크지 않도록 구성.",
     "wbs": null,
     "held": false,
     "blocker": false,
     "done": false
    },
    {
     "line": 618,
     "text": "Alpha 빌드 고정",
     "note": null,
     "desc": "테스트 중 코드가 계속 바뀌면 결과 비교가 어려우므로 PlaceVersion/커밋을 고정하고 이후 수정본은 별도 버전으로 관리.",
     "wbs": null,
     "held": false,
     "blocker": false,
     "done": false
    },
    {
     "line": 620,
     "text": "피드백 수집 양식",
     "note": null,
     "desc": "재미·이해도·막힘·버그를 같은 형식으로 수집해 비교 가능하게 함. 자유 의견만 받지 말고 핵심 질문을 고정.",
     "wbs": null,
     "held": false,
     "blocker": false,
     "done": false
    },
    {
     "line": 622,
     "text": "치명 결함 판정 기준",
     "note": null,
     "desc": "출시/테스트를 중단해야 하는 결함의 범위를 사전에 정의. 데이터 손실·구매 오류·진행 불능·복제 등은 별도 최고 등급 권장.",
     "wbs": null,
     "held": false,
     "blocker": false,
     "done": false
    },
    {
     "line": 624,
     "text": "Alpha 테스트 시나리오와 참가자별 수행 항목 고정",
     "note": null,
     "desc": "각 참가자가 최소한 같은 핵심 기능을 경험하도록 수행 과제를 정하고 완료 여부를 기록.",
     "wbs": null,
     "held": false,
     "blocker": false,
     "done": false
    },
    {
     "line": 626,
     "text": "Known Issues 문서와 재현 절차 작성",
     "note": null,
     "desc": "알려진 문제, 재현 절차, 영향, 임시 우회법, 수정 예정 여부를 한 문서에서 관리.",
     "wbs": null,
     "held": false,
     "blocker": false,
     "done": false
    }
   ],
   "total": 6,
   "done": 0,
   "held": 0,
   "pct": 0
  },
  {
   "no": 25,
   "name": "Closed Beta",
   "gate": "⑦",
   "items": [
    {
     "line": 631,
     "text": "테스터 ≤50 모집",
     "note": null,
     "desc": "초기 외부 테스트 인원을 제한해 피드백과 장애를 통제 가능한 규모로 유지. 실제 참가 인원과 계정 목록을 기록.",
     "wbs": null,
     "held": false,
     "blocker": false,
     "done": false
    },
    {
     "line": 633,
     "text": "Closed Test 설정",
     "note": null,
     "desc": "비공개 접근 권한이 의도한 테스터에게만 열려 있고 일반 사용자가 접근하지 못하는지 확인.",
     "wbs": null,
     "held": false,
     "blocker": false,
     "done": false
    },
    {
     "line": 635,
     "text": "크래시·오류 수집 경로",
     "note": null,
     "desc": "테스터가 오류를 신고할 경로와 서버 로그를 연결해 시간·계정·재현 행동을 추적 가능하게 함.",
     "wbs": null,
     "held": false,
     "blocker": false,
     "done": false
    },
    {
     "line": 637,
     "text": "D1 유지율 1차 관측",
     "note": null,
     "desc": "테스터가 다음 날 다시 돌아오는 비율을 동일 코호트 기준으로 계산. 표본이 작으므로 참고 지표로 사용하고 절대값을 과해석하지 않음.",
     "wbs": null,
     "held": false,
     "blocker": false,
     "done": false
    },
    {
     "line": 639,
     "text": "튜토리얼 완료율·첫 핵심 루프 완료율 관측",
     "note": null,
     "desc": "신규 테스터 중 튜토리얼과 첫 Core Loop를 완료한 비율을 각각 측정해 초기 이탈 지점을 찾음.",
     "wbs": null,
     "held": false,
     "blocker": false,
     "done": false
    },
    {
     "line": 641,
     "text": "평균 세션 길이·재접속률 관측",
     "note": null,
     "desc": "테스터의 세션 분포와 재접속률을 함께 보고 의도한 세션 길이와 비교. 평균만 보지 말고 매우 짧은 세션 비율도 확인.",
     "wbs": null,
     "held": false,
     "blocker": false,
     "done": false
    },
    {
     "line": 643,
     "text": "오류/크래시·저사양 이탈 징후 확인",
     "note": null,
     "desc": "특정 기기에서 로딩 실패·프레임 저하·크래시가 집중되는지 기기별로 분리해 확인.",
     "wbs": null,
     "held": false,
     "blocker": false,
     "done": false
    }
   ],
   "total": 7,
   "done": 0,
   "held": 0,
   "pct": 0
  },
  {
   "no": 26,
   "name": "Analytics",
   "gate": "⑧",
   "items": [
    {
     "line": 648,
     "text": "`AnalyticsService` API 가용 확인",
     "note": "09-03 `pcall` 실측",
     "desc": "API 호출 가능성 자체를 확인한 상태. 실제 이벤트가 운영 분석 화면에 도착하는지까지는 별도 검증 필요.",
     "wbs": null,
     "held": false,
     "blocker": false,
     "done": true
    },
    {
     "line": 650,
     "text": "온보딩 퍼널 설계 초안",
     "note": "`feasibility-abc` §3257·3521",
     "desc": "가입/입장 이후 주요 단계별 전환을 어떤 순서로 측정할지 설계한 초안. 실제 이벤트명과 단계 정의를 고정해야 함.",
     "wbs": null,
     "held": false,
     "blocker": false,
     "done": true
    },
    {
     "line": 652,
     "text": "관찰 지표 목록",
     "note": "기획서 §12.3",
     "desc": "무엇을 볼지 정의된 상태. 각 지표의 데이터 원천, 계산식, 의사결정에 쓰는 기준값까지 연결하면 더 완성됨.",
     "wbs": null,
     "held": false,
     "blocker": false,
     "done": true
    },
    {
     "line": 654,
     "text": "이벤트 명세 표 확정",
     "note": "이벤트명·발화 조건·값·Custom Field·중복 방지 조건",
     "desc": "분석 이벤트의 이름·조건·필드·타입·중복 방지 규칙을 단일 표로 확정. 구현과 대시보드가 같은 이름을 써야 함.",
     "wbs": null,
     "held": false,
     "blocker": false,
     "done": false
    },
    {
     "line": 656,
     "text": "이벤트 8종 구현",
     "note": null,
     "desc": "정의된 8개 이벤트를 코드에 구현하고 정상/예외 흐름에서 정확히 한 번씩 발화하는지 테스트.",
     "wbs": "G8-01",
     "held": false,
     "blocker": false,
     "done": false
    },
    {
     "line": 658,
     "text": "온보딩 Funnel 이벤트 구현",
     "note": null,
     "desc": "튜토리얼 단계별 이탈을 분석할 수 있도록 순서가 있는 이벤트를 구현하고 플레이어별 중복 발화를 방지.",
     "wbs": null,
     "held": false,
     "blocker": false,
     "done": false
    },
    {
     "line": 660,
     "text": "코인 Source/Sink Economy 이벤트 구현",
     "note": null,
     "desc": "코인 획득/소모 시 source/sink 유형과 금액을 기록해 실제 경제 흐름을 분석 가능하게 함.",
     "wbs": null,
     "held": false,
     "blocker": false,
     "done": false
    },
    {
     "line": 662,
     "text": "핵심 루프 Custom 이벤트 구현",
     "note": null,
     "desc": "핵심 루프의 시작·완료·실패 등 게임 고유 행동을 기록. 이벤트가 너무 세분되어 노이즈가 되지 않도록 목적별로 제한.",
     "wbs": null,
     "held": false,
     "blocker": false,
     "done": false
    },
    {
     "line": 664,
     "text": "Published 게임의 서버에서 이벤트 발화 확인",
     "note": "Studio 검증만으로 완료 처리하지 않음",
     "desc": "Studio에서 호출 성공만 확인하지 말고 실제 게시된 서버에서 이벤트가 수집되는지 검증.",
     "wbs": "G8-01",
     "held": false,
     "blocker": true,
     "done": false
    },
    {
     "line": 666,
     "text": "Creator Analytics 에서 이벤트 확인",
     "note": null,
     "desc": "플랫폼 분석 화면에서 예상 이벤트와 값이 실제로 보이는지 시간 지연을 감안해 확인.",
     "wbs": "G8-01",
     "held": false,
     "blocker": true,
     "done": false
    },
    {
     "line": 668,
     "text": "동일 행동의 중복 이벤트·누락 이벤트 표본 검증",
     "note": null,
     "desc": "동일 행동 1회에 이벤트가 2회 이상 또는 0회 기록되지 않는지 표본 세션 로그와 대조.",
     "wbs": null,
     "held": false,
     "blocker": false,
     "done": false
    }
   ],
   "total": 11,
   "done": 3,
   "held": 0,
   "pct": 27
  },
  {
   "no": 27,
   "name": "출시 페이지",
   "gate": "⑧",
   "items": [
    {
     "line": 673,
     "text": "Search 노출 규칙 조사",
     "note": "`marketing/M-02` 19행",
     "desc": "게임명·설명·메타데이터 작성 시 검색 노출 제약을 참고하는 자료. 플랫폼 정책 변경 시 갱신.",
     "wbs": null,
     "held": false,
     "blocker": false,
     "done": true
    },
    {
     "line": 675,
     "text": "Social Links 규칙 조사",
     "note": "`M-02` 33~38행",
     "desc": "외부 링크 사용 가능 조건과 표시 위치를 정리한 자료. 실제 출시 페이지 설정 전 최신 정책과 대조.",
     "wbs": null,
     "held": false,
     "blocker": false,
     "done": true
    },
    {
     "line": 677,
     "text": "게임 이름 확정",
     "note": null,
     "desc": "검색성·기억성·세계관 일치·타깃 언어를 고려해 최종 이름 하나를 고정. 이후 아이콘/설명/마케팅에서 동일하게 사용.",
     "wbs": "G8-02",
     "held": false,
     "blocker": false,
     "done": false
    },
    {
     "line": 679,
     "text": "아이콘",
     "note": null,
     "desc": "작은 정사각형에서도 펫과 게임 정체성이 즉시 보이도록 제작하고 모바일 실제 표시 크기로 확인.",
     "wbs": "G8-02",
     "held": false,
     "blocker": false,
     "done": false
    },
    {
     "line": 681,
     "text": "썸네일",
     "note": null,
     "desc": "게임의 핵심 행동/보상을 보여주는 썸네일 세트를 만들고 과도한 텍스트보다 시각적 상황 전달을 우선.",
     "wbs": "G8-02",
     "held": false,
     "blocker": false,
     "done": false
    },
    {
     "line": 683,
     "text": "설명문",
     "note": null,
     "desc": "첫 문장에서 핵심 재미를 설명하고 주요 기능·업데이트·지원 정보를 간결하게 정리. 실제 게임에 없는 기능을 약속하지 않음.",
     "wbs": "G8-02",
     "held": false,
     "blocker": false,
     "done": false
    },
    {
     "line": 685,
     "text": "스크린샷",
     "note": null,
     "desc": "실제 게임 화면을 대표하는 장면을 준비하고 UI/아트가 최신 빌드와 일치하는지 확인.",
     "wbs": "G8-02",
     "held": false,
     "blocker": false,
     "done": false
    },
    {
     "line": 687,
     "text": "타깃 국가 확정 후 게임명·설명·주요 UI 번역 범위 결정",
     "note": null,
     "desc": "출시 국가가 정해진 뒤 우선 번역 언어와 범위를 확정. 게임명·설명과 핵심 온보딩 UI를 먼저 번역 대상으로 잡음.",
     "wbs": null,
     "held": false,
     "blocker": false,
     "done": false
    }
   ],
   "total": 8,
   "done": 2,
   "held": 0,
   "pct": 25
  },
  {
   "no": 28,
   "name": "Publishing",
   "gate": "⑧",
   "items": [
    {
     "line": 692,
     "text": "Private place 존재",
     "note": "placeId 71818519773106 · PlaceVersion 48",
     "desc": "현재 테스트용 경험과 PlaceVersion이 존재한다는 기준. 이후 공개 대상 Place와 혼동하지 않도록 ID를 계속 명시.",
     "wbs": null,
     "held": false,
     "blocker": false,
     "done": true
    },
    {
     "line": 694,
     "text": "`roblox-target.json` 의 작업 대상 placeId 정정",
     "note": "지금 다른 경험을 가리킨다",
     "desc": "자동화/배포 도구가 잘못된 경험을 수정하지 않도록 대상 placeId를 실제 작업 Place와 일치시켜야 함.",
     "wbs": null,
     "held": false,
     "blocker": false,
     "done": false
    },
    {
     "line": 696,
     "text": "Creator Dashboard 대상 Audience·지원 Devices 설정 확인",
     "note": null,
     "desc": "Creator Dashboard에서 공개 대상과 지원 기기 설정이 실제 개발 범위와 일치하는지 확인.",
     "wbs": null,
     "held": false,
     "blocker": false,
     "done": false
    },
    {
     "line": 698,
     "text": "Content Maturity & Compliance 설문 완료 및 현재 콘텐츠와 일치 확인",
     "note": null,
     "desc": "현재 게임 콘텐츠와 설문 응답이 일치해야 함. 콘텐츠 변경 시 등급/준수 설정도 다시 검토.",
     "wbs": null,
     "held": false,
     "blocker": false,
     "done": false
    },
    {
     "line": 700,
     "text": "공개 직전 PlaceVersion 기록 및 즉시 되돌릴 이전 정상 버전 지정",
     "note": null,
     "desc": "문제 발생 시 즉시 되돌릴 수 있도록 마지막 정상 버전 번호와 현재 배포 버전을 기록.",
     "wbs": null,
     "held": false,
     "blocker": true,
     "done": false
    },
    {
     "line": 702,
     "text": "Team Test",
     "note": null,
     "desc": "개발/운영 참여자가 동일 게시 빌드에서 핵심 기능을 전부 검수하고 배포 설정 문제를 확인.",
     "wbs": null,
     "held": false,
     "blocker": false,
     "done": false
    },
    {
     "line": 704,
     "text": "Closed Test ≤50",
     "note": null,
     "desc": "정해진 외부 테스터만 접근 가능한 단계에서 데이터·구매·Analytics·성능을 실제 서비스 환경으로 검증.",
     "wbs": "G8-03",
     "held": false,
     "blocker": false,
     "done": false
    },
    {
     "line": 706,
     "text": "Beta",
     "note": null,
     "desc": "대상 사용자를 더 넓혀 대규모 상호작용과 지표를 관찰하되 아직 수정 가능성을 전제로 운영.",
     "wbs": "G8-03",
     "held": false,
     "blocker": false,
     "done": false
    },
    {
     "line": 708,
     "text": "Public",
     "note": null,
     "desc": "일반 공개 전환. 아래 출시 Go/No-Go 조건과 치명 결함 0건을 충족한 뒤 체크해야 함.",
     "wbs": "G8-03",
     "held": false,
     "blocker": false,
     "done": false
    }
   ],
   "total": 9,
   "done": 1,
   "held": 0,
   "pct": 11
  },
  {
   "no": 29,
   "name": "Soft Launch",
   "gate": "⑧",
   "items": [
    {
     "line": 713,
     "text": "Soft Launch 지표 임계값 확정",
     "note": null,
     "desc": "D1, 튜토리얼 완료율, 세션, 오류율, 구매 전환 등 각 지표별 계속/수정/중단 임계값을 사전에 정함.",
     "wbs": "G8-04",
     "held": false,
     "blocker": false,
     "done": false
    },
    {
     "line": 715,
     "text": "제한 공개 실행",
     "note": null,
     "desc": "국가/대상/노출 범위를 제한한 실제 공개 환경에서 운영 프로세스와 서버 안정성을 검증.",
     "wbs": null,
     "held": false,
     "blocker": false,
     "done": false
    },
    {
     "line": 717,
     "text": "지표 관측 1주",
     "note": null,
     "desc": "최소 1주간 요일 효과를 포함해 지표를 관찰. 중간 수정이 있었다면 수정 전후 기간을 분리해 해석.",
     "wbs": null,
     "held": false,
     "blocker": false,
     "done": false
    },
    {
     "line": 719,
     "text": "D1·튜토리얼 완료율·평균 세션·오류율·구매 전환율의 계속/수정/중단 기준 적용",
     "note": null,
     "desc": "신규 테스터 중 튜토리얼과 첫 Core Loop를 완료한 비율을 각각 측정해 초기 이탈 지점을 찾음.",
     "wbs": null,
     "held": false,
     "blocker": false,
     "done": false
    },
    {
     "line": 721,
     "text": "치명 장애·경제 오류 발생 시 공개 범위 축소 또는 롤백 조건 검증",
     "note": null,
     "desc": "데이터 손실, 구매 오지급, 경제 붕괴 등이 발생하면 즉시 노출 축소/롤백할 수 있는 실행 기준을 실제로 확인.",
     "wbs": null,
     "held": false,
     "blocker": false,
     "done": false
    }
   ],
   "total": 5,
   "done": 0,
   "held": 0,
   "pct": 0
  },
  {
   "no": 30,
   "name": "정식 출시",
   "gate": "⑧",
   "items": [
    {
     "line": 726,
     "text": "출시 전 최종 회귀",
     "note": null,
     "desc": "고정된 Regression 기준선 전체를 현재 배포 후보 빌드에서 다시 실행하고 실패 0건이어야 함.",
     "wbs": null,
     "held": false,
     "blocker": false,
     "done": false
    },
    {
     "line": 728,
     "text": "공개 전환",
     "note": null,
     "desc": "Creator Dashboard에서 일반 사용자가 접근 가능한 상태로 전환. 대상 PlaceVersion과 시간 기록을 남김.",
     "wbs": null,
     "held": false,
     "blocker": false,
     "done": false
    },
    {
     "line": 730,
     "text": "출시 직후 모니터링 당번",
     "note": null,
     "desc": "출시 직후 오류·DataStore·구매·서버 성능·Analytics를 누가 확인할지 담당과 대응 채널을 정함.",
     "wbs": null,
     "held": false,
     "blocker": true,
     "done": false
    },
    {
     "line": 732,
     "text": "Go/No-Go 체크",
     "note": "저장·구매·Analytics·멀티플레이·성능·출시 페이지 모두 통과",
     "desc": "저장·구매·Analytics·멀티플레이·성능·출시 페이지 등 출시 필수 영역이 모두 통과했는지 한 번에 확인하는 최종 관문.",
     "wbs": null,
     "held": false,
     "blocker": false,
     "done": false
    },
    {
     "line": 734,
     "text": "롤백 담당·대상 PlaceVersion·판단 기준 확정",
     "note": null,
     "desc": "누가 어떤 조건에서 어느 PlaceVersion으로 되돌릴지 사전에 정해 장애 발생 시 의사결정 지연을 없앰.",
     "wbs": null,
     "held": false,
     "blocker": true,
     "done": false
    }
   ],
   "total": 5,
   "done": 0,
   "held": 0,
   "pct": 0
  },
  {
   "no": 31,
   "name": "LiveOps",
   "gate": "⑧",
   "items": [
    {
     "line": 739,
     "text": "업데이트 로드맵 8단계",
     "note": "이전 완료 표시의 직접 근거 미기재; 2026-09-15 재확인 대상으로 전환",
     "desc": "출시 후 콘텐츠 공급 계획이 있다는 의미. 실제 LiveOps에서는 일정·담당·성공 지표와 연결.",
     "wbs": null,
     "held": false,
     "blocker": false,
     "done": false
    },
    {
     "line": 741,
     "text": "대규모 업데이트 3회분 설계",
     "note": "M+1 속삭임 숲 · M+2 펫 변이 · M+3 푸른 해안, 한 달 간격 (09-15) — 스토리 문서 13절 · 기획서 로드맵",
     "desc": "M = Public 출시일이라 아직 날짜가 없다. 셋은 로드맵 앞 셋을 승격한 것이고 근거는 코드다 — 숲(Lv10)·해안(Lv20)은 `C.Regions` 에 있는데 비어 있고, 변이는 `변이형`·`오로라` 가 이미 있다. 각각 등불 우편 규칙 하나를 더 판다(받기·깊이·띄우기).",
     "wbs": null,
     "held": false,
     "blocker": false,
     "done": true
    },
    {
     "line": 743,
     "text": "M+1 속삭임 숲",
     "note": "콘텐츠: Lv10 지역 · 숲 펫 10종 · 야간 펫 · 버섯 먹이 · 숲 장식 5 · 탐험지 +2",
     "desc": "지역 자체가 비어 있어서 지형·건물부터 만들어야 한다. 숲 펫 10종의 구체 종·등급 배치는 미정 — 원본 있는 동물이 10종뿐이고 Studio 에 들어간 것은 토끼 하나라 14단계 에셋 생산 능력에 달려 있다.",
     "wbs": null,
     "held": false,
     "blocker": false,
     "done": false
    },
    {
     "line": 745,
     "text": "M+1 스토리 「밤에만 오는 편지」 2장",
     "note": "반딧불 우편 · 버섯 등불 · 그림책 +2장",
     "desc": "「받기」 규칙을 판다 — 숲에는 등불이 없고 반딧불이 밤에만 옮긴다. 낮 우편과 밤 우편이 만난 적 없었다는 것이 답장이 없던 이유. 새 인물 없음, 숲의 첫 펫이 편지를 물고 온다.",
     "wbs": null,
     "held": false,
     "blocker": false,
     "done": false
    },
    {
     "line": 747,
     "text": "M+2 펫 변이",
     "note": "콘텐츠: 조건 기반 변이(누적 수확·시간대·날씨) · 변이 도감 10종 · 오로라 외형 · 패시브 1",
     "desc": "**확률·고등급 조건 금지**(스토리 7절 원칙). 변이 조건 임계값은 미정. 외형 변화는 팔레트 악센트 5% 규칙 안에서.",
     "wbs": null,
     "held": false,
     "blocker": false,
     "done": false
    },
    {
     "line": 749,
     "text": "M+2 스토리 「오로라를 띤 마음」 1장",
     "note": "첫 토끼가 첫 변이 후보 · 그림책 펫 장 +1",
     "desc": "「깊이」 축(7절)이 그대로 시스템이 된다. 커먼 토끼가 깊어져 오로라가 되는 길이 생기며 「같은 동물이 두 등급에 있는」 기존 모순이 풀린다.",
     "wbs": null,
     "held": false,
     "blocker": false,
     "done": false
    },
    {
     "line": 751,
     "text": "M+3 푸른 해안",
     "note": "콘텐츠: Lv20 지역 · 해안 어종 · 깊은 물 낚시 · 해양 펫; 낚시 보물 도감은 §15 시점 결정 후 반영",
     "desc": "기본 낚시는 이미 초원부터 된다(§6.9). 어종·장소를 확장한다. 낚시 보물 도감은 §15에서 출시 전/M+3 시점을 정한 뒤 한 번만 구현·검증한다.",
     "wbs": null,
     "held": false,
     "blocker": false,
     "done": false
    },
    {
     "line": 753,
     "text": "M+3 스토리 「조류의 근원」 2장",
     "note": "물속에서도 켜진 등불 · 보물 = 바다에 남은 편지들 · 그림책 +2장",
     "desc": "「띄우기」 규칙을 판다. `old_letter` 「오래된 편지」가 이미 보물 목록에 있어 서사적 근거가 코드에 있다. 상실 금지 — 등불은 누가 켠 것도 꺼진 적도 없다.",
     "wbs": null,
     "held": false,
     "blocker": false,
     "done": false
    },
    {
     "line": 755,
     "text": "업데이트 출시 조건 고정",
     "note": "회귀 26행동 + 신규 행동 전부 통과 + 차단 항목 유지",
     "desc": "세 번 다 같은 조건이다. 한 달 = 제작 2주 + QA 1주 + 여유 1주. 여유를 안 두면 셋째 달에 밀린다.",
     "wbs": null,
     "held": false,
     "blocker": false,
     "done": false
    },
    {
     "line": 757,
     "text": "시즌 운영 규칙",
     "note": null,
     "desc": "시즌 길이, 시작/종료, 보상 회수, 미수령 처리, 다음 시즌 이월 규칙을 문서화.",
     "wbs": null,
     "held": false,
     "blocker": false,
     "done": false
    },
    {
     "line": 759,
     "text": "이벤트 일정표",
     "note": null,
     "desc": "이벤트 기간과 업데이트/마케팅 일정을 충돌 없이 배치하고 준비·QA·종료 작업까지 포함.",
     "wbs": null,
     "held": false,
     "blocker": false,
     "done": false
    },
    {
     "line": 761,
     "text": "핫픽스 절차",
     "note": null,
     "desc": "긴급 수정의 승인, 테스트 최소 범위, 배포, 롤백, 사후 기록 단계를 짧은 절차로 고정.",
     "wbs": null,
     "held": false,
     "blocker": false,
     "done": false
    },
    {
     "line": 763,
     "text": "긴급 기능 비활성화/보상 중단을 위한 설정 또는 kill switch 범위 확정",
     "note": null,
     "desc": "문제가 난 기능/보상을 전체 재배포 없이 끌 수 있는 범위를 정하고 실제 설정 변경 경로를 검증.",
     "wbs": null,
     "held": false,
     "blocker": false,
     "done": false
    },
    {
     "line": 765,
     "text": "장애 공지·보상·사후 기록 절차 확정",
     "note": null,
     "desc": "장애 발생 시 사용자 공지, 보상 판단, 원인/재발 방지 기록을 어떤 순서와 책임으로 처리할지 정함.",
     "wbs": null,
     "held": false,
     "blocker": false,
     "done": false
    }
   ],
   "total": 14,
   "done": 1,
   "held": 0,
   "pct": 7
  },
  {
   "no": 32,
   "name": "데이터 기반 개선",
   "gate": "⑧",
   "items": [
    {
     "line": 770,
     "text": "이탈 구간 분석",
     "note": null,
     "desc": "Analytics 퍼널과 세션 로그로 어디서 이용자가 나가는지 단계별로 확인하고 가장 큰 이탈 구간부터 원인을 조사.",
     "wbs": null,
     "held": false,
     "blocker": false,
     "done": false
    },
    {
     "line": 772,
     "text": "경제 실데이터 대조",
     "note": null,
     "desc": "시뮬레이션 값과 실제 시간당 획득·소모·잔액 분포를 비교해 가정이 틀린 구간을 찾음.",
     "wbs": null,
     "held": false,
     "blocker": false,
     "done": false
    },
    {
     "line": 774,
     "text": "개선 항목 우선순위",
     "note": null,
     "desc": "영향도·발생 빈도·개발 비용·위험도를 기준으로 개선 작업을 정렬. 단순 의견 순서가 아니라 근거를 남김.",
     "wbs": null,
     "held": false,
     "blocker": false,
     "done": false
    },
    {
     "line": 776,
     "text": "변경 전·후 지표 비교 기준과 관찰 기간 고정",
     "note": null,
     "desc": "업데이트 효과를 판단할 관찰 기간과 비교 지표를 미리 정해 일시적 변동을 개선 효과로 오해하지 않도록 함.",
     "wbs": null,
     "held": false,
     "blocker": false,
     "done": false
    },
    {
     "line": 778,
     "text": "한 번에 하나의 핵심 가설을 검증하도록 변경 묶음 제한",
     "note": null,
     "desc": "여러 큰 변경을 동시에 배포하면 원인 분석이 어려우므로 한 번에 검증할 핵심 가설을 제한.",
     "wbs": null,
     "held": false,
     "blocker": false,
     "done": false
    }
   ],
   "total": 5,
   "done": 0,
   "held": 0,
   "pct": 0
  },
  {
   "no": 33,
   "name": "사이클 반복",
   "gate": "⑧",
   "items": [
    {
     "line": 783,
     "text": "1회차 회고",
     "note": null,
     "desc": "완료/실패/지연 원인, 예상과 실제 차이, 다음에 유지할 점을 기록. 개인 감상보다 재현 가능한 사실 중심으로 작성.",
     "wbs": null,
     "held": false,
     "blocker": false,
     "done": false
    },
    {
     "line": 785,
     "text": "다음 사이클 범위 확정",
     "note": null,
     "desc": "회고와 데이터 결과를 바탕으로 다음 주기에서 실제로 할 기능·개선·제외 범위를 고정.",
     "wbs": null,
     "held": false,
     "blocker": false,
     "done": false
    },
    {
     "line": 787,
     "text": "회고에서 나온 재발 방지 항목을 WBS·GDD·QA 기준선에 반영",
     "note": null,
     "desc": "회고에서 발견한 문제를 단순 기록으로 끝내지 않고 WBS·GDD·QA 기준선 중 적절한 곳에 영구 규칙으로 반영.",
     "wbs": null,
     "held": false,
     "blocker": false,
     "done": false
    }
   ],
   "total": 3,
   "done": 0,
   "held": 0,
   "pct": 0
  }
 ]
}