OPEN BETA EVENT

2026.5.1 (금) ~ 5.31 (일)

IRON ARM x 아이코치
부문별 최고의 선수를 선발합니다!
분석왕
분석 횟수 1위
타자왕
타격 점수 1위
투수왕
투구 점수 1위
수비왕
수비 점수 1위
제보왕
버그제보 1위
훈련왕
능력 상승 1위

프로야구 선수 싸인볼

원하는 선수에 원하는 이름으로
받아서 선물로 드립니다!

🏆 오픈베타 이벤트 수상자 발표 🏆

🎉 축하합니다!

수상 상품(프로야구 선수 싸인볼)을 받으시려면
아래 연락처 정보를 입력해주세요

아이코치 β 1.7.109

AI BASEBALL FORM COACH

업데이트 노트

β 1.7.109 2026.07.03
  • 🔒 보안·안정성 보강: AI 응답·분석 결과를 화면에 표시할 때 안전 처리를 강화했어요(서식은 그대로 유지).
  • 🧹 팀 연결을 해제하면 그 팀으로 보냈던 상담 요청도 자동으로 정리돼 코치 대기목록에 남지 않아요.
  • 캐시 v379 → v380.
β 1.7.108 2026.07.03
  • 🐛 AI 코치 채팅 입력창 수정: 채팅을 열면 하단 메뉴바가 잠시 숨겨지고 화면 전체를 쓰도록 바꿔, 키보드가 올라와도 입력창이 가려지지 않아요.
  • 캐시 v378 → v379.
β 1.7.107 2026.07.03
  • 🔄 코치 화면 최신화 개선: 연결된 학생 목록을 열면 저장된 내용을 바로 보여주고, 잠시 지난 경우 백그라운드에서 조용히 최신 상태로 갱신해요. (읽기 비용은 그대로 아끼면서 화면은 더 최신)
  • 캐시 v377 → v378.
β 1.7.106 2026.07.03
  • ⚙️ 대규모 운영 대비 성능·비용 최적화 (화면 동작은 동일)
  • 코치 화면의 학생·상담·코치찾기 목록 조회에 상한을 두고, 연결 학생 목록 캐시 시간을 늘려 데이터가 많아져도 안정적으로 동작하도록 했어요.
  • 🔒 개인정보 강화: AI 코치 채팅이 아이 이름을 외부 AI에 보내지 않도록 바꿨어요. 화면에서는 이름을 그대로 불러줘요.
  • 🐛 훈련 자세 분석이 실패하면 안내 메시지가 뜨도록 하고, 학생·코치 숙제 조회 상한을 맞췄어요.
  • 캐시 v376 → v377.
β 1.7.105 2026.06.21
  • 👨‍👩‍👧 부모용 간단 모드 안내 문구 정리
  • "결과만 보는 보호자용(예: 어머니)"이라는 용도와 "이 기기에만 적용"을 명확히 했어요. (기능 동작은 동일)
  • 캐시 v375 → v376.
β 1.7.104 2026.06.21
  • 📋 코치 숙제 — 매주 자동 반복 + 마감 알림
  • 숙제를 낼 때 🔁 매주 자동 반복을 켜면 새 주가 시작될 때 자동으로 다시 나와요. 반복 중인 숙제는 지정 화면에서 "반복 해제"로 끌 수 있어요.
  • 학생 화면엔 주 마감(일요일)이 다가오면 ⏰ 마감 D-1 안내와 남은 숙제 개수가 표시돼요.
  • 캐시 v374 → v375.
β 1.7.103 2026.06.21
  • 🐛 드롭다운(나이 등) 글씨 안 보이던 문제 수정
  • 일부 환경에서 선택 목록이 흰 배경에 흰 글씨로 안 보이던 현상을 고쳤어요. 이제 어두운 배경에 또렷하게 보입니다.
  • 캐시 v373 → v374.
β 1.7.102 2026.06.21
  • 📋 코치 숙제 — 여러 훈련 한 번에 지정
  • 숙제 지정 화면에서 훈련을 여러 개 골라 한 번에 낼 수 있어요. 카테고리를 넘나들며 체크하면 "N개 훈련으로 숙제 내기"로 한 번에 지정됩니다(주간 목표는 일괄 적용).
  • 캐시 v372 → v373.
β 1.7.101 2026.06.21
  • 📞 레슨 상담 전달 정확도 개선
  • 같은 팀이면 소속 이름 표기가 조금 달라도(띄어쓰기·표기 차이) 상담 요청이 담당 코치에게 정확히 전달되도록 팀 코드(teamId) 기반으로 연결했어요. 기존 소속 방식도 함께 지원해서 누락 없이 동작합니다.
  • 캐시 v371 → v372.
β 1.7.100 2026.06.20
  • 🖼️ 모든 훈련에 시범·주의점 이미지 추가
  • 설명만 있던 훈련들에도 바른 자세 ✅ / 잘못된 자세 ❌ 주의점 이미지를 넣었어요. 추천 훈련(분석 결과)과 훈련 메뉴의 빈 곳까지 채워서, 이제 어떤 훈련을 열어도 영상 또는 이미지로 한눈에 확인할 수 있어요.
  • 캐시 v370 → v371.
β 1.7.99 2026.06.19
  • 🔒 코치 모드 — 승인된 코치만 입장
  • 이제 코치 모드는 구글 로그인 + 관리자 승인을 받은 코치 계정만 들어갈 수 있어요. 선수(학생) 계정은 코치 화면·학생 명단에 접근할 수 없습니다.
  • 코치는 설정 → 코치 모드에서 구글 계정으로 한 번 인증하면 됩니다. (기존 팀·학생 연결은 그대로 유지돼요)
  • 캐시 v369 → v370.
β 1.7.98 2026.06.18
  • 📋 코치님 숙제 + 기본 훈련 19종 추가
  • 코치 모드에서 연결된 학생(또는 팀 전체)에게 훈련을 숙제로 지정할 수 있어요. 학생 훈련 탭에 "코치님 숙제"가 뜨고, 인증을 마치면 진행률(n/m)이 코치님 화면에 자동으로 올라옵니다. (영상·얼굴은 그대로 폰 밖으로 안 나가요)
  • 훈련 메뉴에 2단 줄넘기·윗몸일으키기·팔굽혀펴기·버피·제자리멀리뛰기 등 기초 체력·근력·유연성 훈련 19종이 추가됐어요.
  • 캐시 v367 → v368.
β 1.7.97 2026.06.14
  • 🪪 얼굴 인증 동작 정비 (랭킹·훈련 인증)
  • 영상 분석은 이제 매번 본인 얼굴을 확인해요. 영상 시작에 얼굴 클로즈업이 없으면 조용히 넘어가고(랭킹만 미반영), 얼굴이 보이는데 본인이 아니면 "랭킹에 반영되지 않아요"라고 안내해요. 분석 자체는 항상 진행돼요.
  • 훈련 인증도 인증이 필요한 훈련은 매번 본인 확인을 해요. 얼굴이 안 맞거나 안 보이면 안내와 함께 인증이 완료되지 않아요.
  • 캐시 v366 → v367.
β 1.7.96 2026.06.14
  • 🎬 훈련 참고 영상이 다시 나와요
  • 훈련 방법 화면의 시범 영상이 깨져 보이던 문제를 고쳤어요. 56개 훈련 전체에서 영상이 정상 재생됩니다.
  • 캐시 v365 → v366.
β 1.7.95 2026.06.12
  • 🎨 코치 모드 아이콘 마무리
  • 코치 모드 곳곳에 남아 있던 기본 이모지(🏟️📌⚡👥📸📖🌐)가 골드 라인 아이콘 세트로 교체됐어요. 학생이 없을 땐 헤드코치 캐릭터가 안내해 드려요.
  • 캐시 v364 → v365.
β 1.7.94 2026.06.12
  • 🧢 헤드코치 캐릭터가 바뀌었어요
  • 코치 모드의 헤드코치 아바타가 카리스마 있는 어른 감독님(수염 + 선글라스)으로 교체됐어요. 코치 모드 헤더와 안내 화면, 작은 원형 아이콘까지 모두 새 캐릭터로 통일됩니다.
  • 캐시 v363 → v364.
β 1.7.93 2026.06.12
  • 🎨 상담 대기 · 검토 화면까지 디자인 통일
  • 레슨 상담 대기 목록과 훈련 검토 화면이 코치 모드와 같은 다크 + 골드 디자인이 됐어요.
  • 상담 카드는 새 요청(초록) · 확인함(파랑), 검토 카드는 노란 컬러 띠로 상태가 한눈에 보여요.
  • 요청이 없을 땐 헤드코치 캐릭터가 안내해 드려요. 기능은 모두 그대로예요.
  • 캐시 v362 → v363.
β 1.7.92 2026.06.12
  • 📅 레슨 일정 화면도 새 디자인으로
  • 레슨 일정·레슨 추가 화면이 코치 모드와 같은 다크 + 골드 디자인으로 바뀌었어요.
  • 이번 달 요약이 완료 · 예정 · 노쇼 미니 카드로 한눈에 보이고, 레슨 카드에 상태별 컬러 표시가 생겼어요.
  • 일정이 없는 주엔 헤드코치 캐릭터가 안내해 드려요. 기능은 모두 그대로예요.
  • 캐시 v361 → v362.
β 1.7.91 2026.06.12
  • 🎨 코치 모드가 새 옷을 입었어요
  • 야구장 배너와 헤드코치 캐릭터가 있는 히어로 헤더가 생겼어요. 팀명과 초대코드가 상단에 항상 보이고, 탭 한 번으로 복사돼요.
  • 연결 학생 · 검토 대기 · 이번 주 레슨을 한눈에 보는 요약 스탯과, 처리할 일만 모아 보여주는 오늘 할 일 섹션이 추가됐어요.
  • 흩어져 있던 버튼들이 빠른 작업 그리드로 정리되고, 아이콘이 골드 라인 세트로 통일됐어요. 기능과 사용법은 모두 그대로예요.
  • 캐시 v360 → v361.
β 1.7.90 2026.06.11
  • 📞 레슨 상담, 이제 진행 상황이 보여요
  • 상담을 신청하면 분석 결과 카드에 전달됨 → 코치님 확인 → 일정 확정 → 완료 상태가 표시돼요. 상태가 바뀌면 알림으로도 알려드려요.
  • 코치님이 상담 목록을 열어보는 순간 학생 화면에 "코치님이 확인했어요"가 떠요. 코치 화면에는 처리 전까지 🆕 새 요청 / 확인함 표시가 유지돼요.
  • 보류된 요청은 사유 안내와 함께 다시 신청하기가 가능해요.
  • 캐시 v359 → v360.
β 1.7.89 2026.06.11
  • ⚖️ AI 경기 분석 채점이 공정해졌어요
  • 점수 기준표를 도입했어요 — 이제 영상 속 폼만으로 절대평가합니다. 잘 친 영상은 나이·이전 기록과 무관하게 높은 점수를 받아요.
  • 이전 연습 점수가 경기 점수를 끌어내리던 문제(앵커링)를 고쳤어요. 연습 기록은 비교 설명에만 쓰여요.
  • AI가 임팩트·릴리스 같은 핵심 순간을 프레임에서 제대로 못 본 경우, 지어내는 대신 신뢰도 경고를 표시해요.
  • 캐시 v358 → v359.
β 1.7.88 2026.06.11
  • 🏟️ AI 경기 분석이 더 똑똑하고 친절해졌어요
  • AI에 보내는 장면을 8장 → 16장으로 늘려 분석 정확도를 높이고, 프레임 처리 과정을 정리해 분석 시작이 빨라졌어요.
  • AI가 답하지 못한 경우(안전 필터·길이 제한 등) 0점 대신 이유를 알려드려요. 응답도 JSON 모드로 고정해 파싱 실패를 줄였어요.
  • API 키가 없으면 분석 시작 전에 바로 안내해드려요.
  • 캐시 v357 → v358.
β 1.7.87 2026.06.11
  • 📹 촬영 가이드에 그림 안내 복귀
  • "좋은 영상 찍는 법" 카드에 거리(3~5m)·밝기·길이(3~10초) 일러스트 3개를 작게 나란히 넣었어요. 투구·타격·수비 분석 모두 적용됩니다.
  • 캐시 v356 → v357.
β 1.7.86 2026.06.11
  • 🎬 첫 화면 영상 캐릭터 중앙 정렬
  • 모바일 첫 화면(랜딩)에서 배경영상 속 캐릭터가 오른쪽으로 잘려 보이던 것을 화면 가운데로 오도록 조정했어요.
  • 캐시 v355 → v356.
β 1.7.85 2026.06.11
  • 🛠️ 분석 버튼 먹통 긴급 수정
  • β1.7.84에서 촬영 가이드를 정리한 뒤 투구/타격/수비 분석 버튼을 눌러도 화면이 안 바뀌던 문제를 고쳤어요.
  • 캐시 v354 → v355.
β 1.7.84 2026.06.11
  • 📹 촬영 가이드 한 장으로 통합
  • 영상 선택 화면의 안내가 둘로 나뉘어 있던 것을 "좋은 영상 찍는 법" 카드 하나로 합쳤어요. 밝은 곳·단순 배경, 한 동작 3~10초 안내도 카드에 들어갔고, 촬영 거리는 3~5m로 통일했습니다(가까울수록 AI 관절 인식이 정확해요).
  • 캐시 v353 → v354.
β 1.7.83 2026.06.11
  • 🌐 코치 화면에 연결된 학생 표시
  • 코치 모드 팀 패널 아래에 코드로 가입한 학생들의 최근 점수·주간 요약·검토 대기 건수가 자동으로 표시돼요. 📋 주간 리포트 문구 복사 버튼으로 학부모께 보낼 카톡 메시지를 한 번에 만들 수 있어요.
  • 캐시 v352 → v353.
β 1.7.82 2026.06.11
  • 📡 점수 요약 자동 동기화 — 팀 가입 학생
  • 팀에 가입(학부모 동의)한 학생은 분석·훈련 인증을 마칠 때마다 점수·주간 요약·검토 대기 건수만 코치에게 자동으로 전달돼요. 영상·얼굴·사진은 여전히 서버로 가지 않습니다.
  • 캐시 v351 → v352.
β 1.7.81 2026.06.11
  • 🤝 팀 가입 (초대코드) — 학생·학부모
  • ⚙️설정에 팀 가입 카드가 생겼어요. 코치에게 받은 6자리 코드를 입력하고 학부모 동의에 체크하면 팀에 연결됩니다. 코치에겐 점수·인증 요약만 공유되고, 영상·얼굴·사진은 절대 전송되지 않아요. 언제든 연결 해제(서버 데이터 삭제) 가능.
  • 캐시 v350 → v351.
β 1.7.80 2026.06.10
  • 🏟️ 코치 팀 만들기 · 초대코드 발급
  • 코치 모드 상단에서 팀을 만들면 6자리 초대코드가 나와요. 학생이 코드를 입력하면(다음 업데이트) 점수·인증 요약이 코치 화면에 자동으로 모입니다. 영상·얼굴은 서버로 전송되지 않아요.
  • 캐시 v349 → v350.
β 1.7.79 2026.06.08
  • 🧑‍🏫 코치 모드 1차 업그레이드
  • 주간 리포트를 코치 계정에 열고, 검토 대기 영상 전체 승인 버튼과 학생 명단 검색·정렬(이름/검토대기/점수)을 추가했어요. 100명 명단도 빠르게 관리.
  • 캐시 v348 → v349.
β 1.7.78 2026.06.08
  • 🧹 랜딩 첫 화면 정리
  • 첫 화면의 작은 배지(AI 실시간 분석·전국 랭킹·성장 배지)가 아래 기능 소개와 겹쳐서 제거했어요.
  • 캐시 v347 → v348.
β 1.7.77 2026.06.08
  • 🎬 랜딩 첫 화면 영상 10초 심리스 루프
  • 5초 되감기(부메랑) 대신 한 방향으로 흐르는 10초 영상으로 바꿔, 반복 재생 시 끊김 없이 자연스럽게 이어져요.
  • 캐시 v346 → v347.
β 1.7.76 2026.06.08
  • 📱 랜딩 모바일 화면 보정
  • 휴대폰에서 첫 화면 영상이 잘려 보이던 부분을 고쳐, 마스코트가 온전히 보이도록 했어요.
  • 캐시 v345 → v346.
β 1.7.75 2026.06.08
  • 🎬 랜딩페이지(소개 화면) 새단장
  • 첫 화면에 마스코트 영상 배경을 넣고, 소개 글은 핵심만 보이도록 정리했어요. 스크린샷은 자동으로 흐르며 둘러볼 수 있어요.
  • 캐시 v344 → v345.
β 1.7.74 2026.06.08
  • 🧹 지난 이벤트 안내 정리
  • 문의하기·계정 보호 안내에 남아 있던 5월 오픈베타 이벤트 문구를 정리하고, 종료된 이벤트의 랭킹 점수 패널티가 더는 적용되지 않도록 했어요.
  • 캐시 v343 → v344.
β 1.7.73 2026.06.08
  • 🎨 안내 화면을 그림으로 — 더 직관적으로
  • 촬영 가이드(각도·거리·환경·길이), iPhone 설치, AI 코치 키 발급, 경기 분석 사용법, 빈 화면을 캐릭터 일러스트로 바꿨어요.
  • AI 코치 안내 문구를 정확하게 다듬고, 경기 분석 시 아이 실명을 AI로 보내지 않도록 했어요.
  • 캐시 v342 → v343.
β 1.7.72 2026.06.07
  • 🎨 정면 인증 안내 그림을 일러스트로 교체
  • 안내 화면의 2단계 그림을 더 보기 좋은 캐릭터 일러스트(얼굴 정면 → 동작)로 바꿨습니다.
  • 캐시 v341 → v342.
β 1.7.71 2026.06.07
  • ✨ 정면 인증 배너 — 눈에 띄게 (주목 애니메이션)
  • 분석 시작 화면의 정면 인증 배너가 잘 안 보인다는 점을 보완했습니다. 안내를 한 번 확인하기 전까지 배너가 은은하게 깜빡이며(펄스+카메라 흔들림) 시선을 끕니다. 한 번 눌러 안내를 보면 애니메이션이 멈춥니다.
  • 캐시 v340 → v341.
β 1.7.70 2026.06.07
  • 📸 정면 인증 안내를 시작 화면에 선제 노출
  • 분석 시작 화면 상단에 “영상 시작에 얼굴 정면 1~2초” 배너를 추가했습니다(누르면 안내 그림).
  • 코치 모드에 코치·감독용 안내를 넣어, 학생들에게 “훈련 영상은 얼굴을 먼저 보여주고 시작”을 안내하도록 했습니다. 훈련 인증은 코치 확인이 필요한 만큼 확실히 전달됩니다.
  • 훈련 첫 업로드 시 정면 인증 안내가 1회 자동으로 떠요.
  • 캐시 v339 → v340.
β 1.7.69 2026.06.07
  • 📸 정면 인증 도입 — 영상 시작에 얼굴 한 번
  • 경기·훈련 영상은 동작 중 얼굴이 잘 안 잡혀 본인 확인이 어려웠습니다. 이제 영상 맨 처음에 카메라를 정면으로 1~2초 보면 그 프레임으로 본인 확인을 합니다.
  • 분석(투구·타격·수비)은 정면 인증해야 랭킹에 반영되고, 훈련 인증도 시작 전 정면 인증이 필요합니다. 첫 영상에서 한 번만 하면 이후는 자동 통과됩니다.
  • 설정 > 본인 얼굴 인증의 '정면 인증 안내'에서 방법을 그림으로 볼 수 있어요.
  • 캐시 v338 → v339.
β 1.7.68 2026.06.07
  • 🐛 얼굴 등록이 저장되지 않던 버그 수정
  • 등록한 얼굴이 새로고침하면 사라지던 문제를 고쳤습니다. 원인은 얼굴 정보가 용량이 큰 프로필 데이터에 묶여 있어, 저장공간 한도에 걸리면 기기에 안 남던 것입니다. 이제 얼굴 정보를 전용 저장키로 분리하고 IDB 백업·복원을 적용해 한도와 무관하게 유지됩니다.
  • 이 버그로 등록 사용자도 랭킹에서 빠질 수 있었어요(얼굴 미등록 취급). 함께 해결됩니다.
  • 캐시 v337 → v338.
β 1.7.67 2026.06.07
  • 📏 얼굴 측정 정확도 개선 — 샘플 프레임 5 → 24 (관리자 측정 전용)
  • 관리자 측정([iCoach face-test]) 시 영상에서 얼굴을 찾는 프레임 수를 5개 → 24개로 늘렸습니다. 투구처럼 얼굴이 잠깐만 보이는 영상에서 미감지(detected:false)를 줄여 거리값을 더 많이 확보하기 위함입니다. 관리자 전용이라 일반 분석 속도에는 영향 없습니다.
  • 캐시 v336 → v337.
β 1.7.66 2026.06.07
  • 🧪 관리자 모드 얼굴인증 적용 토글 (QA용)
  • 관리자 도구에 "🧪 실제 얼굴인증 (QA용)" 스위치를 추가했습니다. OFF(기본)은 기존처럼 관리자 모드에서 차단 없이 거리만 측정([iCoach face-test])하고, ON이면 관리자 모드에서도 실제 얼굴인증 게이팅이 작동해 타인 영상이 차단됩니다 — 일일 제한 없이 실사용 차단 흐름을 QA할 수 있습니다.
  • 일반 사용자에게는 영향이 없습니다.
  • 캐시 v335 → v336.
β 1.7.65 2026.06.06
  • 📏 얼굴 인증 정확도 측정 로그 (관리자 전용 · 점수/게이팅 영향 없음)
  • 관리자 모드에서 영상 분석 시, 등록된 기준 얼굴과의 거리를 계산해 콘솔 맨 아래 [iCoach face-test] dist=… sim=… wouldBe=… 한 줄로 출력합니다. 본인/타인 영상의 거리 분포를 모아 임계값을 검증하기 위한 계측입니다.
  • 일반 사용자 동작에는 전혀 영향 없습니다(관리자 모드에서만, 차단·점수 미반영).
  • 캐시 v334 → v335.
β 1.7.64 2026.06.06
  • 🔒 랭킹 공정성 강화 — 얼굴 등록 필수화
  • 랭킹 참여 시 얼굴 등록을 필수로 요구합니다. 미등록 상태에서는 랭킹에 자동 등록되지 않고 얼굴 등록 안내가 표시됩니다(관리자 모드는 예외).
  • 얼굴 미등록(skip) 분석 기록을 랭킹 점수 집계에서 제외했습니다. 본인 확인이 안 된 타인·중계 영상이 랭킹을 오염시키지 못하도록 차단합니다.
  • 이미 얼굴을 등록한 사용자는 영향 없습니다(타인 영상은 분석 단계에서 이미 차단됨).
  • 캐시 v333 → v334.
β 1.7.63 2026.06.06
  • 🔧 다인 진단값 콘솔 노출 개선 (점수 영향 없음)
  • β1.7.62의 다인 검출 진단값(실질 인물 수)을 콘솔 맨 아래에 [iCoach persons] substantial=N 형태의 한 줄로 출력해, 객체를 펼치지 않아도 바로 보이게 했습니다.
  • 캐시 v332 → v333.
β 1.7.62 2026.06.06
  • 👥 다인 검출 진단 추가 (캘리브레이션 단계 · 점수 영향 없음)
  • 배경 인물(포수·관중)을 놓쳐 다인 영상이 통과되던 문제 보완을 위해, 민감한 보조 검출기로 "실질 인물 수"(주피사체 대비 40%+ 크기)를 콘솔 [iCoach persons] 로그로 남깁니다.
  • 점수에는 반영하지 않습니다(현 personCountMax 그대로). 재분석으로 다인-FN과 정상 1인 영상이 갈리는지 확인 후 다음 패치에서 통합.
  • 캐시 v331 → v332.
β 1.7.61 2026.06.06
  • 🔬 동작 진폭 신호 계측 추가 (캘리브레이션 단계 · 점수 영향 없음)
  • 각도-FN(정면·사선 NG가 통과되는 문제) 보완을 위해, 분석 시 손목 궤적·회전 진폭·어깨 깊이차를 계산해 콘솔 [iCoach motion] 로그로 남깁니다.
  • 이번엔 점수에 반영하지 않습니다. 33개 영상 재분석으로 어느 신호가 OK/FN을 가르는지 확인한 뒤 다음 패치에서 통합 예정.
  • 캐시 v330 → v331.
β 1.7.60 2026.06.06
  • 📐 카메라 각도 판별 임계치 보정 (측면 인식 정확도 ↑)
  • 측면 판정 기준을 median < 0.20< 0.24 로 완화했습니다. OK 측면 영상 17개 재분석 결과, 정상 측면인데 값이 0.21~0.225로 살짝 높아 '사선'으로 오분류되던 3건을 바로잡았습니다.
  • 캘리브레이션 근거: 측면 영상 median 0.034~0.225, 비측면 NG는 0.282 이상 → 0.20~0.24 구간엔 NG가 없어 안전.
  • 점수 페널티·게이팅은 변경 없음(각도 분류기는 측면 영상 점수 보정 용도로만 사용).
  • 캐시 v329 → v330.
β 1.7.59 2026.06.06
  • 🎯 카메라 각도 자동판별 복구 (각도 분류기 버그 수정)
  • 측면/사선/정면을 자동 판별하는 detectCameraView 가 프레임 수 조건 오류(10개 필요, 실제 8개 샘플)로 항상 '판별 불가'(unknown)로 빠지던 버그를 수정했습니다. 분류기가 그동안 한 번도 작동하지 않았습니다.
  • 이제 측면 영상은 신뢰도 점수가 더 정확히 올라가고, 정면·사선 영상은 안내가 표시됩니다.
  • 콘솔 [iCoach preflight] 로그에 판별 중앙값(viewMedian)을 노출 — 분류 정확도 검증용.
  • 점수 페널티 강도는 이번엔 유지(검증 우선). 재분석 데이터 확인 후 다음 패치에서 게이팅 조정 예정.
  • 캐시 v328 → v329.
β 1.7.58 2026.06.06
  • 🎯 영상 품질 점수(qualityScore) 계산 로직 개선
  • 33개 영상 캘리브레이션 결과를 토대로 다인·잘림 페널티를 강화했습니다.
  • 변경: personCount 가중치 0.15→0.25, factor 값 강화(2명 0.6→0.45, 3명+ 0.4→0.20)
  • 변경: fullBody 가중치 0.20→0.25, 분모 0.80→0.85 (잘림 더 엄격하게)
  • 변경: camera 가중치 0.30→0.25, abnormal 0.15→0.10
  • 효과: NG 영상의 high tier 누락(False Negative) 약 40% 감소 예상.
  • 캐시 v327 → v328.
β 1.7.57 2026.06.05
  • 🎟️ 랜딩페이지 오픈베타 이벤트(5/1~5/31) 섹션 제거
  • 이벤트 종료에 따라 랜딩페이지의 PRIZE·CATEGORIES·HOW TO PARTICIPATE 섹션을 정리했습니다. 앱(app.html)은 변경 없음 (다음 이벤트 시 재활용 가능한 자동 숨김 설계 보존).
  • 캐시 v326 → v327.
β 1.7.56 2026.05.29
  • 🐛 [핫픽스] 땅볼 모드에서 NG 이미지가 타격 자세로 잘못 표시되던 버그 수정
  • 실제 땅볼 모드 ID가 'infield_ground'인데 NG 분기 함수가 'infield'만 체크하고 있어 매번 기본 NG(타격 자세)로 빠지던 문제를 수정했습니다.
  • 이제 땅볼 모드 진입 시 NG 4장이 모두 땅볼 수비 자세 전용 NG로 정상 표시됩니다.
  • OK 이미지는 fallback 덕분에 우연히 정상 동작 중이었지만 함께 주석 정정.
  • 캐시 v325 → v326.
β 1.7.55 2026.05.29
  • 🖼️ 내야수비 "여러 명 NG" 이미지 2장 리프레시
  • 땅볼·플라이볼의 "여러 명 NG" 예시가 이전엔 같은 동작을 하는 3명이 일렬로 늘어선 어색한 구도였는데, "동작하는 1명 + 옆에 그냥 서 있는 동료 1명" 구도로 자연스럽게 교체했습니다.
  • 실제 학원·필드 현장에서 분석 대상 옆에 다른 학생이 같이 찍히는 상황을 그대로 반영한 컷이라, NG 의도가 더 직관적으로 전달됩니다.
  • 파일명은 동일하지만 PWA 캐시 강제 갱신을 위해 캐시 v324 → v325.
β 1.7.54 2026.05.29
  • 🧤 내야수비(땅볼·플라이볼) 모드 전용 가이드 이미지 9장 적용
  • "좋은 영상 찍는 법" 카드의 OK·NG 예시를 땅볼 4장 + 플라이볼 OK 1장 + 플라이볼 NG 4장 모두 전용 이미지로 교체했습니다.
  • 이제 땅볼 모드·플라이볼 모드를 선택하면 그 동작에 맞는 측면 90° OK 예시와 정면·사선·잘림·여러 명 NG 예시가 자동으로 표시됩니다.
  • 플라이볼은 글러브를 머리 위로 올리는 캐치 동작 기준이라, 위쪽 잘림 NG가 특히 직관적입니다.
  • 코드: getOkGuideImagePathinfield_fly 분기 추가 + getNgGuideImagePaths(mode, fieldingType) 시그니처 확장.
  • 캐시 v323 → v324.
β 1.7.53 2026.05.28
  • ⚾ 투구 모드 전용 NG 영상 가이드 4장 적용
  • "이런 영상은 점수가 부정확해요" 섹션의 NG 예시 4장을 투구 자세 전용 이미지로 교체했습니다 (정면·사선·부분·다인).
  • 기존에는 모드와 상관없이 동일한 NG 이미지를 보여줬지만, 이제 투구 모드일 때는 투구 자세의 NG 예시가 자동 표시됩니다.
  • 타격·수비 모드는 기존 NG 이미지를 그대로 사용. 추후 모드별로 확대 예정.
  • 코드: getNgGuideImagePaths(mode) 추가 + renderCameraGuide() 모드별 NG src 교체 로직.
  • 캐시 v322 → v323.
β 1.7.52 2026.05.28
  • 🧤 내야수 플라이볼 추천 훈련 7개 상세화
  • 땅볼 처리 훈련과 같은 수준으로 [목적]·[방법 ①~⑤]·[횟수]·[주의] 형식으로 모든 훈련 설명을 보강했습니다.
  • 대상 7개 훈련: 팝플라이 캐치 연습 · 볼 트래킹 훈련 · 드롭스텝-크로스오버 · 하이 캐치 포지션 훈련 · 쿠션 캐치 연습 · 캐치→스로우 전환 훈련 · 실전 팝플라이 시뮬레이션.
  • 이제 학원생·학부모가 결과 화면에서 "어떻게 하면 좋아지는지" 상세 안내를 한눈에 볼 수 있습니다.
  • 캐시 v321 → v322.
β 1.7.51 2026.05.28
  • 📝 "훈련" 용어 통일 — 앱 전체 "드릴" → "훈련"
  • 야구 학원·필드 현장에서 일반적으로 쓰지 않는 "드릴(drill)" 표현을 익숙한 "훈련"으로 일괄 변경했습니다.
  • 학생·학부모가 보는 모든 화면 — 추천 훈련 카드·코치 멘트·훈련 메뉴·릴리스 노트·AI 코치 채팅 등 — 에서 한꺼번에 적용.
  • 코드 내부(변수명·함수명·파일명)는 영문이라 그대로 유지. 동작에 영향 없음.
  • 총 약 419곳 일괄 치환.
  • 캐시 v320 → v321.
β 1.7.50 2026.05.28
  • 🧤 외야수 분석 다시 숨김 — 단일 2D 영상의 거리 한계 확인
  • β1.7.49에서 외야수 분석을 잠시 다시 활성화했으나, 외야수 동작이 보통 10~30m 이동 범위인 반면 MediaPipe Pose의 신뢰성 있는 인식 거리는 1~5m 수준이라 실질적 분석이 어렵다는 점을 재확인.
  • 준비자세나 캐치 순간 같은 "정지 동작"은 분석 가능하지만, 외야의 핵심 가치인 이동·드롭스텝·다이빙·펜스 플레이는 단일 카메라로 잡기 거의 불가능.
  • 현재 수비 분석 활성 모드는 내야수(땅볼·플라이볼)만. 포수·외야 둘 다 UI 숨김. 코드 로직과 분석 함수는 그대로 보존(복원 시 5분 작업).
  • 캐시 v319 → v320.
β 1.7.49 2026.05.28
  • 🧤 외야수 수비 분석 다시 활성화 — 포수만 숨김 유지
  • β1.7.48에서 포수·외야 둘 다 숨겼는데, 외야수 분석은 학원·학생 활용도가 충분히 있어서 다시 활성화했습니다.
  • 현재 수비 분석 활성 모드: 내야수 (땅볼·플라이볼) + 외야수. 포수만 준비 중.
  • 외야수 클릭 시 외야 전용 메트릭(준비자세·이동·캐치·트랜지션·송구)으로 분석 진행. 외야 전용 추천 훈련(gOD)도 자동 표시.
  • 포수 차단 가드는 유지 — 외부 링크·북마크로 catcher 호출돼도 안전.
  • 캐시 v318 → v319.
β 1.7.48 2026.05.28
  • 🧤 수비 분석 구조 개편 — 내야수 기준으로 정리
  • 분석 선호도가 낮고 단일 카메라 영상 분석의 한계가 큰 포수·외야수 모드는 일단 화면에서 숨겨졌습니다. 코드와 분석 로직은 그대로 보존되어 향후 복원 가능.
  • 수비 분석은 이제 내야수 기준으로만 진행됩니다 — 땅볼 처리 · 플라이볼 처리 두 가지 동작 유형.
  • 기존에 분석했던 포수·외야 기록은 히스토리·랭킹에 그대로 남아 조회 가능합니다 (데이터 보존).
  • 캐시 v317 → v318.
β 1.7.47 2026.05.28
  • 🪪 영상분석에도 본인 얼굴 인증 적용 (A-1.7)
  • 지금까지 본인 얼굴 인증은 훈련(훈련) 인증에만 작동했는데, 이제 영상분석에도 동일 정책으로 통합되었습니다. 학원·랭킹에서 다른 사람 영상을 본인 것처럼 올리는 부정 방지.
  • 정책 (훈련과 동일):
    · 미등록: 통과 (기존 흐름 유지)
    · 본인(similarity ≥ 0.5): 정상 분석
    · 미확정(0.4~0.5): 경고 + 분석 진행 + 랭킹 자동 제외
    · 본인 아님 추정(<0.4): 분석 차단
  • 관리자 모드(yunagunwoo 또는 icoach_admin=1)는 영상분석·훈련 둘 다 얼굴 인증 우회 — 캘리브레이션·QA 운영 효율성을 위해.
  • 분석 결과에 faceMatch 5필드 같이 저장 (Enrolled/Detected/Distance/Similarity/Verdict). lowConfidence와 별개로 랭킹·동급 평균 게이팅에 반영.
  • 캐시 v316 → v317.
β 1.7.46 2026.05.28
  • 📹 시각 카메라 가이드 카드 (A-1.6)
  • 영상 업로드 화면에 OK/NG 예시 이미지가 카드로 자동 표시됩니다. 글로만 설명하던 가이드를 시각으로 보여줘서 학원·학부모도 한눈에 이해.
  • 모드별 OK 컷 자동 교체 — 투구·타격·내야·외야·포수 5가지 자세별로 자기 종목 OK 예시가 나타남.
  • NG 3장(정면/사선/머리·발 잘림) + 수비 이외 모드에서는 다인물 NG 1장 추가 → 총 4장 표시.
  • 적응형 자동 접힘 — 최근 5건 분석에서 신뢰도 high가 4건 이상이면 가이드 자동 접힘 ("✓ 좋은 영상 잘 찍고 계세요!"). 다시 medium/low가 나오면 자동 펼침. 학습된 사용자에겐 노이즈 안 줌.
  • 수동 접기/펼치기 버튼도 제공 — 로컬에 저장되어 다음 방문 시에도 유지.
  • 이미지는 lazy loading으로 처음 가이드 카드 보일 때만 로드.
  • 캐시 v315 → v316.
β 1.7.45 2026.05.28
  • 🎯 분석 신뢰도 점수 + 자동 게이팅 (A-1.5)
  • 모든 분석 결과에 qualityScore (0~1)가 자동 계산됩니다. 카메라 각도·전신 프레임·인물 수·관절 추적 성공률·비정상 측정값 5가지를 가중평균.
  • tier 분류: high (≥0.80) / medium (0.50~0.80) / low (<0.50).
  • tier가 high가 아니면 결과 화면 점수 카드 아래에 학부모 친화 안내 카드 표시 ("이번 영상은 점수 참고용 — 측면 영상으로 다시 찍으면 더 정확합니다" 톤).
  • low(신뢰도 낮음) 영상은 자동으로 랭킹·동급 평균 비교에서 제외됩니다. 히스토리에는 그대로 저장되지만 lowConfidence:true로 구분.
  • 이전 핸드오프 결론(2D 영상의 본질적 한계는 메트릭으론 못 풀고, 신뢰도 레이어로 흡수해야 함)을 시스템으로 구현.
  • 임계치는 보수적으로 시작 — 첫 주 실사용 데이터 보고 다음 세션에서 조정 예정.
  • 캐시 v314 → v315.
β 1.7.44 2026.05.28
  • 📹 분석 시작 전 영상 사전 체크 (A-1)
  • "분석 시작하기"를 누르면 본 분석 전에 영상을 미리 점검합니다 — 카메라 각도(측면 90° 여부) · 인물 수(1명 vs 다수) · 전신 프레임 여부를 8개 시점에서 자동 확인.
  • 문제 발견 시 모달로 안내 + [다시 찍기] / [그대로 진행] 선택. 사용자가 입력 품질을 먼저 통제해서 같은 폼이 매번 다른 점수로 흔들리는 일을 줄입니다.
  • 수비 모드는 코치+수비수 두 사람이 정상이라 다중 인물 경고 미적용. 카메라 각도도 사선/정면 허용.
  • 사전 체크는 약 5~10초 추가 소요. 본 분석에는 영향 없음 (실패 시 자동 스킵).
  • 캐시 v313 → v314.
β 1.7.43 2026.05.27
  • ⚾ 투구 메트릭 P8 — P7 부족분 보강
  • P8-A — 와인드업 무릎 각도가 30° 미만(측면 영상 트래킹 한계로 12°·0° 등 비현실값으로 잡히는 케이스)이면 측정 실패로 간주, 65° 중립값으로 대체. 오타니·오승환 같은 케이스의 와인드업 점수 회복.
  • P8-B — 스트라이드 보폭 ok 상한을 0.75→1.20으로 확장. 야마모토의 신장 100%+ 익스트림 보폭도 정상 점수.
  • P8-C — scoreRange ok 밖 페널티 완화 (최저 40→50점, 거리 계수 1.5→1.2). 측정값이 살짝 어긋난 케이스에 너무 가파른 페널티 방지.
  • 야마모토 66 → 78~82, 오타니 81 → 85+ 예상.
  • 캐시 v312 → v313.
β 1.7.42 2026.05.27
  • ⚾ 투구 메트릭 P7 정밀 조정 — 일본식·MLB 정점 폼 포용
  • P7-A — 와인드업 무릎 각도 측정 노이즈 흡수 (ok 범위 35°~130°로 확장).
  • P7-B — 스트라이드 보폭 ideal 30~65%·ok 20~75%로 확장. 야마모토·다카하시 같은 일본식 큰 보폭 포용 (이전 0.50 상한에 막혀 있었음).
  • P7-C — 유연성 메트릭 보강: 코킹 가중치 0.3→0.5 + 골반-어깨 분리각 ideal 30~70°로 확장. 어깨 외전·hip-shoulder 분리 잘 잡힌 폼이 유연성에 제대로 반영.
  • 야마모토 같은 케이스가 61점 → 78~83점 정상 분포 도달 예상.
  • 캐시 v311 → v312.
β 1.7.41 2026.05.27
  • 📊 동급 학년 평균 대비 점수 (옵션 B+C)
  • 분석 결과 화면 종합 점수 아래에 "※ 프로 기준 채점 · 만 X세 보정 적용" 안내가 항상 표시돼요(옵션 B). 점수가 어떤 기준으로 매겨졌는지 학부모에게 명확히 알림.
  • 동급 학년 평균 대비 점수도 같이 표시(옵션 C). 같은 나이대 분석 10건 이상 누적되면 "만 X세 평균 Y점 · 상위 Z%"로 자동 표시. 10건 미만이면 "누적 중 (N/10건)" 진행 안내.
  • Firebase rankings 컬렉션을 조회 — 모든 사용자의 누적 분석 데이터 활용.
  • 캐시 v310 → v311.
β 1.7.40 2026.05.27
  • 🤝 비정상 감지 정밀 조정 — 코칭과 경고를 명확히 구분
  • 힙 회전 부족은 초·중학교 아이들의 가장 흔한 약점이라 경고가 아닌 코칭으로 안내하는 게 맞아요. 힙 회전이 적은 경우는 기존 스윙 단계 피드백에서 "티 배팅·힙 턴 훈련" 코칭으로 안내합니다.
  • "영상에서 스윙 동작이 잡히지 않은 케이스"(무릎 움직임 거의 없음)만 안내 유지 — 메시지 톤도 부드럽게.
  • 경고 카드 전체 톤 조정: "신뢰하지 마세요" → "정확하지 않을 수 있어요".
  • 캐시 v309 → v310.
β 1.7.39 2026.05.27
  • 📹 비정상 감지 보강 (P6) — 너무 작은 변동값도 경고
  • 스윙 동작이 거의 감지되지 않는 영상(힙-어깨 분리각 변동 5° 미만, 무릎 변동 3° 미만)도 ⚠️ 비정상 측정값 감지 경고가 떠요. 카메라 흔들림·측정 실패·정지 영상 케이스 보강.
  • 예: 김건우 영상 #3에서 힙 회전 4°가 나왔던 케이스가 이제 명확히 경고로 잡힙니다.
  • 캐시 v308 → v309.
β 1.7.38 2026.05.27
  • 📹 비정상 측정값 자동 감지 — 투구·타격·수비 전 분석에 적용
  • 카메라 각도가 측면처럼 보여도 영상에 다른 사람이 잡혔거나 영상 품질이 낮아 관절 추적이 헷갈리면, 측정값이 신체적으로 불가능해질 수 있어요. 이 경우 ⚠️ 빨간 경고 카드가 결과 화면 맨 위에 떠서 "이 점수는 신뢰하지 마세요"라고 명확히 안내합니다.
  • 감지 항목: 힙-어깨 분리각 100°+ · 무릎 각도 비정상 · 팔꿈치 각도 비정상 · 머리 움직임 과도.
  • 카메라 경고가 이미 떠 있으면 중복 안 뜨도록 우선순위 처리.
  • 캐시 v307 → v308.
β 1.7.37 2026.05.27
  • 📹 카메라 각도 경고 대폭 강화 — 측면 영상이 아닐 때 점수 부정확 안내
  • 측면(90°)이 아닌 영상은 결과 화면 맨 위에 ⚠️ 빨간 경고 카드가 떠요. 힙 회전·어깨 분리 같은 핵심 메트릭이 측정이 어려우니 점수를 참고용으로만 봐달라고 명확히 안내해요.
  • 사선·정면·뒷면뿐 아니라 분석 신뢰도가 낮은 영상(인식 불가·너무 짧음)도 동일하게 경고.
  • 캐시 v306 → v307.
β 1.7.36 2026.05.27
  • 🎯 타격 점수 미세조정 (P5) — 힙 회전 범위 확장
  • P5 — 힙 회전 정상 범위를 30~55° → 30~75°로, ok 범위를 15~65° → 15~90°로 확장. KBO 거포·풀스윙 타자(70~90° 회전)도 정상 점수 받음.
  • 안현민·강한 코일 타입 선수들이 스윙 단계에서 손해 보던 문제 해결.
  • 캐시 v305 → v306.
β 1.7.35 2026.05.27
  • 🎯 타격 점수 로직 전면 재조정 (P0+P1+P2+P2.5+P3) ⭐
  • P3 (핵심 버그 수정) — 힙 회전 측정 wrap-around 버그 수정. 358°·320° 같은 비물리적 값이 더 이상 나오지 않아요.
  • P0 — 머리 흔들림이 완벽(0.00)이면 100점 만점 인정 (이전엔 95점 캡).
  • P1+Fix-A — 임팩트 단계 측정 윈도우 정밀화 + 충분 포착.
  • P2 — 팔 뻗기·힙 마무리 기준을 KBO 콤팩트 스윙도 포용하도록 확장.
  • P2.5 — 단계별 점수 페널티 완화 (한 메트릭 어긋남이 단계 폭락시키던 문제).
  • 캐시 v304 → v305.
β 1.7.34 2026.05.23
  • ⭐ 프리미엄 구독 준비 + ☁ 클라우드 백업
  • 설정에 클라우드 백업이 생겼어요(Pro). 기기를 바꿔도 같은 계정으로 로그인하면 기록을 복원할 수 있어요.
  • 프리미엄 구독은 구조만 준비해뒀고, 정식 오픈 시 자동으로 켜집니다.
  • 캐시 v303 → v304.
β 1.7.33 2026.05.23
  • ⚡ 앱 더 가볍게 (2단계)
  • 작은 아이콘들까지 본체에서 분리했어요. 앱 본체가 약 4.6MB→1.6MB로 줄어, 업데이트할 때 다시 받는 양이 크게 줄었어요(두 번째 열 때부터 더 빨라요).
  • 캐시 v302 → v303.
β 1.7.32 2026.05.23
  • ⚡ 앱 용량 다이어트 (더 빠르게)
  • 배지·코치 그림 등 큰 이미지를 앱 본체에서 분리해, 앱이 약 9.6MB→4.6MB로 가벼워졌어요. 업데이트할 때 다시 받는 양도 줄어요.
  • 그림은 따로 저장(캐시)돼서 다음부터 더 빠르게 열려요.
  • 캐시 v301 → v302.
β 1.7.31 2026.05.23
  • ⚾ AI 코치 채팅 — 야구 전용 + 안전 가드
  • AI 코치가 야구(와 운동하는 선수의 건강) 이야기에만 답하도록 했어요. 야구와 무관하거나 부적절한 질문은 부드럽게 야구로 돌려보내요. 아이들이 안심하고 쓸 수 있어요.
  • 너무 빠르게 연달아 물어보면 잠깐 쉬어가도록 안내해요(가벼운 쿨다운).
  • 캐시 v300 → v301.
β 1.7.30 2026.05.23
  • ⭐ Pro 게이팅 2단계 (관리·문의·보안)
  • 업그레이드 모달의 "Pro 문의하기"가 문의 양식으로 연결되고, 관리자 모드에 "Pro 부여/해제" 도구가 생겼어요. 계정 권한(plan) 변조 방지 보안규칙도 적용했어요.
  • 캐시 v299 → v300.
β 1.7.29 2026.05.22
  • ⭐ Pro 게이팅 1단계 (내부)
  • 주간 리포트가 Pro 기능으로 전환됐어요(키 안내처럼 업그레이드 안내 모달 표시). Pro 권한은 계정에 부여됩니다.
  • 캐시 v298 → v299.
β 1.7.28 2026.05.22
  • 🔑 AI 코치 — 기본 코치 안내 + 구글 계정 안내
  • 키가 없으면 AI 코치 채팅 상단에 "기본 코치 · AI 켜기" 배너가 항상 보이고, 구글 계정이 없는 분을 위한 계정 만들기 안내도 추가했어요.
  • 캐시 v297 → v298.
β 1.7.27 2026.05.22
  • 🔑 AI 코치 키 입력 안내 강화
  • 키 없이 AI 코치와 대화하면 무료 키 받는 법 안내가 떠요(Google AI Studio 바로가기 포함). 설정의 API 키 상태 표시 오류도 고쳤어요.
  • 캐시 v296 → v297.
β 1.7.26 2026.05.22
  • 🤖 AI 모델 업그레이드 — Gemini 3.5 Flash
  • 경기 분석·훈련 인증·AI 코치 채팅의 기본 AI를 최신 Gemini 3.5 Flash로 바꿨어요. 영상 분석 정확도가 좋아집니다.
  • 캐시 v295 → v296.
β 1.7.25 2026.05.22
  • 🎨 아이콘 추가 교체 (홈·분석·성장기록)
  • 주간 리포트 보내기·촬영 팁·마지막 백업·최근 분석 결과 아이콘을 캐릭터(건우) 일러스트로 바꿨어요.
  • 캐시 v294 → v295.
β 1.7.24 2026.05.22
  • 🎨 설정·분석 아이콘 5종 교체
  • 부모용 간단 모드·본인 얼굴 인증·저장공간·효과음 설정 + 촬영 가이드 다시 보기 아이콘을 캐릭터(건우) 일러스트로 바꿨어요.
  • 캐시 v293 → v294.
β 1.7.23 2026.05.22
  • 🪪 인증 영상 — 본인 얼굴 등록 필수
  • 얼굴을 등록하지 않으면 훈련 인증이 안 됩니다. 인증할 때 등록 안내가 떠요. (설정 > 본인 얼굴 인증)
  • 캐시 v292 → v293.
β 1.7.22 2026.05.22
  • 🔒 훈련 인증 영상 — 완전 인증 적용
  • 모든 훈련 인증 영상에 AI 2단계 검증 + 본인 얼굴 인증 + 7일 이내 촬영 제한이 자동 적용돼요. (얼굴은 설정에서 등록 시 자동 승인)
  • 캐시 v291 → v292.
β 1.7.21 2026.05.22
  • 📹 훈련 메뉴 영상형 훈련 — 인증 기능 추가
  • 펜스 플레이·피칭 폼·슬라이딩 등 영상형 훈련도 본인 영상을 올려 인증할 수 있어요. (이전엔 안내문만 있었음)
  • 캐시 v290 → v291.
β 1.7.20 2026.05.22
  • 🖼️🎬 훈련 시범 — 이미지·영상 선택 보기
  • 영상이 있는 훈련도 시범 이미지를 함께 제공하고, 상단 「이미지 / 영상」 버튼으로 골라 볼 수 있어요. 기본은 이미지.
  • 캐시 v289 → v290.
β 1.7.19 2026.05.22
  • 🎬 훈련 메뉴 훈련에 시범 영상·이미지 연결
  • 훈련 메뉴(Phase D)에서 훈련을 누르면 자막 시범 영상(9종) 또는 시범 이미지(전체 훈련)가 표시돼요.
  • 캐시 v288 → v289.
β 1.7.18 2026.05.22
  • 🗓️ 코치 모드 — 레슨 일정 카드 아이콘 정리
  • "레슨 일정" 카드의 기본 이모지를 앱 디자인에 맞춘 캘린더 아이콘으로 바꿨어요.
  • 학생 카드의 "주간 리포트" 버튼이 위 글자와 붙어 보이던 간격도 띄웠어요.
  • 캐시 v287 → v288.
β 1.7.17 2026.05.21
  • 💬 "문의하기"로 통합 — 버그 제보·기능 제안·문의 3가지
  • 설정의 "버그 제보 & 기능 제안"을 "문의하기"로 바꾸고, 안에서 버그 제보·기능 제안·일반 문의를 골라 보낼 수 있어요.
  • 캐시 v286 → v287.
β 1.7.16 2026.05.21
  • 🧹 훈련 화면 — "칭호" 카드 컴팩트화
  • 루키/수습선수 같은 칭호 카드가 세로로 길었는데, 아바타와 칭호·진행바를 한 줄로 합쳐 작게 줄였어요.
  • 캐시 v285 → v286.
β 1.7.15 2026.05.21
  • 📊 분석 결과 화면 정리 — 탭으로 분리
  • 분석 결과가 너무 길어서 「결과 · 영상 · 상세」 3개 탭으로 나눴어요.
  • 결과(점수·코치·능력치) / 영상(자세 분석·프로 비교) / 상세(피드백·추천 훈련·롤모델). 공유·PDF·홈 버튼은 항상 아래에 보입니다.
  • 캐시 v284 → v285.
β 1.7.14 2026.05.21
  • 🧹 훈련 화면 — 연속 훈련 카드 컴팩트화
  • "연속 훈련" 카드가 빈 공간을 너무 차지해서, 제목과 일수를 한 줄로 합쳐 작게 줄였어요.
  • 캐시 v283 → v284.
β 1.7.13 2026.05.21
  • 💪 훈련 화면 정리 — 탭으로 분리
  • 훈련 탭이 너무 길어서 「오늘 · 훈련 메뉴 · 기록」 세 개 탭으로 나눴어요.
  • 앱을 열면 '오늘의 훈련'이 먼저 보이고, 훈련 메뉴(60+ 훈련)나 기록(캘린더·목표·분석)은 탭으로 골라 봅니다. 스크롤이 확 줄어요.
  • 캐시 v282 → v283.
β 1.7.12 2026.05.21
  • 🧑‍🏫 코치 자동진입 제거 — 앱 열면 항상 홈으로
  • 이전엔 코치로 설정된 기기에서 앱을 열면 코치 모드로 바로 들어갔는데, 테스트로 코치 등록한 기기에선 선수 계정도 코치 모드로 넘어가는 문제가 있어 제거했어요.
  • 이제 항상 홈 화면으로 시작합니다. 코치 모드는 ⚙️ 설정 → 코치 모드에서 들어갈 수 있어요.
  • 캐시 v281 → v282.
β 1.7.11 2026.05.21
  • 🔒 보안 강화 — 봇 차단(App Check) 적용 시작
  • 자동화 스크립트·봇이 데이터에 함부로 접근하지 못하도록 보호장치를 적용하기 시작했어요.
  • 지금은 관찰 단계라 일반 사용자 경험엔 변화가 없습니다.
  • 캐시 v280 → v281.
β 1.7.10 2026.05.21
  • 🧑‍🏫 코치 화면과 아이 화면 분리
  • 코치 자동 진입: 코치로 설정된 기기는 앱을 열면 코치 모드로 바로 들어갑니다.
  • 아이 화면 정리: 홈에 있던 "코치 모드로 이동" 카드를 없앴어요. 아이가 쓰는 화면엔 코치 카드가 보이지 않습니다. (코치 모드는 ⚙️ 설정에서 들어갈 수 있어요)
  • 캐시 v279 → v280.
β 1.7.9 2026.05.20
  • 🔧 코치 프로필 편집 버그 수정 + 외부 스크립트 정리
  • 코치 편집 수정: 코치로 가입한 분이 프로필을 수정할 때 "나이를 입력해 주세요"에 막혀 저장되지 않던 문제를 고쳤어요. 이제 코치는 나이 없이도 프로필 수정이 됩니다.
  • 개인정보 보호: 페이지에 남아 있던 외부(genspark) 스크립트를 제거해 더 깔끔하고 안전하게 만들었어요.
  • 선수 가입·사용 흐름은 이전과 동일합니다. 캐시 v278 → v279.
β 1.7.8 2026.05.20
  • 🧑‍🏫 가입 시 선수/코치 선택 (Phase D 위험 36)
  • 핵심: 첫 가입 화면 맨 위에서 "선수로 가입 / 코치로 가입"을 고를 수 있어요. 코치를 고르면 나이·신장 같은 선수 항목이 숨겨지고 성인 생년월일도 입력할 수 있습니다.
  • 선수 가입 흐름은 이전과 100% 동일합니다.
  • 캐시 v277 → v278.
β 1.7.7 2026.05.20
  • 🧑‍🏫 코치 자동 진입 편의 개선 (Phase D 위험 37)
  • 핵심: 코치로 설정된 분은 홈 화면에 "코치 모드로 이동" 바로가기 카드가 떠서, 설정까지 안 들어가도 한 번에 코치 모드로 갈 수 있어요.
  • 역할 선택에서 "코치입니다"를 고르면 코치 모드로 바로 들어갑니다. (선수에겐 영향 없음)
  • 캐시 v276 → v277.
β 1.7.6 2026.05.20
  • 📅 레슨 일정 관리 추가 (코치 모드 · Phase E 기능 C)
  • 핵심: 상담 대기에서 "✅ 레슨 예약"을 누르면 날짜·시간·장소·레슨비를 입력해 레슨으로 등록할 수 있어요. 코치 모드에 "📅 레슨 일정" 카드가 생겼어요.
  • 주간/월간 뷰: 이번 주 레슨 리스트 + 월간 캘린더(날짜별 레슨 수)로 한눈에 확인.
  • 완료·노쇼·취소·수금 체크 + 이번 달 레슨 횟수·예상 수익 통계.
  • 레슨 일정은 코치 기기에 저장돼요(본인만). 캐시 v275 → v276.
β 1.7.5 2026.05.20
  • 🔧 관리자 인증 계정 설정 보정 + 캐시 갱신
  • β1.7.4의 관리자 Google 로그인 대상 계정을 운영 계정에 맞게 조정했습니다. (일반 사용자 영향 없음)
  • 캐시 v274 → v275.
β 1.7.4 2026.05.20
  • 🔐 관리자 인증 강화 — Firebase 로그인 전환 (보안)
  • 변경: 관리자 모드를 비밀번호 방식에서 Google 로그인(특정 계정만)으로 교체. 노출됐던 비번·콘솔/URL 백도어 제거.
  • 실질 보안: 코치 디렉터리 추가/수정은 Firestore 규칙에서 관리자 계정만 허용 → 코드 우회로도 변경 불가.
  • 일반 사용자 흐름(분석·랭킹·상담요청)은 그대로입니다. Firebase 로그인은 관리자 전용.
  • 캐시 v273 → v274.
β 1.7.3 2026.05.20
  • 📍 일반(비소속) 사용자 지역 기반 코치 연결 (Phase E)
  • 핵심: 비소속 사용자가 상담 요청 시 사는 시/도(+시·군·구)를 고르면, 운영자가 등록해 둔 가까운 코치 목록이 떠서 직접 연락할 수 있어요.
  • 전국 확장 대비: 17개 시/도 구조(부산·경남 우선). 시·군·구가 같은 코치를 먼저 보여주고, 없으면 같은 시/도로 매칭합니다.
  • 운영자 관리: 관리자 모드에 "코치 디렉터리 관리" 추가 — 지역별 코치(이름·지역·전문분야·공개연락처) 등록/숨김.
  • 개인정보 보호: 코치 사업용 공개 연락처만 저장(아이 개인정보 아님). 일반 사용자는 코치에게 직접 연락.
  • 캐시 v272 → v273.
β 1.7.2 2026.05.20
  • 🧑‍🏫 코치 모드 "레슨 상담 대기" + 기기 간 전달 (Phase E)
  • 핵심: 소속(야구클럽팀) 학생이 보낸 레슨 상담 요청이 코치 모드 화면에 "📞 레슨 상담 대기" 카드로 뜹니다. 다른 기기에서도 보여요(Firebase 연동).
  • 코치 액션: 요청 목록에서 학생·추천등급(🟡/🔴)·사유를 확인하고 "보류" 처리. "레슨 예약"은 다음 업데이트(β1.7.3)에서 일정 관리와 함께 작동합니다.
  • 개인정보 보호: 소속 요청은 연락처 없이 이름·분석 맥락만 전달(코치는 학원 통해 연락). 일반(비소속) 사용자는 연락처를 공개 서버에 올리지 않고 운영자 사적 채널로 안내합니다.
  • 코치 모드에서 "내 소속"을 입력해 두어야 해당 팀 요청이 매칭됩니다.
  • 캐시 v271 → v272.
β 1.7.1 2026.05.20
  • 📞 레슨 상담 요청 기능 작동 (Phase E)
  • 핵심: 분석 결과의 🟡/🔴 추천 카드에서 "코치님께 상담 요청하기"가 실제로 작동합니다. 버튼을 누르면 상담 요청 모달이 열려요.
  • 소속/일반 자동 분기: 야구클럽팀이 등록된 학생은 담당 코치님께 전달, 비소속(일반) 사용자는 지역·연락처를 남기면 가까운 코치를 연결해 드립니다.
  • 안전 장치: 학부모(보호자) 동의 체크 필수 + "레슨비·일정·환불은 코치와 직접, 아이코치는 연결만" 안내. 같은 분석에는 1회만 요청(중복 방지).
  • 요청 접수 시 카드가 "✅ 상담 요청 완료"로 바뀝니다.
  • ※ 코치·운영자가 요청 목록을 보는 화면은 다음 업데이트(β1.7.2)에서 추가됩니다.
  • 캐시 v270 → v271.
β 1.7.0 2026.05.20
  • 📞 레슨 추천 기능 (Phase E 시작) ⭐
  • 핵심: AI 분석 결과 화면 맨 아래에 "코치 추천" 카드가 자동으로 표시됩니다. 이번 분석 점수·능력치와 같은 모드 과거 기록을 종합해 3단계로 안내해요.
  • 🟢 셀프 교정 — "이것만 고치면 훌륭해요!" 혼자 연습으로 충분한 경우 (격려만).
  • 🟡 레슨 권장 — "이 부분은 직접 레슨받으면 훨씬 빨리 좋아져요." 약점 능력치(60점 미만)나 점수 정체가 보일 때.
  • 🔴 레슨 강력 추천 — 밸런스·유연성·정확도처럼 감각이 중요한 부분이 많이 낮거나(50점 미만) 정체될 때, 1시간 직접 레슨 안내.
  • 이번 버전은 "표시 전용"입니다. "코치님께 상담 요청" 버튼은 보이지만, 실제 상담 요청 동작은 다음 업데이트(β1.7.1)에서 활성화됩니다.
  • 캐시 v266 → v270.
β 1.6.6 2026.05.19
  • 🔧 핫픽스 — 학생 계정도 "코치로 추정" 뜨던 버그 (β 1.6.6) ⚡
  • 증상: 모든 학생 계정 첫 부팅 시 역할 확인 모달이 "코치로 추정됩니다" 표시. 학생 99%가 잘못된 추정 결과 보임. 영업 시연 시 신뢰도 타격.
  • 원인 1: _inferUserRoleicoach_coach_students 키 존재만으로 코치 단정. 빈 배열 또는 무명 학생 1개만 있어도 코치로 추정.
  • 원인 2: 모달이 사용자 액션 전엔 icoach_role_modal_shown 플래그 미저장 → 사용자가 무시하고 새로고침하면 다음 부팅에 또 표시.
  • 수정 1: 추론 강화 — 학생 명단에 "이름이 있는 실제 학생" 1명 이상이거나 코치 기본 소속이 2자 이상일 때만 "coach". 그 외 기본 "student".
  • 수정 2: 모달 표시 직전에 즉시 shown=1 저장 → 재표시 100% 차단.
  • 캐시 v265 → v266.
β 1.6.5 2026.05.19
  • 🎨 카테고리·역할 캐릭터 이미지 9개 적용 (β 1.6.5) ⭐
  • 변경 핵심: 8개 카테고리(기초체력·근력·유연성·야구기본기·포지션·부상예방·정신·자기관리) + 선수 역할 캐릭터 = 총 9개 치비 일러스트 이미지를 폴더에 추가. 군베이스볼 톤과 일관된 디자인.
  • ① 이미지 9개 1024×1024 → 224×224 자동 리사이즈 (96.5% 용량 절감: 15MB → 0.5MB)
  • sw.js ASSETS_TO_CACHE에 9개 PNG 등록 → 오프라인 환경에서도 이미지 정상 표시 (PWA)
  • ③ 이전 백업 폴더에 원본 1024×1024 보관 (필요 시 재사용 가능)
  • ④ 캐시 v264 → v265 (이미지 추가 반영)
  • 영업 임팩트: 8 카테고리 그리드 + 역할 모달이 군베이스볼 톤으로 통일된 시각 인상. 학원 시연 시 "이게 진짜 잘 만든 앱이다" 인상 형성.
β 1.6.4 2026.05.19
  • 🎨 카테고리·역할 아이콘 시스템 (β 1.6.4)
  • 이모지 → 치비 일러스트 캐릭터 이미지로 교체 (군베이스볼 톤 일관성)
  • DRILL_LIBRARY.categories[i].iconImage 필드 추가 — 각 카테고리에 PNG 경로 매핑
  • ② 렌더 함수 수정 — 이미지 우선, 로드 실패 시 이모지 자동 fallback (onerror 처리)
  • ③ 역할 모달 카드도 동일 적용 — 선수/코치 캐릭터 이미지
  • ④ 코치 역할은 기존 head-coach-circle-56.png 활용 (즉시 적용)
  • ⑤ 신규 8 카테고리 + 1 선수 캐릭터 = 총 9개 이미지 추가 필요 → _marketing/카테고리_아이콘_생성_프롬프트.md 참조
  • 안전성: 이미지 없어도 이모지로 fallback → 기능 영향 0
  • 캐시 v263 → v264.
β 1.6.3 2026.05.19
  • 🔧 핫픽스 — Phase D 훈련 모달 클릭 시 안 뜨던 버그 (β 1.6.3) ⚡
  • 증상: β 1.6.0 신규 카테고리 그리드에서 훈련(타이머·카운터·체크리스트 등) 클릭 시 모달이 표시되지 않음. 역할 확인 모달도 같은 문제.
  • 원인: .modal-overlay CSS에 opacity:0; pointer-events:none 기본값. .show 클래스 추가 시에만 opacity:1; pointer-events:all로 활성화되는 패턴. β 1.6.0/1.6.2에서는 style.display만 변경하고 .show 클래스를 안 붙여서 보이지 않았음.
  • 수정: drill-modal·role-confirm-modal 모두 classList.add/remove('show') 패턴으로 통일.
  • 4모드 인증 UI 모두 정상 작동 (타이머·카운터·체크리스트·자가보고).
  • 캐시 v262 → v263.
β 1.6.2 2026.05.19
  • 🧑‍🎓 역할 분류 시스템 — 선수 / 코치 (β 1.6.2) ⭐
  • 핵심 변경: 모든 사용자에게 명시적 역할(선수/코치)을 부여. 코치인지 학생인지 처음부터 확실히 분기되어 영업·시연·UX 일관성 ↑
  • profile.userRole 필드 신설 ('student' | 'coach'). 역할별 추가 정보(coachAffiliation, studentPosition 등) 저장.
  • 자동 추론: 기존 사용자는 코치 모드 토글/학생 명단 보고 자동 분류. 코치 모드 진입했거나 학생 1명+ 등록되어 있으면 'coach', 아니면 'student'.
  • 1회 확인 모달: 역할 미설정 사용자에게 부팅 시 1회만 띄움. 자동 추론 결과를 기본값으로, 변경 가능. Skip 옵션 제공.
  • 설정 화면 역할 변경 UI: 본인 프로필 카드 안 "역할: 선수 ▾ / 코치" 토글. 언제든 변경 가능.
  • UI 자동 분기: 학생은 훈련 카테고리 그리드 노출, 코치는 코치 모드 카드 + 학생 명단 우선. 둘 다 본인 훈련 기능은 그대로 사용 가능.
  • 호환성: 기존 가입 폼·PIN·Firebase 가입 흐름 그대로. 역할은 가입 후 자동 추론 또는 모달로 설정.
  • 다음 단계 (β 1.6.3 예정): 신규 가입 시 첫 화면에 역할 선택 추가 + 코치 전용 가입 폼.
  • 캐시 v261 → v262.
β 1.6.1 2026.05.19
  • 🔧 정합성 핫픽스 — 영업 자료와 일치시키기 (β 1.6.1) 🌱
  • 핵심 변경 2가지: 코치 매뉴얼·해운대 제안서·부스 기획안에 약속한 기능이 실제 코드와 일치하도록 정합성 보정.
  • 코치 검토 통합: ⏳ 검토 대기 카드·검토 모달에 영상뿐 아니라 신규 활동 4종(타이머·카운터·체크리스트·자가보고)까지 포함. 코치 매뉴얼 4-2장·5장 약속 충족.
  • 활동 유형별 검토 행 UI: 타이머는 시간+목표, 카운터는 횟수+영상, 체크리스트는 완료/전체+진행시간, 자가보고는 입력값. 각 행에 ✅/❌/📝 버튼.
  • 체크리스트 minDurationSec 훈련별 명시: 폼롤러 3부위는 180초, Throwers Ten은 300초, Jaeger 6단계는 240초 등 정확한 시간 강제 → 부상 예방 약속 무력화 방지.
  • _applyActivityReview 함수와 검토 모달 UI 연결 완료.
  • 호환성: β 1.6.0 사용자 데이터·UI 그대로. 코치 검토 동선 향상 + 위변조 차단 강화.
  • 캐시 v260 → v261.
β 1.6.0 2026.05.19
  • 🌳 훈련 메뉴 트리 + 4모드 인증 UI — Phase D 완성 (β 1.6.0) ⭐⭐⭐
  • 핵심: β 1.5의 야구 훈련 흐름은 그대로 보존 + 신규 8 카테고리 그리드·60개 표준 훈련·4모드 인증 UI 추가. 학생이 매일 인증할 거리 5배 풍성.
  • ① 훈련 탭 하단 신규 📚 더 많은 훈련 카드: 8 카테고리(기초체력·근력·유연성·야구 기본기·포지션 특화·부상 예방·정신·자기관리) 그리드
  • ② 카테고리 클릭 → 서브카테고리 + 훈련 리스트 펼침 (인플레이스, 별도 화면 안 생성)
  • ③ 훈련 클릭 → 모드별 인증 모달:
  • • ⏱️ 타이머 모드: 큰 시계 + 시작·정지 버튼 (러닝·플랭크 등)
  • • 🔢 카운터 모드: 횟수 입력 + 5초 영상 첨부 (푸시업·줄넘기 등)
  • • ✅ 체크리스트 모드: 항목별 체크 + 최소 진행 시간 강제 (워밍업·스트레칭 등)
  • • 📝 자가보고 모드: 숫자·점수·텍스트 입력 (수면·식단·컨디션 등)
  • • 🎬 영상 모드는 기존 야구 훈련 흐름 재사용 (안전)
  • ④ 코치 모드 검토 대기 카드 확장: 영상 + 활동 4종 모두 포함 → 통합 검토
  • ⑤ 활동별 위변조 차단: timer 절대 시각 비교 / counter 본인 얼굴 / checklist 최소 진행 시간
  • 호환성: 기존 5개 야구 훈련 카드 그대로. 신규 60개 훈련은 추가 카드로 노출 — 점진적 사용 가능.
  • 캐시 v252 → v260 (메이저 마이너 점프).
β 1.5.11 2026.05.19
  • 🔧 활동 유형 4종 백엔드 처리 함수 — Phase D 2단계 (β 1.5.11) 🌱
  • 이번 버전 작업: 4가지 활동 유형(timer·counter·checklist·selfreport) 저장·분류·검토 함수 추가. UI 노출 X — 백엔드만.
  • _saveActivity(activity): 활동 1건 저장 + ID 부여 + 자동 분류
  • _classifyActivityStatus(activity): 4종 모드별 status 자동 결정 (auto_approved / pending_coach / rejected)
  • _applyActivityReview(date, activityId, action, note): 코치 승인/반려 처리
  • ④ 조회 유틸 3종: _getActivitiesForDate, _getAllPendingActivities, _getActivityStats
  • ⑤ 각 모드별 위변조 차단: timer 절대 시각 비교 / counter 본인 얼굴 검증 / checklist 최소 진행 시간 강제
  • 호환성: β 1.5 사용자 화면 동일. 코드만 추가 — 활동 추가 UI는 β 1.6.0.
  • 캐시 v251 → v252.
β 1.5.10 2026.05.19
  • 📚 훈련 메뉴 대규모 확장 — Phase D 준비 (β 1.5.10) 🌱
  • 핵심 아이디어: 야구 훈련만이 아닌 8개 카테고리(기초체력·근력·유연성·야구 기본기·포지션 특화·부상 예방·정신·자기관리) × 4가지 활동 유형(영상·타이머·카운터·체크리스트) 종합 훈련 관리 플랫폼으로 진화 시작
  • 이번 버전 작업: 데이터 모델·라이브러리 정의만 — 사용자 UI 변화 0 (안전 단계)
  • DRILL_LIBRARY 상수 신설: 8개 카테고리, 30개 서브카테고리, 60개 표준 훈련 1차 정의 (정적 데이터, 인앱 내장)
  • _icoachMigrateToV160() 함수: icoach_training[date].activities 빈 배열 추가 (멱등)
  • ③ 부팅 시 자동 마이그레이션 호출 (init D-3.5 단계 추가). 옛 데이터 무영향.
  • ④ 캐시 v250 → v251. 신규 PC가 받으면 자동 마이그레이션 1회 실행.
  • 이번 버전 안 함: 새 UI·새 인증 모드 구현·실제 활동 입력 — 모두 β 1.5.11~1.6.0에서 단계 진행
  • 호환성: β 1.5 사용자 화면·데이터 변화 0. 다음 단계 안전한 기반.
  • 설계서: TRAINING_MENU_EXPANSION_DESIGN_β1.6.md 참조
β 1.5.0 2026.05.18
  • 🪪 본인 얼굴 인증 (Phase B-1) — face-api.js 도입 ⭐⭐⭐
  • 핵심 아이디어: 셀카 1장 등록 → 128-dim 얼굴 벡터(임베딩) 추출 → 훈련 영상 인증 시 본인 얼굴 자동 매칭. 대리 인증 차단
  • 🔒 프라이버시 100% 보호: 사진 원본은 저장 안 됨. 수학적 벡터(숫자 128개)만 본인 기기 IDB에 저장. 외부 서버 전송 0. 모든 처리 클라이언트
  • face-api.js 통합: v0.22.2 jsdelivr CDN에서 lazy 로드 (사용 시점에만 다운로드). 모델 파일은 justadudewhohacks GitHub Pages CDN (tinyFaceDetector + faceLandmark68 + faceRecognition, 총 ~6MB)
  • 설정 화면 🪪 본인 얼굴 인증 카드 (코치 모드 위, 초록 톤): 미등록 → "🪪 등록하기" / 등록됨 → "✅ 등록 완료 + 다시 등록/삭제"
  • 셀카 등록 모달: 정면 셀카 1장 선택(capture="user") → 자동 얼굴 감지 → 미리보기 + "✅ 얼굴 감지 성공" 안내 → 학부모 동의 체크박스 → 저장. 사진 자체는 dataURL로도 저장 안 됨
  • 훈련 영상 자동 얼굴 매칭: 영상에서 5프레임 샘플 → 가장 또렷한 얼굴 찾기 → 등록된 임베딩과 유클리드 거리 계산 → similarity 점수(0~1) 산출
  • 매칭 결과 분기 (face-api 표준 임계값):
    • similarity ≥ 0.5 (dist<0.5) → self: 본인 확정 → auto 조건 통과
    • 0.4 ≤ similarity < 0.5 → unverified: 경계선 → 코치 검토 대기
    • similarity < 0.4 → unknown: 다른 사람 추정 → 차단(toast로 안내)
    • 얼굴 미감지 (옆모습/마스크) → unverified → 코치 검토
    • 등록 안 한 사용자 → skip: 기존 흐름 그대로 (호환성 100%)
  • videos[idx]에 얼굴 메타 5개 필드 추가: faceMatchEnrolled, faceMatchDetected, faceMatchDistance, faceMatchSimilarity, faceMatchVerdict. 코치 검토 모달에서 활용 예정
  • profile 데이터 모델 확장: faceEmbedding(128 float 배열), faceEnrolledAt(ISO), faceConsent({agreedAt, agreedByParent, version})
  • 등록/삭제 자유: 사용자가 언제든 카드 클릭으로 다시 등록(셀카 교체) 또는 삭제 가능. 삭제 시 다음 인증부터는 얼굴 매칭 비활성
  • 오프라인 안전: face-api 모델은 sw.js 캐시 안 함 (브라우저 fetch 캐시만 사용). 첫 등록 후 다음 인증부터는 모델 캐시되어 빠름. 모델 로딩 실패 시 토스트로 정중하게 안내
  • 버전 점프: β 1.4.x → β 1.5.0 (메이저 기능 신설). 캐시 v243 → v250
  • 영업 카드: "본인 얼굴 자동 확인 + 코치 검토 게이트 → 학원 단위 100% 신뢰 운영"
  • 다음 단계: β 1.5.x — Phase C (행동 패턴 분석, 랜덤 챌린지)는 안정 검증 후
β 1.4.103 2026.05.18
  • 🎯 훈련 영상 검증 강화 — Phase A-3: 코치 승인 게이트
  • AI 신뢰도 점수 (confidence) 도입: preVerifyDrillVideoLocal은 사람 감지율(60%) + 움직임 강도(40%) 기반 0~1 점수 계산. verifyDrillVideoWithGemini는 Gemini 프롬프트에 confidence 출력 요청 추가하고 응답 파싱
  • status 분기 (auto_approved / pending_coach / rejected):
    • 두 confidence 모두 ≥0.8 + 영상 촬영 ≤3일 → auto_approved (기존처럼 즉시 인증)
    • 경계선 (skipped, 신뢰도 낮음, 오래된 영상 등) → pending_coach (코치 검토 대기)
    • pass:false → 차단 (기존 동일)
  • 코치 모드 화면 ⏳ 검토 대기 카드: 학생 명단 위에 노란 톤 카드 자동 노출. 대기 영상 N건 표시, 클릭 시 검토 모달 열림
  • 학생 카드 ⏳ N건 뱃지 (β 1.4.103 학생별 매핑 슬롯, 본인 모드는 항상 0): 향후 다중 사용자 시 자동 활성화
  • 코치 검토 모달: 영상별 행에 썸네일(80×60) + 훈련명 + 날짜/경과시간 + AI 신뢰도(사람감지% · AI%) + Gemini reason 요약 + ✅승인 / ❌반려 / 📝메모 3버튼
  • 승인/반려 액션: data[date].videos[idx].status 갱신 + coachReview={by,at,action,note} 저장. 반려 시 drills 배열에서 idx 제거(인증 미완료 되돌림)
  • 인증 토스트도 상태 분기: auto는 "인증 완료!" (초록), pending은 "인증 접수 — 코치 검토 대기 ⏳" (정보)
  • videos[idx].studentId 필드 추가 (현재는 본인 모드 항상 null, 학생별 매핑 준비)
  • 호환성: 기존 영상은 status 누락 → "auto_approved 간주". confidence 누락은 pass값에 따라 0.95/0 기본값
  • 다음 단계: β 1.5.0에서 Phase B-1 (face-api.js 본인 얼굴 확인) 예정. 학원 단위 100% 신뢰 운영 핵심
β 1.4.102 2026.05.18
  • 🎬 훈련 영상 검증 강화 — Phase A-1 + A-2
  • A-1 영상 촬영 시각 검증 (옛 영상 재사용 차단): 인증 시 영상 파일의 lastModified를 검사. 7일 이전에 촬영된 영상은 차단하고 "최근 일주일 안에 찍은 영상만 인증할 수 있어요" 안내. 메타가 없는 경우(라이브 촬영)와 시계 오차(미래 시각)은 안전 통과
  • A-2 검증 메타 5개 필드 저장 (Phase A-3 / B-1 준비): videos[idx]에 다음 필드 추가
    • fileMtime — 원본 영상 촬영 시각 (ms)
    • preCheckResult — MediaPipe 사전 검증 결과 객체
    • geminiResult — Gemini AI 검증 결과 객체
    • status — 'auto_approved' | 'pending_coach' | 'approved' | 'rejected' (현재는 auto_approved 고정, A-3에서 confidence 기반 분기)
    • coachReview — null | {by, at, action, note} (A-3 코치 검토 정보)
  • 호환성: 기존 영상 데이터에는 새 필드가 없을 수 있음 → A-3 구현 시 if(!video.status) video.status='auto_approved' fallback 적용 예정
  • 영향 범위: onDrillVideoSelected 함수 (약 10119라인) 단일 지점 변경. 기존 검증 흐름(MediaPipe→Gemini) 그대로 유지, 메타 기록만 추가
  • 다음 단계: β 1.4.103에서 Phase A-3 코치 승인 게이트 UI + 검토 모달 구현 예정
β 1.4.101 2026.05.18
  • 🔧 핫픽스: 학생 삭제 버그 수정
  • 증상: 코치 모드에서 학생 카드 휴지통 버튼을 눌러 삭제해도 "삭제됐어요" 토스트만 뜨고 학생이 그대로 남는 문제
  • 원인: β1.4.94 D-2가 icoach_coach_students의 LS 쓰기를 차단했지만, _ICOACH_CACHE_KEY_MAP에 등록 누락 → saveCoachStudents 직후 getCoachStudents가 LS 옛 값을 반환 (D-2 차단된 키는 LS가 갱신 안 됨)
  • 수정 1: _ICOACH_CACHE_KEY_MAPicoach_coach_students → coachStudents 매핑 추가. 부팅 시 IDB → 메모리 캐시 자동 로드 보장
  • 수정 2: getCoachStudents를 메모리 캐시 우선 패턴으로 재작성 — 우선순위: _dataCache.coachStudents → LS → 빈 배열. 첫 호출 시 LS에서 읽어 캐시 채움
  • 수정 3: saveCoachStudents가 LS 호출 전에 메모리 캐시 즉시 갱신. 다음 getCoachStudents 호출이 새 값을 즉시 받음
  • 역방향 호환 — 마이그레이션 안 된 사용자는 LS 폴백으로 정상 작동
  • 유사 버그 가능성: 같은 D-2 차단 키 중 icoach_version_backups, icoach_chat_history도 캐시에 없음. 백업·채팅 관련 동일 증상 발견 시 같은 패턴으로 수정 예정
β 1.4.100 2026.05.18
  • 코치 모드 6곳 이모지 → 캐릭터/SVG 통일 🎨
  • 🏟️ 내 소속 → head-coach 아바타 (20px, 코치 본인 영역 의미 일관성)
  • 📥 CSV 가져오기 → analyst 아바타 (데이터 분석가 = CSV 처리)
  • 📨 전체 리포트 → cheerleader 아바타 (응원 = 일괄 발송)
  • 📄 샘플 CSV → analysis 아바타 (분석 문서 = 양식)
  • 📋 주간 리포트 → trainer 아바타 (지도 = 리포트 작성)
  • 🗑 학생 삭제 → 인라인 SVG trash 아이콘 (캐릭터 부적합 자리이므로 깔끔한 외곽선 아이콘으로). title/aria-label 부여로 접근성 ↑
  • 신규 사용 캐릭터 PNG 6개 sw.js 캐시 등록: cheerleader-circle-44/56, trainer-circle-44/56, analysis-circle-44/56
  • 코치 모드 화면 비주얼 통일 완료 — Phase 1+2+3+β1.4.100 누적 11곳 (FAB·폼 선택·CTA·홈 카드·픽커·자동 감지·백업·소속·CSV·리포트·삭제) 캐릭터화
β 1.4.99 2026.05.18
  • 코치 모드 — 소속(팀) 필드 신설 🏟️
  • 이중 구조: 코치 본인 기본 소속 + 학생별 개별 소속. 학생 추가 시 비어두면 코치 기본값 자동 적용. 다중 팀 코치도 학생별로 다르게 설정 가능
  • 코치 본인 소속 입력란: 학생 명단 화면 상단에 "🏟️ 내 소속" 입력란 (실시간 저장). localStorage icoach_coach_default_team
  • 학생 추가/편집 모달: "소속 (선택)" 입력란 추가. placeholder에 코치 기본 소속 안내 ("비워두면 [팀명] 자동 적용")
  • 학생 카드 팀 배지: 이름·부모님 호칭 옆 골드 라운드 배지로 "🏟️ 팀명" 표시. 학생 본인 team 우선, 없으면 코치 기본값 fallback
  • 주간 리포트 모달 제목: "[해운대리틀야구단] 김건우 선수 주간 리포트" 형식으로 팀명 prefix 자동 추가
  • CSV 가져오기: "소속" 또는 "팀" 컬럼 자동 인식 (둘 다 지원). 컬럼 비어있으면 코치 기본 소속 fallback
  • CSV 샘플 파일: 12컬럼 → 13컬럼으로 확장 (마지막에 "소속" 추가, 예시값 "해운대리틀야구단")
  • 데이터 구조: 학생 객체에 team 필드 추가. 기존 학생은 자동으로 코치 기본 소속이 적용됨 (마이그레이션 불필요)
  • 코치 영업 관점: "해운대리틀야구단 코치"가 명단 한 번 등록해두면 모든 학생/리포트/카톡 메시지에 "[해운대리틀야구단]" 자동 표시 → 학부모 신뢰감 ↑
β 1.4.98 2026.05.18
  • 비주얼 일관성 Phase 2 + 3 — 동적 텍스트·보조 자리 캐릭터 적용 🎨
  • Phase 2 — 최근 분석 카드 modeLabel: 홈 화면 "최근 분석 결과" 카드의 모드 표시(⚾ 투구 / 🏏 타격 / 🧤 수비)가 캐릭터 아바타로 변경. 동적 HTML 렌더링 함수(renderRecentAnalysisCard) 안의 modeLabel 변수가 이미지 태그를 생성
  • Phase 2 — 학생 분석 픽커 icon: 코치 모드의 학생 주간 리포트 작성 시 "📅 내 분석에서" 클릭하면 뜨는 픽커 모달의 12건 분석 항목 옆 모드 아이콘이 캐릭터 아바타로 변경. _renderHistoryPickerList 함수 안 동적 생성
  • Phase 3 — "🤖 자동 감지" 버튼: 투구 폼 선택 모달의 자동 감지 pill 버튼에 analyst 캐릭터 아이콘 적용
  • Phase 3 — "📊 분석 기록": 백업 미리보기 모달의 분석 기록 라벨에 analyst 캐릭터 아이콘 적용
  • 의도적 유지: 카톡 공유 텍스트(copyShareText, shareKakao)와 토스트 메시지의 이모지는 받는 사람에게도 보여야 하므로 그대로 유지
  • 신규 사용 캐릭터: analyst-circle-44.png / analyst-circle-56.png (sw.js 캐시 등록)
  • 이번 버전으로 앱 전체 비주얼 일관성 완료 — Phase 1+2+3 합쳐 9개+ 자리에서 이모지 → 치비 캐릭터 통일
β 1.4.97 2026.05.18
  • 비주얼 일관성 Phase 1 — 모드 진입 큰 자리 캐릭터 아바타 적용 🎨
  • 빠른 분석 FAB 옵션 3개 — ⚾ 투구 / 🏏 타격 / 🧤 수비 이모지를 각각 pitch-coach / bat-coach / defense 캐릭터 아바타로 교체. 상단 텍스트 옆 18px + 큰 라운드 버튼 36px 두 위치 모두
  • 투구 폼 선택 모달 헤더 — "⚾ 투구 폼을 선택하세요" → pitch-coach-circle-44.png 22px 아바타
  • 최근 분석 카드 CTA 버튼 — "⚾ 투구 분석 시작" → pitch-coach-circle-44.png 18px 아바타
  • 화면에 큰 자리로 보이는 곳부터 우선 교체. 동적 텍스트(modeLabel)와 보조 이모지(📊·🎉·💪 등)는 Phase 2~3에서 처리 예정
  • 사용 캐릭터 PNG 6개 신규 캐시 등록 (pitch/bat/defense × 44/56)
β 1.4.96 2026.05.18
  • 코치 모드 캐릭터 아바타 신설 🎨 — 'COACH' 가슴 자수 + 골드 별 캡 + 팔짱 포즈의 치비 스타일 헤드코치 캐릭터 신규 생성. 기존 Pitching/Batting Coach 아바타 시리즈와 한 세트로 통일 (네이비 + 골드 + 화이트 톤)
  • 6가지 사이즈 변형 등록 — 원형 44/56/80/120 + 정사각형 180/200 PNG. 리스트·헤더·카드 등 다양한 UI 자리에 활용 가능. sw.js ASSETS_TO_CACHE 자동 등록
  • 코치 모드 화면 헤더 갱신 — 기존 👨‍🏫 이모지 자리를 head-coach-circle-44.png로 교체 (32×32, 원형 마스킹). 설정 화면의 코치 모드 진입 버튼도 동일 교체 (24×24)
  • 코드 변화 외 기능 동작 동일 — 학생 명단·주간 리포트·CSV 임포트·일괄 발송 모두 그대로
  • 다음 후보: 다른 모드 화면(투구/타격/수비/AI 코치 등)의 이모지도 동일하게 캐릭터 아바타로 교체 → 앱 전체 비주얼 일관성
β 1.4.95 2026.05.18
  • IndexedDB 마이그레이션 D-2.1 — IDB → LS 복원에도 차단 가드 적용
  • β1.4.94 실측 결과 _lsEmergencyCleanup 확보량 2,348KB → 16KB로 99.3% 감소 ✅ (가드 작동 입증). 그러나 _icoachIdbRestoreFromIdb가 부팅 중 큰 키를 다시 LS에 복원해서 cleanup이 미세하게 계속 발동
  • 해결: _icoachIdbRestoreFromIdb_ICOACH_LS_BLOCK_KEYS 검사 추가. 차단 키는 LS 복원 자체를 skip → LS 깨끗 유지 → cleanup 발동 0건 목표
  • 화면 영향 없음 — D-1의 IDB → 메모리 캐시 직접 로드가 이미 작동 중이므로 차단 키도 화면엔 정상 표시
  • 콘솔: window._icoachLsRestoreSkipped 카운터 추가 (부팅 시 LS 복원 skip된 횟수)
  • 다음 단계 (E): _lsEmergencyCleanup 단순화 또는 제거, 작은 키 차단 옵션 — 며칠 안정 검증 후
β 1.4.94 2026.05.18
  • IndexedDB 마이그레이션 4단계 (D3-D 2차) — 큰 키 LS 쓰기 차단 ⭐
  • 차단 대상 5개 키icoach_version_backups(14일치 백업) · icoach_chat_history(AI 대화) · icoach_history(분석 50건) · icoach_coach_students(학생 history) · icoach_training(훈련 인증). LS 한도 압박의 80% 차지하는 큰 키들
  • 4중 안전 가드 — ① 마이그레이션 완료 플래그 _icoachLsSkipReady ② IDB 가용 _idbAvailable()icoach_ prefix ④ 차단 키 목록 포함 — 4개 모두 충족 시에만 LS 쓰기 skip. 마이그레이션 안 된 사용자는 기존 동작 유지 (안전 폴백)
  • 작은 키는 그대로 LS 사용 — 프로필·뱃지·목표·연속 출석 등 자주 동기 getItem되는 작은 키는 차단하지 않음 → 다른 코드 호환성 100% 유지
  • 예상 효과 — 매 부팅마다 발동하던 _lsEmergencyCleanup 빈도 대폭 감소 (이상적으론 0건). LS 한도 부딪힐 일 없음. IDB는 수십~수백MB이므로 사실상 무한 저장
  • 콘솔 디버깅: window._icoachLsBlocked(차단 누적 카운터), window._icoachLsSkipReady(마이그 완료 여부), _ICOACH_LS_BLOCK_KEYS(차단 키 배열)
  • 실측 검증법: 부팅 후 콘솔 로그에서 [_lsEmergencyCleanup] running... 메시지가 사라졌는지 확인. window._icoachLsBlocked 가 0이 아닌 숫자면 차단이 실제로 작동 중
  • 다음 단계 (D-3 / E): 모든 LS 쓰기 차단 (작은 키까지) + _lsEmergencyCleanup 단순화 또는 제거 — D-2 안정 검증 후 진행
β 1.4.93 2026.05.17
  • IndexedDB 마이그레이션 4단계 (D3-D 1차) — 진실 소스(source of truth)가 LS → IDB로 전환
  • 부팅 시 IDB → 메모리 캐시 직접 로드 — LS가 비어있거나 한도 임박이어도 IDB에서 직접 캐시 채움. 로드 완료 후 활성 화면(홈·성장기록·코치·설정) 자동 재렌더
  • LS 한도 초과 시 IDB-only 저장localStorage.setItemQuotaExceededError 던지면 IDB에는 정상 저장하고 LS는 조용히 skip. 사용자 분석/저장 흐름이 끊기지 않음
  • 1·2·3단계 동작 모두 유지 — LS 쓰기는 그대로 (안전망), 듀얼 라이트도 유지. 단지 의도가 "IDB가 메인"으로 변경
  • 콘솔 디버깅: await window._idbReloadCache() 로 IDB → 메모리 캐시 수동 재로드, window._icoachLsQuotaHits 로 LS 한도 초과 발생 횟수 확인
  • 다음 단계 (D-2): LS 쓰기 완전 제거 — 사용자 안정 검증 후 별도 버전
β 1.4.92 2026.05.17
  • IndexedDB 마이그레이션 3단계 (D3-C) — 전 데이터 미러 + 멱등 마이그레이션
  • 듀얼 라이트 키 범위를 모든 icoach_* 키로 자동 확장 (prefix 매칭). 새 키 추가 시 별도 등록 없이 자동 미러
  • 부팅 시 일회성 전체 마이그레이션 — IDB에 _meta_migration_v1 플래그가 없으면 LS의 모든 icoach_* 키를 IDB로 1회 복사. 이미 했으면 스킵 (멱등)
  • 진단 함수 window._idbAudit() 추가 — LS와 IDB의 키별 일치/불일치 비교 리포트 (inBoth, onlyLs, onlyIdb, mismatch)
  • 1·2단계 동작 그대로 유지 — 듀얼 라이트(setItem) + 자동 복원(부팅 시) + LS 삭제 시 IDB 보존
  • 콘솔 디버깅: await window._idbMigrate(), await window._idbAudit()
  • 다음 단계: D(LS 쓰기 제거) → E(정리)
β 1.4.91 2026.05.17
  • IndexedDB 마이그레이션 2단계 (D3-B) — 자동 복원 동작
  • 부팅 시 IDB → localStorage 자동 복원 (LS 빈 키만). 예: _lsEmergencyCleanup이 백업 14일치를 지워도 IDB에 남아있으면 다음 부팅 때 자동 복원되어 토스트 "💾 백업에서 N개 항목 복원됨" 알림
  • 안전 규칙: IDB가 LS를 절대 덮어쓰지 않음 — LS와 IDB 둘 다 있으면 LS 우선 (사용자 최신 작업 보존)
  • 1단계의 removeItem 후크 의도적 제거 — LS 삭제(긴급 정리)는 더 이상 IDB로 전파되지 않음. IDB가 LS의 백업 역할
  • 명시 삭제 함수 노출: window.clearAllIcoachData() — 사용자가 의도적으로 전체 데이터 지울 때 호출 (LS+IDB 동시 삭제)
  • 콘솔 디버깅: await window._idbRestore() — 수동 복원 트리거 가능
  • 다음 단계: C(일회성 마이그레이션 확장) → D(LS 쓰기 제거) → E(정리)
β 1.4.90 2026.05.17
  • 핫픽스 — sw.js 끝부분 잘림 복원 — 이전부터 sw.jsSKIP_WAITING 메시지 핸들러가 잘려있어 (130번째 줄에서 SyntaxError) 새 버전 SW가 즉시 활성화되는 메커니즘이 제대로 작동 안 했을 가능성
  • 이제 새 버전 배포 시 사용자 새로고침 한 번으로 새 SW가 즉시 활성화됨
  • D3 IndexedDB 1단계는 그대로 유지 — 콘솔에서 await window._idbStats() 로 계속 검증 가능
β 1.4.89 2026.05.17
  • IndexedDB 마이그레이션 1단계 (D3-A) — localStorage 5MB 한도 해결을 위한 첫 발걸음
  • IndexedDB 어댑터 함수 도입 (_idbOpen / _idbGet / _idbSet / _idbDelete / _idbKeys / _idbStats)
  • localStorage.setItem을 후크해서 핵심 키 7개(분석 기록·학생 명단·훈련·목표·프로필·자동 백업·채팅)을 IndexedDB에 자동 미러 — fire-and-forget 비동기, 본 저장은 LS 그대로
  • UI/동작 변화 0 — 사용자 입장에선 변화 없음. 백그라운드에 IDB가 동일 데이터를 따로 쌓기 시작
  • IDB 실패 시 안전 폴백 — LS는 정상 작동, 콘솔에 경고만 출력
  • 콘솔 디버깅: await window._idbStats() 로 IDB 내 키별 용량·총량 확인 가능
  • 다음 단계: B(읽기 경로 IDB 우선) → C(일회성 마이그레이션) → D(LS 쓰기 제거) → E(정리)
β 1.4.88 2026.05.17
  • 다크모드 일관성 2단계 — 인라인 색상 토큰화
  • 인라인 style 안의 흰색 반투명 텍스트 3건을 var(--text-sub)로 통일 — 코치 모드 카드 부제·저장공간 빈 상태·최근 분석 능력치 빈 상태
  • 유지 항목 (의도된 컬러): 릴리즈노트 태그 7건(#10b981/#a855f7/#3b82f6/#0ea5e9/#22c55e — 컬러 배경 위 흰 텍스트), 관리자 그라데이션 버튼들, 데이터 보관 단계 번호(파랑/빨강/노랑/초록/골드 번호 동그라미), 골드 그라데이션 버튼 위 검은 텍스트(#000) — 모두 그대로 보존
  • 1단계(β1.4.81 신규 카드 4개) + 2단계(인라인 텍스트 컬러)로 다크모드 텍스트 토큰 정리 일단락
β 1.4.87 2026.05.17
  • 코치 액션바에 "📄 샘플 CSV" 다운로드 버튼 추가 — CSV 가져오기·전체 리포트 옆에 위치
  • 클릭 시 12컬럼 양식(이름·학부모·이번주/지난주 점수·잘한항목/점수·약점항목/점수·추천훈련·영상수·훈련수·첫주) + 예시 4행 CSV가 즉시 다운로드
  • UTF-8 BOM 포함 — 엑셀에서 열어도 한글 안 깨짐
  • 코치가 양식을 모르고 헤매던 문제 해결 — 샘플 받아 엑셀에서 학생 정보 채워 그대로 임포트
β 1.4.86 2026.05.17
  • 학생 카드 점수 추이 상세 차트 — 코치 모드에서 학생 카드의 작은 sparkline을 클릭하면 큰 SVG 라인 차트 모달이 열림 (이전 sparkline 옆에 ▸ 표시)
  • 차트 본체: 면적+선 + 데이터 포인트(80↑ 초록·60미만 빨강) + 마지막 포인트 강조 + 최고·최저·최신은 점수 라벨 표시 + Y축 그리드 + X축 날짜 라벨(요일 포함, 자동 간격)
  • 상단 통계 한 줄: 최근 ▲▼변동 · 평균 · 최고 · 최저 · 기록 회수
  • 하단 데이터 표: 최신→과거 순으로 회차·날짜·점수·변동 모두 표시 (스크롤 가능)
  • 데이터 2회 미만일 땐 sparkline 클릭 비활성 + 토스트로 안내
β 1.4.85 2026.05.17
  • 학생 분석 결과 자동 임포트 — 코치 모드의 학생 주간 리포트 작성 모달 안, "이번 주 점수" 라벨 옆에 "📅 내 분석에서" 파란 칩 추가
  • 클릭 시 최근 12건 본인 분석 기록 모달이 뜸 — 모드 아이콘(⚾🏏🧤) + 날짜(오늘/어제/N일 전/M.D) + 점수(80↑ 초록·60↑ 노랑·그 외 빨강)
  • 한 건 선택 시 점수가 자동으로 칸에 들어가고 리포트 미리보기 즉시 갱신 + 토스트로 확인
  • 코치 운용 효율 ↑ — 학생 영상 분석 직후 같은 화면에서 점수 옮기지 않고 클릭 한 번으로 끝
β 1.4.84 2026.05.17
  • 설정 화면 대대적 컴팩트화 — 7개 카드(선수 프로필 · 저장공간 · 효과음 · AI 코치 · 데이터 보관 · 버그 제보 · 법적 정보 · 지원 문의)를 헤더 클릭으로 접고 펼치는 <details> 패널로 전환
  • 각 헤더 우측에 미니 요약 한 줄 — "효과음 ON · BGM ON · 80%", "API 키 설정됨/미설정", "백업 N개", "김건우 · 만 12세 · 우투우타", "약관·개인정보" 등 펼치지 않아도 핵심이 보임
  • 저장공간 카드만 기본 펼침 — 사용량 게이지를 자주 보는 카드라 유지. 나머지는 기본 접힘으로 시작
  • 스크롤 길이 약 절반으로 단축 — 사용자가 자주 안 보는 약관·문의·AI 코치 설명문이 접혀서 보기 깔끔
  • β 1.4.83에서 펼쳤던 백업 카드는 다시 기본 접힘으로 복원 — 다른 카드들과 톤 통일
β 1.4.83 2026.05.17
  • 백업 복원 UI 대폭 개선 — 설정 화면 백업 카드 기본 펼침 (14일치 한눈에)
  • 각 백업 옆 👁️ 미리보기 버튼 — 분석 N건·학생 N명·훈련 N건·목표 N개·배지 N개·프로필 유무를 모달로 확인 후 안심하고 복원
  • 📤 백업 파일 내보내기 — 단일 백업(📤 아이콘) 또는 전체 백업을 JSON 파일로 다운로드 → 기기 변경·재설치 대비 외부 보관 가능
  • 📥 백업 파일 가져오기 — 다른 기기에서 내보낸 백업 JSON을 불러와 기존 백업과 자동 병합 (같은 날짜는 최신 1개만)
  • 홈 화면 미니 배지 — "💾 마지막 백업: 오늘 / 어제 / 3일 전" 표시. 3일 이상이면 골드 강조 + 클릭 시 설정 점프
β 1.4.82 2026.05.17
  • 코치 모드 2단계 — 학생별 점수 추이 차트: 학생 카드 안에 SVG sparkline(최근 12회) 노출. 마지막 점수와 직전 점수 차이(▲/▼)도 컬러로 표시. 학생 리포트 점수 입력할 때마다 자동 누적(같은 날짜는 갱신).
  • CSV 명단 일괄 가져오기: 코치 화면 상단 "📥 CSV 가져오기" 파란 버튼. 마케팅 자료 02_students_sample.csv 형식 그대로 사용(이름/학부모/이번주점수/지난주점수/잘한·약점/추천훈련/영상수/훈련수/첫주 12컬럼). 기존 명단과 이름으로 매칭해 추가/갱신.
  • 전체 리포트 일괄 생성: 코치 화면 상단 "📨 전체 리포트" 골드 버튼. 점수 입력된 모든 학생의 리포트를 B2 4가지 템플릿으로 자동 분류해 하나의 텍스트로 묶고 카톡 공유. 한 번에 클럽 부모 전체에게 보낼 수 있음.
  • 학생 데이터 구조에 history 배열 추가(최대 12회 시계열). 기존 학생도 다음 리포트 입력 순간부터 자동 누적 시작.
β 1.4.81 2026.05.17
  • 다크모드 일관성 정리 (E4 1단계) — 최근 5개 버전에서 추가한 카드 4개(저장공간·최근분석·빠른분석 FAB·부모용 간단 모드) 안의 텍스트 색상을 하드코딩(#fff, rgba(255,255,255,0.55) 등)에서 기존 디자인 토큰(var(--text), var(--text-sub))으로 통일. 다크모드 톤이 들쭉날쭉하던 부분이 정돈됨.
  • 효과 컬러(카드 배경·게이지바 배경·테두리·반투명 오버레이)는 변경 안 함 — 색상 단계감 유지.
  • 카드 정체성 컬러(저장공간 초록·최근분석 골드·FAB 골드·부모모드 핑크·코치 파랑)도 그대로.
β 1.4.80 2026.05.17
  • 부모용 간단 모드 신설 — 설정 화면 코치 모드 위에 "👨‍👩‍👧 부모용 간단 모드" 핑크 톤 카드 + 토글 스위치 추가. 켜면 분석 결과와 성장기록 상세에서 능력치 레이더 차트·상세 능력치·구간별 점수·프로 선수 비교가 모두 숨겨지고, 큰 점수 + 코치 코멘트 + 훈련 추천 + 영상만 노출.
  • localStorage 상태 유지icoach_parent_mode 키로 토글 상태 저장. 앱 재진입 시에도 자동 적용. DOM 로딩 즉시 1회 + 설정 화면 진입 시마다 토글 동기화.
  • 구현 방식 — body에 .parent-mode 클래스 토글 + CSS로 결과 화면 일부 요소 숨김 / 성장기록 상세는 showHistoryDetail() 안에서 abHtml·phHtml·proHtml 변수를 빈 문자열로 강제. 다른 화면(홈·랭킹 등)은 영향 없음.
β 1.4.79 2026.05.17
  • 빠른 분석 FAB 신설 — 홈·성장기록·훈련 화면 우하단에 골드 원형 + 버튼. 누르면 위로 ⚾투구 · 🏏타격 · 🧤수비 3개 미니 FAB가 라벨과 함께 시차 애니메이션으로 펼쳐지는 Speed Dial 패턴.
  • 옵션별 진입 — ⚾→selectMode('pitching'), 🏏→selectMode('batting'), 🧤→selectFieldingMode() 로 기존 분석 흐름에 즉시 진입.
  • 안전한 표시 범위 — 분석 진행·결과·설정·코치 화면에선 자동 숨김. showScreen() 호출마다 활성 화면 ID를 보고 syncAnalyzeFab() 가 동기화. 코치 모드 FAB와 자리 충돌 없음.
  • FAB 외 영역 클릭(반투명 백드롭) 또는 옵션 선택 시 자동으로 닫힘. + 아이콘은 열렸을 때 45도 회전.
β 1.4.78 2026.05.17
  • 홈 화면 "최근 분석" 카드 신설 — 환영 통계 아래에 최신 분석 1건을 한눈에. 큰 점수(80↑ 초록, 60↑ 노랑, 그 외 빨강) + 모드 아이콘 + "3일 전" 같은 상대 날짜 + 능력치 상위 3개 미니 게이지로 압축 표시.
  • 원터치 점프 — 카드 어디든 누르면 성장기록 화면으로 이동. 매번 앱 열 때마다 어제 점수가 바로 보이고, 추이도 한 번에 확인.
  • 빈 상태 카드 — 분석 기록이 없는 신규 사용자에겐 안내 메시지 + "⚾ 투구 분석 시작" 골드 버튼이 나와 첫 분석으로 자연스럽게 유도.
  • 수비 모드일 땐 fieldingType(포수/외야수/내야수)까지 라벨에 자동 반영.
β 1.4.77 2026.05.17
  • 저장공간 시각화 카드 신설 — 설정 화면 코치 모드 아래에 "💾 저장공간" 카드 추가. 사용량 %, 가로 게이지바(50% 미만 초록 / 50~80% 노랑 / 80%+ 빨강), 항목별 사용량(분석 기록·자동 백업·채팅·학생 명단·프로필 사진·훈련·기타) 막대 시각화.
  • 자동 정리 버튼 — "🧹 정리하기" 버튼 클릭 시 확인 모달이 열리고, 정리 대상(7일치 자동 백업·채팅 기록·오래된 분석 기록 압축)을 안내. "정리 진행" 누르면 기존 _lsEmergencyCleanup() 호출 → 확보 용량을 모달에 즉시 표시.
  • 백업 받기 버튼 — 동일 카드에서 한 번에 데이터 백업(exportData()) 실행. 정리 전 안전망 제공.
  • 지원 환경에선 navigator.storage.estimate로 더 정확한 % 비동기 갱신.
β 1.4.76 2026.05.17
  • 긴급 핫픽스 — 메인 화면 안 뜨는 문제 해결 — β 1.4.72(영상 품질 자동 체크) 코드 블록이 β 1.4.71 shareCardAsImage 함수의 catchfinally 사이에 잘못 삽입되어, finally 키워드가 다른 함수들·IIFE 뒤로 밀려나 고아 상태가 되었습니다. JavaScript 전체 파싱이 실패하면서 init()이 실행되지 않아 화면 자체가 활성화되지 않던 증상을 수정. finally 블록을 shareCardAsImage 의 catch 직후로 되돌렸습니다.
  • 기능 변경 없음 — 캐시만 v215 → v216 으로 갱신하여 모든 기기에서 새 JS가 즉시 적용되도록 처리.
β 1.4.75 2026.05.16
  • 코치 모드 신설 — 설정 화면 상단에 "👨‍🏫 코치 모드" 파란 카드 추가. 클릭하면 새 화면(screen-coach)으로 진입. 클럽 단위 월정액 가치 제안의 핵심 — 한 명의 코치가 여러 학생 관리.
  • 학생 명단 CRUD — 우측 하단 골드 + FAB로 학생 추가 (이름·부모님 호칭·메모). 카드별 ✎ 편집 / 🗑 삭제 버튼. localStorage.icoach_coach_students JSON 배열 1개에 단일 저장.
  • 학생별 주간 리포트 작성 폼 — 학생 카드의 "📋 주간 리포트" 버튼 → 입력 모달. 이번 주/지난 주 점수, 잘한 항목·점수, 약점 항목·점수, 영상수, 훈련수 입력. 입력하는 동안 미리보기 실시간 갱신.
  • B2 템플릿 재활용 — β 1.4.73의 4가지 템플릿(A 표준 · B 첫주 · C 하락 · D 정체기)을 그대로 재활용. 학생 이름·부모님 호칭이 자동 치환. 마지막 입력 값은 학생 정보에 자동 저장되어 다음에 열 때 자동 복원.
  • 공유 방식navigator.share로 카톡 등 시스템 공유 (학생 이름이 제목에 포함), 폴백은 클립보드 복사. 코치가 학생별로 한 명씩 보낼 수 있음.
  • 해운대리틀야구단 영업 무기 — 미팅에서 "이 앱이 코치 업무도 도와줍니다" 시연 가능. 베이스라인 측정만 잡으면 매주 자동 리포트 → 부모 만족도 ↑.
β 1.4.74 2026.05.16
  • 주간 종합 리포트 PDF 자동 생성 — β 1.4.73 주간 리포트 모달에 "📄 PDF로 받기" 빨간 메인 버튼 신설. 클릭하면 A4 1장짜리 종합 리포트 PDF 자동 생성·다운로드. 코치·부모님께 인쇄해서 전달하거나 카톡 파일로 공유 가능.
  • PDF 구성 — 상단 골드 헤더(아이코치 주간 리포트 · 기간 · 학생명), 종합 점수 카드(큰 점수+모드별 색상+변화량 ▲▼▶), 점수 추이 라인 차트(이번 주 분석 2회 이상일 때 표시), 잘한 항목 / 다음 주 집중(2열), 추천 훈련(자동 매칭), 부모님께 보낸 메시지 본문, 골드 푸터 워터마크.
  • 한글 폰트 — 기존 PDF의 loadPDFKoreanFonts() Spoqa Han Sans Neo 인프라 재활용. 첫 호출 후 캐시.
  • 버튼 상태 — 생성 중에는 "⏳ PDF 생성 중..." + disabled 처리. 폰트 fetch 첫 호출은 1~2초 걸릴 수 있음.
  • 파일명아이코치_주간리포트_{학생이름}_{YYYY.MM.DD}.pdf 형태로 자동 저장.
β 1.4.73 2026.05.16
  • 주간 리포트 인앱 생성 + 부모 공유 — 성장기록 화면 상단에 "📋 부모님께 주간 리포트 보내기" 골드 CTA 카드 추가. 클릭하면 본인 이번주/지난주 분석 기록을 자동 집계하고, 마케팅 자료 #2의 4가지 템플릿(A 표준 · B 첫주 환영 · C 점수 하락 · D 정체기 돌파) 중 상황에 맞는 것을 자동 선택해 카톡으로 바로 공유.
  • 자동 집계 로직 — 최근 7일 분석 평균 점수, 그 이전 7일 평균(변화량 계산), phases(투구: 와인드업·코킹·가속·릴리스·팔로스루 / 타격: 준비자세·스윙·임팩트·팔로스루) 평균에서 최고점=잘한 항목, 최저점=약점 항목 자동 추출. 약점에 따라 추천 훈련도 자동 매칭.
  • 호칭 선택 — 어머님/아버님/부모님 드롭다운으로 변수 치환. 변경 즉시 미리보기 갱신.
  • 공유 방식navigator.share로 카톡/문자 등 시스템 공유, 폴백은 클립보드 복사 후 "붙여넣기 하세요" 안내. 메시지 끝에 icoach.ai.kr 링크 자동 포함 → 받는 부모님이 앱 알아볼 수 있음.
  • 표시 조건 — 분석 기록이 1개 이상일 때만 CTA 노출. 기록 없으면 표시 안 됨.
β 1.4.72 2026.05.16
  • 영상 품질 자동 체크 — 영상 업로드 후 미리보기 바로 아래에 품질 카드가 자동 표시. 해상도(1280×720 이상=양호), 길이(3~10초 권장), 밝기(중간 프레임 픽셀 평균) 3가지를 평가해 양호(녹색) · 보통(골드) · 주의(레드) 3단계로 등급 매김.
  • 분석은 그대로 진행 가능 — 경고가 떠도 사용자가 그대로 "분석 시작"을 누를 수 있음. 분석 실패 가능성이 높은 영상에 미리 알려줘 재시도 부담을 줄이는 것이 목적.
  • 개선 팁 자동 안내 — 어두우면 "실내 조명 켜거나 야외 낮 시간대 권장", 해상도 낮으면 "720p 이상 카메라로 재촬영 권장", 너무 짧거나 길면 "한 동작 3~10초 권장" 자동 노출.
  • 구현 방식 — 외부 라이브러리 없이 video.duration · videoWidth/Height · 중간 프레임 캔버스 픽셀 평균(Rec.709 휘도)으로 계산. preview-videoloadedmetadata 이벤트에 한 번만 리스너 등록. 모든 영상 업로드 경로(중복 영상 컨펌 포함)에서 자동 트리거.
β 1.4.71 2026.05.16
  • 분석 결과 공유 카드 이미지화 — 결과 화면 → 공유 버튼 → "📷 이미지로 공유" 메인 버튼 신설. 1080×1080 정사각형 PNG 카드 생성 후 navigator.share({files}) API로 카톡·인스타에 이미지 미리보기 그대로 전달. 받는 사람이 텍스트 한 줄이 아닌 프리미엄 카드 이미지를 봄.
  • 카드 디자인 — 모드별 일러스트 배경(투구·타격) + 골드 가로 라인 + 큰 점수(80↑ 녹색 / 60↑ 골드 / 그 외 레드) + 이름·만나이·모드·능력치 4~5개 + icoach.ai.kr 워터마크. 외부 이미지 라이브러리 의존 없이 순수 Canvas API로 그림.
  • 공유 흐름 정리 — 메인 액션은 이미지 공유(녹색 큰 버튼) · 부가 액션은 텍스트 복사/텍스트만 공유(작은 외곽선 버튼). 사용자가 어떤 게 추천인지 시각적으로 즉시 파악.
  • 안전 폴백navigator.share가 파일 공유를 지원하지 않거나 사용자가 취소하지 않은 채 오류 발생 시 자동으로 다운로드 트리거 → 갤러리에 저장. 어떤 환경에서도 카드가 손에 들어옴.
  • 버튼 상태 — 카드 생성 중에는 "⏳ 카드 생성 중..." 표시 + disabled 처리. 사용자가 더블 탭으로 중복 호출 방지.
β 1.4.70 2026.05.16
  • 촬영 가이드 접기/펼치기 — 신규 사용자에겐 1·2·3·4 가이드를 그대로 보여주되, 익숙해진 사용자는 가이드 1번 위의 ✕ 다시 보지 않기 작은 버튼을 누르면 가이드 4개가 모두 접힘. 화면이 즉시 컴팩트해져 영상 선택 버튼이 첫 화면에 보임.
  • 되돌리기 가능 — 가이드가 접혀 있을 때 그 자리에 작은 📋 촬영 가이드 다시 보기 링크가 노출. 클릭 한 번으로 언제든 복귀.
  • 상태 영속화localStorage.icoach_guide_dismissed 키 1개로 모든 모드(투구·타격·수비)에 공통 적용. 한 번 익히면 4가지 화면 전부 컴팩트해짐.
  • 접근성 — 다시 보기 링크는 가이드 영역과 영상 선택 버튼 사이라 시각적으로 명확. 골드 테두리 점선 강조.
β 1.4.69 2026.05.16
  • "다운로드 1개 완료" 알림 제거 — 앱 실행할 때마다 안드로이드 알림창에 뜨던 자동 JSON 다운로드를 비활성화. 매일 한 번씩 다운로드 폴더에 백업 JSON 파일이 쌓이지 않음.
  • 백업은 그대로 유지checkDailyBackup()이 매일 한 번 localStorage icoach_version_backups 배열에 7일치 스냅샷을 자동 저장(설정 → "수동 백업" 옆 목록). 데이터 복원에는 영향 없음.
  • 수동 내보내기는 그대로 — 설정의 "JSON 파일 내보내기" 버튼은 정상 작동. 외부에 백업 파일이 필요하면 그때 한 번에 받을 수 있음.
  • 코드 변경init() 안의 setTimeout(autoDailyBackup,3000) 한 줄만 주석 처리. 함수 본체는 보존하여 향후 복구 가능.
β 1.4.68 2026.05.16
  • 모드 헤더 배너 추가 — 투구·타격 분석 안내 화면 상단에 모드별 일러스트 배너 노출. 사용자가 지금 어떤 모드에 들어왔는지 시각적으로 즉각 인지 가능 → 모드 혼동(글러브 영상을 타격에 올리는 등) 사전 방지에도 도움.
  • 이미지 최적화 — 원본 PNG 7.5MB → WebP 1200px polish 80KB대로 압축. 모바일 데이터 부담 없음. images/headers/ 폴더로 정리.
  • 적용 범위 — 투구·타격 모드만 노출. 수비(내야/외야/포수) 모드는 배너 숨김 처리.
  • 서비스 워커sw.js ASSETS_TO_CACHE에 헤더 이미지 2장 추가, CACHE_NAME icoach-v207icoach-v208 갱신.
β 1.4.67 2026.05.11
DRILL VERIFY · CRITICAL BUG FIX
  • 훈련 인증 "0/6프레임" 오류 근본 원인 수정preVerifyDrillVideoLocal() 이 VIDEO 모드로 생성된 poseLandmarker 에 IMAGE-모드 전용 메서드 .detect() 를 호출해서 매 프레임 silent failure 발생. try/catch 가 에러를 삼키고 결과를 null 로 처리 → 검출 0건 → "0/6프레임. 전신이 보이도록 다시 촬영" 오해 유발.
  • 같은 패턴 버그 2곳 추가 수정quickDrillAnalysis() (훈련 영상에 즉시 관절각도 표시) · analyzeDrillVideo() (다중 프레임 훈련 폼 분석) 도 동일하게 .detect() 잘못 호출. 두 함수 모두 silent failure 로 항상 null 반환 → 훈련 폼 분석 결과 미표시 버그가 있었으나 오류 메시지 없이 묻혀 있었음. 이번 릴리스에서 함께 수정.
  • 증상 조건 — 같은 세션에서 영상 분석(폼 분석)을 한 번이라도 돌린 다음 훈련 인증을 시도할 때 100% 발생. 앱을 새로 켜고 바로 훈련 인증을 시도하면 poseLandmarkernull 이라 사전검증을 스킵해서 통과됨(그래서 일관성 없게 보이는 버그였음).
  • 해결 방식 — landmarker 생성 3곳(영상 분석 2곳·실시간 1곳)에 window._poseLandmarkerMode 추적 변수 도입. 사전검증에서 모드를 읽고 분기: VIDEO 모드면 detectForVideo(canvas, ts) 호출(단조증가 ms 타임스탬프 전달), IMAGE 모드면 detect(canvas), LIVE_STREAM 모드면 사전검증을 스킵하고 Gemini 검증으로 위임.
  • 타임스탬프 안전성performance.now() 를 베이스로 사용, 프레임마다 +100ms 증가. 페이지 로드 후 항상 증가하는 값이라 영상 분석이 이미 사용한 어떤 타임스탬프 범위와도 충돌하지 않음.
  • 진단 로그 추가catch(e) 블록에 console.error 추가. 같은 종류의 silent failure 가 다시 생기면 콘솔에서 즉시 식별 가능 (이전엔 영구히 묻혀 있었음).
  • 분석 점수에 영향 없음 — 이 수정은 훈련 인증 사전검증만 손대고 메인 분석 흐름은 그대로 유지.
  • 캐시 버전 v206→v207 — 배포 후 PWA 강제 업데이트 권장.
β 1.4.66 2026.05.11
ANALYSIS · MODE MISMATCH
  • 글러브 끼고 던지는 영상에 "스윙(타격) 감지" 오탐 제거checkModeMismatch() 의 투구 모드 검증을 4-조건 AND 로 강화. 기존 (swingR>0.3, oneArmR<0.1) 두 조건만으로는 측면 카메라 와인드업이 양손 중심점을 어깨너비 1.5배 넘게 이동시켜 오탐 발생.
  • 배트 휘두르는 영상에 "투구 동작 감지" 오탐 제거 — 타격 모드 검증에 손목 X 이동 비대칭 게이트 추가. 배트로 풀스윙하면 양손이 함께 회전 → 비대칭 낮음 → 경고 스킵.
  • 신규 지표 2개 도입 — (1) peakArmExtension: 영상 전체에서 한 팔이 어깨너비 대비 가장 멀리 뻗은 비율 (피크값). 한 프레임이라도 어깨×2 이상 뻗어지면 투구로 인정. (2) wristAsymmetryX: 좌·우 손목 X 이동 범위의 비대칭도(0~1). 0에 가까우면 배트 그립처럼 두 손이 함께 움직임, 1에 가까우면 던지는 팔만 멀리 이동.
  • 새 임계값 — 투구 모드 스윙 경고: swingR>0.5 & oneArmR<0.05 & peakArmExtension<2.0 & wristAsymmetryX<0.35. 타격 모드 투구 경고: oneArmR>0.35 & swingR<0.05 & wristAsymmetryX>0.4. 모두 AND.
  • 크롭(_icoachCropActive) 임계값 — 0.5 → 0.7 로 더 보수적으로 조정. 줌인 영상에서 false-positive 가능성을 추가로 낮춤.
  • 분석 점수에는 영향 없음 — 이 변경은 모드 불일치 안내 경고만 강화한 것. 점수 산출 로직은 그대로.
  • 캐시 버전 v205→v206 — 배포 후 PWA 강제 업데이트 권장.
β 1.4.65 2026.05.01
SETTINGS · CLEANUP
  • 설정 화면 "이벤트 안내 다시 보기" 카드 제거 — 새 픽셀 아트 아이콘 적용 검증용으로 추가했던 임시 카드를 정리. 이벤트 팝업은 정상 작동 중이며 자정 지나면 자동 재노출되므로 영구 카드는 불필요.
  • 관련 함수는 보존showEventPopupForce(), _isEventPeriod()는 코드에 남겨둠. 향후 동일 카드 재추가 시 즉시 활용 가능.
  • 캐시 버전 v204→v205 — 배포 후 PWA 강제 업데이트 권장.
β 1.4.64 2026.05.01
UI · EVENT POPUP ICONS
  • OPEN BETA EVENT 팝업 7개 아이콘 — 픽셀 아트 전용 이미지로 전면 교체 — 부문별 의미가 직접적으로 보이도록 16-bit 픽셀 아트 전용 이미지를 새로 생성해서 7개 모두 교체. 분석왕(트로피+차트), 타자왕(스윙 임팩트), 투수왕(화염구), 수비왕(다이빙 캐치), 제보왕(돋보기+버그), 훈련왕(덤벨+레벨업), 싸인볼(사인 야구공).
  • 이미지 최적화 — 4MB+ 원본을 256×256 PNG로 리사이즈 + 압축 → 각 평균 70KB. 7개 합쳐 약 510KB.
  • 아이콘 사이즈 확대 36→48px — 픽셀 아트 디테일이 잘 보이도록 키움. 싸인볼 20→24px.
  • iconMap 신규 키 7개EVENT_ANALYST · EVENT_BATTER · EVENT_PITCHER · EVENT_DEFENDER · EVENT_BUG · EVENT_TRAINER · EVENT_SIGNBALL. 기존 TROPHY · BATTING · FIRE 등은 다른 화면에서 그대로 사용.
  • sw.js 캐시 자산 7개 추가 — PWA 오프라인에서도 정상 표시.
  • 캐시 버전 v203→v204 — 배포 후 PWA 강제 업데이트 권장.
β 1.4.63 2026.05.01
SETTINGS · EVENT REPLAY
  • 설정 화면에 "이벤트 안내 다시 보기" 카드 추가 — 한 번 닫은 OPEN BETA EVENT 팝업을 다시 띄우려면 콘솔 명령이나 자정까지 대기가 필요했습니다. 이번 버전부터 설정 → "이벤트 안내 다시 보기" 버튼 하나로 바로 재노출.
  • 이벤트 기간 중에만 표시 — 2026.5.1 ~ 5.31 기간 동안에만 카드 노출. 기간 외엔 자동 숨김 (코드는 그대로 유지하되 미표시).
  • showEventPopupForce() 신규 함수 — today 차단 키를 제거한 뒤 showEventPopup() 호출. 일회성 강제 표시이지만 닫을 때는 다시 일반 동작.
  • 캐시 버전 v202→v203 — 배포 후 PWA 강제 업데이트 권장.
β 1.4.62 2026.05.01
UI · EVENT POPUP UX
  • 이벤트 팝업 "확인" 버튼이 "오늘 그만 보기"와 동일 동작하던 버그 수정 — 기존 closeEventPopup()이 "확인"·"오늘 그만 보기" 어느 쪽으로 닫혀도 무조건 today 키를 localStorage에 저장 → 한 번이라도 확인을 누르면 그날은 팝업이 다시 안 뜸. 사용자 의도는 "확인=일단 닫기, 다음 진입 시 또 보기" / "오늘 그만 보기=오늘은 더 안 보기" 가 분리되어야 정상.
  • 함수 분리closeEventPopup(): 단순 닫기(키 저장 X) · dismissEventPopupForToday(): 오늘 그만 보기 전용(키 저장 O). "확인" 버튼은 단순 닫기, "오늘 그만 보기" 버튼만 today 키 저장.
  • 이전 버전에서 저장된 키 정리 안내 — β 1.4.62 이전에 "확인"을 눌러 차단된 사용자는 콘솔에서 Object.keys(localStorage).filter(k=>k.startsWith('icoach_event_popup_')).forEach(k=>localStorage.removeItem(k)) 입력해 키 제거 가능 (또는 자정 지나면 자동 해제).
  • 캐시 버전 v201→v202 — 배포 후 PWA 강제 업데이트 권장.
β 1.4.61 2026.05.01
UI · EVENT POPUP
  • OPEN BETA EVENT 팝업 7개 이모지 → 앱 아이콘 교체 — 기존 시스템 이모지(🏆⚾🔥🧤🐛💪🏅)는 OS·기기마다 모양이 달라 일관된 느낌이 없었습니다. 이번 버전부터 앱 내에서 사용하는 전용 생성 이미지 아이콘으로 교체해서 브랜드 톤이 통일됐습니다.
  • 매핑: 분석왕→TROPHY, 타자왕→BATTING, 투수왕→FIRE, 수비왕→HOME_FIELDING, 제보왕→bug_report, 훈련왕→MUSCLE, 싸인볼→GIFT.
  • iconMap 확장BUG_REPORT 신규 키 추가(./icon_bug_report.png 매핑). sw.js 캐시 자산 목록에 이미 등록돼 있어 PWA 오프라인에서도 정상 표시.
  • 캐시 버전 v200→v201 — 배포 후 PWA 강제 업데이트 권장.
β 1.4.60 2026.05.01
UI · COPY
  • OPEN BETA EVENT 팝업 안내 문구 줄바꿈 적용 — 프로야구 선수 싸인볼 안내 문구가 한 줄로 길게 흘러 가독성이 떨어졌습니다. "원하는 선수에 원하는 이름으로" / "받아서 선물로 드립니다!" 두 줄로 정리.
  • 캐시 버전 v199→v200 — 배포 후 PWA 강제 업데이트 권장.
β 1.4.59 2026.04.29
DATA · AGE EXPANSION (PREP)
  • 14~19세 평균 데이터·보정 비율 사전 정의 (드롭다운은 13세까지 유지) — 현재 "아이코치"는 컨셉상 만 7~13세(초1~중1)만 다루지만, 향후 확장 시 즉시 작동하도록 로직과 데이터를 미리 깔아 두었습니다. 드롭다운에 14세 이상 옵션을 추가하기만 하면 별도 코드 수정 없이 정확한 평균 비교와 점수 보정이 적용됩니다.
  • getAgeAvg — 14~19세 평균 데이터 추가 — 사춘기 급성장(중2~중3) → 고등학생(고1~고3) → 성인(19세) 진입까지 6개 항목(힘·속도·정확도·밸런스·유연성·폼완성도) 평균을 점진 곡선으로 정의. 예: 만 14세 힘=82(13세 78), 만 18세 힘=94, 19세 힘=95.
  • scoreRange — 보정 비율 점진 감소 곡선 — 기존 7~9세 25% / 10~11세 15% / 12~13세 8% 에 더해 14~15세 4% / 16~18세 2% 추가. 19세 이상은 성인 기준 그대로(보정 없음). 13→14세 경계에서 점수가 급격히 떨어지지 않게 부드러운 곡선 유지.
  • 주의 — UI에서는 13세까지만 노출 — "아이코치" 정체성을 신중히 유지. 향후 14세 이상 확장이 결정되면 inp-age 드롭다운에 옵션만 추가.
  • 캐시 버전 v198→v199 — 배포 후 PWA 강제 업데이트 권장.
β 1.4.58 2026.04.29
SETTINGS · SOUND
  • 효과음 볼륨 슬라이더 + BGM 별도 토글 추가 — 그동안 설정 화면에서는 효과음 ON/OFF 토글 하나뿐이라 볼륨이 고정(30%)이었습니다. 이번 버전부터 효과음 볼륨 슬라이더(0~100%)로 직접 조절할 수 있습니다. 또한 분석 중 재생되는 배경음(BGM)을 효과음과 별도로 토글할 수 있고, BGM 전용 볼륨 슬라이더(기본 15%)도 추가됐습니다.
  • 설정 자동 저장 — 슬라이더 값을 움직이면 즉시 localStorage에 저장 (icoach_sound_volume, icoach_bgm_volume, icoach_bgm_enabled). 다음 실행에도 자동 적용.
  • UX 디테일 — 효과음 OFF 상태에서는 슬라이더가 비활성화(흐릿하게) 표시되어 상태가 명확. 슬라이더 조정 시 tap 효과음이 바로 재생되어 볼륨 미리듣기 가능.
  • 캐시 버전 v197→v198 — 배포 후 PWA 강제 업데이트 권장.
β 1.4.57 2026.04.29
DETECTION · THROWING ARM
  • V5 outlier 케이스 — 던지는 팔 자동 판별 강화 — β 1.4.39 분류기에서 마지막까지 남아 있던 V5 outlier(peakUp=170° 케이스)는 측정 자체는 정확했지만 "던지는 팔"을 잘못 선택해 글러브 팔의 코킹·정지 자세를 분석하면서 사이드암으로 오분류되던 문제였습니다. 기존엔 좌·우 손목의 x축 이동 범위 한 가지만 비교했기 때문에 글러브 팔이 코킹 자세에서 좌우로 흔들리면 던지는 팔로 오선택되는 케이스가 있었습니다.
  • 5개 지표 가중 합산 방식으로 교체 — (a) x 이동 범위 [가중 1.0] (b) y 이동 범위 [1.0] (c) 손목 최고 속도 = Δ(프레임 간 거리) 최대값 [1.5] (d) 어깨 위로 올라간 프레임 비율 [1.0] (e) 손목 visibility 평균 [0.5] 을 정규화 후 가중 합산. 종합 점수가 더 높은 쪽이 던지는 팔. 글러브 팔의 좌우 흔들림이 일부 점수에 영향을 줘도 피크 속도와 어깨 위 프레임 수에서 던지는 팔이 압도적이어서 거의 모든 케이스에서 정확히 선택됩니다.
  • 가시성 노이즈 차단 — visibility < 0.3 인 프레임은 측정에서 제외. 한 쪽 손목이 거의 가려진 영상에선 자동 fallback (반대 쪽 점수로 결정).
  • 관리자 진단 강화window.__icoach_throwarm_debug 글로벌에 종합 점수와 5개 raw 지표를 모두 노출. 관리자 콘솔에서 던지는 팔 오선택 의심 시 즉시 수치 확인 가능.
  • 캐시 버전 v196→v197 — 배포 후 PWA 강제 업데이트 권장.
β 1.4.56 2026.04.28
AI · DETECTION
  • 원거리 인물 감지 대폭 강화 — 자동 크롭 타일 9개→20개 확장 (3x줌 소형 타일 11개 추가). 극소 인물도 감지 가능. 관절 인식 임계값 완화로 먼 거리에서도 감지율 향상.
  • 저장 공간 경고 오탐 수정 — SW캐시가 포함되던 용량 계산을 localStorage 전용으로 변경. 저장 실패 시 자동 정리 후 재시도. 앱 시작 시 50%+ 자동 정리.
β 1.4.55 2026.04.28
STORAGE
  • 저장 공간 관리 대폭 개선 — 버전 백업 히스토리를 요약본으로 저장하여 용량 90% 절감. 오래된 분석 기록 자동 압축, 앱 시작 시 자동 정리, 더 공격적인 긴급 정리 로직.
β 1.4.54 2026.04.28
STABILITY
  • 점수 결정성 완전 확보 — 이중 시크 + 캔버스 스냅샷으로 프레임 디코딩 비결정성까지 제거. 모든 분석에서 캔버스에 먼저 그린 뒤 감지하여 동일 입력 보장.
β 1.4.53 2026.04.28
STABILITY
  • 점수 결정성 대폭 개선 — 같은 영상을 반복 분석해도 동일한 점수가 나오도록 타임스탬프 체계 전면 개편. poseLandmarker 재생성 + 고정 타임스탬프로 비결정성 제거.
β 1.4.52 2026.04.28
AI · DETECTION
  • 원거리 촬영 자동 크롭 — 사람이 작게 찍힌 영상에서 자동으로 인물 영역을 탐색하고 확대하여 분석. 실내 연습장 원거리 촬영 지원.
β 1.4.51 2026.04.28
AI MODEL
  • 포즈 감지 모델 업그레이드 — MediaPipe Lite → Full 모델로 변경. 원거리 촬영 영상에서도 인물 감지 정확도 대폭 향상.
β 1.4.50 2026.04.28
PROFILE
  • 가입 대상 연령 확장 — 만 13세(중1)까지 선택 가능. 연령별 평균 능력치 기준표에 13세 데이터 추가.
β 1.4.49 2026.04.27
SOUND · UX
  • 효과음 시스템 추가 — Web Audio API 기반 32종 효과음을 탭 전환·분석·훈련·채팅 등 주요 인터랙션에 매핑. 설정에서 ON/OFF 가능.
  • 저장공간 토스트 폭주 수정 — _lsEmergencyCleanup 세션당 1회 제한 + 토스트 대신 콘솔 로깅으로 변경.
β 1.4.48 2026.04.27
STORAGE · CRITICAL FIX
  • localStorage 용량 초과 크래시 수정 — 주간 스케줄 저장 시 QuotaExceededError가 발생하면 훈련이 아예 안 뜨던 치명적 버그. 저장 실패해도 훈련은 정상 표시되도록 수정.
  • 자동 공간 정리 — 용량 초과 감지 시 오래된 백업·채팅·훈련 데이터를 자동 축소하고 재저장 시도.
β 1.4.47 2026.04.27
DIAG · DRILL FIX
  • 훈련 미표시 진단 기능 — 훈련 훈련 0개 시 파이프라인 상태(FP/스케줄/DayIdx 등) 진단 정보 + "스케줄 초기화" 버튼 표시
  • 에러 가시화 — renderTodayDrills 예외 시 화면에 에러 메시지 표시 (기존: 콘솔만)
β 1.4.46 2026.04.27
DATE · UTC FIX
  • 자정~오전9시 훈련 훈련 0개 표시 버그 수정 — β1.4.45에서 todayKey()를 로컬 전환했지만, startDate를 new Date("YYYY-MM-DD")로 파싱하면 UTC 자정으로 해석되어 한국 시간 자정~9시 사이에 dayIndex가 -1이 되는 문제 발견. _parseLocalDate() 헬퍼 도입으로 해결.
  • getScheduleDayIndex() 음수 인덱스 방지 — Math.max(0,...) 가드 추가. schedule.days[-1] 참조로 인한 빈 배열 반환 차단.
  • getWeeklySchedule() 유효성검사 강화 — daysSince≥0 가드 추가. 미래 날짜 startDate가 유효 판정되는 edge case 차단.
  • 잔여 toISOString().slice(0,10) 일괄 로컬 전환 — calcStreak, renderGoalSection, renderWeeklyReport, 주간 진행 도트, renderTrainingCompare, autoDailyBackup, 스크립트블록[4] 분석 통계까지 총 9곳 수정.
  • 캐시 버전 v185→v186 — 배포 후 PWA 강제 업데이트 필요. localStorage의 icoach_weekly_schedule은 자동 재생성됨.
β 1.4.45 2026.04.26
TRAINING · DATE FIX
  • 훈련 탭 훈련 목록이 안 뜨던 버그 수정todayKey() 가 UTC 기준 날짜를 반환해 한국(UTC+9) 사용자의 로컬 날짜와 불일치, 주간 스케줄·커스텀 훈련 모두 "오늘" 을 찾지 못해 빈 화면이 되던 문제. 로컬 시간 기반으로 전환.
  • 분석 후 "훈련에 담기" 버튼이 작동 안 하던 버그 수정 — 채팅 코치에서 훈련 추가 시 저장되는 dateKey 도 UTC 기준이라 getCustomDrillsForToday() 와 날짜 불일치. todayKey() 통일.
  • 주간 스케줄 캐시 손상 시 크래시 방지getWeeklySchedule()JSON.parse 에 try/catch 추가. 손상된 캐시는 자동 삭제 후 재생성.
  • DRILL_VIDEO_MAP 참조 안전 체크 — 스크립트 블록 간 로드 순서에 의한 ReferenceError 방지를 위해 typeof 가드 추가.
  • 훈련 0개 상태에서 "완료" 가능하던 허점 차단 — 빈 배열의 every() 가 vacuous truth 를 반환하는 JS 특성 때문에 훈련 없이도 완료 판정. drills.length>0 가드 추가.
  • 홈·히스토리 "+" 버튼 UTC 날짜 수정_added / _addedH 함수의 dateKey 도 todayKey() 로 통일.
  • 캐시 버전 v184→v185 — 배포 후 PWA 강제 업데이트 권장.
β 1.4.44 2026.04.23
PWA · INSTALL UX
  • PWA 설치 안내가 영영 안 뜨던 문제 근본 해결 — 사용자(특히 테스트 참여자)가 매번 링크로만 접속하던 불편을 해결하기 위해 5가지 개선을 한 번에 적용했습니다. "다시 알리지 않기" 한 번에 영구 차단되는 정책 + 노출 동선 부재 + iOS 5초 대기 등 누적된 UX 문제를 통합 정리.
  • (A) 설정 탭에 "📱 홈 화면에 앱 설치" 카드 항상 노출 — 설치 안 된 상태면 설정 진입 시 항상 보임. 브라우저 자동 감지 → Chrome/안드로이드/삼성 인터넷/iOS/데스크톱 별로 안내 문구와 버튼 동작이 자동 분기. 설치 완료 시 카드 자동 사라짐.
  • (B) "다시 알리지 않기" 정책 영구→7일 — 영영 차단되던 icoach_install_dismissed_forever 정책 폐기. 새 정책 icoach_install_dismissed_at 타임스탬프 기반 — 7일 경과 시 자동 재노출. 기존 사용자의 영구 차단 키는 마이그레이션으로 제거되어 다음 방문 시 다시 안내받습니다.
  • (C) iOS 가이드 5초 → 1초 — 사용자가 페이지 떠나기 전에 안내가 보이도록 노출 지연 단축. setTimeout(...5000)1000ms.
  • (D) 첫 분석 완료 후 자연스러운 권유 토스트 — 분석 1회를 마쳤지만 아직 설치 안 한 사용자에게 "💡 앱으로 설치하면 매번 빠르게 시작할 수 있어요. 설정 → 📱 홈 화면에 앱 설치" 토스트 (분석 완료 4초 후, 6.5초 노출).
  • (E) 우측 하단 플로팅 📱 앱 설치 버튼 — 설치 안 된 상태에서 모든 화면 우측 하단에 골드 그라디언트 라운드 버튼이 항상 떠 있음 (탭 살짝 위로 흔들리는 펄스 애니메이션). 누르면 즉시 브라우저 맞춤 안내. 설치 완료 시 자동 숨김.
  • appinstalled 이벤트 핸들러 추가 — 사용자가 설치를 완료하면 window.appinstalled 이벤트가 발생, 모든 안내 UI 즉시 숨김 + "🎉 홈 화면에 추가됐어요!" 성공 토스트.
  • 스토어 차단 가능성은 무관 — 아이코치는 PWA(웹 앱) 라 Play Store/App Store 정책과 무관. "안전하지 않은 앱" 경고는 일부 안드로이드에서 PWA 설치 시 정상적으로 뜨는 표준 동작이며, "세부정보 → 무시하고 설치" 로 진행하면 됨 (기존 설치 배너 안내 그대로 유지).
  • 캐시 버전 v183→v184 — 배포 후 PWA 강제 업데이트 권장. 이번 업데이트 이후 영구 차단 상태가 자동 해제되어 사용자 폰에서 다시 안내가 보이기 시작합니다.
β 1.4.43 2026.04.23
SETTINGS · POLISH
  • 과거로 되돌리기 — 버튼 1줄 단순화 — 수동 백업 2줄 스택 대신 더 간결하게 "백업" 한 단어 1줄로 통일. 펼치기도 같은 사이즈로 맞춰 시각적 균형 확보.
  • 두 버튼 공통 스타일: padding:6px 12~14px · font-size:11px · white-space:nowrap · line-height:1. 폰트 두께는 골드 강조(백업: 700) / 중립(펼치기: 600) 로 차등해 시선 유도 유지.
  • 캐시 버전 v182→v183 — 배포 후 PWA 강제 업데이트 권장.
β 1.4.42 2026.04.23
SETTINGS · LAYOUT
  • "과거로 되돌리기" 헤더 영역 줄바꿈 정리 — β 1.4.41 의 새 데이터 보관 카드에서 "(최근 14일)" 텍스트가 "14"와 "일)"로 쪼개지고, "▼ 펼치기"가 "펼치"/"기"로, "수동 백업"이 "수동 백"/"업"으로 어색하게 줄바꿈되던 문제 해결.
  • 3가지 세부 수정:
    • 타이틀 "(최근 14일)" 을 <br> 으로 아래 줄로 내려 깔끔한 2줄 레이아웃
    • "▼ 펼치기" 버튼에 white-space:nowrap 추가 → 항상 1줄 유지
    • "수동 백업" 버튼을 <span display:block> 2개로 의도적으로 "수동" / "백업" 2줄 스택
  • 플렉스 비율 조정 — 타이틀 영역 flex:1 min-width:0, 버튼 영역 flex-shrink:0 으로 모바일 폭이 좁아도 버튼이 찌그러지지 않음.
  • 캐시 버전 v181→v182 — 배포 후 PWA 강제 업데이트 권장.
β 1.4.41 2026.04.23
SETTINGS · UX
  • 설정 → 데이터 보관 섹션 통합 — "데이터 관리" / "클라우드 동기화" / "날짜별 롤백" / "JSON 가져오기" 가 설정 화면에 나란히 놓여 있어 사용자가 "어떤 걸 눌러야 하나" 혼란을 겪던 UX 를 정리. 단일 "데이터 보관" 카드로 묶고 내부에 3 개의 독립 섹션으로 시각적으로 분리했습니다.
  • 용도 중심 재배치 — 상단부터 (1) ☁️ 기기 간 동기화 — 기기 변경·캐시 삭제 대비 / (2) 📅 과거로 되돌리기 — 최근 14일 데이터 타임머신 / (3) ⚙️ 고급 — JSON 내보내기·가져오기 (기본 접힘). 각 섹션에 "언제 쓰나요?" 한 줄 안내를 붙여 목적을 즉시 파악 가능하게 함.
  • 초보자 동선 최적화 — 가장 자주 쓰는 클라우드 동기화가 맨 위로, JSON 은 <details> 접힘으로 숨김. 일반 사용자에게는 2개만 보이고 고급 옵션은 필요할 때만 열림. 기능은 그대로 유지되지만 "어디서 시작해야 하는지" 명확해짐.
  • 기능 변경 없음 — 코드 수준에서 syncHistoryBoth(), manualSaveVersionBackup(), exportData(), importData() 는 모두 기존 동작 그대로. 순수 UI 재구성.
  • 캐시 버전 v180→v181 — 배포 후 PWA 강제 업데이트 권장.
β 1.4.40 2026.04.23
PITCHING · USER CHOICE
  • 암슬롯 사용자 선택 UI 도입 — 초보 오버핸드 오분류 근본 해결 — 투구 분석 전 오버핸드 · 사이드암 · 언더핸드 · 🤖 자동 감지 4개 pill 버튼을 표시합니다. 사용자가 의도한 폼을 직접 선택하면 그 값이 자동 감지를 덮어쓰고 분석 기준으로 적용됩니다. 아직 폼이 완성되지 않은 초보 오버핸드 친구가 수치상 사이드암으로 측정되더라도 사용자가 '오버핸드' 를 선택했다면 오버핸드 전용 기준(팔꿈치 각도 80~120°, 몸통 틸트 20~40° 등) · 오버핸드 롤모델 · 오버핸드 훈련 로 분석됩니다.
  • 왜 사용자 선택이 필요한가 — 2D 랜드마크 분석은 "지금 이 영상에서 팔이 어떻게 움직였는가" 만 측정 가능. "의도한 폼" 과 "실제 역학" 이 다른 초보 선수(대부분의 어린 오버핸드 선수) 는 수치만 보면 사이드암처럼 보입니다. 하지만 사용자(부모·코치) 는 선수의 의도를 알고 있으므로, 그 지식을 분석에 반영하는 게 훨씬 정확한 결과로 이어집니다.
  • UI·UX — 영상 업로드 후 미리보기 바로 아래에 골드 테두리 카드로 4개 pill 버튼이 노출. 선택은 localStorage.icoach_user_armslot 에 저장되어 다음 번에도 유지. 기본값은 '오버핸드' (한국 초중등 야구에서 가장 흔함). 투구 모드에서만 표시되고 타격·수비에는 영향 없음.
  • 자동 감지의 새로운 역할 — β 1.4.39 의 classScore 분류기는 이제 사용자가 '🤖 자동 감지' 를 명시적으로 선택한 경우에만 작동. 평소에는 관리자 진단 참고용 데이터로만 수집됨 — 사용자가 신경 쓸 필요 없이 본인이 선택한 폼으로 안정적으로 분석받을 수 있습니다. 관리자 카드에는 사용자=overhand · 적용=overhand · 원판정(자동)=sidearm 처럼 3개 값이 모두 표시되어 경계 케이스 데이터 계속 수집 가능.
  • Gemini API 는 현재 불필요 — 이 문제를 AI 비전으로 해결하려면 영상당 수백 원의 API 비용·네트워크 지연이 발생합니다. 사용자 선택 한 번으로 UX·정확도 양쪽을 해결하므로 API 의존 없이 동작. 장기적으로 Gemini 선택적 통합은 '자동 감지' 내부 개선 방향으로 유보.
  • 캐시 버전 v179→v180 — 배포 후 PWA 강제 업데이트 권장.
β 1.4.39 2026.04.23
DETECTION · DATA-CALIBRATED
  • 사이드암 자동 분석 부활 — 실측 데이터 기반 재보정 — β 1.4.32 에서 SAFE MODE 로 암슬롯 자동 감지를 전면 비활성화했던 기능이 실제 사용자 영상 11개(오버핸드 6 + 사이드암 5) 의 진단 수치를 기반으로 튜닝되어 돌아왔습니다. 이제 친구들이 사이드암으로 영상을 분석받을 때 사이드암 전용 기준(팔꿈치 각도 75~110°, 몸통 틸트 25~45° 등) + 롤모델(정대현·김병현·야마다 히사시) + 전용 훈련 이 정상 작동합니다.
  • classScore — 단일 연속 점수 분류기 — 기존엔 peakUpAng · peakElev · avgElev · 각종 각도 조합 12단계 if 체인으로 분기했는데, 경계 케이스마다 한두 조건이 어긋나 오탐이 속출했습니다. 11건 실측 분포를 분석해 classScore = peakUpAng/200 + (-avgElev) × 1.5 단일 스칼라를 도출 — 오버핸드 최고 1.05, 사이드암 최저 1.18 로 자연스러운 경계 1.15 발견. 기존 수많은 임계값을 이 한 줄로 대체.
  • 분류 규칙:
    classScore < 1.15오버핸드 (V1~V7 케이스 커버)
    classScore ≥ 1.15사이드암 (S1~S5 케이스 커버)
    classScore ≥ 1.80 AND avgElev < -0.55언더핸드 (극단적 케이스만, 거의 사용 X)
  • SAFE MODE 자동 해제 + 카메라 각도 연동 — 이제 기본값은 분류기 ON. 단 detectCameraView()(β 1.4.38) 가 'side' 를 반환한 경우에만 분류기 가동. 정면/뒷면/사선/불명 카메라는 측정값 자체가 왜곡되므로 자동으로 오버핸드 고정 — 별도 사용자 조작 없이 안전하게 보호됩니다. 명시적 강제 OFF 가 필요하면 콘솔에서 window.__icoach_detect_armslot = false.
  • 관리자 진단 카드 개선 — 타이틀에 classScoreview 추가. 한눈에 "분류 근거 점수" 와 "카메라 각도" 를 확인 가능. text 영역에는 새 공식과 임계값을 명시.
  • 예상 적중률 (실측 11건 기준): 오버핸드 5/5(100%) · 사이드암 5/5(100%) · V5(outlier) 는 수치상 사이드암으로 분류됨 (던지는 팔 오감지 의심). 실제 서비스에서 앞으로 새 영상을 축적하며 경계 케이스 튜닝 예정.
  • 캐시 버전 v178→v179 — 배포 후 PWA 강제 업데이트 권장.
β 1.4.38 2026.04.23
ANALYSIS · CAMERA GUIDE
  • 카메라 촬영 각도 자동 감지 + 안내 카드 — 앞에서 찍은 영상을 투구 분석하면 스트라이드 7% · 몸통 회전 1° · 코킹 팔꿈치 3° 같은 "무동작" 수치가 나오는 구조적 문제가 있었습니다. 사용자 촬영 미숙이 아니라 AI 분석의 근본적 한계 — 투구의 핵심 동작(스트라이드·회전·분리·코킹)이 카메라 축 방향(깊이) 으로 일어나 2D 프레임에선 납작해져 측정되기 때문입니다. 이제 AI 가 촬영 각도를 자동 감지해 사용자에게 알려줍니다.
  • 판별 원리 — 어깨폭 / 몸 높이 비율|LS.x - RS.x| / |avgShoulderY - avgAnkleY| 의 중앙값을 계산. 측면 촬영은 어깨가 카메라 기준 edge-on 이라 비율 < 0.20, 정면/뒷면은 양 어깨가 다 드러나 비율 > 0.30, 그 사이는 사선으로 분류. 연산은 프레임당 O(1) 이라 전체 오버헤드 무시 가능.
  • 🎥 촬영 각도 안내 카드 — 측면이 아닌 영상이면 분석 결과 맨 위에 노란 안내 카드가 뜹니다. 정면/뒷면: "스트라이드·몸통 회전·어깨 분리 등 카메라 축 방향으로 일어나는 동작은 실제보다 훨씬 작게 측정될 수 있어요." 사선: "살짝 비스듬한 각도. 90° 측면 촬영을 권장." 상세 영역에는 촬영 팁(선수 옆면·5~8m·수평) 수록.
  • 투구·타격·수비 3 모드 전부 적용pitchA, batA, fieldA(땅볼), fieldA_fly(플라이), catcherA(포수), outfield(외야) 6개 분석기 모두에 카메라 안내 카드 인젝션. 진단 덤프는 window.__icoach_view_debug 에 중앙값·샘플 수 저장.
  • SAFE MODE 진단 연결 — 이전 사용자 영상에서 peakUpAng=163° 같은 극단값이 나온 원인을 "앞에서 찍힌 초보 투구" 로 설명하는 데이터 기반 근거 확보. 측면 촬영으로 다시 분석하면 정상 범위 수치가 나올 가능성이 높고, 그때 SAFE MODE 해제 조건 논의로 이어갈 수 있습니다.
  • 캐시 버전 v177→v178 — 배포 후 PWA 강제 업데이트 권장.
β 1.4.37 2026.04.23
DETECTION · SAFE MODE BUG
  • SAFE MODE 우회 버그 근본 수정 — 언더핸드 오탐 발생 — β 1.4.32 에서 SAFE MODE 를 도입했는데 설계 결함이 있었습니다. 언더핸드 판정 경로(peakUpAng > 120°)가 SAFE MODE 검사보다 먼저 return 'underhand' 해버려 자동 감지 OFF 상태임에도 언더핸드 라벨이 튀어나오는 버그. 오버핸드 투구 영상을 "언더핸드 투구폼 감지"로 오분류하는 리포트 재발.
  • 문제 구조detectArmSlot() 의 12단계 캐스케이드에서 (4)~(9) 오버핸드 확정과 (10) 언더핸드 확정은 조기 return, (11) 사이드암만 wouldBe 변수 경유 → SAFE MODE 적용을 받았습니다. 즉 SAFE MODE 는 사이드암은 막았지만 언더핸드는 못 막는 비대칭 구조였습니다. 또한 조기 return 으로 인해 진단 카드의 원판정 필드가 언더핸드 케이스에서 n/a 로 찍혔습니다 (wouldBe 를 저장하는 코드에 도달하기 전에 함수 종료).
  • 수정 — 단일 return 지점으로 리팩터 — (4~9) 오버핸드 확정 / (10) 언더핸드 확정 / (11) 사이드암 확정 조건을 모두 개별 boolean 식으로 평가하고 wouldBe 변수에 누적, 맨 마지막에 SAFE MODE 체크 한 곳에서만 최종 return. 모든 분류 결과가 SAFE MODE 를 반드시 통과.
  • 진단 카드 개선 — 덤프 위치를 분류 로 이동해 wouldBe 가 항상 window.__icoach_armslot_debug 에 포함됨. 이제 관리자 카드 제목에 원판정=overhand / sidearm / underhand 가 실제 판정대로 찍혀 SAFE MODE 가 어떤 내부 판정을 차단했는지 확인 가능.
  • 사용자 영상 실측값(참고) — peakUp=163.2° / minUp=158.6° / pE=-0.378 / aE=-0.465 / aboveShoulder=0/23. 진짜 오버핸드임에도 팔이 단 한 프레임도 어깨 위로 안 올라옴. 가장 유력한 가설은 "던지는 팔 자동 판별"에서 글러브 팔이 잘못 선택됐거나, 영상이 릴리스~팔로스루 구간만 담겨 코킹 전반을 놓친 케이스. 실측 데이터 축적 중.
  • 캐시 버전 v176→v177 — 배포 후 PWA 강제 업데이트 권장.
β 1.4.36 2026.04.23
CHAT · CONVERSATION
  • 앵무새 응답 근본 수정 — 대화처럼 느끼도록 재설계 — "고맙습니다" 든 "스윙 준비 스트레칭도 매번 해야하나요?" 든 뭘 물어봐도 코치가 같은 문구 + 동일 훈련 카드로만 답하던 문제 해결. 3가지 근본 원인 모두 손봤습니다.
  • 원인 1: 사교적 의도에도 훈련 카드가 붙었음getRuleBasedResponse 의 switch 문이 default 로 먼저 떨어지면서 drills=getGeneralDrills(...) 로 훈련이 세팅되고, 그 뒤의 thanks/encouragement 처리는 response 만 덮어쓰고 drills 는 그대로 두는 구조였습니다. 이제 thanks/encouragement/affirm/negate/warmup_q/frequency_q/why_q 분기에서 모두 drills=[] 로 초기화.
  • 원인 2: 같은 응답 템플릿이 한 개씩 — 점수대별로 한 문장만 있어 매번 똑같이 반복. getGeneralBattingResponse/PitchingResponse/FieldingResponse 를 모두 점수대 × 4개 템플릿 풀로 확장하고 icoach_chat_rot_<key> localStorage 카운터로 순차 로테이션. 같은 점수대여도 매번 다른 멘트.
  • 원인 3: 훈련이 무조건 따라붙었음 — 직전 코치 메시지에 이미 훈련 카드가 있었으면 이번 턴에서는 훈련 생략(명시적 "훈련 추천해줘" 의도만 예외). 연속 3턴 내내 동일 훈련 4개 재노출되던 현상 차단.
  • 의도 인식 확장recognizeIntentwarmup_q(스트레칭/준비운동/웜업) · frequency_q(매번/매일/자주/얼마나/몇 번) · why_q(왜/이유/어째) · affirm(네/응/오케이) · negate(아니/안/싫어) 5종 추가. "스윙 준비 스트레칭도 매번 해야되나요?" → warmup_q + frequency_q 범위로 들어와 실제 준비운동 빈도 지침을 응답하도록 함.
  • Gemini API 키 연결 시 계속 AI 채팅 사용 — 규칙 기반 응답은 폴백. 설정에서 Gemini API 키를 넣으면 대화 맥락(최근 6턴)과 분석 점수를 바탕으로 진짜 대화형 코치가 작동합니다. 현재 앵무새 현상이 심하다면 Gemini 키 연동을 먼저 추천.
  • 캐시 버전 v175→v176 — 배포 후 PWA 강제 업데이트 권장.
β 1.4.35 2026.04.23
CHAT · LAYOUT
  • 채팅 스크롤·입력창 소실 근본 수정 — CSS 특수성 충돌 — β 1.4.34 에서 rAF + 이미지 로드 리스너까지 달아 스크롤 로직을 강화했음에도 "스크롤이 안 내려가고 더 채팅을 할 수가 없다"는 리포트. 근본 원인은 전혀 다른 곳 — CSS 선택자 특수성 충돌이었습니다.
  • 버그 구조.screen.active(선택자 2개, 특수성 0,0,2,0) 가 display:block 을 강제, .chat-screen(0,0,1,0) 의 display:flex특수성 밀려서 덮어쓰지 못했습니다. 결과적으로 채팅 화면이 실제로는 block 으로 렌더링되어 .chat-messagesflex:1 이 무력화됨. 메시지가 쌓이면 컨테이너 높이가 내용만큼 계속 늘어나고, 그만큼 전체 스크린 높이도 늘어나 chat-input-area 가 뷰포트 밖으로 밀려난 것. 스크롤 JS 는 정상 동작해도 입력창이 눈에 안 보이니 채팅을 이어갈 수 없었습니다.
  • 수정 — 특수성 0,0,2,0 의 .screen.chat-screen 선택자로 display:flex + padding-bottom:0 + height:calc(100dvh - 65px) 재선언. .screen.chat-screen.active(0,0,3,0) 에도 display:flex 명시로 최종 확정. 안전장치로 !important 병행. 이제 chat-header/chat-messages/chat-input-area 가 제대로 flex 기반으로 배치되어 chat-messages 만 내부 스크롤되고 input 은 항상 바닥에 고정.
  • 100dvh 적용 — 기존 100vh 는 모바일 브라우저의 URL 바 표시/숨김에 따라 값이 요동쳐 가상 키보드 띄웠을 때 입력창이 사라지는 부수 문제가 있었는데, 100dvh(dynamic viewport height) 로 교체해 안정화. 구형 브라우저는 기존 100vh 규칙이 폴백으로 남아있습니다.
  • 캐시 버전 v174→v175 — 배포 후 PWA 강제 업데이트 권장.
β 1.4.34 2026.04.23
CHAT · UX
  • 채팅 자동 스크롤 근본 수정 — 질문을 보내고 코치 응답(또는 추천 훈련 카드)이 도착해도 채팅 화면이 맨 아래로 내려가지 않던 문제 해결. 기존 scrollChatToBottom()scrollTop = scrollHeight동기적으로 한 번만 호출했는데, 코치 아바타나 훈련 아이콘 <img>비동기로 로드되면서 실제 높이는 그 뒤에 확정 → 최초 스크롤 시점에는 아직 늘어나지 않은 높이만 반영돼 중간쯤에서 멈췄습니다.
  • 5단 스크롤 보장 — (1) 즉시 1회 (2) requestAnimationFrame 중첩 2회 (레이아웃 반영 후) (3) 200ms · 600ms 지연 타이머 (4) 로드되지 않은 <img>load·error 리스너 부착해 실제 이미지 로드 시 재스크롤. 모바일의 느린 네트워크에서도 확실히 바닥에 붙습니다.
  • "훈련 정보를 찾을 수 없습니다" 토스트 UX 개선 — β 1.4.28 의 4중 폴백으로도 제목을 뽑지 못하는 극히 드문 레거시 채팅 히스토리에서 오류 토스트가 떠 혼란을 줬습니다. 이제 해당 케이스에서는 에러 대신 정보 토스트("이 훈련은 이전 버전 포맷이에요. 새 분석의 추천 훈련은 바로 담을 수 있어요") + 버튼만 비활성화. 동시에 콘솔에 버튼/부모 DOM 을 덤프해 다음 추적을 위한 근거 확보.
  • 캐시 버전 v173→v174 — 배포 후 PWA 강제 업데이트 권장.
β 1.4.33 2026.04.23
DIAGNOSTIC · UI
  • 관리자 진단 카드 전용 디버그 레이아웃 분리 — β 1.4.32 에서 추가한 🔧 관리자 진단 카드가 일반 피드백 카드 렌더러를 타면서 "현상 / 원인 / 교정" 3단 템플릿에 억지로 끼워맞춰져, 원인·교정 자리에 "이 부분을 개선하면 부상 예방..." 같은 상용구가 자동 생성되고 있었습니다. 진단 정보가 코칭 피드백처럼 표시돼 혼란을 줬습니다.
  • 간결한 모노스페이스 단일 블록으로 교체 — 카드 제목이 🔧 로 시작하면 렌더러가 이를 감지해 3단 템플릿을 건너뛰고, 제목 / text / detail 을 모노스페이스 한 블록으로 표시합니다. 접힘 토글과 화살표를 제거해 항상 펼친 상태로 노출 — 관리자가 스크린샷 한 장으로 모든 수치를 캡처할 수 있도록. 메인 분석 결과 렌더러와 히스토리 상세 렌더러 양쪽에 동일하게 적용.
  • 감지 판정에 영향 없음 — 이번 변경은 순수 렌더링 레이어. β 1.4.32 의 SAFE MODE (암슬롯 자동 감지 OFF 기본값) 는 그대로 유지되어 "사이드암 투구폼 감지" 오탐은 계속 차단됩니다.
  • 캐시 버전 v172→v173 — 배포 후 PWA 강제 업데이트 권장.
β 1.4.32 2026.04.23
DETECTION · SAFE MODE
  • 암슬롯 자동 감지 기본 비활성화 — 사이드암 오탐 완전 차단 — β 1.4.29/1.4.31 에서 비율 기반 임계값 완화 → 각도 기반 판정기 추가까지 시도했지만, 특정 카메라 구도에서는 오버핸드 영상이 계속 사이드암으로 오분류돼 잘못된 롤모델(김병현/정대현)이 추천되는 문제가 해결되지 않았습니다. 측정 지표가 아무리 정교해져도 카메라 각도·피사체 구도에 따른 노이즈가 근본적으로 남아, 임계값 조준 튜닝만으로는 안전하게 분류할 수 없다고 판단했습니다.
  • 안전 모드 전환 — 모든 투구를 오버핸드로 분석detectArmSlot() 의 측정·분류 코드는 그대로 유지한 채, 최종 리턴 직전에 window.__icoach_detect_armslot === true 플래그가 없으면 항상 'overhand' 로 오버라이드. 결과적으로 "사이드암 투구폼 감지" 카드와 사이드암·언더핸드 롤모델 추천이 더 이상 나타나지 않습니다. 원래 내부 판정 결과(wouldBe)는 진단에 보존되므로 나중에 실측 데이터로 재조정 가능.
  • 관리자 진단 카드 타이틀에 핵심 수치 상시 노출 — 기존에는 접힌 상태에서 제목만 보이고 수치는 열어야 확인 가능했습니다. 이제 타이틀에 🔧 원판정=overhand/sidearm/underhand · peakUp=XX° · minUp=XX° · pE=X.XX · aE=X.XX 형태로 핵심 4개 값을 직접 노출해 스크린샷 한 장으로 상태 파악 가능. 세부는 접은 상태로 유지.
  • 자동 감지 재활성화 경로 — 관리자 브라우저 콘솔에서 window.__icoach_detect_armslot = true 입력 후 재분석하면 β 1.4.31 의 12단계 캐스케이드 판정기가 다시 작동합니다. 실제 사이드암/언더핸드 투수 영상의 진단 값을 수집해 임계값을 실측 기반으로 재설정한 뒤 전체 재활성화 여부 결정 예정.
  • 캐시 버전 v171→v172 — 배포 후 PWA 강제 업데이트 권장.
β 1.4.31 2026.04.23
DETECTION · ANGLE-BASED
  • 사이드암 오탐 2차 수정 — 생체역학적 각도 판정기 도입 — β 1.4.29 의 peakElev/keyElev 이중 기준으로도 여전히 오버핸드 투구를 사이드암으로 오분류하는 영상이 있었습니다. 비율 기반 지표(elev = (sh.y - el.y) / torso) 는 카메라 각도·거리·피사체 줌에 의해 분모가 요동쳐 근본적으로 불안정한 스칼라였습니다.
  • 새 PRIMARY 판정기 — 어깨→팔꿈치 벡터의 수직각upAng = atan2(|el.x - sh.x|, sh.y - el.y) × 180/π. 0°=팔꿈치가 어깨 바로 위(팔 수직), 90°=어깨와 같은 높이(팔 수평), 180°=바로 아래(팔 수직 아래). 프레임 스케일·줌에 완전히 독립이라 훨씬 안정적. 오버핸드 코킹 10~45°, 사이드암 65~105°, 언더핸드 120°~.
  • 12단계 캐스케이드 판정 — (4) peakUpAng < 55° → 오버핸드 / (5) minUpAng < 45° (단 한 프레임이라도 팔이 분명히 위쪽) → 오버핸드 / (6~9) 기존 비율 기반 백업 체크들 / (10) 언더핸드는 peakUpAng > 120° AND 삼중 조건 / (11) 사이드암은 네 조건 모두 충족(peakUpAng 65~110° AND releaseUpAng ≥ 60° AND peakElev < 0.02 AND avgElev < -0.15) / (12) 나머지는 전부 오버핸드 기본값. 애매한 경계에서 오버핸드로 쏠리는 구조.
  • 수집 창 확장 — 기존 [release-12, release+2] → [release-20, release+3]. 느린 와인드업의 코킹 피크가 창 밖으로 밀려 peakElev 가 과소 측정되던 문제 보정. 팔로스루 배제 상한(+3)은 유지해 오염 원천 차단.
  • 관리자 진단 카드 추가 — 관리자 모드일 때 분석 결과 상단에 🔧 관리자 진단 (암슬롯) 노란색 카드가 뜹니다. 판정에 쓰인 실제 수치 — armSlot, isRight(R/L), releaseF(프레임%), 수집창 범위, aboveShoulder 프레임 수, peakElev/releaseElev/avgElev, peakUpAng/releaseUpAng/minUpAng — 를 한 줄로 노출해 다음 오탐 발생 시 정확한 수치 기반으로 임계값을 조준 튜닝할 수 있습니다. 콘솔에서도 window.__icoach_armslot_debug 로 접근 가능.
  • 캐시 버전 v170→v171 — 배포 후 PWA 강제 업데이트 권장.
β 1.4.30 2026.04.23
ADMIN · QA
  • 관리자 모드에서 같은 영상 반복 분석 허용 — 기존에는 관리자 모드로 일일 제한이 풀려도, "이 영상은 이미 분석한 적이 있습니다" 중복 영상 다이얼로그가 여전히 떠서 QA·회귀 테스트 시 동일 영상으로 재분석을 반복할 수 없었습니다. onVideoSelected 의 중복 체크 호출부를 관리자 상태 확인 후 우회하도록 수정 — _adminUnlocked === true 또는 localStorage.icoach_admin === '1' 이면 다이얼로그 없이 바로 진행합니다.
  • 시각적 피드백 — 관리자 모드에서 중복 영상이 감지되면 (차단하지 않고) 🔓 관리자 모드: 같은 영상 재분석 허용 토스트를 띄워 우회 동작이 일어났음을 알려줍니다. 영상 지문(fingerprint) 자체는 계속 저장되므로 관리자 모드를 해제하면 일반 사용자 흐름(중복 경고 다이얼로그)이 그대로 돌아옵니다.
  • 일일 제한 해제 패턴 재사용checkDailyLimit() 에서 이미 검증된 관리자 판정 로직(_adminUnlocked 변수 + icoach_admin localStorage) 을 동일하게 적용. 추후 isAdminUnlocked() 헬퍼로 통합 여지 있음.
  • 캐시 버전 v169→v170 — 배포 후 PWA 강제 업데이트 권장.
β 1.4.29 2026.04.23
DETECTION · ROOT-CAUSE FIX
  • 사이드암 오탐 근본 수정 — 오버핸드 투구 영상에서 반복적으로 사이드암 투구폼 감지 라벨이 잘못 붙던 문제를 해결했습니다. 기존 분류는 keyElev > -0.05 단 한 줄로 "팔꿈치가 어깨 기준 몸통 길이의 5% 이하로만 내려가도 사이드암" 으로 취급했는데, 실제 정상 오버핸드 릴리스에서도 팔꿈치가 어깨보다 살짝 아래(-0.07~-0.15)에 위치하는 경우가 흔해 지속적으로 오분류됐습니다. Safety Net 들도 있었지만 단일 프레임 keyElev 한 번만 임계값 밑으로 떨어지면 즉시 사이드암 라벨이 찍히는 구조적 약점이 있었습니다.
  • 이중 기준 분류로 교체 — (A) peakElev 오버핸드 확정 임계값 0.08→0.04, (B) 어깨 위 프레임 절대수 3→2 로 완화해 정상 오버핸드는 Safety Net 단계에서 빠르게 확정. (C) 경계 구간 진입 시 peakElev < 0.05 AND keyElev ≤ -0.18 두 조건을 동시에 요구해야만 사이드암 — 피크가 어깨 근처까지라도 올라왔으면 오버핸드. (D) keyElev > -0.15 면 오버핸드(정상 오버핸드 릴리스의 자연스러운 하강 포용). (E) 언더핸드 기준 -0.30→-0.38 로 엄격화. (F) 애매한 중간 구간은 기본값 오버핸드 — 가장 흔한 폼이므로 오분류 비용이 최소.
  • 크라우칭(포수) 오탐 근본 수정 — 투구/타격 분석에서 ⚠️ 크라우칭(포수) 자세가 많이 감지 경고가 잘못 뜨던 문제 해결. 기존 조건 hipY > kneeY * 0.82 는 이미지 절대 좌표 비율이라 피사체가 프레임에 어떻게 잡혔느냐(크게/작게/위쪽/아래쪽)에 따라 값이 요동쳤습니다. 투수가 프레임 중상단에 잡히면 hipY/kneeY 가 자연스레 0.82 를 넘어 상시 오탐.
  • 신체 정규화 깊이 + 무릎 각도 이중 조건 — 새 지표는 (ankleY - hipY) / (ankleY - shoulderY) — 발목-어깨 축에서 엉덩이가 얼마나 아래쪽에 위치하는지를 몸 전체 길이로 정규화합니다. 서 있으면 0.5, 크라우칭이면 0.45 미만. 여기에 무릎 각도 < 115° (실제 굽혀진 상태) 조건을 AND 로 결합해, 두 지표 모두 만족해야만 크라우칭으로 카운트. 경고 발동 임계값도 crouchR > 0.4 → 0.55 로 상향해 잔존 노이즈를 한 번 더 거릅니다.
  • 파싱 버그 동시 수정(lk?.y||1+rk?.y||1)/2 는 연산자 우선순위 때문에 lk?.y || (1 + rk?.y) || 1 / 2 로 해석되어 kneeY 가 쓸모없는 값(2 또는 NaN)이 되던 숨은 버그를 함께 고쳤습니다.
  • 캐시 버전 v168→v169 — 배포 후 PWA 강제 업데이트 권장.
β 1.4.28 2026.04.23
TRAINING · ROOT-CAUSE FIX
  • 채팅 코치의 "+ 추가" 토스트 "훈련 정보를 찾을 수 없습니다" 근본 수정 — β 1.4.26 의 DOM-First 폴백이 .drill-suggest-title-line / .drill-suggest-desc 클래스명에만 의존하고 있었습니다. 하지만 이전 버전(β 1.4.17 이하)의 채팅 히스토리는 <span>아이콘 제목<span>설명</span></span> 형태라 두 클래스가 존재하지 않았고, 결과적으로 "+ 추가" 클릭 시 제목·설명을 전혀 뽑아내지 못해 토스트만 떴습니다. addChatDrill()3-tier 폴백 체인(①data-* 속성 → ②새 클래스 파싱 → ③레거시 중첩 span 파싱 → ④button/img 제거 후 textContent)을 심어 모든 히스토리 포맷에서 복원되도록 했습니다.
  • 채팅 추천 훈련이 매번 같은 3종(티 배팅 50회 / 드라이 스윙 30회 / 공 추적 연습)이던 문제 해결 — 기존 getGeneralDrills(mode) 는 모드별로 하드코딩된 3개 훈련만 반환해 대화가 단조로웠습니다. 새 버전은 (1) 분석 페이즈가 있으면 gBD/gPD/gFD/gCD/gOD/gFD_fly 분석기를 재사용해 실제 사용자 폼 약점에 맞춘 훈련을 우선 내놓고, (2) 페이즈가 없으면 모드별 8종 풀에서 3종씩 회전(icoach_drill_rot_<mode> localStorage 카운터) 합니다. 투구·타격·수비 채팅 모두 동일 구조로 적용.
  • 분석 결과 추천 훈련 카드에 "+ 훈련에 담기" 버튼 신설 — 홈 화면의 분석 결과 .drill-card 에는 영상 보기 버튼만 있고 커스텀 훈련에 추가할 버튼이 없어, 채팅으로 다시 물어봐야 훈련 메뉴에 반영되는 흐름이었습니다. 이제 각 훈련 카드 하단에 drill-card-add-btn 이 노출되어 한 번의 탭으로 오늘의 커스텀 훈련에 담깁니다. 이미 담긴 훈련은 "추가됨" (비활성) 라벨로 표시.
  • 히스토리 상세 페이지에도 동일 버튼 적용 — 과거 분석을 다시 열어볼 때도 같은 경로로 추천 훈련을 훈련 메뉴에 담을 수 있게 drill-card-add-btn 을 동일하게 배치. 내부적으로는 addChatDrill(btn, mode) 를 공유해 저장 경로가 한 군데로 수렴합니다.
  • 캐시 버전 v167→v168 — 배포 후 PWA 강제 업데이트 권장.
β 1.4.27 2026.04.22
STORAGE · ROOT-CAUSE FIX
  • "저장 공간 107% 사용 중" 처럼 100% 를 넘는 비정상 경고가 뜨던 문제 근본 수정 — 기존 로직은 icoach_* 키의 문자열 길이를 합쳐 임의의 4.5MB 가상 상한 으로 나눠 퍼센트를 계산했습니다. 실제 브라우저가 허용하는 localStorage 한도는 보통 5~10MB 이상이라, 데이터가 가상 상한만 넘으면 브라우저에서는 멀쩡히 저장되는데 화면에는 107%·120%·150% 같은 말이 안 되는 수치가 찍혔습니다. 분석 24~30건만 쌓여도 매번 경고가 떠 불필요한 불안을 줬습니다.
  • 개선 (1) 브라우저의 진짜 quota 사용navigator.storage.estimate() 를 호출해 실제 usage/quota 비율을 계산합니다. 이 API 는 Chrome·Safari·삼성인터넷 모두 지원.
  • 개선 (2) 100% 하드캡 — API 사용 경로든 레거시 폴백 경로든 최종 퍼센트는 항상 0~99 로 제한되어 "107%" 가 원천적으로 발생하지 않습니다.
  • 개선 (3) 임계값·스로틀 — 경고 임계값 80% → 90% 로 상향, 한 번 경고가 뜨면 24시간 동안 재표시 억제 (icoach_storage_warn_at). 단, safeSave 에서 실제로 저장 실패가 일어난 경우는 force 로 스로틀 우회.
  • 캐시 버전 v166→v167 — 배포 후 PWA 강제 업데이트 권장.
β 1.4.26 2026.04.21
TRAINING · ROOT-CAUSE FIX
  • 코치 채팅의 "+ 추가" 버튼이 "훈련 정보를 찾을 수 없습니다" 토스트만 띄우던 문제 근본 수정 — β 1.4.25 까지는 버튼의 onclick 이 메모리 상의 chatSuggestedDrills[idx] 배열 인덱스를 참조하는 구조였는데, 이 배열은 실제로는 한 번도 채워지지 않고 있었고, 채팅 히스토리는 HTML 문자열로 localStorage 에 저장되기 때문에 페이지를 새로고침하거나 세션을 다시 열면 메모리 배열이 항상 비어 있어서 모든 인덱스가 undefined 가 되는 구조적 결함이 있었습니다. β 1.4.25 에 추가한 가드가 이 결함을 표면화시켜 매번 "훈련 정보를 찾을 수 없습니다" 가 뜬 것입니다.
  • DOM-First 아키텍처로 전환 — 훈련 페이로드(제목·설명·모드)를 버튼의 data-drill-title / data-drill-desc / data-mode 속성에 HTML 엔티티 이스케이프(&·"·<·>)로 내장하도록 바꿨습니다. 속성이 비어 있는 구버전 히스토리의 버튼을 만나더라도 부모 .drill-suggest-item 요소의 .drill-suggest-title-line / .drill-suggest-desc 텍스트를 직접 파싱해 폴백합니다. 두 경로 모두 완전히 DOM 기반이라 리로드 · 히스토리 복원 · 다른 탭 재열기 이후에도 항상 동작.
  • 시그니처 하위호환addChatDrill(btnEl, mode) 신형과 addChatDrill(idx, mode, this) 구형을 첫 인자 타입(HTMLElement 여부)으로 자동 감지해 처리합니다. 이미 localStorage 에 남아 있는 예전 채팅 HTML 이라도 곧바로 새 로직을 타고 정상 추가됩니다.
  • 캐시 버전 v165→v166 — 배포 후 PWA 강제 업데이트 권장.
β 1.4.25 2026.04.21
TRAINING · BUGFIX
  • 코치 채팅에서 "+ 추가" 누른 훈련이 훈련 메뉴에 반영되지 않던 문제 수정 — 기존에는 버튼이 "추가됨" 으로 바뀌고 훈련이 추가되었습니다 토스트까지 뜨지만, 실제로는 icoach_custom_drills 라는 별도 로컬 버킷에만 저장될 뿐 어느 화면도 그 버킷을 읽지 않아서 훈련 메뉴에는 아무것도 뜨지 않았습니다. 이번 릴리즈에서 getTodayDrillListGrouped() 가 오늘 날짜로 필터한 커스텀 훈련을 해당 모드(투구/타격/수비) 그룹 끝에 자동으로 합류 시키도록 고쳤습니다. 채팅에서 "+ 추가" 를 누르면 → 토스트 + 훈련 메뉴의 해당 섹션 맨 아래에 체크박스/훈련방법 버튼까지 포함해 즉시 표시됩니다. 훈련 탭이 열려 있으면 재렌더까지 바로 수행.
  • 날짜 스코프 저장 + 30일 자동 프루닝 — 커스텀 훈련은 dateKey(YYYY-MM-DD) 를 함께 저장하므로 추가한 그 날의 훈련 리스트에만 나타나고, 자정이 지나면 자동으로 사라집니다. 로컬 스토리지 누적 방지를 위해 30일 초과 엔트리는 저장 시점에 프루닝. 같은 날/같은 모드/같은 제목 중복 입력은 1회만 반영.
  • 캐시 버전 v164→v165 — 배포 후 PWA 강제 업데이트 권장.
β 1.4.24 2026.04.21
DATA-ROLLBACK · POLISH
  • "날짜별 롤백" 이지만 리스트는 β 1.4.14 같은 버전 번호가 메인 라벨이던 문제 수정 — β 1.4.23 에서 dedupe 키를 날짜로 바꿨지만 라벨 포맷 은 "날짜 엔트리면 날짜, 레거시 버전 엔트리면 버전" 식으로 분기되어 있어서, 실제 사용자의 목록에는 β 1.4.23 이전에 쌓인 레거시 엔트리가 대부분이라 화면에는 여전히 버전 번호가 크게 보였습니다. 이번 릴리즈에서 모든 엔트리는 예외 없이 날짜(2026.4.21 (수))를 메인 라벨 로, 버전 번호(있다면)와 시각·분석 횟수는 작은 부제로 표시하도록 통일했습니다.
  • 1일 1엔트리 강제 마이그레이션 — 기존 저장소에는 같은 날짜에 여러 개(예: 2026.4.21 에만 β 1.4.14·1.4.13·1.4.10·1.4.9·0.9.5 총 5개)가 쌓여 있어 "날짜별 롤백" 이라는 이름과 맞지 않았습니다. 앱 실행 시 _vb_migrate()한 번 돌며 (1) 레거시 엔트리의 date ISO 문자열에서 dateKey(YYYY-MM-DD)를 파생하고, (2) 같은 dateKey 에 속한 엔트리 중 타임스탬프가 가장 최신인 1개만 남기며, (3) 최근 14일 범위로 잘라 저장합니다. 따라서 2026.4.21 자리에는 당일 마지막에 저장된 스냅샷만 남고 나머지는 정리됩니다.
  • 페이지네이션 추가 (5개/페이지, 최대 14일 = 3페이지) — 14일치가 전부 쌓여도 설정 화면이 세로로 길게 늘어지지 않도록, 리스트를 한 페이지 5개 로 자르고 하단에 ← 이전 / N·M / 다음 → 버튼을 추가했습니다. 페이지가 1장(엔트리 ≤ 5개) 이면 컨트롤은 숨김. 수동 백업을 누르면 첫 페이지(가장 최신 쪽)로 점프합니다.
  • 캐시 버전 v163→v164 — 배포 후 PWA 강제 업데이트 권장.
β 1.4.23 2026.04.21
DATA-ROLLBACK · REDESIGN
  • "버전별 롤백" 을 "날짜별 롤백" 으로 재설계 — 기존 설계는 "앱 버전이 바뀔 때마다 직전 버전 데이터를 1회 스냅샷" 이라 같은 버전에 머무르는 동안 은 수동으로 누르지 않으면 백업이 아예 생기지 않는 구조였고, β 1.4.22 에서 dedupe 를 도입한 뒤로는 한 버전당 1장만 보존되어 "어제 삭제한 기록을 복구" 같은 실제 수요를 전혀 못 막았습니다. 애초에 "롤백" 이라는 이름도 사용자에게 앱 기능 자체의 롤백으로 오해되기 쉬웠고, 실제로는 기능 롤백이 필요한 상황이 거의 발생하지 않으므로, 남겨야 할 진짜 기능은 데이터 타임머신 이었습니다. 이번 릴리즈에서 dedupe 키를 versiondateKey (YYYY-MM-DD) 로 바꾸고, 앱 실행 시점에 오늘 날짜의 스냅샷이 없으면 자동으로 1장을 저장 하는 정책으로 교체했습니다.
  • 하루 1회 자동 백업 + 최근 14일 FIFO 보존 — 앱이 실행될 때 checkDailyBackup()icoach_version_backups 배열을 스캔해서 오늘 날짜(dateKey) 항목이 없으면 즉시 한 장을 저장합니다. 기존 버전 기반 체크 (checkVersionAndBackup) 는 제거했습니다. 백업 상한은 10개 → 14일 로 상향해 "지난 2주 내 어느 날로도 복구 가능" 을 보장하고, 이 상한을 넘으면 가장 오래된 엔트리부터 드롭됩니다. 수동 수동 백업 버튼은 오늘 날짜 스냅샷을 최신 데이터로 덮어쓰기 (같은 날 여러 번 눌러도 리스트가 불지 않음) 하며, 완료 토스트는 2026.04.21 백업 완료 형태로 날짜를 노출합니다.
  • 기존 버전별 백업 엔트리는 그대로 유지(공존) — β 1.4.22 이하에서 만들어진 version 키 엔트리는 마이그레이션/삭제 없이 목록에 그대로 남고, 라벨만 다르게 렌더됩니다: 날짜 엔트리는 2026.04.21 (수) 를 메인 라벨로, β 1.4.23 을 작은 부제로 표시하고, 레거시 버전 엔트리는 기존처럼 β 1.4.22 를 메인 라벨로 유지합니다. 사용자가 과거 롤백 기록을 "잃어버렸다" 고 오인하는 일이 없도록 하는 것이 목적입니다.
  • 캐시 버전 v162→v163 — 배포 후 PWA 강제 업데이트 권장.
β 1.4.22 2026.04.21
SETTINGS · UX · POLISH
  • 수동 백업을 눌러도 현재 버전(β 1.4.21)이 리스트에 안 보이던 문제 수정 — 기존 saveVersionBackup() 은 매 클릭마다 append 만 했기 때문에, 브라우저가 이전 캐시된 JS 를 쓰거나 또는 이미 "최신" 으로 표시되던 다른 버전이 있으면 사용자가 추가된 항목을 인지하기 어려웠습니다. 이번 릴리즈에서는 저장 시 같은 버전의 기존 항목을 제거(dedupe)한 뒤 새로 push 하도록 변경했고, 확인 토스트에도 β X.Y.Z 백업 완료 처럼 버전을 명시해 실제 저장 여부를 즉시 확인할 수 있게 했습니다.
  • 버전별 롤백 리스트 접기/펼치기 추가 — 업데이트를 오래 쓴 사용자의 백업이 5개 이상 쌓이면서 설정 화면이 세로로 길게 늘어져 가독성을 해치는 문제가 있었습니다. 기본은 접힘 상태(현재 최신 버전 요약 한 줄만 표시)이고, ▼ 펼치기 버튼으로 전체 목록을 열 수 있습니다. 펼친 상태는 섹션 재진입 시 유지되지 않고 항상 접힘으로 리셋됩니다(사용자가 필요할 때만 연다는 철학).
  • 중복된 ↑올리기 / ↓내려받기 버튼 제거 — "☁ 클라우드 동기화" 블록 안의 파란 지금 동기화 버튼이 이미 syncHistoryBoth()(내려받기 → 올리기) 를 수행하고, 새 분석 시 자동 업로드 · 앱 실행 시 자동 다운로드도 별도로 돌고 있어서 아래 두 방향 버튼은 거의 사용되지 않으면서 UI 만 어지럽혔습니다. 두 버튼은 ▸ 고급: 한 방향만 동기화 토글 뒤로 숨겨, 평상시에는 한 개의 지금 동기화 버튼만 보이게 정리했습니다.
  • 캐시 버전 v161→v162 — 배포 후 PWA 강제 업데이트 권장.
β 1.4.21 2026.04.21
VERIFY · TRAINING · CRITICAL
  • 훈련과 전혀 무관한 영상을 올려도 "인증 완료"가 뜨던 버그 수정 — 훈련 탭에서 훈련 인증 시, 예컨대 "쿠션 캐치 연습" 훈련에 풍경/셀카/무관한 영상 등을 업로드해도 곧바로 인증 완료 로 처리되던 치명적 오류였습니다. 원인은 3중 구조적 허점: (A) Gemini API 키가 없는 사용자는 즉시 pass:true 로 통과. (B) Gemini 프롬프트가 "관대하게 판별해. 야구 관련 동작이면 대부분 pass:true"라고 명시적으로 느슨하게 지시되어 있음. (C) 응답 파싱 실패·네트워크 오류·JSON 포맷 오류 등 모든 예외가 pass:true 로 폴백 — 즉 기본값이 통과. 3개 중 하나라도 걸리면 이후 검사는 무의미했습니다.
  • 수정안 — 이중 검증(로컬 MediaPipe + Gemini) + fail-closed 기본값 — (1) 로컬 1차 검증 (preVerifyDrillVideoLocal): API 호출 전 단계에서 브라우저 내장 MediaPipe 포즈 추정기로 6 프레임을 샘플링 → "사람이 실제로 움직이는가?" 확인. 사람 감지 프레임이 절반 미만이거나 총 이동량이 0.05 아래면 즉시 차단. 정지 화면·풍경·반려동물 영상을 API 비용 없이 거름. (2) Gemini 2차 검증 강화: 프레임 2장→4장, 해상도 384px→480px, temperature 0.2→0.1, 훈련 제목/태그에서 핵심 동작 키워드를 추출해 프롬프트에 주입(투구/타격/수비/워밍업/체력), 프롬프트 어조를 "엄격하게 판별한다. 기본값은 pass:false" 로 반전. (3) fail-closed 정책: 파싱 실패·JSON 포맷 오류·pass 가 boolean 이 아닐 때 모두 pass:false. 진짜 네트워크 에러만 skipped:true 로 사용자 편의상 통과 허용.
  • 영향 — 무관한 영상 업로드 시 "영상에서 사람의 움직임을 확인할 수 없습니다" 또는 "이 훈련과 맞지 않는 영상입니다" 메시지와 함께 차단. 실제 해당 훈련을 촬영한 영상은 기존처럼 통과됩니다. 로컬 검증 단계가 추가되어 업로드 직후 1~2초 지연이 생길 수 있으나, 그 대신 Gemini API 호출 비용은 무효 영상에서 절감됩니다.
  • 캐시 버전 v160→v161 — 배포 후 PWA 강제 업데이트 권장.
β 1.4.20 2026.04.21
PITCH · ARM-SLOT · CRITICAL
  • 오버핸드 투구가 언더핸드로 오분류되던 문제 수정 — 팔이 위에서 아래로 내리꽂히는 확연한 오버핸드 투구인데도 분석 결과가 "언더핸드" 로 뜨고, 그에 맞춰 정대현·김병현·야마다 히사시 같은 사이드암/잠수함 투수가 롤모델로 추천되던 치명적 오류였습니다. 원인은 detectArmSlot() 이 투구 전체 30~85% 구간을 스캔하는 과정에서 팔로스루(릴리스 이후 팔이 몸 반대쪽 무릎까지 크게 휘둘려 내려가는 구간) 프레임이 분석에 섞여 들어갔기 때문입니다. 오버핸드 투수의 팔로스루는 팔꿈치가 어깨보다 한참 아래로 떨어지므로, 여기서 손목 속도가 재상승해 릴리스 프레임이 팔로스루 후반으로 잘못 잡히면 keyElev 가 깊은 음수(-0.30 미만) → "언더핸드" 로 결론 나는 회로가 있었습니다.
  • 수정안 — 분석 구간을 "팔 스윙"에만 엄격히 한정 — (A) 릴리스 탐색 구간을 30~85% → 40~75% 로 축소해 팔로스루 대역(75~100%)을 원천 배제. (B) 팔꿈치 높이(elev) 수집 창을 "릴리스 전후의 팔 스윙 윈도우"로 락([release-12, release+2]). ★ 릴리스 이후는 최대 2 프레임까지만 허용 → 팔로스루 프레임이 통계를 오염할 수 없음. (C) 오버핸드 확정 임계치 peakElev 를 0.12 → 0.08 로 하향(창이 좁아 노이즈 없음). (D) 어깨 위 프레임 비율 20% 방식을 절대 3장 이상 방식으로 전환(짧은 스윙에서도 안정적으로 트리거). (E) 릴리스 값이 없고 피크가 양수면 오버핸드 고정(폴백 경로 보강).
  • 영향 — 오버핸드 투구 영상에서 언더핸드/사이드암 롤모델(정대현·김병현·야마다 히사시 등)이 추천되는 일이 사라집니다. 실제 사이드암/언더핸드 투구는 팔꿈치가 어깨 위로 올라가는 프레임이 거의 없으므로 기존처럼 올바르게 분류됩니다.
  • 캐시 버전 v159→v160 — 배포 후 PWA 강제 업데이트 권장.
β 1.4.19 2026.04.21
PDF · RENDER · CRITICAL
  • PDF 마지막 페이지에 HTML 코드/base64 데이터가 그대로 노출되던 문제 수정 — "코치 한마디" 섹션이 last.coachComment 의 인-앱 HTML 문자열(<span class="coach-good">, <b>, <img src="data:image/png;base64,..."> 등)을 그대로 splitTextToSize 에 넘겨 렌더하다 보니, 화면에서는 보이지 않던 태그/긴 base64 문자열이 PDF 본문에 통째로 출력되었습니다. 신규 헬퍼 stripHtmlForPDF() 를 도입해 이미지·태그·HTML 엔티티를 정리한 평문만 PDF 로 출력하도록 변경.
  • "프로선수 롤모델" 카드와 다음 섹션 줄겹침 수정 — 카드 높이 계산식 needH=6+5+reasonLines×4+strengthLines×4+6 이 카드 맨 아래 "유튜브 검색: ..." 라인의 baseline(+3) 과 폰트 descender·하단 패딩을 빠뜨려, 다음 섹션 헤더가 카드 위로 올라타며 가독성을 망가뜨리는 현상이 있었습니다. +12 로 보정하고 ensureSpace 도 여유분 +3 추가.
  • 본문 여백 정리 — "코치 한마디" 카드 내부 텍스트 시작 y 위치를 5→6 으로 내리고, 라인 폭을 W-M*2-10 으로 살짝 좁혀 좌측 골드 테두리(0.5pt) 와 글자 충돌 제거. 빈 코멘트일 경우 섹션 자체를 그리지 않도록 가드 추가.
  • 캐시 버전 v158→v159 — 배포 후 PWA 강제 업데이트 권장.
β 1.4.18 2026.04.21
LABEL · UX POLISH
  • 투구 분석 라벨 오타 수정 — 프로 비교 지표에서 보폭(%신장) · 어깨 MER 처럼 내부 유닛 표기/영문 약어가 사용자 화면에 그대로 노출되던 문제를 고쳤습니다. 각각 보폭, 어깨 외회전 으로 정리.
  • 영향 범위 — 오버핸드·사이드암·언더핸드 3종 투구 폼 모두 동일하게 적용. getProIdealAngles()label 필드 6곳 + getProCoachComment() 의 코멘트 테이블 key 2곳을 동시 수정해 분석 결과 카드와 코치 코멘트가 일치하도록 맞췄습니다.
  • 전체 스캔 결과 — app.html 에 있는 60+ 개 label: 필드를 전수 검사했고, 다른 영문 약어/내부 단위 표기는 확인되지 않았습니다.
  • 캐시 버전 v157→v158 — 배포 후 PWA 강제 업데이트 권장.
β 1.4.17 2026.04.21
TRAINING · PRIORITY · ALL MODES
  • 투구·수비 추천 훈련도 약점 중심으로 통일 — β 1.4.16 에서 타격(gBD) 에 적용한 약점 우선순위 알고리즘을 투구(gPD) · 내야땅볼(gFD) · 내야플라이(gFD_fly) · 포수(gCD) · 외야(gOD) 전 영역에 동일하게 이식. warmup 1 + 점수<75 인 phase 상위 3개(낮은 점수 우선) + 실전 기본 연습 1 + (평균<60 시 코어 1) 구조로 통일.
  • 수정 포인트별 상세 — (1) gPD: 6 phase(코킹·스트라이드·와인드업·가속·릴리스·팔로스루) 중 약점 상위 3개만, avg<85 무조건 심화 훈련 제거. (2) gFD: 5 phase(준비자세·어프로치·글러브·트랜지션·송구) 중 상위 3개. (3) gFD_fly: 5 phase + 베이스 실전 연습 1개만 유지, 선라이트 훈련 제거. (4) gCD: base drill 전체를 채워 넣던 fallback 제거 — 점수와 무관하게 8개 고정되던 문제 해결. (5) gOD: 인접 훈련 자동 push 로직 제거.
  • 결과 — 투구 최대 13종 → 6종, 수비 최대 8종 → 5종으로 압축. 모두 우수(avg≥75) 인 경우 최소 2~3개만 뜨도록 깔끔해짐.
  • 캐시 버전 v156→v157 — 배포 후 PWA 강제 업데이트 권장.
β 1.4.16 2026.04.21
TRAINING · PRIORITY
  • 타격 추천 훈련 폭주 해결 — gBD() 약점 중심 재설계 — 기존 로직은 phase 점수가 낮을수록 같은 phase 에 2~3개 훈련을 한꺼번에 밀어넣고, 평균<85 이면 심화 실전 훈련 4개를 무조건 추가해 최대 13개까지 추천 목록이 부풀어 올랐습니다. 비슷한 훈련이 중복 노출되어 "어디부터 손대야 할지" 혼란.
  • 수정안 — (1) warmup 1개 고정 + 가장 약한 phase 3개(점수<75)만 선정해 각 phase 당 난이도에 맞춘 훈련 1개씩. (2) 점수 낮은 phase 가 앞으로 오도록 정렬 → 우선순위가 한눈에 보임. (3) 티 배팅 1개 고정(가장 범용 실전). (4) 코어 강화는 평균<60 일 때만. (5) 기존 자동 심화 훈련 4종(연속 티·카운트 시뮬·워킹 스윙 등) 삭제.
  • 결과 — 추천 훈련이 최대 6개로 압축 (warmup 1 + 약점 3 + 티 배팅 1 + 코어 최대 1). 평균 ≥75 인 경우 최소 2개(warmup + 티 배팅)까지 깔끔해짐.
  • 캐시 버전 v155→v156 — 배포 후 PWA 강제 업데이트 권장.
β 1.4.15 2026.04.21
CRITICAL · DETECTION
  • 투구폼 오감지 근본 재수정 — detectArmSlot 3차 개편 — β 1.2.9 수정 이후에도 명백한 오버핸드 투구가 언더핸드로 오분류되던 사례가 재발. 원인은 릴리스 프레임 탐색 로직이 "손목-어깨 거리 최대" 방식이라 팔로스루에서 손이 몸통 반대편으로 크게 돌 때 팔로스루 프레임을 릴리스로 오판하고, 그 ±3 프레임 평균이 이미 팔꿈치가 내려온 구간 중심으로 잡히면서 음수 elev 가 나오는 것이었습니다.
  • 수정안 — (1) 릴리스 프레임 탐색을 "손목 속도 최대" 기준으로 전환 (생체역학적으로 공이 손을 떠나는 순간이 손목 속도 피크). (2) SAFETY NET: 투구 중 팔꿈치 피크 높이가 어깨보다 확실히 위 (0.12 × torso 이상) 또는 어깨 위 프레임이 전체 20% 이상이면 릴리스 계산과 무관하게 무조건 오버핸드로 고정. (3) 언더핸드 문턱을 -0.15 → -0.30으로 2배 엄격히 (팔꿈치가 몸통의 1/3 이상 아래로 내려갈 때만). (4) 탐색 구간 60~85%30~85%로 확장하여 코킹 피크 포착. (5) 애매한 경우 오버핸드 default 원칙 유지.
  • 캐시 버전 v154→v155 — 배포 후 PWA 강제 업데이트 권장.
β 1.4.14 2026.04.21
TRAINING · CLEANUP
  • 추천 훈련 목록 정리 — 분석 결과 화면의 추천 훈련 리스트에서 ① 가볍게 캐치볼 (교정 목적이 약한 일반 캐치볼), ② 슬라이드 스텝 훈련 (주자 견제) (유소년 투구 분석 범위와 어긋남), ③ 프로선수 롤모델 카드 (하단 프로선수 롤모델 섹션과 중복) 세 가지를 제거했습니다. 이제 훈련 카드는 실제 교정에 직결되는 단계별 훈련만 남습니다.
  • 타격 6-cap 로직 단순화 — 기존에는 롤모델 카드를 고정 마지막에 유지하기 위한 splice/re-push 처리가 들어가 있었는데, 롤모델이 리스트에서 빠지면서 단순 sort + _extra 플래그만 남겨 가독성을 개선했습니다.
  • 캐시 버전 v153→v154 — 배포 후 PWA 강제 업데이트 권장.
β 1.4.13 2026.04.21
PDF · REPORT
  • 분석 결과 PDF 저장이 이제 전체 내용을 담습니다 — 지금까지는 1페이지짜리 요약(피드백 4개 + 훈련 3개)만 저장되던 것을, 분석 화면에 표시되는 모든 코칭 피드백 · 모든 추천 훈련(기본 + 더보기 포함) · 프로선수 롤모델 · 코치 한마디 까지 자동으로 여러 페이지에 걸쳐 저장하도록 재작성했습니다.
  • 코칭 피드백 3단 구성 그대로 — 각 피드백 카드의 현상 → 원인 → 교정 라벨링을 PDF에도 그대로 기재하고, 앵글 측정 뱃지도 카드 우측에 표시됩니다.
  • 페이지 자동 분할 + 페이지 번호 — 내용이 한 페이지를 넘으면 새 페이지가 자동 생성되며, 하단에 페이지 번호가 찍힙니다. 공유·출력 시에도 잘림이 없도록 여백 계산을 개선했습니다.
  • 캐시 버전 v152→v153 — 배포 후 PWA 강제 업데이트 권장.
β 1.4.12 2026.04.21
TRAINING · UX
  • 추천 훈련 카드 기본 노출 6개로 축소 — 타격 분석 이후 추천 훈련 카드가 최대 9개까지 한 번에 노출되어 스크롤이 지나치게 길어지던 문제를 해결했습니다. 이제 핵심 6개 + 프로선수 롤모델 만 기본 노출되며, 약점 구간이 많아 기획된 훈련이 6개를 초과하면 하단에 + 훈련 더 보기 (N개) 버튼이 나타나 원하는 선수만 나머지 훈련을 펼쳐볼 수 있습니다.
  • 성장 기록 상세 화면에도 동일 적용 — 과거 분석 상세에서도 6개 + 더보기 버튼 방식으로 통일해, 긴 훈련 리스트를 빠르게 훑고 필요할 때만 펼쳐볼 수 있습니다.
  • 프로선수 롤모델은 항상 고정 노출 — 약점 참고용 롤모델 카드는 cap 로직과 무관하게 항상 마지막에 표시됩니다.
  • 캐시 버전 v151→v152 — 배포 후 PWA 강제 업데이트 권장.
β 1.4.11 2026.04.21
TRAINING · CONTENT
  • 타격 심화 훈련 6종 추가 — 기존 타격 훈련 모듈에 새로운 심화 훈련이 탑재되어, 약점 구간 점수가 낮은 선수에게 더 구체적인 페어 훈련이 제안됩니다: ① 바텀핸드 원핸드 스윙 (탑핸드 훈련과 한 쌍), ② 아웃사이드 반대 방향 타격 (인사이드 풀과 한 쌍), ③ 하이 티 훈련 · ④ 로우 티 훈련 (높은 공 · 낮은 공 대응 페어), ⑤ 힙 퍼스트 로드 훈련 (하체 선행 감각), ⑥ 워킹 스윙 훈련 (걸으며 스윙 — 체중 이동 연결).
  • 훈련 영상 맵 정리DRILL_VIDEO_MAP 에서 푸시 타이틀과 맵 키의 괄호 suffix 불일치로 영상이 연결되지 않던 5건(런지 워크, 스트라이드 연습, 스텝 훈련, 드라이 스윙, 하프 스쿼트 훈련)에 짧은 별칭 엔트리를 추가했습니다. 이제 훈련 카드에서 동영상이 정상적으로 나옵니다.
  • 파일 끝 재잘림 긴급 복구 — β 1.4.10 배포 과정에서 재발한 app.html 끝부분 truncation (DRILL_VIDEO_MAP 중간에서 잘림 → </script></body></html> 누락)을 bak_histdet 꼬리 splice 로 복구. 5개 스크립트 블록 node --check 통과 확인.
  • 캐시 버전 v150→v151 — 배포 후 PWA 강제 업데이트 권장.
β 1.4.10 2026.04.21
CRITICAL · DATA-SAFETY
  • init 크래시 긴급 핫픽스 — β 1.4.9 배포 이후 icoImg is not defined 참조 에러로 앱이 시작 단계에서 튕기는 현상 보고. applyIcons()를 try/catch로 격리하고, 하위 스크립트 블록이 파싱 실패해도 icoImg가 정의되지 않은 상태에서 호출되지 않도록 얼리 스텁을 삽입했습니다.
  • 파일 끝 잘림 복구 — 배포본 app.html 의 2번째 스크립트 블록이 잘려 있어 전체 스크립트 파싱이 실패하던 문제를 백업 splice로 복구했습니다. 이로 인해 일부 사용자가 경험한 "데이터 소실" 체감은 실제 데이터 삭제가 아니라 localStorage 에서 읽기 실패로 화면만 비어 보이던 증상이었음을 확인했습니다.
  • 캐시 버전 v149→v150.
β 1.4.9 2026.04.21
CRITICAL · RANKING · CLOUD
  • 랭킹보드 "내 것만 보이던 버그" 수정 — 타자왕/투수왕/수비왕 탭을 눌러도 자기 기록 1개만 뜨던 심각한 버그를 수정했습니다. 원인은 fetchLeaderboard()rankings.orderBy('score','desc').limit(50)전체 모드의 상위 50명만 받은 뒤 클라이언트에서 모드 필터를 적용하던 구조였습니다. 상위 50이 특정 모드(예: 분석왕) 에 편중되면, 다른 모드 탭에는 내 문서 말고 아무것도 남지 않았습니다. 이번 릴리즈에서 서버측 where('mode','==',X) 필터를 쓰도록 바꾸고, 복합 인덱스가 없으면 limit(300) 폴백으로 받아와 클라이언트에서 거르도록 이중 안전장치를 넣었습니다. 전체 모드 리밋도 50 → 200, 최종 슬라이스도 20 → 50 으로 상향했습니다.
  • ☁ 히스토리 클라우드 동기화 (users/{uid}/history) — 지금까지 분석 기록이 브라우저 localStorage 에만 있어, 기기를 바꾸거나 캐시를 지우면 데이터가 사라지는 구조적 위험이 있었습니다. 이번 릴리즈부터 모든 분석 기록이 Firestore users/{uid}/history/{date} 에 자동 저장됩니다. 분석 완료 시 자동 업로드, 앱 시작 시 자동 다운로드(기존 사용자만), 설정 → ☁ 클라우드 동기화 메뉴에서 수동으로 올리기/내려받기/양방향 동기화 가능.
  • 버전 백업 자동화checkVersionAndBackup()importData() 안에서만 호출되던 버그를 수정. 앱 시작 시 init() 에서 자동 호출되도록 바꿔, 업데이트만 받은 사용자도 이전 버전의 분석 기록이 자동으로 버전 백업 리스트에 남도록 보강했습니다.
  • 관리자 도구 — 📊 랭킹 진단 버튼 — 관리자 모드에서 rankings 컬렉션의 모드별 문서 수, 고유 UID 수, 점수 분포, 최근 등록 10건을 한눈에 확인. "실제로 다른 사용자 데이터가 있는지 / 내 필터 버그인지" 빠른 판별용.
  • ⚠ 보안 규칙 추가 필요users/{uid}/history/{docId} 에 대한 Firestore 규칙이 아직 없으면 동기화가 실패할 수 있습니다. FIRESTORE_AUTH_SETUP.md 에 추가된 규칙 블록을 Firebase Console → Rules 에 반영해주세요.
  • 캐시 버전 v148→v149 — 배포 후 PWA 강제 업데이트 권장.
β 1.4.8 2026.04.21
CRITICAL · PDF
  • PDF 리포트 한글 깨짐 수정 — 성장기록에서 [PDF] 버튼으로 내려받은 리포트에서 "아이코치", 선수 이름, "타격 분석", "능력치 분석" 등 모든 한글이 네모/물음표로 깨져서 출력되던 치명적 버그를 수정했습니다.
  • 원인 — jsPDF 라이브러리가 기본으로 쓰는 내장 폰트(Helvetica 등 Type 1 14종)는 WinAnsi 인코딩(Latin-1) 만 지원하며 한글 글리프 자체가 존재하지 않습니다. 한글 유니코드(U+AC00~U+D7A3)를 이 폰트로 그리라고 넘기면 테이블에 없는 코드포인트라 깨진 글자로 렌더됐습니다.
  • 해결Spoqa Han Sans Neo Regular/Bold TTF 2종을 앱의 ./fonts/ 폴더에 배치하고, PDF 버튼을 누른 순간 fetch → base64 인코딩 → doc.addFileToVFS() + doc.addFont() 로 jsPDF 에 주입하는 로직을 loadPDFKoreanFonts() 헬퍼로 구현했습니다. 첫 호출 이후에는 window.__pdfKoreanFonts 에 캐시되어 재호출 시 fetch 하지 않습니다.
  • Spoqa Han Sans Neo 선택 이유 — Noto Sans CJK 를 기반으로 제작된 오픈 라이선스(OFL) 한글 폰트로, Regular + Bold 둘 다 제공되어 섹션 타이틀/점수를 강조할 수 있고, KS X 1001 + 추가 한글 2,574자 를 500KB 미만으로 커버합니다. Noto Sans KR 의 공식 TTF는 단일 파일이 4MB 이상이라 PDF 임베딩용으로는 과도합니다.
  • 렌더링 품질 향상 — "아이코치" 로고, "능력치 분석"/"단계별 점수"/"코칭 피드백"/"추천 훈련" 섹션 타이틀, 종합 점수 숫자에 Bold 가중치가 적용되어 가독성이 확연히 개선됩니다.
  • 기타 정리 — 훈련 추천 리스트의 불릿 가 Spoqa 폰트에 없어 로 대체했습니다. 오프라인 PWA 도 정상 작동하도록 서비스워커 ASSETS_TO_CACHE 에 TTF 2종을 프리캐시 목록에 추가했습니다.
  • 캐시 버전 v147→v148 — 배포 후 PWA 강제 업데이트 또는 홈 화면에서 다시 설치 권장.
β 1.4.7 2026.04.21
UX · HISTORY
  • 성장기록 → 분석기록 상세화면 전면 개편 — 분석 직후 보던 모든 내용을 그대로 복원 — 기존에는 성장기록 탭에서 과거 분석을 눌렀을 때 점수·능력치·단계별 점수만 요약해서 보여줬습니다. 그래서 "이 분석에서 AI 가 뭐라고 피드백 줬는지", "어떤 훈련을 추천했는지", "코치 코멘트는 뭐였는지" 가 전혀 보이지 않아, 사용자가 다시 확인하려면 또 분석을 돌려야 하는 불편이 있었습니다. 이번 릴리즈에서는 분석 직후에 보이는 전체 결과 화면과 동일한 내용이 상세화면에 그대로 나타나도록 바꿨습니다. 점수·능력치·단계별 점수에 더해 AI 피드백(이유/개선 방법 토글 포함), 추천 훈련 훈련 카드, 암슬롯 정보(투구), 코치 코멘트 까지 전부 확인 가능합니다.
  • 신규 분석은 풀 데이터 저장 — 분석 완료 시점에 feedback, drills, armSlot, coachComment, fieldingTypeicoach_history localStorage 에 함께 저장하도록 addHistory() 호출부 두 곳을 모두 보강했습니다. 앞으로 기록되는 모든 분석은 상세화면에서 원본 전체를 바로 복원합니다.
  • 레거시 기록도 자동 복원 — β 1.4.7 이전에 저장된 기존 분석 기록들은 feedback/drills 가 비어 있지만, 저장된 phases(단계별 점수) 와 mode/fieldingType 을 기반으로 gPD·gBD·gFD·gFD_fly·gCD·gOD 훈련 생성 함수를 재호출해 추천 훈련 카드를 실시간 재구성합니다. 피드백이 완전히 없는 초기 기록에는 "이 분석은 피드백/훈련 추천이 저장되기 전 기록입니다" 안내가 표시됩니다.
  • 훈련 카드 서브라인 방어적 폴백d.tag/d.cat 이 비어 있는 훈련(특히 gFD_fly() 팝플라이 훈련 7종) 에서 "undefined · 훈련" 으로 표시되던 현상이 있었습니다. catcategory 순서로 조회하고, 없을 때는 {warmup:'쉬움', form:'기본', strength:'보통', practice:'실전', advanced:'심화'} 매핑으로 자동 폴백되도록 렌더러를 보강했습니다.
  • 캐시 버전 v146→v147 — 배포 후 PWA 강제 업데이트 또는 홈 화면에서 다시 설치 권장.
β 1.4.6 2026.04.20
ACCURACY · UX
  • 경기 분석에 "우리 아이 식별 정보" 입력 추가 — 기존에는 Gemini 가 프레임과 상황 설명 텍스트만으로 타겟 선수를 추정해야 해서, 여러 야수가 한 프레임에 같이 찍히는 수비 영상에서 엉뚱한 선수를 분석할 위험이 있었습니다. 이번 릴리즈에서 각 역할(투구/타격/수비)별 영상 업로드 카드 아래에 등번호 · 유니폼 상의 색 · 포지션 세 칸을 추가했고, 입력값은 AI 프롬프트에 [타겟 선수 식별 정보] 블록으로 자동 삽입됩니다.
  • AI 프롬프트 규칙 강화 — "위 정보와 일치하는 선수만 분석 대상으로 삼고, 다른 선수의 동작은 참고용으로만 사용할 것. 일치하는 선수를 특정할 수 없으면 observations 첫 항목에 식별 실패를 명시하고 score=0" 지침이 함께 전달됩니다. 수비처럼 타겟 구분이 어려운 장면에서 오분석 위험이 크게 줄어듭니다.
  • 역할별 안내 문구 차등화 — 투구/타격 카드에는 "한 명만 주인공이라 선택 입력이지만 채우면 정확도↑", 수비 카드에는 "필수에 가깝습니다" 경고 문구를 자동 표시합니다.
  • 상황 설명 가이드 카피 보강 — "좋은 분석 결과를 받으려면?" 접힘 카드의 상황 설명 팁에 "여러 선수가 함께 찍힌 수비 영상은 식별 정보도 꼭 채워주세요" 안내를 추가했습니다.
  • 캐시 버전 v144→v145 — 배포 후 PWA 강제 업데이트 또는 홈 화면에서 다시 설치 권장.
β 1.4.4 2026.04.20
UX · 안내
  • 경기 분석 화면 상단에 API 키 상태 배너 추가 — "AI 경기 분석"은 유일하게 Gemini API 키가 반드시 필요한 기능입니다. 이전까지는 영상과 상황 설명을 다 입력한 뒤 [분석 시작] 버튼을 누른 순간에야 "키 필요" 토스트로 차단돼 헛수고가 많았습니다. 이제 경기 분석 화면에 들어오자마자 상단에 빨간 배너로 "API 키가 필요해요 · 설정에서 무료 등록 →" 가 표시되고, 바로 설정 화면의 키 입력란으로 포커스가 이동합니다.
  • 키가 등록되어 있으면 "AI 경기 분석 준비 완료" 녹색 배지로 전환 — 언제든 "변경" 버튼으로 키를 수정할 수 있습니다. 설정에서 키를 저장/삭제하는 즉시 배너도 자동 갱신됩니다.
  • 키 없을 때 "AI 경기 분석이란?" 가이드 기본 펼침 — 키 등록이 필요한 이유와 흐름을 바로 보여드립니다. 키가 있는 사용자는 기존처럼 접힌 상태로 유지돼 공간을 차지하지 않습니다.
  • 투구·타격·수비 폼 분석은 API 키 없이도 그대로 사용 가능 — 온디바이스(MediaPipe) 로 기기 안에서만 처리되므로 영상이 서버로 나가지 않습니다. 훈련 훈련 영상 인증도 키가 없으면 "자동 검증만 생략" 하고 분석·적립은 정상 진행됩니다.
  • 캐시 버전 v143→v144 — 배포 후 PWA 강제 업데이트 또는 홈 화면에서 다시 설치 권장.
β 1.4.3 2026.04.20
CRITICAL · HOTFIX
  • ⚠️ 치명적 버그 수정: app.html 파일 끝부분 잘림 복구 — 이전 배포본(β 1.4.0~1.4.2)의 app.html 이 파일 끝(약 8.72MB, 11,907줄)에서 UTF-8 문자 중간에 잘린 채로 올라가 있었습니다. 이 때문에 거대한 인라인 스크립트 블록의 </script> 닫힘 태그와 </body></html> 이 전부 사라져, DRILL_YOUTUBE 정의 이후 openDrillGuide/closeDrillGuide 같은 보조 함수가 실행되지 못했습니다. 그 결과 홈 탭의 총 분석 수·점수, 전국 랭킹 리스트, 성장기록 화면이 모두 빈 상태로 나타나던 것입니다. 이번 릴리즈에서 최종 완전본 백업(app_20260419_060149_pre_analyst_img.html)의 꼬리 블록을 이어 붙여 파일을 복구했고, JS 구문 검사(node --check)도 통과했습니다.
  • 훈련 탭 "투수/타격/수비 코치에게 질문" 버튼 아이콘 깨짐 수정 — 거대한 인라인 스크립트가 파싱되는 동안 DOMContentLoaded 이벤트가 이미 발생해, 아이콘을 채워주는 initializeIcons() 의 리스너가 한 박자 늦게 등록되면서 한 번도 실행되지 않던 문제가 원인이었습니다. 이제 스크립트 끝에서 document.readyState 를 확인해 이미 DOM 이 준비되어 있으면 즉시 initializeIcons() 를 실행하도록 보강했습니다.
  • 함께 개선된 아이콘 영역 — 촬영 가이드 4칸(각도/거리/환경/길이), 영상 업로드 아이콘, 분석 결과의 "능력치/단계별 점수", 추천 훈련, 안전 안내, 랭킹 뱃지 등 ID 기반으로 로드되던 모든 아이콘도 동일한 타이밍 이슈의 영향을 받고 있었는데 이번 패치로 함께 안정화됩니다.
  • 캐시 버전 v142→v143 — 배포 후 PWA 강제 업데이트(F12 → Application → Service Workers → Update) 또는 홈 화면에서 다시 설치 권장.
β 1.4.2 2026.04.20
POLISH · UI
  • 설정 화면 기본 이모지 아이콘 5종을 전용 아이콘 PNG로 교체 — "버그 제보 & 기능 제안", "법적 정보", "지원·문의", "문의하기(구글 폼)", "이메일로 문의" 항목의 📄💬📮✉️ 이모지를 나노바나나로 생성한 128×128 네이비·골드 톤 아이콘으로 대체했습니다. OS별 이모지 편차가 사라져 브랜드 톤이 일관됩니다.
  • 서비스 워커 프리캐시 목록 확장 — 신규 아이콘 5종(icon_bug_report / legal / support / form / email)을 ASSETS_TO_CACHE 에 추가해 오프라인에서도 깨지지 않도록 했습니다.
  • 캐시 버전 v141→v142
β 1.4.1 2026.04.20
FIX
  • 추천 훈련 카드 줄바꿈 교정 — 챗 버블 안 "추천 훈련" 리스트에서 제목(예: "기본스윙연습")과 설명이 같은 줄에 붙어 흘러 가독성이 떨어지던 문제를 고쳤습니다. drill-suggest-item 레이아웃을 flex + 스택 제목/설명 구조로 바꾸고 word-break:keep-all을 적용해 한글 단어가 어색하게 잘리지 않도록 했습니다.
  • 캐시 버전 v140→v141
β 1.4.0 2026.04.20
SECURITY · EVENT
  • 계정 보호 시스템 도입 — 5월 오픈베타 이벤트 공정성 확보 — 같은 선수인데 아빠/아들 폰에서 각각 가입되어 중복 계정이 생기거나, 이름만 알면 남의 계정으로 기록을 등록할 수 있던 구조적 취약점을 해소했습니다.
  • 이름 + 생년월일 + 4자리 PIN — 신규 가입 시 생년월일(YYYY-MM-DD)과 4자리 PIN을 등록합니다. PIN은 SHA-256 + 생년월일 salt 로 해싱되어 Firestore 에는 평문이 저장되지 않습니다. 3회 실패 시 24시간 잠금으로 무차별 시도를 차단합니다.
  • 가족 폰 자동 연결 — 다른 폰에서 같은 이름·생년월일 입력 시 "이미 가입된 계정이에요" 안내 후 PIN 확인만으로 기존 계정에 연결됩니다. 아빠·엄마·본인 폰이 하나의 icoach_uid 를 공유합니다.
  • 소속 분리 — 학교 / 야구클럽팀 — 기존 단일 "소속" 필드를 학교 + 야구클럽팀 두 필드로 분리하고, Firestore 에 이미 등록된 값을 모아 <datalist> 자동완성을 제공합니다. "군베이스볼" / "군 베이스볼" / "군BB" 같은 표기 차이로 인한 오인식이 크게 줄었습니다.
  • 기존 사용자 강제 마이그레이션 — β 1.4.0 첫 실행 시 기존 사용자에게 1회성 모달이 뜨고 생년월일 + PIN 을 등록해야 앱 사용이 가능합니다. 기존 icoach_uid 는 그대로 유지되어 분석 히스토리·랭킹 기록은 보존됩니다.
  • 계정 보호 없이는 랭킹 등록 불가autoSubmitRanking()birth + pinHash 존재 여부를 선검사하고, 미보호 계정은 즉시 마이그레이션 모달로 안내합니다.
  • Firestore 보안규칙 추가 (accounts 컬렉션) — 문서 ID = uid, pinHash 변경 금지, 이름/생년월일 변경 금지, 삭제 금지. 자세한 내용은 프로젝트 루트의 FIRESTORE_AUTH_SETUP.md 참조.
  • 캐시 버전 v136→v140
β 1.3.2 2026.04.19
SUPPORT · OPS
  • 파일럿 운영 Phase 2 완료 — 지원·배포 인프라 정비 — 단톡방 100명 파일럿을 본격 돌릴 수 있도록 문의 창구·긴급 롤백·홍보 자료를 한 번에 정비했습니다.
  • 설정 → 💬 지원·문의 카드 신설 — "문의하기(구글 폼)" + "이메일로 문의" 버튼 추가. 버전·UID가 자동으로 prefill 되어 제보 처리가 빨라집니다.
  • 긴급 점검 모드 (Kill-switch) — Firestore config/maintenance 문서를 관리자가 켜면, 앱 진입 시 즉시 점검 안내 모달이 뜨고 필요 시 전면 차단도 가능합니다. 클라이언트 재배포 없이 실시간 대응이 가능해졌습니다.
  • 파일럿 FAQ 1페이지 + 단톡방 홍보 문구 2종 + QR — 학부모 배포용 외부 자료 일괄 준비 (FAQ_파일럿.md, 홍보문구_단톡방.md, QR_icoach_ai_kr.png).
  • 동의 마이그레이션 모달 CSS 클래스 불일치 후속 정리 — β 1.3.1 hotfix(.active → .show) 상시화 및 모달 문구 버전 표기 보정.
β 1.3.1 2026.04.19
LEGAL · OPS
  • 출시 전 블로커 해소 — 100명 파일럿 준비 — 군베이스볼 학부모 단톡방 비공식 파일럿 출시를 위한 법적·운영 요건을 일괄 반영했습니다.
  • 개인정보 처리방침 / 이용약관 고지 — 앱 하단 법적 정보 카드 + 최초 가입 시 체크박스 3개(약관·방침·법정대리인 동의). 기존 사용자에게는 접속 시 마이그레이션 모달을 1회 표시합니다.
  • 닉네임 금칙어 필터 + 관리자 차단 — 한글 우회(ㅅㅂ, ㅂㅅ 등) 대응 정규화 + 50개 이상 금칙어. 관리자 도구에 "닉네임 관리" 탭 추가 — 부적절한 닉네임 삭제 + UID 블랙리스트로 재가입 차단.
  • Firestore 한도 방어 — 랭킹 쿼리 limit(100)→limit(50), 새로고침 버튼 추가 + 5초 쿨다운, 30초 메모리 캐시로 중복 호출 차단. 예상 DAU 30명 기준 Spark 무료 한도의 15% 내에서 운영.
  • 영상 기기 저장 검증 완료 — 코드 grep으로 Firebase Storage SDK 미사용 확정. Gemini Vision에는 정지 이미지(JPEG 프레임) 최대 20장만 전송되며 영상 원본은 기기 밖으로 나가지 않습니다.
β 1.3.0 2026.04.19
FEAT
  • 랭킹 공식 전면 개편 — 점수 "지키기" 방지 — 타자왕·투수왕·수비왕의 점수를 최고점에서 "최근 7회 중 상위 5회 평균"으로 교체했습니다. 기존 시스템은 한 번 좋은 기록이 나오면 점수 하락이 두려워 분석을 기피하게 만드는 구조였습니다. 새 공식은 부진한 2회까지 "용서"하되 최근 폼에 민감하게 반응합니다.
  • 랭킹 진입 기준 상향 — 최소 분석 횟수 3회 → 5회, 20점 이상 유효 분석 2회 → 3회. 상위 5회 평균을 산출하기 위한 표본 요건입니다.
  • 분석왕 공식 — 최근 활동 가중 — 누적 분석 횟수만 세던 방식에서 총 분석 × 0.5 + 최근 30일 분석 × 2.0 으로 변경. "과거 한 달에 수십 회 찍고 방치" 보다 "꾸준히 분석하는 선수"가 우대됩니다.
  • 훈련왕 공식 — 최근3 vs 최초3 상승폭 — 그동안 임시로 score desc 였던 훈련왕 기준을 실제 "최근 3회 평균 − 최초 3회 평균"의 성장 곡선으로 바꿨습니다 (표본 6회 이상 필요).
  • 오픈베타 이벤트(5/1~5/31) 참여 패널티 레이어 — 점수 "지키기"를 원천 차단. 이벤트 기간 동안
    · 해당 모드 주간 미분석 1주당 −3점
    · 일일 훈련 미완료 1일당 −1점
    이 기본 점수에서 차감됩니다. 평상시 상시 랭킹에는 적용되지 않습니다.
  • 랭킹 탭 UI — 자동 등록 카드에 이벤트 패널티 배지(주간 미참여 × 일일 미완료)와 "이벤트 점수 = 기본 − 패널티" 라인을 추가. 리더보드도 이벤트 기간엔 eventNetScore 기준으로 재정렬됩니다.
  • Firestore 스키마 확장recent30Count · improvementDelta · eventWeeklyMisses · eventDailyMisses · eventPenalty · eventNetScore · scoreFormula 필드 추가. 구버전 문서는 하위 호환(분석왕은 0.5× 대체, 훈련왕은 자연 배제).
  • 캐시 버전 v132→v133
β 1.2.9 2026.04.19
FIX
  • 투구폼 오감지 버그 수정 — detectArmSlot 재작성 — 명확한 오버핸드 투구가 "사이드암"으로 잘못 분류되던 문제를 해결. 기존 알고리즘은 (a) 50~85% 구간 전체를 평균내어 코킹 단계의 음수 각도와 릴리스 단계의 양수 각도가 상쇄되어 중간값이 나오고, (b) Math.abs()로 앞뒤 방향 정보가 소실되며, (c) 우완 투수만 처리하여 좌완은 오분류되는 구조적 결함이 있었습니다.
  • 단일 릴리스 프레임 + 상완 높이 비율 — 탐색 구간을 60%~88%(팔로스루 배제)로 좁히고, 던지는 팔 손목이 어깨에서 가장 먼 릴리스 프레임을 찾아 ±3 프레임 평균으로 (어깨-팔꿈치)/몸통길이 비율을 계산합니다. 양수(어깨 위)는 오버핸드, 0 근처(어깨 레벨)는 사이드암, 음수(어깨 아래)는 언더핸드.
  • 좌투수 자동 판별 — 좌·우 손목의 x 이동 범위를 비교해 던지는 팔 자동 감지. 좌완 투수도 같은 알고리즘으로 정확히 분류됩니다.
  • 단위 테스트 4/4 통과 — 우투 오버핸드·사이드암·언더핸드 + 좌투 오버핸드 시나리오를 mock 랜드마크로 검증.
  • 캐시 버전 v131→v132
β 1.2.8 2026.04.19
FEAT
  • 보너스 훈련 카드 기능 강화 — "새 분석 기반 보너스 훈련" 카드가 체크박스만 있던 문제를 해결. 이제 일반 훈련 카드와 동일하게 시범 영상 버튼훈련방법 모달을 제공해 "목적 · 방법 · 횟수 · 주의점" 전체 가이드를 바로 볼 수 있습니다.
  • showDrillGuide 리팩터링source 인자('bonus' | 기본) 추가. 보너스 훈련은 window.__bonusDrills 캐시를 참조해 오늘의 훈련 목록과 인덱스 충돌 없이 독립적으로 동작합니다.
  • 보너스의 "가벼움" 유지 — 레벨 배지·즐겨찾기·인증영상·타이머는 의도적으로 제외. 정규 훈련 완료 후 이라는 보너스 맥락은 그대로입니다.
  • 캐시 버전 v130→v131
β 1.2.7 2026.04.19
FEAT
  • 랭킹 진입 최소 기준 도입 — 1~2회만 분석하고 떠나는 사용자가 상위 랭킹을 왜곡하는 문제를 해결했습니다. 이제 3회 이상 분석 + 그 중 20점 이상 분석이 2회 이상인 사용자만 공식 랭킹에 표시됩니다.
  • "랭킹 도전 중" 섹션 신설 — 기준 미달 사용자는 별도 섹션에 점수·분석 횟수·남은 횟수 와 함께 노출되어, 완전히 숨겨지지 않고 진행 상황을 볼 수 있습니다.
  • 내 랭킹 진입 진행 UI — 자동 등록 카드에 ●●○ 진행 도트와 "랭킹까지 N회 더!" 안내 문구를 추가했습니다. 재방문 동기부여를 위한 UX.
  • 저장 데이터 확장 — Firestore 문서에 validAnalysisCount 필드 추가 (20점 이상 분석 수). 기존 데이터는 analysisCount 로 대체 계산하여 하위 호환성 유지.
  • 캐시 버전 v129→v130
β 1.2.6 2026.04.19
FIX
  • PC 관리자 모드 입력 시 화면 멈춤 최종 해결 — β 1.2.5의 SW 패치로도 남아 있던 PC 고유 freeze 를 해결했습니다. 크롬 비밀번호 매니저 / 1Password / LastPass / Bitwarden 등의 확장프로그램이 <input type=password> 를 가로채 Enter 시점에 페이지를 멈추게 하던 것을 차단 속성(autocomplete=off · data-lpignore · data-1p-ignore · data-bwignore)으로 막고, DOM 토글을 requestAnimationFrame 으로 비동기화했습니다.
  • 관리자 모드 콘솔·URL 백도어 — UI 로 못 들어갈 때 쓰는 보조 경로를 추가했습니다.
    • 콘솔: Google 관리자 로그인(β1.7.4) / adminOff()
    • URL: 관리자 로그인 버튼 를 주소 끝에 붙이면 자동 진입
  • 진단 로그unlockAdmin() 진행 단계마다 [admin] unlock 타임 마커가 콘솔에 찍혀 혹시 또 멈추더라도 정확한 freeze 지점을 식별할 수 있습니다.
  • 캐시 버전 v128→v129
β 1.2.5 2026.04.19
FIX
  • 랭킹 크로스 디바이스 동기화 복구 — PC에서 만든 계정이 모바일 랭킹에 안 뜨던 문제 해결. Firestore 보안 규칙의 uid == docId 검사가 실제 문서ID 스키마(uid + '_' + mode)와 일치하지 않아 모든 쓰기가 Missing or insufficient permissions 로 거부되던 것을 수정했습니다.
  • 수비 모드 랭킹 저장 가능 — 규칙에 'defense' mode 허용값을 추가. 이전에는 수비 분석 결과가 Firestore에 전혀 저장되지 않았습니다.
  • 관리자 모드 — 일일 분석 제한 해제 — 랭킹 탭 하단 "관리자 도구"에서 비밀번호 입력 시 일일 1회 제한이 풀려 테스트·QA 용으로 여러 번 분석이 가능합니다. 새로고침해도 유지되며, "모드 해제" 버튼으로 끌 수 있습니다. 분석 화면 상단에 🔓 배지로 현재 상태가 표시됩니다.
  • 점수 타입 완화 — Firestore 규칙 score is intis number (소수점 평균 점수 허용)
  • [PATCH] Service Worker 프리즈 버그 수정 — PC에서 관리자 모드 진입 시 화면이 멈추던 현상 해결. Chrome 확장프로그램이 보내는 chrome-extension:// 스킴 요청을 SW가 캐시하려다 TypeError 가 폭주해 메인 스레드를 막던 것을 차단했습니다.
  • 캐시 버전 v126→v128
β 1.2.4 2026.04.19
UPDATE
  • 프로 선수 비교 — 숫자 대신 한글 코치 코멘트 — 기존에는 "팔꿈치 131/95 (+36)" 같은 숫자를 보여줬는데, 부모나 아이가 숫자만 보고 판단하기 어려워 "릴리스 때 팔이 너무 펴져 있어요. 살짝 더 굽혀서 채찍처럼 가속해보세요." 처럼 코치가 말해주는 한 줄 피드백 으로 바꿨습니다. 분석 로직(몸통 기울기 포함)은 그대로 유지됩니다.
  • 상태 아이콘 — 각 항목 옆에 ✓(범위 안) · !(교정 필요) 아이콘과 색(초록/금/빨강)으로 한눈에 상태를 파악할 수 있습니다.
  • 투구·타격 11개 지표 코멘트 세트 내장 — 팔꿈치, 앞·뒷무릎, 보폭, 몸통 틸트, 분리각, 어깨 MER, 힙턴, 헤드스테이, 배트 앵글, 웨이트 시프트 모두 상황별(too-high / too-low / good) 3단계 코멘트를 준비했습니다.
  • 캐시 버전 v125→v126
β 1.2.3 2026.04.19
FIX
  • 프로 고스트·궤적·관절 표시가 영상에 안 보이던 문제 수정 — 두 가지 원인이 겹쳐 있었습니다. ① 재생 중 오버레이 갱신이 ontimeupdate(약 4회/초)에만 의존해 프레임 간 공백이 생겼고, ② 와이드샷·모션블러로 특정 프레임에서 MediaPipe 검출이 실패하면 해당 프레임이 통째로 비어 있었습니다.
    수정: requestAnimationFrame 기반 상시 렌더 루프(재생 중 60회/초) + 가까운 유효 프레임(±30) 으로 자동 폴백.
  • 모드별 목표각 분기 — 프로 고스트 교정 각도를 종목에 맞게 차별화. 투구: 팔꿈치 95° · 무릎 135°, 타격: 100° · 135°, 수비: 110° · 120°.
  • 캐시 버전 v124→v125
β 1.2.2 2026.04.19
UPDATE
  • 프로 고스트 — 이상적 자세 오버레이 실구현 — 기존에는 체크박스만 있고 실제로는 동작하지 않던 "프로 고스트" 를 각도 교정 방식으로 구현했습니다. 사용자 어깨·엉덩이·팔꿈치·무릎의 위치와 뼈 길이는 그대로 유지한 상태에서, 팔꿈치 각도 95° · 무릎 각도 135°(프로 범위 중앙값) 로 교정된 손목·발목 위치를 초록 점선으로 겹쳐 표시합니다. "내 지금 자세에서 손목·발목이 여기 있어야 했어" 가 한눈에 보이도록 설계했습니다.
  • 범례 표시 — 고스트가 켜지면 캔버스 좌상단에 "프로 고스트 — 이상적 자세" 라벨이 함께 표시돼 아이들도 뭘 보는지 바로 이해합니다.
  • 캐시 버전 v123→v124
β 1.2.1 2026.04.19
UPDATE
  • 수비 분석 — 다중 인물 추적(수비수 자동 선택) — 코치가 펑고를 쳐주고 이용자가 수비하는 상황에서 코치가 아닌 수비수(공을 받는 사람)를 자동으로 추적하도록 개선했습니다. 수비 모드에서는 카메라에서 더 먼 쪽(= 작은 바운딩박스)을 수비수로 선택하고, 프레임 간에는 이전 인물과의 중심점 거리로 동일 인물을 추적합니다.
  • "다른 사람 선택" 수동 override — 자동 선택이 틀렸을 때 결과 화면의 👥 다른 사람 선택 버튼으로 원하는 인물을 직접 지정할 수 있습니다. (수비 모드 + 2명 이상 감지된 경우에만 노출)
  • 궤적 / 프로 고스트 재생중 표시 버그 수정 — 재생·스크럽 중에는 궤적/프로고스트 체크박스를 켜도 캔버스에 그려지지 않던 문제를 수정했습니다. drawSkel 렌더 경로를 단일화해서 정지·재생·토글 어디에서든 동일하게 표시됩니다.
  • 캐시 버전 v122→v123
β 1.2 2026.04.19
UPDATE
  • 세로 영상(9:16) 완벽 지원 — 스마트폰 세로 촬영 영상도 비율을 유지한 채 분석합니다. 기존에는 512×384 고정으로 인해 세로 영상이 가로로 찌그러지던 문제를 해결했습니다.
  • 영상 처리 무한 대기 방지 — 프레임 추출 단계에서 5초 타임아웃을 적용해 손상·호환성 영상에서 진행률 바가 멈추는 현상을 방지합니다.
  • 연습 vs 경기 능력치 일관성 강화 — AI 경기 분석의 능력치 평가 기준을 연습 분석과 동일한 6개 항목(힘/속도/정확도/밸런스/유연성/폼완성도)으로 통일해 시계열 비교 정확도를 향상시켰습니다.
  • 캐시 버전 v115→v116
β 1.1.1 2026.04.19
FIX
  • AI 경기 분석 품질 개선 — Gemini AI에 전달하는 핵심 장면을 4장 → 8장으로 확대해 분석 정확도를 높였습니다.
  • 영상 처리 안정성 강화 — 손상·미지원 형식 영상 업로드 시 불필요한 AI 호출을 차단하고 명확한 안내 메시지를 표시하도록 수정했습니다.
  • PWA 설치 안내 정리 — 매니페스트에서 누락된 스크린샷 참조를 제거해 앱 설치 프롬프트 경고를 해결했습니다.
  • 캐시 버전 v114→v115
β 1.1 2026.04.19
NEW
  • 심화 훈련 21종 신규 탑재 — 투구 심화 8종(PA1~PA5, PA8, PA9, PA11) · 타격 심화 13종(BA1~BA12, BA14)을 훈련 시스템에 추가했습니다. (미완성 7종: PA6/PA7/PA10/PA12/PA13/PA14/BA13 — 추후 업데이트)
  • 점수 55점 미만 심화 티어 신설 — 기본(85점 미만) / 추가(70점 미만) 2단계였던 훈련 추천 로직에 심화(55점 미만) 단계를 추가했습니다. 폼 점수가 매우 낮을 때 더 세밀하고 교정 강도 높은 훈련이 자동 처방됩니다.
  • 심화 실전 훈련 블록 추가 — 투구·타격 평균 점수가 85점 미만일 때 프로선수 롤모델 섹션 직전에 "심화 실전" 훈련 블록이 노출되어 실전 감각과 교정을 동시에 연결합니다.
  • 캐시 버전 v113→v114 — 새 훈련 영상 21개가 즉시 반영되도록 서비스워커 캐시를 갱신했습니다.
β 1.0 2026.04.16
NEW
  • 56개 훈련 훈련 시범 영상 탑재 — 투구(P1~P11), 타격(B1~B10), 포수(C1~C8), 외야(OF1~OF8), 내야(IF1~IF10) 전 포지션 훈련 영상을 앱 내에서 바로 재생할 수 있습니다.
  • 로컬 영상 플레이어 도입 — 기존 YouTube 검색 연결 방식을 제거하고, 전용 비디오 플레이어로 훈련 시범 영상을 앱 안에서 직접 시청합니다.
  • TTS 음성 발음 개선 — 훈련 영상 내 "글러브" 발음 오류(글러드)를 수정하여 자연스러운 음성 안내를 제공합니다.
  • 투구·타격 심화 훈련 28종 프롬프트 제작 — PA1~PA14(투구 심화), BA1~BA14(타격 심화) 추가 훈련 영상 생성용 프롬프트를 완성했습니다.
β 0.9.5 2026.04.12
NEW
  • AI 경기 분석 시스템 전면 개편 — 기존 밝기 감지 방식을 제거하고, Gemini Vision AI 기반 영상 분석으로 교체했습니다. 영상 클립 + 상황 설명을 입력하면 AI가 직접 동작을 분석합니다.
  • 음성 입력 지원 — 상황 설명 입력 시 마이크 버튼을 눌러 음성으로 입력할 수 있습니다. (Web Speech API)
  • AI 경기 분석 가이드 추가 — 경기 등록 화면에 "AI 경기 분석이란?" 가이드와 영상 업로드 화면에 "좋은 분석 결과를 받으려면?" 팁 카드를 추가했습니다.
  • 경기 화면 아이콘 전면 교체 — 경기 분석 관련 모든 화면의 기본 이모지를 생성 아이콘 이미지로 교체하여 앱 전체 디자인 통일성을 높였습니다.
β 0.9.4 2026.04.12
NEW
  • 다크 배경 캐릭터 이미지 적용 — 투구·타격·수비·경기 분석 카드와 아이콘에 프리미엄 다크 배경 캐릭터 이미지가 적용되었습니다.
  • 56명 레전드 프로 선수 초상화 — 롤모델 카드에 선수별 카툰 초상화가 표시됩니다. (오타니 쇼헤이, 류현진, 추신수 등)
  • 훈련 훈련 코치 아이콘 개선 — 훈련 카드 아이콘이 현재 분석 모드(투구/타격/수비)에 맞는 코치 이미지로 표시됩니다.
  • 레벨 프로필 이미지 업데이트 — 레벨별 프로필 아이콘이 새로운 캐릭터 이미지로 교체되었습니다.
β 0.9.3 2026.04.09
NEW
  • 훈련방법 가이드 팝업 — 각 훈련의 훈련방법 버튼을 누르면 목적, 방법(단계별), 횟수, 주의사항을 팝업으로 확인할 수 있습니다.
β 0.9.2 2026.04.09
NEW
  • 아이코치 브랜드 로고 적용 — 앱 헤더, 랜딩페이지, 홈화면 아이콘에 새로운 아이코치 로고가 적용되었습니다.
  • 관리자 도구 접근성 개선 — 랭킹 탭에서 또래비교 전환 시에도 관리자 다운로드 버튼이 표시됩니다.
  • 업데이트 노트 아이콘 수정 — 업데이트 노트 및 결과 공유 팝업의 아이콘이 정상 표시됩니다.
β 0.9.1 2026.04.06
NEW
  • 훈련 영상 자세 분석 — 인증 영상을 올리면 MediaPipe로 자세를 분석하고, 훈련별 체크포인트를 기준으로 피드백을 제공합니다.
  • 훈련 시범 영상 — 각 훈련 훈련 옆 ▶️ 버튼으로 AI 코치의 시범 영상을 바로 볼 수 있습니다.
  • 코치 조언 팝업 — 분석 결과를 좋음/보통/조정필요로 등급화하고, 훈련별 맞춤 코칭 조언과 교정 포인트를 안내합니다.
  • 분석 결과 기록 — 영상 분석 결과(등급, 체크 통과 수)가 훈련 기록에 저장되어 훈련 목록에 표시됩니다.
β 0.9 2026.04.06
NEW
  • 실전 경기 분석 — 대회나 연습경기 영상을 올리면 투구/타격/수비별로 분석합니다.
  • 연습 vs 실전 비교 — 평소 연습 점수와 실전 경기 점수를 능력치별로 나란히 비교해볼 수 있습니다.
  • 종합 경기 리포트 — 평균 점수, 일관성 등급, 코칭 가이드, 아빠 대화 가이드를 한눈에 확인합니다.
  • 시즌 기록 관리 — 모든 경기 기록이 저장되어 시즌 평균, 최고 점수, 성장 추세를 추적합니다.
β 0.8 2026.04.06
NEW
  • 훈련 3단계 성장 시스템 — 초급→중급→고급으로 훈련이 자동 승급되어 아이의 실력에 맞게 훈련 난이도가 올라갑니다.
  • 매일 다른 훈련 조합 — 같은 분석 결과라도 날마다 다른 훈련 조합이 나와 지루하지 않게 훈련할 수 있습니다.
  • 훈련 즐겨찾기 — 자주 하고 싶은 훈련에 별표를 눌러두면 다음 날 우선 추천됩니다.
  • 타이머 인증 — 워밍업과 체력 훈련은 영상 대신 타이머로 간편하게 인증할 수 있습니다.
  • 훈련 영상 AI 코칭 — 폼 교정 훈련 영상을 올리면 관절 각도를 분석해서 간단한 코칭 피드백을 줍니다.
  • 영상 썸네일 미리보기 — 인증 영상을 올리면 첫 장면이 썸네일로 표시되어 확인이 쉬워졌습니다.
  • 오늘의 미션 — 매일 1개의 특별 미션이 주어지고 달성하면 보너스 스탯 +2를 받습니다.
  • 칭호 성장 시스템 — 훈련 일수에 따라 루키→수습선수→정규선수→주전선수→에이스→레전드로 칭호가 성장합니다.
  • 가족 응원 메시지 — 훈련 완료 시 아빠의 이름으로 된 격려 메시지가 나와 아이에게 동기부여를 줍니다.
  • 주간 훈련 리포트 — 이번 주 훈련 현황과 코칭 메시지를 한눈에 확인할 수 있습니다.
FIX
  • 연속 훈련 마일스톤 확대 — 3일/5일/10일/21일/30일/50일/100일 등 더 다양한 연속 훈련 배지가 추가되었습니다.
  • 훈련 완료 즉시 피드백 — 훈련을 체크하면 카테고리별 응원 메시지가 바로 표시됩니다.
  • 훈련 효과 하이라이트 — 훈련 완료 시 최근 분석 점수 변화를 보여줘 훈련 효과를 실감할 수 있습니다.
β 0.7 2026.04.05
NEW
  • 외야수 수비 분석 추가 — 준비자세, 이동/추적, 캐치, 트랜지션, 송구 5단계 분석. 크로스오버 스텝, 드롭 스텝, 크로우 홉 등 전용 훈련 8종 포함.
  • 외야수 프로 롤모델 — 마이크 트라웃, 이치로, 무키 베츠(MLB), 이종범, 나성범, 박건우(KBO) 등 단계별 추천.
  • 외야수 AI 코치 채팅 — 준비자세, 이동, 포구, 트랜지션, 송구, 포지셔닝 6개 주제로 상세 코칭 제공.
  • 나노바나나 배지 이미지 완성 — 30개 배지 전부 고급 골드 메달 디자인으로 교체. 13개 신규 배지 이미지 추가.
FIX
  • 수비 분석 영상 선택 버그 수정 — 수비 하위 유형별(땅볼/플라이/포수/외야) 일일 제한을 독립 적용하여 영상 선택이 차단되던 문제 해결.
  • 데이터 복원 아이콘 수정 — 기본 이모지 대신 커스텀 아이콘으로 교체.
  • 촬영 팁 한 줄 표시 — 홈 화면 촬영 팁이 줄바꿈 없이 한 줄로 표시되도록 수정.
β 0.6 2026.04.04
FIX
  • 랭킹 화면 데이터 미표시 수정 — renderCompare 에러가 switchRankTab 실행을 차단하던 문제를 분리 처리했습니다.
  • fetchLeaderboard null 참조 오류 수정 — DOM 요소 존재 여부를 확인하는 안전장치를 추가했습니다.
  • 랭킹 스켈레톤 비동기 처리 수정 — async/await 패턴으로 변경하여 로딩 애니메이션이 정상 동작합니다.
  • 랭킹 렌더링 에러 핸들링 강화 — renderRankingTab, switchRankMode에 try-catch 및 재시도 버튼을 추가했습니다.
  • 훈련 훈련 제목 2줄 표시 수정 — 모바일에서 훈련 이름이 한 줄로 표시되도록 폰트 크기와 굵기를 조정했습니다.
  • 커스텀 아이콘 추가 — 선물, 금/은/동 메달 아이콘을 커스텀 디자인으로 교체했습니다.
β 0.5 2026.04.03
NEW
  • 사이드암 / 언더핸드 분석 지원 — 투구폼을 자동 감지하여 오버핸드·사이드암·언더핸드 각각에 맞는 전용 기준으로 분석합니다.
  • 사이드암/언더핸드 레전드 롤모델 추가 — 정대현(KBO), 김병현(MLB), 야마다 히사시(NPB) 선수가 추천 롤모델에 등장합니다.
  • 투구/타격 랭킹 분리 — 전국 랭킹이 투구·타격 별도 탭으로 분리되어 더 공정한 비교가 가능합니다.
  • 소속 자동 입력 — 랭킹 등록 시 프로필의 소속(학교/클럽)이 자동으로 채워집니다.
FIX
  • 랭킹 등록 오류 수정 — Firebase 보안 규칙과 코드 간 문서 ID 불일치 문제를 해결했습니다.
  • 타격 분석 진행 불가 오류 수정 — 영상 선택 후 분석이 멈추는 문제를 여러 방면에서 개선했습니다.
  • 프로필 화면 체크박스 오류 수정 — 프로필 입력 화면에 잘못 배치된 체크박스를 올바른 위치로 이동했습니다.
  • 훈련 코칭 플랜 오류 수정 — 타격 분석 후에도 투구 훈련만 추천되던 문제를 수정했습니다.
β 0.4 2026.03
NEW
  • 전국 랭킹 시스템 (Firebase Firestore 연동)
  • 프로 선수 롤모델 추천 및 유튜브 영상 연결
  • 프로 비교 차트 (관절 각도 비교)
  • PDF 리포트 생성
  • 뱃지 / 레벨 시스템
β 0.3 2026.02
NEW
  • 5단계 구간 분석 (와인드업~팔로스루 / 준비자세~임팩트)
  • 맞춤형 훈련 훈련 추천
  • 성장 기록 및 또래 비교
  • 실시간 카메라 감지 모드
β 0.2 2026.01
NEW
  • AI 투구 분석 (MediaPipe Pose)
  • AI 타격 분석
  • PWA 지원 (홈 화면 설치)

사진을 탭하여 업로드

아이코치에 오신 걸 환영합니다!

아이 정보를 입력하면 맞춤 분석이 가능합니다

아빠 폰 / 아들 폰에서 같은 계정으로 로그인할 때 사용합니다.
이벤트 공정성을 위한 본인 확인용이에요.

아이코치

AI가 자세를 분석하고 맞춤 훈련을 추천합니다

0
총 분석
-
⚾투구 최고
평균 -
-
🏏타격 최고
평균 -
-
🧤수비 최고
평균 -
루키
야구의 첫 걸음!
0 / 50 XP
🏅 뱃지
투구

투구 분석

던지기 자세

타격

타격 분석

스윙 자세

수비

수비 분석

수비 자세

실시간

경기 분석

실전 영상 분석

촬영 팁촬영 팁전신이 보이도록, 밝은 곳에서 3~5m 거리로 촬영해 주세요.
← 처음으로
모드 헤더

투구 분석

📸
영상 시작에 얼굴을 정면으로 1~2초!
정면 인증해야 랭킹에 반영돼요 · 첫 영상 한 번만 (눌러서 자세히 ▸)

📹 좋은 영상 찍는 법

OK 촬영 예시
측면 90° · 전신 · 1명
선수 옆모습이 카메라에 잡히게 · 머리부터 발끝까지 · 1명만 프레임 안에
3~5m 머리에서 발끝까지 밝은 곳 단순 배경 한 동작 3~10초
NG 정면
정면·뒷면
힙·어깨 회전이 안 보임
NG 사선
사선 각도
관절 각도가 부정확
NG 부분
머리·발 잘림
전신이 안 잡힘
NG 다인
여러 명
분석 대상이 헷갈림
📹 영상 가이드
업로드

영상 선택

촬영한 영상 분석

실시간 분석

라이브 카메라

AI 모델 로딩 중
잠시만 기다려주세요

처음 실행 시 AI 모델 다운로드에
30초~1분 정도 소요됩니다

← 홈으로

분석 결과

--종합 점수

능력치 능력치
단계별점수 단계별 점수
↓ 당겨서 새로고침
성장 기록
부모님께 주간 리포트 보내기
이번 주 분석 결과 자동 정리 → 카톡으로 한 번에 공유
← 처음으로
헤드코치
COACH MODE
코치 모드
 ·  복사
0
연결 학생
0
검토 대기
0
이번 주 레슨
빠른 작업
전체 리포트
명단 학생 일괄 생성
CSV 가져오기
명단 일괄 등록
샘플 CSV
입력 양식 내려받기
훈련 인증 안내 (코치·감독님)
학생의 훈련 인증 영상은 시작에 본인 얼굴을 정면으로 1~2초 보여줘야 인증됩니다. 정면 인증이 없으면 인증이 실패하니, 소속 학생들에게 “훈련 영상은 얼굴을 먼저 보여주고 시작”하도록 꼭 안내해주세요. (분석·훈련 통틀어 첫 영상 1회만 하면 이후 자동 통과)
안내 그림 보기 ▸
학생 명단 직접 관리 · 미가입 포함
비교 & 랭킹
또래 비교
전국 랭킹
← 처음으로

📹 실시간 분석

카메라를 사용할 준비가 되셨나요?

실시간으로 자세를 분석합니다

  • 밝은 곳에서 촬영해주세요
  • 전신이 보이도록 3~5m 거리
  • 측면에서 촬영하면 정확도 UP
  • 안정적인 곳에 기기를 고정
← 뒤로

📊 분석 비교

분석 1

분석 2

능력치 비교
단계별 점수 비교
경기 등록
AI 경기 분석이란?
경기 정보
투수
타자
수비
경기 영상 & 상황 설명
좋은 분석 결과를 받으려면?
AI 경기 분석
경기 종합 리포트
시즌 기록
⚙️설정
부모용 간단 모드
직접 찍거나 분석하지 않고 결과만 보는 보호자용(예: 어머니). 점수·코치 코멘트·훈련 추천만 크게 보이고, 능력치 차트·구간별 점수·프로 비교는 숨겨요. 이 기기에만 적용돼요.
본인 얼굴 인증
미등록 · 정면 인증 안내
훈련 영상 인증 시 본인 얼굴 자동 확인. 사진 원본은 저장되지 않고 수학적 벡터 128개만 본인 기기에 저장. 외부 전송 0.
코치코치 모드 🔒 코치 인증 필요
학생 명단 관리 + 학생별 주간 리포트 일괄 생성
저장공간—%
☁ 클라우드 백업 PRO
기기를 바꿔도 안전하게 — 클라우드에 기록 백업·복원
효과음 설정
버튼 효과음
효과음 볼륨 30%

분석 중 배경음(BGM)
BGM 볼륨 15%

탭 전환·분석 시작·훈련 완료 등 주요 동작에 효과음이 재생됩니다. BGM은 분석 진행 중에만 재생됩니다.

AI 코치 AI 코치 설정

AI 코치란?

아이코치 앱에는 기본 코치 기능이 들어있어서 바로 질문할 수 있어요. 여기에 Google의 AI(Gemini)를 연결하면, 코치가 우리 아이의 분석 결과를 더 깊이 이해하고 진짜 대화하듯이 맞춤 조언을 해줘요.

API 키는 Google AI 서비스를 사용하기 위한 일종의 비밀번호예요. 한 번만 발급받아 아래에 붙여넣으면 끝! 발급은 무료이고, 개인 사용 수준에서는 무료로 쓸 수 있어요. 다만 무료로 연결하면 입력한 내용이 Google의 서비스 개선에 사용될 수 있으니, 아이 실명 등 민감한 정보는 넣지 않는 걸 권장해요.

💡 API 키가 없어도 기본 코치 기능은 사용할 수 있어요.
키를 입력하면 더 자연스럽고 상세한 AI 대화가 가능합니다.

💾 데이터 보관

분석 기록을 안전하게 지키는 3가지 방법입니다. 아래 두 가지는 자동으로 동작하므로 평소에는 신경 쓸 필요가 없어요.

☁️ 기기 간 동기화

언제 쓰나요? 휴대폰을 바꾸거나 브라우저 캐시를 지웠을 때. 새 기기에서 앱을 열면 자동으로 복원돼요.

✓ 새 분석할 때 자동 업로드 · 앱 열 때 자동 다운로드 — 평소엔 버튼 안 눌러도 됨

▸ 고급: 한 방향만 동기화
📅 과거로 되돌리기
(최근 14일)

언제 쓰나요? 실수로 기록을 지웠거나 데이터가 이상해졌을 때 어제 이전 상태로 되돌릴 수 있어요.

✓ 하루 1회 자동 저장 · 최근 14일 보존 — 같은 기기 내 타임머신

⚙️ 고급 — JSON 파일로 내보내기·가져오기

언제 쓰나요? 클라우드 계정 없이 전체 데이터를 수동 파일로 보관하거나, 다른 사람에게 전달할 때. 대부분은 위 두 기능으로 충분해요.

⚠️ 가져오기는 현재 로컬 데이터를 덮어쓰기합니다. 신중히 사용하세요.

문의하기버그·기능·문의

버그·기능 아이디어·문의사항이 있으면 알려주세요!
보내주신 제보 하나하나가 아이코치를 더 좋게 만드는 데 큰 힘이 됩니다. 🙌

법적 정보약관·개인정보

아이코치 이용과 개인정보 처리에 관한 방침입니다. 이용 전 반드시 한 번 읽어주세요.

운영: 김아빠 · 연락처: 2026icoach@gmail.com

지원 · 문의문의·이메일

오류 제보·기능 제안·이용 문의를 한 곳에서 받아요. 답변은 이메일 또는 단톡방 공지로 드립니다.

2026icoach@gmail.com

훈련 관리
연속 훈련
0일
📅 훈련 캘린더
🎯 목표 설정
오늘의 훈련 체크리스트

각 훈련을 완료하고 인증 영상을 올려주세요. 꾸준한 훈련에 보너스 스탯이 부여됩니다!

📚 더 많은 훈련 메뉴 — 야구 외 종합 훈련

기초체력·근력·유연성·부상 예방 등 야구 실력의 토대가 되는 60+ 가지 훈련을 카테고리별로 골라 인증하세요. 영상이 아니어도 시간 측정·횟수·체크리스트로 간편 인증.

📊 훈련 효과 분석

이전 분석 대비 어떤 부분이 좋아졌는지, 추가로 어떤 훈련이 필요한지 확인하세요.

훈련 보상 현황
코치
● 온라인
투구
수비
수비
타격
타격
투구
투구

아이코치 앱 설치

홈 화면에 추가하면 앱처럼 빠르게 실행할 수 있어요!

설치 시 "안전하지 않은 앱" 경고가 뜰 수 있습니다. 아이코치는 웹사이트 바로가기(PWA)로 설치되며, 개인정보 수집이나 악성코드가 없으니 안심하세요. "세부정보 더보기" → "무시하고 설치하기"를 눌러 진행하면 됩니다.

iPhone에 설치하기

iPhone 설치 3단계 — 공유 버튼 → 홈 화면에 추가 → 완료