필드 판정 — token_links 확정

토큰 ↔ 객체 엣지. append-only 관측 로그라 마스터와 규칙이 다릅니다 — 덮어쓰지 않고, 그래서 update 메서드를 아예 만들지 않습니다. · contents(확정) · accounts(확정) · venues(확정)

확정  공용 10 · 최적화용 5 · 제거 2   (총 17 · 보류 없음)

확정된 token_links 스키마  — append-only 관측 로그
{
  _id                ObjectId   
  token_address      string        mint 주소. ObjectId 를 쓰지 않는다 — 토큰은 재분류·병합이 없다
  object             enum          contents | accounts | venues
  object_id          ObjectId      {object_id, linked_at} 이 "이 객체를 건 토큰 수" 의 유일한 경로

  source_url         string        재할당의 안전장치. object_id 는 바뀌어도 이 값은 안 바뀐다
  linked_at          Date          as-of 절단축. 덮어쓰면 순번이 복원 불가
  observed_at        Date       
  status             enum          ok · deleted · unavailable · unresolved
                                     상태 이력의 유일한 자리 — contents.fetch_status 를 제거했으므로
  name_match         bool       ○   title 이 가변이라 나중에 재계산 불가 → 관측 시점에 남긴다

  platform           enum          최적화용 대상에서 복사. 플랫폼별 집계를 1회 조회로
  subtype            enum          최적화용 draft 의 "tiktok search vs video 비교" 가 여기서 끝난다
  first_transfer_at  Date       ○   최적화용 Δt 계산 조인 0회. token_created_at 을 대체
  lineage[]          ObjectId[] 기본값 []  최적화용 자기+조상, 길이 상한 2
  link_depth         number        최적화용 lineage.length − 1

  created_at/updated_at  Date   
}

제거 2  content_key(= 유실 문제의 원인) · source_field(칸 구분이 지켜지지 않음)
질문 1 · 이 필드로 쿼리하는가?   아니오 → data   예 → 질문 2
질문 2 · 의미가 모든 대상에서 같은가?   아니오 → data   예 → 질문 3
질문 3 · 원본(SoT)이 다른 곳에 있는가?   예 → 최적화용   아니오 → 공용

필수 여부
  필수 ●  없으면 저장 불가    기본값  항상 존재    선택 ○  없을 수 있음
이 컬렉션의 쟁점 3개
  1. token_address 를 무엇으로 참조할지
     이름 규칙상 문자열이면 token_key, ObjectId 면 token_id 다.
     주소는 불변이고 tracker 와 주고받는 값이라 문자열이 편하지만,
     다른 참조가 전부 ObjectId 인 것과 어긋난다.

  2. lineage[] · link_depth 를 유지할지
     원본은 contents.parent_content_id 체인이라 파생값이다.
     유지하면 "$or 없이 실질 재사용 세기" 가 되고, 빼면 매번 체인을 펼쳐야 한다.

  3. name_match 를 여기로 받을지
     venues 에서 "토큰과 비교한 파생값" 이라 제거했다.
     저장한다면 (토큰, 객체) 쌍의 속성이므로 여기가 자리다.

이 컬렉션만의 제약
  append-only. status 가 ok → deleted 로 바뀐 시각이 신호라 덮어쓰면 복원 불가.
  contents 에서 fetch_status 를 제거했으므로 상태 이력은 여기에만 남는다.
필드 어디서 오나 · 무엇인가 Q1
쿼리
Q2
의미
Q3
원본
판정 근거 · 쟁점 판정 필수 메모

JSON 출력

복사해서 채팅에 붙여넣으시면 그대로 반영하겠습니다.