[
  {
    "date": "2026-09-01",
    "persona": "예나",
    "glyph": "🧹",
    "title": "성장 트리 10일 정기 점검 — glossary 용어 설명 누락 9건 채움",
    "detail": "scripts/growth_tree_audit.py로 growth/*/growth_tree.json 전체(geunhoo 11노드·hosting_guide 10노드·yena_career 9노드, 총 3개 트리) 스캔. 중복/근접중복 0건, 과잉분할 후보 0건, 스키마 필수 필드 결손 0건, 용어 설명 누락(glossary) 후보 9건 — 전부 실제 노드 텍스트를 직접 대조해 진짜 누락임을 확인(오탐 없음): geunhoo에서 '캐러셀'(pillar_ratio_focus·story_routine)·'스토리'(pillar_ratio_focus)·'Trial Reels'(discovery_reels_batch·single_purpose_per_reel) 5건, hosting_guide에서 '상시 프로세스'(compare_cloudflare_workers)·'콜드스타트'(compare_fly)·'cron'(full_auto_combo) 3건, yena_career에서 'devlog'(reel_once_a_week_cap) 1건. 모두 같은 트리 안에 이미 정의된 용어라 그 정의를 그대로 재사용해 해당 노드 glossary에 채움(새 설명 지어내지 않음, 숫자·확률 없음). 재실행 결과 4가지 규칙 모두 후보 0건으로 정리 완료. docs/growth_tree_audit_runbook.md는 이 저장소 docs/에 없음(스크립트 주석은 23AppdeveloperReleaser 로컬 프로젝트 경로를 가리킴) — schema.md의 glossary 규칙과 스크립트 자체 설명으로 판단해 처리, 다음 점검 전 러너북을 이 저장소로 실제 이관 필요.",
    "link": "../growth/geunhoo/"
  },
  {
    "date": "2026-08-19",
    "persona": "박새로이",
    "glyph": "🌳",
    "title": "서버 운영 방식 선택 가이드 — 로컬 PC/온라인 호스팅/AI 처리 방식 성장 트리 신설",
    "detail": "요청: 로컬 PC 상시 실행 vs 온라인 호스팅, 실시간 API vs 배치 처리 같은 선택지를 게임 스킬트리처럼 배우는 교육용 가이드. 오늘 브레인와이어(Node/Express) 사례로 조사된 실제 사실(로컬+Cloudflare Quick Tunnel의 URL 변동/끊김 문제, Cloudflare Workers가 상시 프로세스를 못 올리는 구조적 한계, Render 무료 15분 슬립+약 1분 콜드스타트, Railway Trial 30일 제한 vs Hobby 월 $5, Fly.io shared-cpu-1x+256MB 상시 가동 시 월 약 $2~5, 실시간 API+cron 자동 배치 vs API 키 없는 수동 트리거 배치의 '비용 0'과 '완전 무인 자동'이 동시에 성립할 수 없는 구조적 모순)를 새 슬러그 growth/hosting_guide/(김근후 geunhoo·김예나 yena_career와 완전히 분리, 특정 인물 아닌 범용 학습 자료)로 일반화. docs/growth_tree_schema.md 그대로 준수 — source_report.md(가공 없는 원문, 확인 못한 Render Starter 정확 가격·API 배치 비용은 '확인 필요'로 명시), growth_tree.json(10개 노드/4단계/weight 합 100, whySimple·journeyContext·glossary 전 노드 필수 채움, tier3에 '비용 0 vs 완전 자동' 모순을 짚는 spot_the_contradiction 관문 노드 배치), growth/geunhoo/index.html을 템플릿으로 복사해 growth/hosting_guide/index.html(제목/h1/canonical/주석만 교체, 나머지는 JSON 필드를 그대로 읽는 구조라 손대지 않음). Render 무료 슬립 정책(15분/약 1분)·Railway 요금제·Fly.io 최소사양 비용은 WebFetch로 공식 pricing/docs 페이지에서 재확인. dev-portfolio/index.html demo-row에 두 번째 성장 트리 카드로 등록. 로컬 python http.server로 index.html(200)·growth_tree.json(200, JSON 파싱 성공) 확인.",
    "link": "../growth/hosting_guide/"
  },
  {
    "date": "2026-08-12",
    "persona": "박새로이",
    "glyph": "🌳",
    "title": "성장 트리 — AI 보고서를 게임 스킬트리로 바꾸는 재사용 시스템 (첫 사례: 김근후 인스타그램)",
    "detail": "클로이 박이 미리 만들어둔 growth/geunhoo/growth_tree.json(11개 노드, 4단계, weight 합 100, 김근후 인스타그램 마케팅 타당성 보고서 근거)은 다른 로컬 클론(/private/tmp/rp_growth)에만 커밋(82ffbd8)되어 있었고 origin에는 없었던 것 — 그 클론을 최신 origin/main으로 rebase 후 이어서 작업. growth/geunhoo/index.html 신규(남색/차콜+골드 XP 팔레트로 다른 정체성과 겹치지 않게, tier 세로 배치+커넥터, requires 전부 done이어야 잠금 해제, 화면상 유일한 숫자형 %는 '완료 weight 합÷100' 진행도, 노드 클릭 시 오른쪽 드로어에 원문 근거(sourceSection)·예나 톤 쉬운 설명(WHY_SIMPLE, 원문 왜곡 없이 비유로 재서술)·action·성공(초록)/실패(주황, 겁주지 않는 톤) 카드, '완료로 표시'는 apps/gallery configwarn과 동일하게 미리보기 전용 — 새로고침하면 원복, 실제 반영은 scripts/mark_growth_node.sh). 애니메이션은 opacity+transform만 쓰는 IntersectionObserver(2026-08-11 스크롤 잭 버그 재발 방지 원칙 준수). 재사용 시스템: 23AppdeveloperReleaser/docs/growth_tree_schema.md 신규(필드별 규칙, weight 합 100 필수, why/successEffect/failureCost는 원문 인용이지 확률 아님을 명시), 허브 루트 index.html의 KIND_ORDER/LABELS/DESC/GLYPH/PROMPT에 growth_tree kind 추가(PROMPT는 실제 geunhoo 노드를 예시로 포함, '숫자/확률 지어내지 마라·weight 합 100' 규칙을 프롬프트 자체에 박음). dev-portfolio/index.html demo-row에 성장 트리 카드 추가. 검증: playwright(신규 설치)로 로컬 서버 렌더링 — 콘솔/페이지 에러 0, 데스크톱·모바일(420px) 스크린샷 확인, tier1 3칸만 잠금 해제·나머지 8칸 잠김 확인, 선행 노드 2개 중 1개만 완료 시 여전히 잠김(AND 로직) 확인, 잠긴 노드 클릭 시 안내문·잠기지 않은 노드 클릭 시 상세+완료버튼 정상 노출 확인. scripts/mark_growth_node.sh(+_mark_growth_node.py)를 임시 JSON 사본에 실행해 status 토글과 weight 합 100 검증 경고 로직 확인. iOS 뷰어(appDev/growth_tree_viewer)는 별도로 flutter analyze/test/build ios --release --no-codesign까지 진행(실기기 설치는 미실행, 사용자 확인 전). 웹 저장소는 이 세션에서 커밋까지만 — push는 승인 대기(구조적 변경).",
    "link": "../growth/geunhoo/"
  },
  {
    "date": "2026-08-11",
    "persona": "박새로이",
    "glyph": "🔧",
    "title": "방문자 분석(GoatCounter) 연결 — 방문자수/지역/유입경로, 검색어는 별도 콘솔 안내",
    "detail": "요청: 들어오는 인원/지역/서치엔진 유입을 수치로 보고, 서치엔진 유입이면 검색 키워드까지 알고 싶다는 요청. 도구는 무료·쿠키 없는 GoatCounter로 확정. 검색 키워드는 GoatCounter를 포함한 어떤 분석 스크립트도 리퍼러 정책상 볼 수 없어 이미 세팅된 구글 Search Console/네이버 서치어드바이저에서만 확인 가능하다는 점을 문서에 명시(혼동 방지). 구현: 루트 analytics-config.js 신설(사이트 코드 값을 한 곳에서만 관리, YOUR_CODE placeholder일 때는 count.js 요청 자체를 보내지 않도록 가드해 조용한 404 대신 완전한 no-op으로 처리) → 공개 페이지 전체(index/about/articles/connect-survey/dev-portfolio/downloads/portfolio/progress/worklog/apps/gallery/apps/ox-quiz/apps/balance-game, 총 12개, git으로 실재 확인)에 상대경로로 로드 스크립트 삽입. about/index.html CONTACT 블록에 '방문 통계 보기' 링크 추가 — GOATCOUNTER_CODE가 placeholder면 자동으로 비활성 표시, 실제 코드 세팅 후엔 공개 대시보드로 연결. docs/goatcounter_setup_walkthrough.md 신규(네이버/구글 walkthrough와 같은 예나 톤, 가입→사이트코드→Public 토글→analytics-config.js 값 교체→커밋/push 5단계 + '검색어는 여기서 안 보여요' 전용 섹션에서 기존 두 문서로 링크). 로컬 python http.server로 12개 페이지 전부 렌더링·콘솔 에러 없음, analytics-config.js가 placeholder 상태에서 조용히 no-op하는 것 확인. 커밋까지만, push는 승인 대기(구조적 변경).",
    "link": "../about/"
  },
  {
    "date": "2026-08-11",
    "persona": "박새로이",
    "glyph": "🔧",
    "title": "네이버 검색 노출 세팅 — robots.txt/sitemap.xml/OG 태그/검증 placeholder",
    "detail": "웹 명함(about/index.html)이 네이버 검색에 뜨게 해달라는 요청 처리. robots.txt 신설(모든 크롤러 + 네이버 Yeti 허용, sitemap.xml 위치 명시), sitemap.xml 신설(루트/about/portfolio/apps/gallery/dev-portfolio/progress/articles/worklog 8개 공개 페이지, lastmod는 각 파일 git 마지막 커밋 날짜 기준). about/index.html·index.html <head>에 Open Graph(og:title/description/image/url/type)·Twitter Card 메타 태그 추가(about는 기존 프로필 사진 URL 재사용, 새 이미지 파일 생성 없음), 둘 다에 <meta name=\"naver-site-verification\" content=\"여기에_나중에_채울_값\"> placeholder 추가(실제 값은 rogan님이 https://searchadvisor.naver.com 에 본인 네이버 계정으로 로그인해 사이트 등록해야만 발급됨 — 로그인 필요한 수동 단계라 대신 할 수 없음). docs/naver_search_setup_walkthrough.md 신규(과거 firebase_setup_walkthrough.md와 같은 톤 — 터미널 몰라도 되는 한국어 단계별: 사이트 등록→HTML 태그 검증값 붙여넣기→커밋/push→소유확인→사이트맵 제출→웹페이지 수집 요청). 로컬 python http.server로 about/index.html·index.html 렌더링 및 sitemap.xml/robots.txt 유효성(XML 파싱 에러 없음) 확인. 커밋까지만, push는 승인 대기.",
    "link": "../about/"
  },
  {
    "date": "2026-08-11",
    "persona": "박새로이",
    "glyph": "🔧",
    "title": "포트폴리오 웹 — 그리드/스토리 토글 + 유튜브 스크롤 자동재생 + 연락처, 로컬 업로드 전용 iOS 앱 신설",
    "detail": "apps/gallery/index.html과 portfolio/index.html에 격자/스토리(100dvh 세로 스냅 스크롤) 보기 토글 추가, mp4/mov는 <video>로 렌더링(자동재생 대상 아님). portfolio/posts.json에 youtube 필드가 있으면 정규식으로 영상 ID를 뽑아 youtube-nocookie.com iframe으로 임베드하고 IntersectionObserver로 뷰포트 진입 시에만 autoplay=1&mute=1&playsinline=1, 벗어나면 iframe을 통째로 제거해 정지(prefers-reduced-motion이면 자동재생 자체를 끄고 클릭 재생만). portfolio/index.html 하단에 about/index.html과 동일한 CONTACT 블록(전화/이메일) 추가. about/index.html 김근후 소개 섹션에 apps/gallery/photos.json 최신 4개를 정적 fetch로 가져오는 미리보기 그리드 + '포트폴리오 전체 보기 →' 링크 신설. 중복 업로드 방지용 scripts/add_photo.sh(+ scripts/_add_photo.py, python3 hashlib 기반)를 신규 작성 — SHA-256으로 apps/gallery/photos.json 기존 해시와 대조해 중복이면 파일 복사·JSON 수정 전부 없이 즉시 에러 종료, 신규면 apps/gallery/photos/에 복사하고 {file, hash, caption, addedAt} 엔트리를 append. 더미 PNG로 1차 추가 성공 + 2차(동일 파일) 거절 둘 다 실제로 실행해 확인 후 원상복구(photos.json은 다시 빈 배열). 로컬 python http.server로 세 페이지(apps/gallery, portfolio, about) 렌더링·콘솔 에러 없음 확인. 별도로 네트워크 업로드 없는 완전 로컬 iOS 앱 /Users/rogan/Desktop/appDev/portfolio_uploader/를 새로 스캐폴딩 — image_picker로 여러 장 선택 → 긴 변 2000px 이하로 클라이언트 리사이즈 → SHA-256 계산(SharedPreferences로 같은 세션 내 중복만 방지) → share_plus Share Sheet로 AirDrop/파일앱 내보내기, Firebase/로그인 없음. 웹 변경은 커밋까지만 하고 push는 하지 않음(지시대로).",
    "link": "../portfolio/"
  },
  {
    "date": "2026-08-10",
    "persona": "박새로이",
    "glyph": "🔧",
    "title": "차실장 ↔ 클로이 박(디자인팀장) 연결 + sync-projects — Windows 이식 완료",
    "detail": "2026-08-07 Windows LaunchPad 세션이 hub_bridge로 전달한 3가지(DesignLeadService.cs.reference 기준)를 Mac Dart로 포팅: (1) 클로이 박 디자인 체크리스트(design_review.dart/design_lead_store.dart, LaunchProgressStore와 동일 관례의 로컬 JSON 저장소), (2) 차실장 진행률 계산에 느슨한 결합으로 연결(AppProgress.designUnresolvedCount, LaunchProgressStore.loadAll()이 DesignLeadStore.summarize(slug) 호출), 앱 카드/브리핑에 '⛔ 클로이 박 검토 대기 N건' 노출, (3) sync-projects — App Vault 전체를 차실장 추적 목록에 안전하게(추가만) 일괄 등록하는 채팅 캐퍼빌리티. API 사용량 0 유지. 새 테스트 13개 포함 전체 스위트 115개 통과(flutter analyze 클린, 재확인함), flutter build macos --release 실빌드 성공, /Applications 설치·재실행까지 완료. 차실장 말투(타짜 스타일)는 기능 우선 원칙에 따라 이번엔 손대지 않음.",
    "link": null
  },
  {
    "date": "2026-08-08",
    "persona": "박새로이",
    "glyph": "🔧",
    "title": "포트폴리오 신설 — 사진 갤러리 + 새 글(posts) 통합 페이지",
    "detail": "리포트 허브 셸(다크/라이트, 히어로, 뒤로가기 패턴)을 참고해 새 최상위 경로 portfolio/index.html 신설. apps/gallery/의 다크룸 톤·firebaseConfig를 그대로 import해 사진 탭을 직접 통합(iframe 아님) — 같은 Firebase Auth 세션이므로 onAuthStateChanged 하나로 로그인 상태가 갤러리와 포트폴리오 양쪽에 동시 반영됨. 새 Firestore 컬렉션 posts로 글 탭(제목/본문, 로그인 시 작성·수정·삭제) 추가, 별도 Firebase 프로젝트는 만들지 않음. 루트 index.html에 진입 카드 연결. 로컬 서버로 렌더링/콘솔 에러 없음 확인 — Firebase config가 REPLACE_ME 상태라 로그인/글쓰기의 실제 end-to-end 동작은 미검증.",
    "link": "../portfolio/"
  },
  {
    "date": "2026-08-08",
    "persona": "박새로이",
    "glyph": "🔧",
    "title": "35Closer 절전 방지 무시 버그 — 근본 원인 추적·수정",
    "detail": "사용자가 keepAwake를 켜고 나갔는데도 절전됨. 이벤트 로그(events-2026-08-07.log)를 시간순으로 대조해 autoIdle의 Claude 보호 하드캡이 keepAwake 상태를 아예 모른 채 sleep을 실행한다는 구조적 결함 확인. auto_idle_controller.dart에 attachKeepAwake() 게이트 추가, 재빌드·재배포까지 확인.",
    "link": null
  },
  {
    "date": "2026-08-08",
    "persona": "박새로이",
    "glyph": "🔧",
    "title": "사진 갤러리 — Firebase 로그인·업로드·삭제 구현",
    "detail": "정적 사이트에 Auth(이메일/[REDACTED] 연동. 로그인 시에만 업로드/캡션 수정/삭제 가능, 비로그인은 감상만. Firebase 콘솔 수동 설정 단계는 한국어 안내문(docs/firebase_setup_walkthrough.md)으로 분리.",
    "link": "../apps/gallery/"
  },
  {
    "date": "2026-08-08",
    "persona": "클로이 박",
    "glyph": "🎨",
    "title": "사진 갤러리 — 다크룸 컨셉 기획",
    "detail": "가로/세로 원본 비율을 그대로 살리는 콘택트시트 그리드, 등장 시 한 가지 동작(페이드+살짝 떠오름)만 반복하는 절제된 애니메이션, safelight red 액센트로 톤 확정. 구현은 박새로이에게 인계.",
    "link": null
  },
  {
    "date": "2026-08-08",
    "persona": "차실장",
    "glyph": "🤖",
    "title": "iOS 실기기 세션 업데이트 자동 설치 시스템 구축",
    "detail": "이번 세션 중 변경된 iOS 앱만 골라 빌드·설치하는 디스패처(tool/session_update_installer.sh)를 만들어 사계기록·OX퀴즈 앱 실기기 설치까지 확인. 과정에서 프로젝트 위치 인덱스가 사계기록(harugirok)을 오래된 스냅샷으로 잘못 표시해 실제 변경을 놓쳤던 걸 발견·정정.",
    "link": null
  }
]
