{
  "specVersion": "0.1",
  "slug": "tangible-data-dinov3-beans",
  "kind": "story",
  "authors": [
    {
      "name": "Joo-Haeng Lee",
      "affiliation": "Pebblous"
    }
  ],
  "language": "ko",
  "title": {
    "candidates": [
      {
        "text": "AI는 강낭콩 잎 사진을 어떻게 '비슷하다'고 볼까?",
        "form": "질문형"
      },
      {
        "text": "같은 잎 사진, AI의 렌즈를 바꾸면 이웃도 바뀐다",
        "form": "현재형 주장"
      },
      {
        "text": "강낭콩 잎 사진으로 들여다본 AI의 눈, 직접 눌러 보는 탐색기",
        "form": "신문 명사형"
      }
    ],
    "subtitle": "우간다 강낭콩 잎 사진 300장을 네 가지 AI 모델의 눈으로 비교하고, 신경망 층마다 바뀌는 값을 직접 눌러 보는 탐색기",
    "appTitle": "DINOv3 · Data Art Lab — 잎 사진에서 데이터 선택까지"
  },
  "evidence": [
    {
      "id": "images-300",
      "kind": "measured",
      "transform": "extracted",
      "from": [],
      "spec": "app/data/images.json",
      "desc": "iBean 공식 train 에서 선택한 300장 원본(클래스별 100장), SHA-256 대조. 전체 데이터셋 진단과 다르다"
    },
    {
      "id": "embeddings-4lens",
      "kind": "measured",
      "transform": "extracted",
      "from": [
        "images-300"
      ],
      "spec": "app/data/embeddings.json",
      "desc": "DINOv2-L·DINOv3-L·SigLIP 2·C-RADIOv4-H 4종 임베딩의 추출 provenance 와 분석 산출물. 웹 JSON 은 원시 고차원 행렬 전체를 담지 않는다"
    },
    {
      "id": "neighbors-8",
      "kind": "measured",
      "transform": "computed",
      "from": [
        "embeddings-4lens"
      ],
      "spec": "app/data/embeddings.json",
      "desc": "렌즈별 원공간 cosine 전수 비교 상위 8. 3D 화면 거리가 아니고 FAISS·H 커널 순위도 아니다"
    },
    {
      "id": "pca-3d",
      "kind": "measured",
      "transform": "projected",
      "from": [
        "embeddings-4lens"
      ],
      "spec": "app/data/embeddings.json",
      "desc": "렌즈별 독립 PCA 3축 투영(L2 정규화·평균 중심화·SVD). 모델·층 사이 좌표를 같은 좌표계로 읽지 않는다"
    },
    {
      "id": "patches-6",
      "kind": "measured",
      "transform": "computed",
      "from": [
        "images-300"
      ],
      "spec": "app/data/patches.json",
      "desc": "기존 6장 DINOv3-L 패치 추론 결과에서 계산한 196×196 cosine 지도 + 반복 확인 1회. 원시 패치 특징 전체가 아니라 사전 계산 유사도"
    },
    {
      "id": "layers-3x30",
      "kind": "measured",
      "transform": "extracted",
      "from": [
        "images-300"
      ],
      "spec": "app/data/layers.json",
      "desc": "#094·#183·#256 의 30단계 실제 텐서(입력·토큰·24 블록·최종 정규화). 클래스 전체 대표성 없음"
    },
    {
      "id": "layer-distances",
      "kind": "measured",
      "transform": "computed",
      "from": [
        "layers-3x30"
      ],
      "spec": "app/data/layers.json",
      "desc": "저장된 텐서에서 계산한 CLS·패치 cosine 거리와 변화 구간. 추론 없이 재계산 검증"
    },
    {
      "id": "h-selection-120",
      "kind": "measured",
      "transform": "computed",
      "from": [
        "embeddings-4lens"
      ],
      "spec": "app/data/embeddings.json",
      "desc": "DINOv3-L 공간 300→120 선택(diet-h-four-lens-beans-r40-2026-09-04) effect/absolute. 평가 = 공식 test 128 → validation 65 / final 63, 300장 전체·H 120·클래스 수 맞춘 무작위 120 을 같은 final 63 으로 비교한 탐색적 결과: 균형 정확도 +3.35%p. 다른 진단과 합치지 않는다"
    },
    {
      "id": "historical-greenhouse-audit",
      "kind": "measured",
      "transform": "computed",
      "from": [],
      "spec": "app/data/beans-context-audit.json",
      "desc": "별도의 과거 Greenhouse 부분집합 진단 기록(Govern 라벨 셔플·DINOv2-base cross-eval 등). H 효과의 근거가 아니며 전체 1,295장 진단으로 읽지 않는다"
    },
    {
      "id": "ema-gram-synth",
      "kind": "synthetic",
      "transform": "authored",
      "from": [],
      "spec": "app/math.js",
      "desc": "EMA 궤적·Gram 실험 — 원리 설명용 합성 예제. 실제 DINOv3 학습 로그 아님"
    }
  ],
  "sources": [
    {
      "name": "iBean (Makerere AI Lab · NaCRRI)",
      "url": "https://github.com/AI-Lab-Makerere/ibean",
      "terms": "MIT"
    },
    {
      "name": "TensorFlow Datasets beans",
      "url": "https://www.tensorflow.org/datasets/catalog/beans",
      "terms": "카탈로그(1,295장)"
    },
    {
      "name": "DINOv3 (Siméoni et al., 2025)",
      "url": "https://arxiv.org/abs/2508.10104",
      "terms": "논문"
    },
    {
      "name": "facebookresearch/dinov3 @6876159",
      "url": "https://github.com/facebookresearch/dinov3/tree/6876159a11b4df116f30f667f8c9888617df0751",
      "terms": "DINOv3 License"
    },
    {
      "name": "Pebblous PebbloScope API @d39926d",
      "url": "https://github.com/pebblousDev/pebbloscope-api-service/tree/d39926d7214e8d1012b797fa4545045aaee66ad6",
      "terms": "자사 코드(접근 권한 필요)"
    }
  ],
  "downloads": [
    {
      "path": "app/report.md",
      "label": "연구 보고서(Markdown)"
    },
    {
      "path": "app/data/embeddings.json",
      "label": "임베딩·이웃·선택 결과(JSON)"
    },
    {
      "path": "app/data/beans-context-audit.json",
      "label": "과거 Greenhouse 진단 기록(JSON)"
    }
  ],
  "findings": [
    {
      "text": "같은 잎, 다른 이웃 — 렌즈를 바꾸면 이웃 여덟 장이 갈아 끼워진다",
      "evidenceIds": [
        "neighbors-8",
        "embeddings-4lens"
      ]
    },
    {
      "text": "출력뿐 아니라 층 안으로 — 30단계 중 어느 블록에서 세 장의 거리가 벌어지는지",
      "evidenceIds": [
        "layers-3x30",
        "layer-distances"
      ]
    },
    {
      "text": "DINOv3-L 공간의 120장 선택이 클래스 수 맞춘 무작위보다 균형 정확도 +3.35%p (조건 한정)",
      "evidenceIds": [
        "h-selection-120"
      ]
    }
  ],
  "limits": [
    {
      "text": "진단 서비스가 아니다",
      "evidenceIds": []
    },
    {
      "text": "유사도 지도는 attention·인과 설명이 아니다",
      "evidenceIds": [
        "patches-6"
      ]
    },
    {
      "text": "3D 지도는 1,024차원의 일부",
      "evidenceIds": [
        "pca-3d"
      ]
    },
    {
      "text": "300장은 1,295장의 부분집합",
      "evidenceIds": [
        "images-300"
      ]
    },
    {
      "text": "EMA·Gram 은 합성",
      "evidenceIds": [
        "ema-gram-synth"
      ]
    },
    {
      "text": "과거 Greenhouse 기록은 H 효과의 근거가 아니다",
      "evidenceIds": [
        "historical-greenhouse-audit"
      ]
    }
  ],
  "version": "2.0",
  "snapshotDate": "2026-09-26",
  "sourceCommit": null,
  "sourceDirty": true,
  "createdAt": "2026-09-26T00:00:00Z",
  "updatedAt": "2026-09-26T10:19:54Z",
  "entry": "app/index.html",
  "reportPath": "app/report.md",
  "uiRegister": "합쇼체",
  "publishApproval": {
    "status": "approved",
    "by": "joohaeng",
    "at": "2026-09-26T10:30:00Z",
    "note": "형님 지시(2026-09-26): '아래의 새버전을 넣어 주면 좋겠는데' — v2 를 첫 편의 새 판으로 발행"
  },
  "verifyResultPath": "verify-result.json",
  "rights": [
    {
      "target": "beans JPEG 300장",
      "source": "AI-Lab-Makerere/ibean",
      "terms": "MIT",
      "evidence": "docs/licenses/IBEAN-LICENSE.txt",
      "status": "confirmed",
      "required": true
    },
    {
      "target": "DINOv3 파생 임베딩·패치 지도·중간 텐서",
      "source": "facebookresearch/dinov3 MODEL_CARD·LICENSE.md",
      "terms": "DINOv3 License",
      "evidence": "DINOv3 License(facebookresearch/dinov3 LICENSE.md, 2025): §1.a 사용·복제·배포·파생 허용, §1.b.ii 연구 결과 발표 시 사용 고지(기사 출처 절에 논문·코드·모델 카드 고지), §1.b.v 금지 용도 해당 없음, 출력물(outputs and results) 제한 조항 없음. **형님 확인 2026-09-26** (법률 의견 아님, 페블러스 판단)",
      "status": "confirmed",
      "required": true,
      "confirmedBy": "joohaeng",
      "confirmedAt": "2026-09-26"
    },
    {
      "target": "DINOv2-L·SigLIP 2·C-RADIOv4-H 파생 임베딩(이웃·투영·선택 결과)",
      "source": "각 모델 카드",
      "terms": "각 모델 라이선스",
      "evidence": "docs/RIGHTS.md — 원시 행렬 미포함, 계산 결과만",
      "status": "unconfirmed",
      "required": true
    },
    {
      "target": "Pebblous 로고·파비콘(SVG)",
      "source": "Pebblous 브랜드 자산",
      "terms": "자사 자산(재라이선스 없음)",
      "evidence": "docs/RIGHTS.md",
      "status": "confirmed",
      "required": true
    },
    {
      "target": "웹 코드·본문·실험 기록",
      "source": "Pebblous 연구 워크벤치",
      "terms": "자사 저작물(별도 공개 라이선스 부여 없음)",
      "evidence": "docs/RIGHTS.md",
      "status": "confirmed",
      "required": true
    },
    {
      "target": "Pretendard OTF",
      "source": "orioncactus/pretendard",
      "terms": "SIL OFL 1.1",
      "evidence": "변환본에서 제외 — jsDelivr CDN(Pretendard Variable) 로 대체",
      "status": "excluded",
      "required": false
    },
    {
      "target": "TT Firs Neue Variable OTF",
      "source": "Pebblous 디자인 자산",
      "terms": "재배포 권한 미확인",
      "evidence": "변환본에서 제외 — Google Fonts Outfit 로 대체",
      "status": "excluded",
      "required": false
    }
  ],
  "externalRuntime": [
    {
      "url": "https://cdn.jsdelivr.net/gh/orioncactus/pretendard@v1.3.9/dist/web/variable/pretendardvariable.min.css",
      "purpose": "font"
    },
    {
      "url": "https://fonts.googleapis.com/css2?family=Outfit:wght@400;600;700;800&display=swap",
      "purpose": "font"
    }
  ],
  "stats": {
    "fileCount": 431,
    "totalBytes": 110223364,
    "treeHash": "34c5079ec583c3c63e31a5ae85ae5eb3dcb4e12e59a83562db043add44c49304",
    "hashBase": "story/tangible-data-dinov3-beans/ (경로 접두 app/)"
  },
  "sourceChanges": [
    "dinov3-data-art-lab-v2 는 git 저장소가 아닌 작업 사본(README: 'V1과 분리한 로컬 비교용 작업 사본')",
    "표현 계층 변경: index.html·lab.css(신규)·lab.js(신규)·app.js·context.css·layers.js·navigation.js·patches.js·report.md — 과학 계산·data/·assets/ 는 V1 과 바이트 동일(README)"
  ],
  "exceptions": [
    {
      "check": "register",
      "reason": "v2 UI 는 합쇼체 중심(문장 327 중 합쇼체 249). 형님 확정(09-25) '지금 편은 그대로, 앞으로는 해라체' + 09-26 v2 반영 지시에 따라 이번 판도 원본 문체 유지. 다음 판부터 해라체",
      "approvedBy": "joohaeng",
      "at": "2026-09-26"
    },
    {
      "check": "rights",
      "target": "DINOv2-L·SigLIP 2·C-RADIOv4-H 파생 임베딩(이웃·투영·선택 결과)",
      "reason": "원시 행렬 미포함, 계산 결과만 공개. 권리 판정 대기. 형님 v2 반영 지시로 발행",
      "approvedBy": "joohaeng",
      "at": "2026-09-26"
    }
  ],
  "preparedBy": "blog-service 접수 세션(Claude)이 v2 작업 사본에서 꾸림 — 실험 쪽 선언(draft1)과 v0.1.1 예제를 바탕으로. 검증 4개는 접수 쪽에서 재실행",
  "basedOn": {
    "treeHash": "c6e1aa9ef23a419725988a4f46d0f6eeb7c6b1df0a0f75c2ac80f22d395567b8",
    "manifest": "dinov3-tangible-intake-20260926-v2/package/tangible.json"
  },
  "transforms": [
    {
      "type": "design",
      "what": "assets/brand/*.otf 4개 제외(TT Firs Neue 권리 미확인, Pretendard 는 CDN)"
    },
    {
      "type": "design",
      "what": "brand.css @font-face 4줄 제거, --pb-font-sans/--pb-font-display 를 CDN 서체로"
    },
    {
      "type": "copy",
      "what": "index.html 에 Pretendard CDN·Outfit 링크, 마스트헤드 edition 'Tangible Data / DINOv3'"
    },
    {
      "type": "copy",
      "what": "index.html 라벨 '연구 노트 01 · 로컬 V2' → '연구 노트 01 · 2판' (공개 화면 표기, 형님 승인 2026-09-26)"
    }
  ],
  "note": "변환본(블로그 발행본) 선언 — 2판(v2.0, 2026-09-26). 예외 3건은 이 판에만 유효",
  "sizeReview": {
    "decision": "accept",
    "by": "joohaeng",
    "at": "2026-09-26",
    "reason": "105MB — 1판과 같은 크기, 첫 화면은 사진 세 장 먼저 로딩"
  }
}
