{
  "$comment": "index.json 에서 파생됨. 손으로 고치지 말 것 — graph.py 를 다시 돌린다.",
  "generatedAt": "2026-08-23T05:34:26Z",
  "nodes": [
    {
      "id": "me",
      "label": "서효다",
      "group": "core",
      "detail": "나는 인프라와 환경을 잡아주고, 그들은 디테일을 심는다.",
      "src": "본인 진술 (hyoda.kr 운영자)",
      "r": 27
    },
    {
      "id": "catchphrase",
      "label": "인프라 vs 디테일",
      "group": "mission",
      "detail": "나는 인프라와 환경을 잡아주고, 그들은 디테일을 심는다. 디테일은 그들의 전문성이고, 겉(표면 구현)은 이제 AI 몫이라 개발자가 겉을 대신 만들면 병목이 된다 — 개발자의 자리는 본질(엔터티·관계·시스템화)이다.",
      "src": "본인 문장",
      "r": 25
    },
    {
      "id": "role-한-핀테크-스타트업",
      "label": "한 핀테크 스타트업",
      "group": "org",
      "detail": "데이터 전문가(모델러) · 백엔드 개발자 (프리랜서). 데이터 모델링·백엔드. 오픈 준비 중인 서비스",
      "src": "본인 확인 2026-08",
      "r": 19
    },
    {
      "id": "role-미라클쿠지",
      "label": "미라클쿠지",
      "group": "org",
      "detail": "파트너 (파트너). 前 CTO 겸 유일 개발자. 미라클타임 앱",
      "src": "본인 확인 2026-08",
      "r": 19
    },
    {
      "id": "role-데브마인랩",
      "label": "데브마인랩",
      "group": "org",
      "detail": "대표 (개인사업자). 응용 소프트웨어 개발 및 공급",
      "src": "본인 확인 2026-08",
      "r": 19
    },
    {
      "id": "claim-career-years",
      "label": "개발 경력",
      "group": "asset",
      "detail": "19년 9개월 — 개발 경력 시작(2006-11 유솔비넷 개발사업부)부터 빌드 시각까지 자동 산정",
      "src": "본인 이력서(2023-09) · 위시켓 집계 교차 확인 (2026-08-21)",
      "r": 15
    },
    {
      "id": "claim-wishket-rating",
      "label": "위시켓 평점",
      "group": "asset",
      "detail": "5.00 / 5.00 — 플랫폼 인증 평점, 상위 1% 프리랜서",
      "src": "위시켓 인증 (2026-03)",
      "r": 15
    },
    {
      "id": "claim-copyright",
      "label": "한국저작권위원회 프로그램 등록",
      "group": "asset",
      "detail": "C-2026-005914 — 등록번호 공개",
      "src": "AI 기반 쇼핑몰 데이터 수집 및 등록 자동화 시스템 (2026)",
      "r": 15
    },
    {
      "id": "claim-pirs",
      "label": "PIRS — 개인정보 유출 대응 모의훈련 플랫폼 구축",
      "group": "asset",
      "detail": "49일 · 커밋 442 · 이슈 150/151 종료(99.3%) · 51,001 LOC — 저장소 실측 집계. **MVP 구간(2026-01-07~02-25) 기준**이다 — 1차 문서 작성 시점의 스냅숏이라 그 뒤 쌓인 커밋은 여기 없다. `git rev-list --count HEAD --until=2026-02-25` 재측정 442(2026-08-17). 배포 v0.1.1~v0.1.281, 이슈 151 생성/150 종료, TS·TSX 260개 파일, DB 마이그레이션 46개.",
      "src": "내부 1차 문서 (2026-02-25)",
      "r": 15
    },
    {
      "id": "claim-legacy-refactor",
      "label": "레거시 저장 프로시저 재작성",
      "group": "asset",
      "detail": "8만 줄 → 2만 줄 — 리팩토링 전후 라인 수",
      "src": "위시켓 이력서 (2020)",
      "r": 15
    },
    {
      "id": "claim-booking-rate",
      "label": "리조트 레벨 요금 시스템 — 예약율 개선",
      "group": "asset",
      "detail": "30~60% → 80~95% — 도입 전후 예약율",
      "src": "위시켓 이력서 (2020)",
      "r": 15
    },
    {
      "id": "claim-hansol-ref",
      "label": "한솔인티큐브 레퍼런스 체크",
      "group": "asset",
      "detail": "통과 — 위시켓 인증 레퍼런스",
      "src": "위시켓 레퍼런스 체크 — 한솔인티큐브 (2021)",
      "r": 15
    },
    {
      "id": "claim-pirs-scope",
      "label": "PIRS — MVP 요구사항 달성",
      "group": "asset",
      "detail": "14/14 (100%) + 추가 구현 15건 — MVP 계획 대비 달성 현황표. 5단계 훈련 시뮬레이션·7가지 질문유형·자동채점·기업포탈·관리자콘솔 등 14개 전부 완료, 계획 외 15개 추가 구현.",
      "src": "내부 1차 문서 (2026-02-25)",
      "r": 15
    },
    {
      "id": "claim-census",
      "label": "전국 매장 census 수집 가능성 실측",
      "group": "asset",
      "detail": "17개 시도 완주 · distinct 2,167 · 외부 오라클 대비 갭 14%(within) · 삼각측량 종합 PASS — 삼각측량 3축 동시 판정 — A 내부일관성(무절단·무손실·소진, leaf 71개 전량 소진·캡도달 0), B 엔드포인트 수렴(union 2,167 · new_id_rate 0.0 · converged), C 외부 오라클 대조(공식 1,900 vs 관측 2,166 · 갭 +14% · 허용 15% 이내). 폴라이트 1.5 req/s · 90콜 · throttle 0건. 시도별 합 2,575와 distinct 2,167의 차이 408은 인접 시군구 경계 중복으로 id 중복제거 흡수.",
      "src": "store-collect-studio/docs/briefing/2026-06-21-전국census-실측결과.md (1차 문서) (2026-06-21)",
      "r": 15
    },
    {
      "id": "claim-unstructured",
      "label": "비정형 → 정형 데이터 실적",
      "group": "asset",
      "detail": "상품 카테고리 매칭·자동등록 100만 건 · 오프라인 매장 정형화 38만 매장 · 인허가 데이터 190개 업종 — 각 프로젝트의 처리 건수 집계. 핵심 역량(비정형을 정형으로)의 규모 증거.",
      "src": "내부 1차 문서 (2026-06)",
      "r": 15
    },
    {
      "id": "claim-api-integrity",
      "label": "카드혜택 API 정합성 회복",
      "group": "asset",
      "detail": "55.8% → 97.2% — 운영 로그 실측 기반 회복안 적용 전후 정합성.",
      "src": "내부 1차 문서 (2026)",
      "r": 15
    },
    {
      "id": "claim-crawlcat",
      "label": "CrawlCat — 이커머스 상품등록 자동화",
      "group": "asset",
      "detail": "326 릴리즈 · 등록시간 90%↓ · 오류 95%↓ — 릴리즈 카운트 및 도입 전후 비교.",
      "src": "내부 1차 문서 (2026)",
      "r": 15
    },
    {
      "id": "claim-releases",
      "label": "누적 산출",
      "group": "asset",
      "detail": "40+ 프로젝트 · 자사 제품 6종 · 600+ 릴리즈 — 프로젝트·제품·릴리즈 누적 집계.",
      "src": "내부 1차 문서 (2026)",
      "r": 15
    },
    {
      "id": "claim-github-release-tags",
      "label": "GitHub 본인 리포 — 릴리즈·태그",
      "group": "asset",
      "detail": "릴리즈 태그 715 · GitHub 릴리즈 280 (리포 175개) — `ops/count-releases.py` — GraphQL 로 본인 리포(포크 제외) 전수, `releases.totalCount` 와 `refs(refPrefix: refs/tags/).totalCount` 를 합산. **둘은 다른 것이다** — 릴리즈를 만든 리포는 5개, 태그가 있는 리포는 15개다.",
      "src": "GitHub GraphQL API — 본인 소유 리포(포크 제외) 전수 (2026-08-22)",
      "r": 15
    },
    {
      "id": "claim-collab-workation",
      "label": "협업형 워케이션 실증 — 15일 합숙 협업",
      "group": "asset",
      "detail": "브랜드(BI) 설계를 반나절에 · 거의 무비용 — 마음 맞는 참여자들과 15일 장기 합숙하며 일하는 구조. 각자 다른 역량을 가진 소집단이 한 자리에 모이자 아침 식사 전후 짧은 시간에 브랜드 아이덴티티가 나왔다. 협업형(공유형이 아닌) 구조의 효과를 보여주는 사례.",
      "src": "내부 1차 문서 (2023)",
      "r": 15
    },
    {
      "id": "claim-capex-zero",
      "label": "공공 제안 설계 — 신축 0(CAPEX 0) 원칙",
      "group": "asset",
      "detail": "기존 유휴 공간 재활용 · 3년 한정 위탁(BTO형) + 인수인계 내장 — ‘센터’를 건물이 아니라 운영 역량(데이터팀+SOP+멤버십 엔진)으로 정의하고, 이미 있는 유휴 그릇에 프로그램·데이터·사람을 넣는 설계. 자생력을 형용사가 아니라 연도별 보조금 의존도 하락 곡선으로 규정.",
      "src": "내부 1차 문서 (2026-06)",
      "r": 15
    },
    {
      "id": "claim-namhae-diagnosis",
      "label": "공공 데이터 진단 — 지자체 관광 통계 정합성",
      "group": "asset",
      "detail": "두 출처 간 163만(23%) 불일치 규명 · ‘판정 기준 부재’로 재정의 — 무인계수기(물리 통과 카운트)와 통신신호 기반 추정 모델을 대조해 같은 기간 23% 격차를 확인하고, 원인을 ‘어느 쪽의 오류’가 아니라 ‘정의·관측단위 상이’로 규명. 이어 실제 인구통계 데이터가 월 300명 QR 설문(자기선택 표본)뿐임을 확인해 ‘방문객이 누구인지 판정할 기준 데이터가 없다’로 진단을 재정의.",
      "src": "내부 1차 문서 (2026-06)",
      "r": 15
    },
    {
      "id": "claim-namhae-chatbot",
      "label": "남해 워케이션 지역정보 챗봇 — 협업형 실물",
      "group": "asset",
      "detail": "수집 데이터 505건 (펜션 202 · 음식점 145 · 카페 112 · 서핑·액티비티 등) — 2023년 8월 남해군 워케이션 기간에 제작. Streamlit + OpenAI 기반 RAG 챗봇으로 현지 숙박·음식·카페·액티비티 정보를 수집해 질의응답. 수집 원문에 ‘남해군 워케이션 일정 중’ 기록이 남아 제작 시기·장소가 확인된다.",
      "src": "내부 1차 문서 (data/ 505건 · README) — 저장소 비공개 (2023-08)",
      "r": 15
    },
    {
      "id": "claim-vision-predates",
      "label": "미션 선언은 2025년 4월에 본인이 이미 작성했다",
      "group": "asset",
      "detail": "2025-04-08 — devmine.co.kr 블로그 원문 GET, datePublished 메타 확인",
      "src": "https://devmine.co.kr/blog/tech-people (2026-08-15)",
      "r": 15
    },
    {
      "id": "claim-blog-posts",
      "label": "블로그 글",
      "group": "asset",
      "detail": "30 — sitemap.xml 의 /blog/ URL 에서 tag·category 제외 후 전수 GET",
      "src": "https://devmine.co.kr/blog (sitemap 전수) (2026-08-21)",
      "r": 15
    },
    {
      "id": "claim-blog-volume",
      "label": "블로그 본문 총량",
      "group": "asset",
      "detail": "397,159자 — 글 30건의 <article> 텍스트를 전수 수집해 합산",
      "src": "https://devmine.co.kr/blog (본문 전수 수집) (2026-08-21)",
      "r": 15
    },
    {
      "id": "claim-blog-reports",
      "label": "8,000자 이상 전략 보고서",
      "group": "asset",
      "detail": "17 — 같은 수집분에서 본문 8,000자 이상을 계수",
      "src": "https://devmine.co.kr/sitemap.xml (2026-08-15)",
      "r": 15
    },
    {
      "id": "claim-sida-chat",
      "label": "남해 워케이션 중 만든 RAG 챗봇 「시다 챗」",
      "group": "asset",
      "detail": "2023-08 · 문서 506건 — 공개 저장소 트리 전수 조회 후 소스의 st.title 문자열과 data/ 하위 분류를 확인",
      "src": "내부 1차 문서 — 저장소 비공개 전환(2026-08-16)으로 공개 링크 없음 (2026-08-15)",
      "r": 15
    },
    {
      "id": "claim-linkedgram-scale",
      "label": "링크드그램 등재 매장",
      "group": "asset",
      "detail": "111곳 · 24개 시군구 — sitemap.xml 전수 파싱 후 /stores 상세와 /stores/region 을 분리 계수",
      "src": "https://linkedgram.kr/sitemap.xml (2026-08-15)",
      "r": 15
    },
    {
      "id": "claim-miracletime-scale",
      "label": "미라클타임 — 멤버십 앱 누적 회원 · 앱 이벤트",
      "group": "asset",
      "detail": "누적 회원 754 · 30일 앱 이벤트 8,807 — office.miracletime.kr 관리자 대시보드 실측. 가장 많이 열린 화면은 커뮤니티 피드.",
      "src": "office.miracletime.kr 대시보드 (본인이 최고 관리자로 접근 · 게재는 오너 합의) (2026-08-16)",
      "r": 15
    },
    {
      "id": "claim-pirs-cumulative",
      "label": "PIRS — 누적 (MVP 이후 포함)",
      "group": "asset",
      "detail": "커밋 500 · 릴리즈 태그 296 — 서버 실물 저장소 `/home/ubuntu/pirs` 에서 전수 계측. `git rev-list --count HEAD` = 500(최초 2026-01-07 ~ 최신 2026-04-15), 모든 ref 기준 514, `git tag | wc -l` = 296.",
      "src": "PIRS 운영 서버의 git 저장소 (직접 계측) (2026-08-17)",
      "r": 15
    },
    {
      "id": "claim-batch-queue",
      "label": "대량 처리 — 배치 + 큐 기반 발송 시스템 (엔터프라이즈)",
      "group": "asset",
      "detail": "수만 명 개인화 발송 · 실패/재시도/지연 설계 — NestJS 기반. MongoDB 배치 처리 + Bull Queue 로 청크 단위 조회와 큐 워커를 분리하고 실패 건만 재시도하는 구조. 삼성전자 북미법인 프로젝트의 리포트·배치 파트에서 만들었다.",
      "src": "https://devmine.co.kr/blog/bull-queue-email (본인 글, 2024-03-08 · 공개) (2024-03-08)",
      "r": 15
    },
    {
      "id": "claim-pipeline-ops",
      "label": "데이터 파이프라인 운영 — Airflow 배치 오케스트레이션",
      "group": "asset",
      "detail": "DAG 상태 10초 폴링 현황판 · enrich 3차 런 254,597 → 100,069 (61% 감소) — Airflow DAG 를 운영하며 사이클 로그를 관찰하고 실패 런만 재처리한다. 사무실(공인 IP)↔외부(VPN) 교차 작업을 도달성 probe 로 자동 선택하는 SSH 구성, Docker health + DAG 상태를 함께 보는 현황판(10초 폴링).",
      "src": "지휘 워크스페이스 저장소의 HANDOFF·도구 등록부 (비공개 1차 문서) (2026-07-23)",
      "r": 15
    },
    {
      "id": "claim-store-census",
      "label": "전국 매장 수집 — 규모와 정확도",
      "group": "asset",
      "detail": "중복 제거 고유 매장 332,382 · 브랜드 전수 검증 2,167(공식 대비 14% 이내) — 수집 DB 다중 교차(naver_id dedup)로 고유 매장을 센다. 정확도는 '전국 스타벅스' 같은 전수 확인 가능한 브랜드로 대조해 검증했다.",
      "src": "store-collect-studio 실측 보고 (비공개 1차 문서, 2026-06) (2026-06-23)",
      "r": 15
    },
    {
      "id": "claim-hospitality-years",
      "label": "숙박 도메인 종사 기간 (누적)",
      "group": "asset",
      "detail": "12년 1개월 — `employment` 에서 `domain=hospitality` 인 재직 구간의 개월을 합산한다 (유솔비넷 · 대명위드원 · 디미디어 · 베이직나인). **구간 합이지 처음~마지막이 아니다** — 중간에 다른 도메인 일이 있었다.",
      "src": "본인 이력 — 숙박 도메인 재직 구간 4건 (2026-08-22)",
      "r": 15
    },
    {
      "id": "prod-linkedgram",
      "label": "링크드그램",
      "group": "product",
      "detail": "소상공인 발견 플랫폼. 세 면으로 구성된다 — 소비자용 `/`(우리 동네 단골 매장 발견), 매장용 `/business`(적립을 넘어 단골을 커뮤니티로 · 피드·채팅·출석·랭킹), 그리고 `/apps` 앱 레지스트리(‘AI가 인용·호출하는 1st-party 표면’). 등재 규모는 111곳 · 24개 시군구. · https://linkedgram.kr [운영 중]",
      "src": "https://linkedgram.kr",
      "r": 16
    },
    {
      "id": "prod-miracletime",
      "label": "미라클타임",
      "group": "product",
      "detail": "포인트 적립 · 커뮤니티 모바일 앱 · https://www.miraclekuji.com [운영 중]",
      "src": "https://www.miraclekuji.com",
      "r": 16
    },
    {
      "id": "prod-crawlcat",
      "label": "CrawlCat",
      "group": "product",
      "detail": "이커머스 셀러 자동화 데스크탑 앱 (Electron). 상품 이미지 자동 생성 · 대량 등록 · 수집을 아우르고, AI 를 붙여 멤버십 형태로 서비스했다. [운영 중]",
      "src": "AI 연결·멤버십 운영 사례(본인 확인 2026-08-17). 같은 도메인의 **또 다른 축이 자동주문 시스템**(Naver Automation — 네이버·쿠팡·G마켓·11번가 멀티몰 크롤링과 주문 배분, 27 릴리즈)이다. 별개 제품이 아니라 이커머스 셀러 자동화의 두 축이다.",
      "r": 16
    },
    {
      "id": "prod-pirs",
      "label": "PIRS",
      "group": "product",
      "detail": "개인정보 유출 대응 훈련 B2B SaaS. 상용 서비스로 운영 중이며 IRX 와 같은 것이다. · https://pirs.hyoda.kr [운영 중]",
      "src": "https://pirs.hyoda.kr",
      "r": 16
    },
    {
      "id": "prod-wing-studio",
      "label": "Wing Studio",
      "group": "product",
      "detail": "쿠팡 Wing 상세페이지 AI 재생성 SaaS [개발 중]",
      "src": "본인 운영 제품 (공개 URL 없음)",
      "r": 16
    },
    {
      "id": "prod-handoff",
      "label": "handoff",
      "group": "product",
      "detail": "Claude Code 세션 인계 스킬. 요약이 아니라 **실행 계약**을 낸다 — 7절 런북을 강제하고 §0 은 언제나 환경 재구성이다(터널이 죽은 런북은 런북이 아니다). · https://github.com/hyoda/claude-skill-handoff [오픈소스]",
      "src": "https://github.com/hyoda/claude-skill-handoff",
      "r": 18
    },
    {
      "id": "prod-opraseno",
      "label": "opraseno",
      "group": "product",
      "detail": "DISC/MBTI 성향 분석 서비스 · https://opraseno.com [운영 중]",
      "src": "https://opraseno.com",
      "r": 18
    },
    {
      "id": "prod-mileshop-rc",
      "label": "마일샵 RC",
      "group": "product",
      "detail": "RC 완구 자사몰 · 명판 제작 쇼룸 [운영 중]",
      "src": "인프라·환경 지원으로 운영자가 만든 결과물",
      "r": 18
    },
    {
      "id": "prod-sida-chat",
      "label": "시다 챗",
      "group": "product",
      "detail": "남해 워케이션 중 만든 남해 지역정보 RAG 챗봇. Streamlit + OpenAI + Chroma, 한국어 임베딩(ko-sbert-sts). 펜션 202 · 음식점 145 · 카페 112 · 서핑 6 · 달리기 11 · 남해 향토자료 8건 등을 색인했다. [보관]",
      "src": "저장소는 비공개다(2026-08-16 정리). **비공개 리포 URL 은 공개 표면에 걸지 않는다** — 방문자에겐 죽은 링크이고, 리포의 존재를 드러낸다.",
      "r": 16
    },
    {
      "id": "prod-autoplan",
      "label": "정대표의 오토플랜",
      "group": "product",
      "detail": "김포 지역 커뮤니티 비즈니스 생태계. Hub Verdi 플랫폼 위에서 멤버십·모임·지역 상생을 운영자가 직접 꾸린다. · https://autoplan.hyoda.kr/ [운영 중]",
      "src": "https://autoplan.hyoda.kr/",
      "r": 18
    },
    {
      "id": "prod-does-it-bite",
      "label": "does-it-bite",
      "group": "product",
      "detail": "검사기가 실제로 무는지 시험한다. **통과는 근거가 아니다** — 아무것도 안 보는 검사도 통과를 보고한다. 변이 시험 + 돌아가는 검사기 5종 + 실패 분류 6가지. 자기 검사기를 자기 변이 시험으로 시험하고 자기 README 수치를 자기 표류 검사기로 대조한다. · https://github.com/hyoda/does-it-bite [오픈소스]",
      "src": "https://github.com/hyoda/does-it-bite",
      "r": 18
    },
    {
      "id": "prod-hat-agents",
      "label": "hat-agents",
      "group": "product",
      "detail": "이벤트로 굴러가는 4-모자 개발 루프. 지시를 촘촘히 쓰는 대신 **품질 게이트를 세우고 루프를 돌린다** — 역할 넷이 이벤트만 주고받고, 마지막에 커밋을 막을 권한을 가진 감사자를 세운다. · https://github.com/hyoda/claude-hat-agents [오픈소스]",
      "src": "https://github.com/hyoda/claude-hat-agents",
      "r": 18
    },
    {
      "id": "prod-margin-calculator",
      "label": "마진 계산기",
      "group": "product",
      "detail": "매입가에서 마진 배수별 판매가를 역산한다. 소계(공급가+택배) × 배수 = 판매가, 판매가에서 수수료·수수료부가세를 빼 정산가를 낸다. 단일 HTML · 의존성 없음 · 오프라인. · https://hyoda.github.io/margin-calculator/ [오픈소스]",
      "src": "https://hyoda.github.io/margin-calculator/",
      "r": 18
    },
    {
      "id": "theirs",
      "label": "그들이 만든 것",
      "group": "mission",
      "detail": "인프라·환경만 제공하고 운영자가 직접 만든 결과물. 포트폴리오의 단위가 '내가 만든 것'에서 '내 개입을 줄이며 그들이 만든 것'으로 바뀐다.",
      "src": "운영자가 직접 만들었다고 표시된 제품들 (계약의 note 필드)",
      "r": 21
    },
    {
      "id": "lin-seoro",
      "label": "서로학교",
      "group": "narr",
      "detail": "“우리는 서로에게서 배운다” — 6년간 브레인스토밍·난상토론 학습 공동체. 남해 워케이션 실험과 스위칭 허브 구상의 모태. 창립멤버 김강수. · https://dalpum.hyoda.kr/",
      "src": "dalpum.hyoda.kr — 서로학교 6년 활동 분석. **소유는 김강수(서로학교)이고 제작이 본인이다** (본인 확인 2026-08-18). 그래서 이 사이트는 위성(동일 엔터티)이 아니라 **제작 관계**로만 건다 — sameAs 로 묶으면 서효다=김강수가 된다.",
      "r": 18
    },
    {
      "id": "lin-sfl",
      "label": "서울핀테크랩 · 위워크",
      "group": "narr",
      "detail": "“같은 공간에 있어도 각자 따로다” — 공유형 오피스의 한계를 직접 겪은 곳. '협업형' 착안의 계기.",
      "src": "본인 확인 2026-08",
      "r": 18
    },
    {
      "id": "lin-namhae",
      "label": "달품 남해 워케이션",
      "group": "narr",
      "detail": "“장소를 바꾸면 일의 구조도 바꿀 수 있지 않을까” — 협업형 워케이션 실증. 2022.10 밋업 첫 접점 이후 3일~3주 단위 반복 방문(관계인구). 각자 분야가 다른 소집단이 15일 합숙하며 일하자 혼자서는 못 만들 결과가 나왔다. · https://workation-story.netlify.app/",
      "src": "「워케이션, 일탈이 아닌 설계 — 1인 사업가의 이야기」 (2026 워케이션 정책포럼 발표자료)",
      "r": 18
    },
    {
      "id": "pain-persistence",
      "label": "RDB ↔ KG 엔지니어링",
      "group": "target",
      "detail": "한계: 지식의 영속성 실패 — 쌓이지 않고 흩어짐 → 깔아야 할 바닥: RDB ↔ KG 엔지니어링. 가진 자산: 스튜디오 wiki/, EKG 스튜디오, 사내 지식그래프 저장소, 현직 데이터 모델러",
      "src": "멤버십 운영 경험에서 역산",
      "r": 17
    },
    {
      "id": "pain-expansion",
      "label": "_catalog 계약",
      "group": "target",
      "detail": "한계: 지식의 확장 실패 — 한 사람 머리에서 멈춤 → 깔아야 할 바닥: _catalog 계약. 가진 자산: discoverable-app-factory 축2",
      "src": "멤버십 운영 경험에서 역산",
      "r": 17
    },
    {
      "id": "pain-deploy",
      "label": "CI/CD · 인프라",
      "group": "target",
      "detail": "한계: 배포하지 못함 — 만들어도 세상에 못 냄 → 깔아야 할 바닥: CI/CD · 인프라. 가진 자산: hyoda-deploy 스킬, Lightsail 2대, Docker/PM2/nginx 운영",
      "src": "멤버십 운영 경험에서 역산",
      "r": 17
    },
    {
      "id": "pain-discovery",
      "label": "발견 OS",
      "group": "target",
      "detail": "한계: 발견되지 못함 → 깔아야 할 바닥: 발견 OS. 가진 자산: 링크드그램, discoverable-app-factory 축1·3·4",
      "src": "멤버십 운영 경험에서 역산",
      "r": 20
    },
    {
      "id": "pain-ai",
      "label": "교육 · 에이전트 하네스",
      "group": "target",
      "detail": "한계: AI를 제대로 못 씀 — 도구는 있는데 안 붙음 → 깔아야 할 바닥: 교육 · 에이전트 하네스. 가진 자산: 비공개 커뮤니티 사상, 출시 에이전트 5종, 스킬 6종",
      "src": "멤버십 운영 경험에서 역산",
      "r": 17
    },
    {
      "id": "method",
      "label": "스튜디오",
      "group": "product",
      "detail": "순서: Data → Knowledge Graph → Studio → Agent → Company. 기준본 — 재논의하지 않는 결정을 동결 / 실험 장부 — 가설 → 적용 → 결과 → 판정 / 판정을 통과한 실험의 승급 결과물",
      "src": "내부 매니페스토 (비공개 저장소)",
      "r": 22
    },
    {
      "id": "pr-바닥은-ai가-아니라-데이터다--구조가-엉성",
      "label": "바닥은 AI가 아니라 데이터다. 구조가 엉성하면…",
      "group": "narr",
      "detail": "바닥은 AI가 아니라 데이터다. 구조가 엉성하면 그 위에 AI를 얹어도 무너진다.",
      "src": "매니페스토 3원칙",
      "r": 13
    },
    {
      "id": "pr-지식그래프는-ai-native-company",
      "label": "지식그래프는 AI Native Company의 …",
      "group": "narr",
      "detail": "지식그래프는 AI Native Company의 운영체제다.",
      "src": "매니페스토 3원칙",
      "r": 13
    },
    {
      "id": "pr-ai가-못하는-일-을-지키는-게-아니라",
      "label": "'AI가 못하는 일'을 지키는 게 아니라, AI…",
      "group": "narr",
      "detail": "'AI가 못하는 일'을 지키는 게 아니라, AI에게 넘길 수 있는 일을 끝없이 늘린다 — 어제 사람이 하던 일이 오늘 AI 몫이 되도록.",
      "src": "매니페스토 3원칙",
      "r": 13
    },
    {
      "id": "pr-발견은-출시-후-마케팅이-아니라--태어날-때",
      "label": "발견은 출시 후 마케팅이 아니라, 태어날 때의 …",
      "group": "narr",
      "detail": "발견은 출시 후 마케팅이 아니라, 태어날 때의 속성이다.",
      "src": "매니페스토 3원칙",
      "r": 13
    },
    {
      "id": "pr-매칭을-더-정교화하는-게-아니라--버려진-신",
      "label": "매칭을 더 정교화하는 게 아니라, 버려진 신뢰키…",
      "group": "narr",
      "detail": "매칭을 더 정교화하는 게 아니라, 버려진 신뢰키를 복원한다.",
      "src": "매니페스토 3원칙",
      "r": 13
    },
    {
      "id": "pr-루프-위에서-조정하고--루프-안에-개입하지",
      "label": "루프 위에서 조정하고, 루프 안에 개입하지 않는…",
      "group": "narr",
      "detail": "루프 위에서 조정하고, 루프 안에 개입하지 않는다.",
      "src": "매니페스토 3원칙",
      "r": 13
    },
    {
      "id": "w-vision-2025-04",
      "label": "나의 비전 선언문: 기술보다 사람이 먼저…",
      "group": "narr",
      "detail": "2025-04-08 — 「기술은 단지 수단일 뿐이며, 그 수단을 잘 쓰는 사람들에게 내가 가진 능력을 서빙(Serving)하는 것이 나의 사명이자 비전입니다.」 이번 작업에서 도출한 캐치프레이즈 '나는 인프라와 환경을 잡고, 당신은 디테일을 심는다' 는 이 문장의 압축이다. 미션은 새로 만든 것이 아니라 2025년 4월에 이미 쓰여 있었다.",
      "src": "https://devmine.co.kr/blog/tech-people",
      "r": 17
    },
    {
      "id": "w-origin-2025-04",
      "label": "AI 시대, 나는 왜 작은 가게를 위한 …",
      "group": "narr",
      "detail": "2025-04-11 — 「왜 이런 시스템은 대기업만 쓰고, 작은 사업체들은 늘 손발로 일해야 할까?」 창업 동기의 1차 기록. '작은 사람도 구조를 만들면 크게 움직일 수 있다' 는 믿음이 사업의 출발점이라고 본인이 적었다.",
      "src": "https://devmine.co.kr/blog/ai-system",
      "r": 17
    },
    {
      "id": "w-jeongyeol-2025-04",
      "label": "정열은 시스템을 해킹하는 감각에서 온다",
      "group": "narr",
      "detail": "2025-04-11 — 「이런 정열을 가진 사람들과 계속 일하고 싶습니다. 그리고 그 안에 기술을, 구조를, 시스템을 조금 더 정직하게 얹어주고 싶습니다.」 협업 구조를 한 문장으로 말한 곳. 그들이 정열을 가져오고 나는 구조를 얹는다 — 캐치프레이즈와 같은 형태다.",
      "src": "https://devmine.co.kr/blog/system",
      "r": 17
    },
    {
      "id": "w-switching-hub-2025-08",
      "label": "남해 스위칭 허브: 전문성의 시스템화를 …",
      "group": "narr",
      "detail": "2025-08-09 — 「지역 내 핵심 전문가, 즉 '선순환 설계자(Giver-Entrepreneurs)'를 발굴하고, 그들의 고유한 전문성을 확장 가능한 디지털 시스템과 서비스로 '패키징'하여 공유한다.」 협업형 오피스의 이론적 원본. 4계층 아키텍처와 벤치마크 3건이 이미 문서화돼 있었다. 캐치프레이즈는 E-Myth '기술자의 함정' 해결책의 실무 번역이다 — 그들은 기술을 심고, 나는 그것을 시스템으로 만든다.",
      "src": "https://devmine.co.kr/blog/namae-euwiing-eoeu-eonuneongui-systemwaeul-onghan-iyeog-waleongwa-strategy-framework",
      "r": 17
    },
    {
      "id": "w-office-manifesto-2026-08",
      "label": "작게, 그러나 무너지지 않게 — 협업형 …",
      "group": "narr",
      "detail": "2026-08-16 — 「큰 회사를 만들려는 게 아닙니다. 무너지지 않는 것을 만들려는 겁니다 — 가장 깊은 전문성을 가진 사람이 가장 취약해선 안 된다.」 스위칭 허브 프레임워크(2025-08-09)의 확장·선언. 거버 '기술자의 함정' + The Minimalist Entrepreneur 사상 위에 오피스의 명분·해자·미션·로드맵을 세웠다. /office 가드레일 섹션과 크로스링크.",
      "src": "https://devmine.co.kr/blog/small-but-unbreakable",
      "r": 17
    },
    {
      "id": "blog",
      "label": "글 30",
      "group": "asset",
      "detail": "축 — 전략 11 · 기술 6 · 선언 4 · 지역 4 · 소상공인 3 · 기타 2. 태그 87 · 카테고리 44.",
      "src": "https://devmine.co.kr/sitemap.xml 의 /blog/ URL 중 tag·category 를 제외한 30건을 각각 GET 하여 title·description·datePublished 를 추출.",
      "r": 20
    },
    {
      "id": "inv-repos",
      "label": "리포 217",
      "group": "asset",
      "detail": "본인 174 · 공개 5 · 비공개 169 · 올해 활성 56 · 시작 2014년",
      "src": "gh repo list --limit 500. 포크 제외 집계. 비공개 리포는 개수만 세고 이름·설명은 내보내지 않는다.",
      "r": 19
    },
    {
      "id": "inv-domains",
      "label": "도메인 87",
      "group": "asset",
      "detail": "api 14 · internal 27 · mirror 1 · parked 6 · protected 1 · public 38",
      "src": "ops/private/domains.tsv 인벤토리. 총계는 전수, 목록은 publish=yes 인 것만. 도달 가능하지만 광고하지 않는 도메인(사적·실험·내부)은 목록에서 제외한다. 응답 수는 ops/healthcheck.sh 가 남긴 스냅샷에서 온다 — 빌드는 네트워크를 쓰지 않는다.",
      "r": 18
    },
    {
      "id": "yr-2020",
      "label": "2020",
      "group": "career",
      "detail": "한솔인티큐브 AI 자동화 PL — AutoML · ELK · Prometheus/Grafana",
      "src": "본인 이력 (위시켓 이력서 기준)",
      "r": 15
    },
    {
      "id": "yr-2022",
      "label": "2022",
      "group": "career",
      "detail": "데브마인랩 설립",
      "src": "본인 이력 (위시켓 이력서 기준)",
      "r": 15
    },
    {
      "id": "yr-2025",
      "label": "2025",
      "group": "career",
      "detail": "남해 워케이션 — 일의 구조를 다시 짜다",
      "src": "본인 이력 (위시켓 이력서 기준)",
      "r": 15
    },
    {
      "id": "yr-2026",
      "label": "2026",
      "group": "career",
      "detail": "남해군 인수위 포럼 단독 발제 · 링크드그램 발견 OS 가동 · 협업형 오피스",
      "src": "본인 이력 (위시켓 이력서 기준)",
      "r": 15
    },
    {
      "id": "clients",
      "label": "함께 일한 곳 20",
      "group": "career",
      "detail": "유솔비넷 · KT하이텔 · 대명레저(비발디파크·오션월드·소노팰리체) · 알펜시아 · 농협정보통신 · 인포뱅크 · 네오위즈 · 동원산업 · LG CNS · HDC 현대산업개발 · 인천국제공항 T2 · 파르나스 호텔 · 한솔인티큐브 · 삼성전자 북미법인 (KNOX 기반 인증·결제·리포트/배치) · KICC · 호반건설 · 베이직나인 · 별소프트 · 코아소프트 · 로켓오즈(후 선데이토즈 인수)",
      "src": "위시켓 이력서",
      "r": 20
    }
  ],
  "edges": [
    {
      "from": "me",
      "to": "catchphrase",
      "rel": "표어",
      "w": 2
    },
    {
      "from": "me",
      "to": "role-한-핀테크-스타트업",
      "rel": "역할",
      "w": 2
    },
    {
      "from": "me",
      "to": "role-미라클쿠지",
      "rel": "역할",
      "w": 2
    },
    {
      "from": "me",
      "to": "role-데브마인랩",
      "rel": "역할",
      "w": 2
    },
    {
      "from": "me",
      "to": "claim-career-years",
      "rel": "주장",
      "w": 2
    },
    {
      "from": "me",
      "to": "claim-wishket-rating",
      "rel": "주장",
      "w": 2
    },
    {
      "from": "me",
      "to": "claim-copyright",
      "rel": "주장",
      "w": 2
    },
    {
      "from": "me",
      "to": "claim-pirs",
      "rel": "주장",
      "w": 2
    },
    {
      "from": "me",
      "to": "claim-legacy-refactor",
      "rel": "주장",
      "w": 2
    },
    {
      "from": "me",
      "to": "claim-booking-rate",
      "rel": "주장",
      "w": 2
    },
    {
      "from": "me",
      "to": "claim-hansol-ref",
      "rel": "주장",
      "w": 2
    },
    {
      "from": "me",
      "to": "claim-pirs-scope",
      "rel": "주장",
      "w": 2
    },
    {
      "from": "me",
      "to": "claim-census",
      "rel": "주장",
      "w": 2
    },
    {
      "from": "me",
      "to": "claim-unstructured",
      "rel": "주장",
      "w": 2
    },
    {
      "from": "me",
      "to": "claim-api-integrity",
      "rel": "주장",
      "w": 2
    },
    {
      "from": "me",
      "to": "claim-crawlcat",
      "rel": "주장",
      "w": 2
    },
    {
      "from": "me",
      "to": "claim-releases",
      "rel": "주장",
      "w": 2
    },
    {
      "from": "me",
      "to": "claim-github-release-tags",
      "rel": "주장",
      "w": 2
    },
    {
      "from": "me",
      "to": "claim-collab-workation",
      "rel": "주장",
      "w": 2
    },
    {
      "from": "me",
      "to": "claim-capex-zero",
      "rel": "주장",
      "w": 2
    },
    {
      "from": "me",
      "to": "claim-namhae-diagnosis",
      "rel": "주장",
      "w": 2
    },
    {
      "from": "me",
      "to": "claim-namhae-chatbot",
      "rel": "주장",
      "w": 2
    },
    {
      "from": "me",
      "to": "claim-vision-predates",
      "rel": "주장",
      "w": 2
    },
    {
      "from": "me",
      "to": "claim-blog-posts",
      "rel": "주장",
      "w": 2
    },
    {
      "from": "me",
      "to": "claim-blog-volume",
      "rel": "주장",
      "w": 2
    },
    {
      "from": "me",
      "to": "claim-blog-reports",
      "rel": "주장",
      "w": 2
    },
    {
      "from": "me",
      "to": "claim-sida-chat",
      "rel": "주장",
      "w": 2
    },
    {
      "from": "me",
      "to": "claim-linkedgram-scale",
      "rel": "주장",
      "w": 2
    },
    {
      "from": "me",
      "to": "claim-miracletime-scale",
      "rel": "주장",
      "w": 2
    },
    {
      "from": "me",
      "to": "claim-pirs-cumulative",
      "rel": "주장",
      "w": 2
    },
    {
      "from": "me",
      "to": "claim-batch-queue",
      "rel": "주장",
      "w": 2
    },
    {
      "from": "me",
      "to": "claim-pipeline-ops",
      "rel": "주장",
      "w": 2
    },
    {
      "from": "me",
      "to": "claim-store-census",
      "rel": "주장",
      "w": 2
    },
    {
      "from": "me",
      "to": "claim-hospitality-years",
      "rel": "주장",
      "w": 2
    },
    {
      "from": "me",
      "to": "prod-linkedgram",
      "rel": "만든 것",
      "w": 2
    },
    {
      "from": "me",
      "to": "prod-miracletime",
      "rel": "만든 것",
      "w": 2
    },
    {
      "from": "me",
      "to": "prod-crawlcat",
      "rel": "만든 것",
      "w": 2
    },
    {
      "from": "me",
      "to": "prod-pirs",
      "rel": "만든 것",
      "w": 2
    },
    {
      "from": "me",
      "to": "prod-wing-studio",
      "rel": "만든 것",
      "w": 2
    },
    {
      "from": "me",
      "to": "prod-handoff",
      "rel": "운영",
      "w": 1
    },
    {
      "from": "me",
      "to": "prod-opraseno",
      "rel": "운영",
      "w": 1
    },
    {
      "from": "me",
      "to": "prod-mileshop-rc",
      "rel": "운영",
      "w": 1
    },
    {
      "from": "me",
      "to": "prod-sida-chat",
      "rel": "만든 것",
      "w": 2
    },
    {
      "from": "me",
      "to": "prod-autoplan",
      "rel": "운영",
      "w": 1
    },
    {
      "from": "me",
      "to": "prod-does-it-bite",
      "rel": "운영",
      "w": 1
    },
    {
      "from": "me",
      "to": "prod-hat-agents",
      "rel": "운영",
      "w": 1
    },
    {
      "from": "me",
      "to": "prod-margin-calculator",
      "rel": "운영",
      "w": 1
    },
    {
      "from": "me",
      "to": "theirs",
      "rel": "협업",
      "w": 2
    },
    {
      "from": "theirs",
      "to": "prod-handoff",
      "rel": "그들이 만든 것",
      "w": 2
    },
    {
      "from": "theirs",
      "to": "prod-opraseno",
      "rel": "그들이 만든 것",
      "w": 2
    },
    {
      "from": "theirs",
      "to": "prod-mileshop-rc",
      "rel": "그들이 만든 것",
      "w": 2
    },
    {
      "from": "theirs",
      "to": "prod-autoplan",
      "rel": "그들이 만든 것",
      "w": 2
    },
    {
      "from": "theirs",
      "to": "prod-does-it-bite",
      "rel": "그들이 만든 것",
      "w": 2
    },
    {
      "from": "theirs",
      "to": "prod-hat-agents",
      "rel": "그들이 만든 것",
      "w": 2
    },
    {
      "from": "theirs",
      "to": "prod-margin-calculator",
      "rel": "그들이 만든 것",
      "w": 2
    },
    {
      "from": "theirs",
      "to": "catchphrase",
      "rel": "표어를 뒷받침",
      "w": 2
    },
    {
      "from": "me",
      "to": "lin-seoro",
      "rel": "뿌리",
      "w": 2
    },
    {
      "from": "lin-seoro",
      "to": "catchphrase",
      "rel": "표어의 유래",
      "w": 1
    },
    {
      "from": "me",
      "to": "lin-sfl",
      "rel": "뿌리",
      "w": 2
    },
    {
      "from": "lin-sfl",
      "to": "catchphrase",
      "rel": "표어의 유래",
      "w": 1
    },
    {
      "from": "me",
      "to": "lin-namhae",
      "rel": "뿌리",
      "w": 2
    },
    {
      "from": "lin-namhae",
      "to": "catchphrase",
      "rel": "표어의 유래",
      "w": 1
    },
    {
      "from": "me",
      "to": "pain-persistence",
      "rel": "다루는 문제",
      "w": 1
    },
    {
      "from": "catchphrase",
      "to": "pain-persistence",
      "rel": "표어가 답하는 문제",
      "w": 2
    },
    {
      "from": "me",
      "to": "pain-expansion",
      "rel": "다루는 문제",
      "w": 1
    },
    {
      "from": "catchphrase",
      "to": "pain-expansion",
      "rel": "표어가 답하는 문제",
      "w": 2
    },
    {
      "from": "me",
      "to": "pain-deploy",
      "rel": "다루는 문제",
      "w": 1
    },
    {
      "from": "catchphrase",
      "to": "pain-deploy",
      "rel": "표어가 답하는 문제",
      "w": 2
    },
    {
      "from": "me",
      "to": "pain-discovery",
      "rel": "다루는 문제",
      "w": 1
    },
    {
      "from": "catchphrase",
      "to": "pain-discovery",
      "rel": "표어가 답하는 문제",
      "w": 2
    },
    {
      "from": "pain-discovery",
      "to": "prod-linkedgram",
      "rel": "이 문제를 푸는 제품",
      "w": 1
    },
    {
      "from": "me",
      "to": "pain-ai",
      "rel": "다루는 문제",
      "w": 1
    },
    {
      "from": "catchphrase",
      "to": "pain-ai",
      "rel": "표어가 답하는 문제",
      "w": 2
    },
    {
      "from": "me",
      "to": "method",
      "rel": "미션",
      "w": 2
    },
    {
      "from": "method",
      "to": "pain-persistence",
      "rel": "바닥",
      "w": 1
    },
    {
      "from": "method",
      "to": "pain-expansion",
      "rel": "바닥",
      "w": 1
    },
    {
      "from": "method",
      "to": "pain-deploy",
      "rel": "바닥",
      "w": 1
    },
    {
      "from": "method",
      "to": "pain-discovery",
      "rel": "바닥",
      "w": 1
    },
    {
      "from": "method",
      "to": "pain-ai",
      "rel": "바닥",
      "w": 1
    },
    {
      "from": "method",
      "to": "pr-바닥은-ai가-아니라-데이터다--구조가-엉성",
      "rel": "원칙",
      "w": 1
    },
    {
      "from": "method",
      "to": "pr-지식그래프는-ai-native-company",
      "rel": "원칙",
      "w": 1
    },
    {
      "from": "method",
      "to": "pr-ai가-못하는-일-을-지키는-게-아니라",
      "rel": "원칙",
      "w": 1
    },
    {
      "from": "method",
      "to": "pr-발견은-출시-후-마케팅이-아니라--태어날-때",
      "rel": "원칙",
      "w": 1
    },
    {
      "from": "method",
      "to": "pr-매칭을-더-정교화하는-게-아니라--버려진-신",
      "rel": "원칙",
      "w": 1
    },
    {
      "from": "method",
      "to": "pr-루프-위에서-조정하고--루프-안에-개입하지",
      "rel": "원칙",
      "w": 1
    },
    {
      "from": "me",
      "to": "w-vision-2025-04",
      "rel": "쓴 글",
      "w": 2
    },
    {
      "from": "catchphrase",
      "to": "w-vision-2025-04",
      "rel": "표어의 출처",
      "w": 2
    },
    {
      "from": "me",
      "to": "w-origin-2025-04",
      "rel": "쓴 글",
      "w": 2
    },
    {
      "from": "catchphrase",
      "to": "w-origin-2025-04",
      "rel": "표어의 출처",
      "w": 2
    },
    {
      "from": "me",
      "to": "w-jeongyeol-2025-04",
      "rel": "쓴 글",
      "w": 2
    },
    {
      "from": "catchphrase",
      "to": "w-jeongyeol-2025-04",
      "rel": "표어의 출처",
      "w": 2
    },
    {
      "from": "me",
      "to": "w-switching-hub-2025-08",
      "rel": "쓴 글",
      "w": 2
    },
    {
      "from": "catchphrase",
      "to": "w-switching-hub-2025-08",
      "rel": "표어의 출처",
      "w": 2
    },
    {
      "from": "me",
      "to": "w-office-manifesto-2026-08",
      "rel": "쓴 글",
      "w": 2
    },
    {
      "from": "catchphrase",
      "to": "w-office-manifesto-2026-08",
      "rel": "표어의 출처",
      "w": 2
    },
    {
      "from": "me",
      "to": "blog",
      "rel": "블로그",
      "w": 2
    },
    {
      "from": "blog",
      "to": "w-vision-2025-04",
      "rel": "대표 글",
      "w": 1
    },
    {
      "from": "blog",
      "to": "w-origin-2025-04",
      "rel": "대표 글",
      "w": 1
    },
    {
      "from": "blog",
      "to": "w-jeongyeol-2025-04",
      "rel": "대표 글",
      "w": 1
    },
    {
      "from": "blog",
      "to": "w-switching-hub-2025-08",
      "rel": "대표 글",
      "w": 1
    },
    {
      "from": "blog",
      "to": "w-office-manifesto-2026-08",
      "rel": "대표 글",
      "w": 1
    },
    {
      "from": "me",
      "to": "inv-repos",
      "rel": "실측 인벤토리",
      "w": 2
    },
    {
      "from": "me",
      "to": "inv-domains",
      "rel": "실측 인벤토리",
      "w": 2
    },
    {
      "from": "me",
      "to": "yr-2020",
      "rel": "연표",
      "w": 1
    },
    {
      "from": "me",
      "to": "yr-2022",
      "rel": "연표",
      "w": 1
    },
    {
      "from": "yr-2020",
      "to": "yr-2022",
      "rel": "다음 해",
      "w": 2
    },
    {
      "from": "me",
      "to": "yr-2025",
      "rel": "연표",
      "w": 1
    },
    {
      "from": "yr-2022",
      "to": "yr-2025",
      "rel": "다음 해",
      "w": 2
    },
    {
      "from": "me",
      "to": "yr-2026",
      "rel": "연표",
      "w": 1
    },
    {
      "from": "yr-2025",
      "to": "yr-2026",
      "rel": "다음 해",
      "w": 2
    },
    {
      "from": "me",
      "to": "clients",
      "rel": "함께 일한 곳",
      "w": 2
    },
    {
      "from": "clients",
      "to": "yr-2020",
      "rel": "이 무렵",
      "w": 1
    }
  ]
}