절차는 소셜 생성기 착수 프로세스 에 있습니다. 이 문서는 이번 소셜에서 사람이 골라야 하는 것만 담습니다. 고르면 아래에 답이 조립되니 그대로 돌려주시면 됩니다.
classify · fetchByUrl ·
이미지 필드(contentUrl·images·thumbnail·iconImg)까지 들어가 있습니다.ContentSubtype.POST · VenueSubtype.SUBREDDIT.ContentMetrics 에 upVotes·score·
upvoteRatio·numCrossposts 가 Reddit 블록으로 선언돼 있고,
commentsCount 는 Instagram 과 공용입니다.$0.04/run · 8.5배 는 글 URL 기준으로는 틀린 값이었습니다 — 아래 실측 상자.fetchByUrl(url) 하나가
RedditPost | RedditUser | RedditCommunity 를 낸다 —
입력 종류와 산출 종류가 어긋나기 때문입니다(subreddit URL 을 넣어도 dataType:'post' 가 옵니다).
D-015 의 유일한 예외입니다.scaffold/reddit.json 이 없습니다 —
sources/reddit.html 이 수기 작성이라 기계 대조가 안 됩니다.
qna/reddit.md 는 있고 조인키·share·필드 누락 2건을 잡았습니다.초안이 추정으로 적어둔 것 셋을 실제로 불러서 확인했습니다. 셋 다 초안과 달랐습니다. 이 표가 V-1(Venue 미생성) 확정과 결정 R-1·R-3 의 근거입니다.
| URL | 반환 건수 | 첫 건의 dataType | 구성 | 과금 |
|---|---|---|---|---|
/r/{sub}/comments/{id} 글 | 1 | post | 글 1건 | $0.022 |
/r/{sub} 서브레딧 | 10 | post | 글 10건 — community 가 한 건도 없음 | $0.04 |
/user/{u} 유저 | 21 | user_profile | 프로필 1 + 댓글 20 | $0.062 |
maxItems:1 은 글 URL 에서만 지켜집니다. 초안의 "실측상 무시된다(4건+)" 는
어느 run 에도 없던 숫자였습니다. skipComments:true 도 유저 URL 에서 무시됩니다(댓글 20건).dataType 이 'user' 가 아니라 'user_profile' 이었습니다.
fetcher 는 case 'user' 만 보고 있어서 모든 유저 URL 이 default → toPost 로 흘렀고,
user_profile 에는 authorName 이 없어 requireKey 가 던졌습니다 —
유저 URL 전량이 예외였습니다. Generator 가 없어 드러나지 않았을 뿐입니다.
→ 착수 전에 고쳤습니다(회귀 테스트 포함). 결정 사항이 아닙니다.dataType:'community' 를 아직 한 번도 못 봤습니다.
서브레딧을 요청해도 글만 옵니다. 즉 toCommunity() 는 도달 불가일 수 있습니다(R-7).초안을 쓴 뒤 X · YouTube · Telegram · Instagram · GitHub 의 결정과 대조했습니다. 일치 3건 · 새로 드러난 것 3건입니다.
| 선례 | ||
|---|---|---|
| 일치 | I-10 — Instagram 검색을 호출 0회로 행 1건. 근거는 "비용 0 + 어휘가 이미 있음" | reddit_search 가 classify 에 이미 있고 ContentSubtype.SEARCH 도 있다 → R-4 ①과 같은 방향 |
| 일치 | G-17 — 팔로워류는 이름 무관 metrics.followers 로 통합 |
followersCount → 같은 자리. GitHub 에서도 같은 답이었다 |
| 일치 | R-0.9 — classify 분기를 전부 표에 나열 | 코드 8분기 vs 표 9행. 빠짐없이 대응한다 ✅ |
crawledAt 이 observedAt 과 겹칩니다. AccountInput.observedAt 은
필수 필드로 이미 있는데(우리가 넘기는 값) ContentInput 에는 없습니다.
Reddit 은 양쪽에 crawledAt 을 주므로 객체마다 답이 갈립니다 → R-10params.get('q') 만 씁니다 —
/r/A/search?q=x 와 /r/B/search?q=x 가 같은 키가 됩니다.
X 는 전역 검색이라 문제가 없었는데 Reddit 은 서브레딧 스코프입니다 → R-11displayUrl·videoUrl 은 같은 그림의
해상도 변형이 아니라 서로 다른 자산이라 G-16 의 '변형 1개' 규칙에 안 걸린다" 고 판정했습니다.
Reddit 의 images[] 는 갤러리라 서로 다른 이미지지만
thumbnail 은 그중 하나의 축소판일 수 있어 규칙에 걸립니다 → R-6 에 반영호스트 2종(reddit.com · redd.it). 관측 합계 161건.
| URL 형태 | 관측 | sourceType | sourceKey | 무엇이 되나 | 결정 |
|---|---|---|---|---|---|
| Content — post | |||||
/r/{sub}/comments/{postId}/{slug} | 106 | reddit_post |
postId (원형) | Content 1 + Account 1 (+ Venue?) | R-1 · R-2 · R-5 |
redd.it/{postId} | 0 | reddit_post |
첫 세그먼트 | 〃 | 〃 |
| Creator — user | |||||
/user/{name} · /u/{name} | 18 | reddit_user |
username (소문자) | Account 1 | R-3 |
| Venue — subreddit | |||||
/r/{sub} | 16 | reddit |
subreddit (소문자) | 🔴 post 가 온다 | R-2 |
/r/{sub}/new 등 탭 | 4 | reddit |
〃 (탭 무시) | 〃 | R-2 |
| 비객체 · 미해석 | |||||
/r/{sub}/search?q= | 7 | reddit_search |
검색어 (소문자) | 미정 | R-4 |
/r/{sub}/s/{shareId} | 10 | reddit_share |
shareId | 미정 — IP 차단으로 해석 불가 | R-5 |
| 빈 경로 | — | unknown | null |
없음 · UNSUPPORTED | — |
⚠️ 그 외 전부 — reddit.com/{segment} | — | reddit catch-all | {segment} (소문자) |
🔴 reddit.com/settings 가 가짜 서브레딧 키가 된다 | R-9 |
RedditPost 22필드)| 자리 | Reddit 원본 | 상태 |
|---|---|---|
| top-level | ||
platform · subtype | reddit · POST | ✅ enum 에 있다 |
platformKey | parsedId | ✅ 확정 |
publishedAt | createdAt | ✅ 확정 |
text.primary · text.body | title · body |
✅ 확정 — body 는 audit 문서에 통째로 빠져 있던 필드(qna 가 발견) |
outboundUrls | contentUrl? | 🟡 R-6 — 링크형 post 의 대상 URL |
mediaUrls | images[] · thumbnail |
🟡 R-6 — images[] 는 갤러리(서로 다른 자산)라 I-6 처럼 전부 담고,
thumbnail 은 그중 하나의 축소판일 수 있어 G-16 의 "변형 1개" 에 걸린다 |
tags · mentions | 해당 없음 | ✅ 비운다 |
creatorId | authorName |
✅ Writer 가 채운다(R-12) — 같은 묶음에서 |
venueId | — | 항상 빈다 — Venue 를 만들지 않는다(V-1) |
| metrics — 자리가 이미 다 있다 | ||
upVotes · score · upvoteRatio · commentsCount · numCrossposts |
동일 | ✅ 확정 — Reddit 블록이 선언돼 있다 |
| data | ||
| 자리가 없다 ×7 | domain · outboundUrlHost · removedByCategory ·
removedBy · bannedBy · subredditSubscribers · crawledAt |
🔴 R-6 — 모더 삭제 3종이 스캠 tell, crawledAt 은 as-of 앵커 |
RedditUser 9필드)| 자리 | Reddit 원본 | 상태 |
|---|---|---|
platformKey · handle | username 둘 다 |
✅ 확정 — 변경 불가라 이름이 곧 키(qna Q1) |
accountCreatedAt · bio | createdAt · bio | ✅ 확정 |
avatarUrl | iconImg | ✅ G-16 그대로 · 선행 0건 |
metrics.followers | followersCount | ✅ G-17 통합 규칙 |
displayName | 주는 필드가 없다 | ✅ 비운다 — Reddit 은 표시명 개념이 약하다 |
| 자리가 없다 ×4 | totalKarma · linkKarma · commentKarma · crawledAt |
🔴 R-6 — 카르마 3종이 계정 나이와 함께 봇 판별 축 |
초안의 이 표는 RedditCommunity 6필드를 전제로 짰는데, 그 응답을 얻는 URL 경로가 없습니다.
Venue 를 두지 않기로 했으므로 아래는 어디로 대신 가는가의 표입니다.
| 원래 가려던 자리 | Reddit 원본 | 실제 처리 |
|---|---|---|
platformKey · name | parsedCommunityName |
→ content.data.communityName |
metrics.members | subredditSubscribers |
→ content.data.subredditSubscribers (원래 이름 유지 · G-7) |
description · venueCreatedAt | publicDescription · createdAt |
❌ 얻을 경로 없음 — venueCreatedAt 부재가 유일하게 아픈 손실 |
subtype | (고정) SUBREDDIT | 미사용이 된다 |
creatorId | 해당 없음 | Reddit 이 공개하지 않음 |
Telegram 이 13, GitHub 이 8 이었고 Reddit 은 11 입니다(Content 7 · Account 4).
그중 모더레이터 삭제 3종(removedByCategory·removedBy·bannedBy)이
스캠·스팸 tell 이고, crawledAt 은 mutable 지표의 as-of 앵커라
actor 가 직접 주는 값입니다 — 우리 fetch 시각보다 정확합니다.
이 소셜이 만드는 것은 Content 와 Account 둘뿐입니다. GitHub 과 같은 모양이 됩니다. 서브레딧 정보는 버리지 않고 Content 에 남깁니다 — post 응답에 공짜로 딸려오기 때문입니다.
content.data.communityName "solana" content.data.subredditSubscribers 520971
| 슬롯 | 출처 | |
|---|---|---|
platform · subtype | 고정값 | 응답에서 오는 값이 아님 |
platformKey | ✅ solana | parsedCommunityName |
name | ✅ r/solana | communityName |
metrics.members | ✅ 520971 | subredditSubscribers |
description | ❌ | community 응답에만 있고 그 경로가 없음 |
venueCreatedAt | ❌ | |
creatorId | ❌ | Reddit 이 방 개설자를 공개하지 않음 |
metrics.moderatorCount · data.moderators · data.adminHandle · data.iconUrl | ❌ | post 응답 키 71개 전수 확인 — 없음 |
즉 members 말고는 조회·판별에 쓸 값이 없습니다. 그 하나를 위해 객체를 만들 이유가 약합니다.
관측 174건이 속한 서브레딧 82개 중 URL 이 2건 이상 모인 곳입니다.
r/wallstreetbets URL 15건 · 토큰 63개 r/cats URL 14건 · 토큰 58개 r/aww URL 9건 · 토큰 42개 r/interestingasfuck URL 9건 · 토큰 39개
전부 공용 밈 서브레딧입니다. 토큰이 링크한 것은 "우리 방" 이 아니라 밈의 출처입니다. "63개 토큰이 r/wallstreetbets 를 참조했다" 는 wallstreetbets 가 유명하다는 뜻이지 그 토큰들에 대해 아무것도 말해주지 않습니다 — 조인축으로서 변별력이 없습니다.
🔴 Telegram 과 정반대입니다. 저쪽 채널은 프로젝트가 직접 만든 방이라 개설일·가드봇·메시지 수가
전부 판별 근거였고 data 만 14필드를 채웠습니다. 여기는 남의 방입니다.
/r/solana 를 부르면 오는 첫 글은 모더레이터의 규칙 안내글입니다(actor 가 stickied 를 먼저 줍니다).
title "Welcome to /r/Solana - Read This To Get Started" authorName ansi09 ← 모더레이터 createdAt 2025-03-29 ← 16개월 전 upVotes 22 · stickied true
이것을 저장하면 모더레이터가 "이 토큰과 연결된 계정" 이 됩니다. 러그 판별이 목적인 그래프에서 서브레딧 운영자를 스캠 토큰에 엮는 것은 잘못된 간선입니다.
/r/{sub} URL 은 호출하지 않습니다(관측 6건 · 3.4%). 불러봐야 안내글이므로
0콜 + UNSUPPORTED 입니다 — 근거는 아래 URL 종류별 처리 표.toCommunity() · RedditCommunity 를 지웁니다. 애초에 도달 불가였습니다 —
dataType:'community' 는 키워드 검색으로만 나오고 URL 조회 경로가 없습니다
(actor input schema 확인: searchCommunities = "Include communities in keyword search results").VenueSubtype.SUBREDDIT 이 미사용이 됩니다. X 의 COMMUNITY 처럼 남겨둬도 무해합니다.maxPostsCount: 1 을 input 에 추가합니다. 안 보내면 actor 기본값 10 이 적용됩니다 —
이것이 서브레딧 10건·유저 21건의 원인이었습니다. 넣으면 각각 1건·2건이 되고, 무엇보다
items[0] 의 모호함이 사라집니다.
(비용 효과는 작습니다 — 월 $10.93 → $10.52. 관측의 96% 가 이미 1건짜리 글 URL 이므로.)계정을 만드는 경로는 /user/{name} 하나뿐입니다. 글 URL 은 Content 만 내고
creatorId 는 빈 채로 둡니다. R-1 의 ③입니다.
R-18 은 "같은 객체를 만드는 경로가 둘이면 산출이 같아야 한다" 입니다. post 에서 계정을 안 만들면 경로가 하나만 남으므로 규칙이 적용될 대상 자체가 사라집니다.
②(양쪽을 username 만으로)와 비교하면 ③이 낫습니다 — ②는 /user/ 가
실제로 주는 9필드를 일부러 버리는데, ③은 버리지 않습니다.
| 소셜 | R-18 해법 | 추가 호출 | 그 호출의 비용 |
|---|---|---|---|
| X | 애초에 문제 없음 — tweet.author 가 완전 | 0 | — |
| TikTok | 〃 video.author 가 완전 | 0 | — |
| YouTube | ① 1콜 더 | +1 | 1 unit — 사실상 무료 |
| ① 1콜 더 | +1 | $0.0027 — 전량 ≈ $0.48 | |
| GitHub | ① 1콜 더 | +1 | 무료 |
| ③ 만들지 않는다 | 0 | ①이면 +$0.062 — 원가의 3.8배 |
①을 고른 셋은 추가 호출이 공짜에 가까웠기 때문입니다. Reddit 만 유일하게 비쌉니다 (유저 URL 이 21건을 뱉어서 — 실측). 전량 적용하면 월 +$26 으로 3소셜 합계가 두 배가 됩니다.
그리고 ③ 자체는 이미 코드에 있습니다 — YouTube·Instagram 이 보조 호출 실패 시 하는 행동이 정확히 이것입니다.
⚠️ 껍데기 계정을 만드는 쪽으로 흘러가지 않는다(G-6). 채널 조회가 실패하면
2필드짜리 계정을 만드는 대신 계정을 아예 만들지 않는다 — 만들면 그 모양이
영구히 고착되어 R-18 을 어긴 채로 굳는다.
— youtube.generator.ts:160
creator: null 을 SocialObjectGroup 이 받게 이미 설계돼 있습니다.
Reddit 은 그것을 예외가 아니라 기본으로 쓰는 것뿐입니다.
V-1 에서 본 분포가 그대로 적용됩니다. 가장 많이 링크된 글은
r/mildlyinteresting 의 고양이 사진이고 토큰 26개가 달라붙었습니다.
그 글을 쓴 사람은 고양이 사진을 올린 일반 레딧 유저입니다.
계정을 만들면 그래프에서 "이 계정이 26개 스캠 토큰에 등장한다" 로 읽히는데 사실이 아닙니다 —
V-1 과 같은 종류의 잘못된 간선입니다.
계정을 만드는 경로가 /user/ 하나인데 관측상 고유 1건입니다.
즉 이 소셜의 산출은 Content 153 + Account 1 이 됩니다.
반대 근거가 하나 남아 있습니다 — r/dogecoin·r/shiba 같은 코인
서브레딧의 글은 프로젝트가 직접 썼을 수 있고, 그럼 작성자가 진짜 신호입니다.
밈 서브레딧과 코인 서브레딧이 섞여 있어 일괄로 버리면 진짜도 같이 버립니다.
서브레딧별로 갈라 코인 서브레딧에서만 작성자를 부르는 안도 가능하지만, 판정 기준을 우리가 지어내야 해서 채택하지 않았습니다 — R-9 의 "추측으로 예약어를 만들면 진짜 서브레딧을 막는다" 와 같은 함정입니다. 관측이 쌓이면 다시 봅니다.
reddit 의 UNSUPPORTED 는 G-20 의 기준으로 고른 값입니다 —
"무엇이 바뀌면 성공하나" 가 판정 문장이고, 여기 답은 "우리가 Venue 를 만들면" 입니다.
SKIPPED_PAID 가 아닌 이유는 호출이 0회라 게이트 밖이기 때문입니다 —
유료를 켜도 아무것도 안 생깁니다.
sourceType | 관측 고유/링크 | 호출 | 만드는 객체 | status |
|---|---|---|---|---|
reddit_post | 153 / 620 | 유료 1회 | Content 만 — creatorId 빔 | OK |
reddit_user | 1 / 12 | 유료 1회 | Account 만 — 9필드 온전히 | OK |
reddit (subreddit) | 6 / 40 | 0회 | 없음 | UNSUPPORTED |
reddit_share | 14 / 59 | R-5 미결 | ||
reddit_search | 0 / 0 | R-4 미결 | ||
unknown | — | 0회 | 없음 | UNSUPPORTED |
객체(Content·Account·Venue)를 안 만든다는 뜻이고, URL 자체는 언제나 남습니다.
collectOne 이 status 와 무관하게 TokenSocialUrlInput 을 반환해
tokens.social_urls[] 에 들어갑니다. 링크가 사라지지는 않습니다.
초안의 카드들은 audit 의 다른 집계를 썼고 지금 세 곳이 어긋납니다 —
/user/ 18 vs 1, post 106 vs 153, search 7 vs 0.
이 표는 report.html(--from 2026-07-25 --to 2026-08-04 --min-af-count 3)의
링크 그룹을 직접 파싱한 값입니다. R-4·R-5 의 무게가 이 숫자에 걸려 있어 착수 전에 맞춰야 합니다.
카드에 인용된 관측 수치가 두 집계에서 나왔고 서로 다릅니다. 착수 전에 맞췄고, 결론은 둘 다 맞으며 결정에는 영향이 없다 입니다.
sourceType | audit (2026-07-29 · 총 161건) | report (07-25~08-04 · --min-af-count 3 · 고유 174건) |
|---|---|---|
reddit_post | 106 | 153 |
reddit (서브레딧) | 20 | 6 |
reddit_user | 18 | 1 |
reddit_share | 10 | 14 |
reddit_search | 7 | 0 |
같은 것을 세지 않았습니다. audit 은 다른 시점의 관측 전량이고, report 는
--min-af-count 3 을 통과한 토큰의 고유 URL 입니다. 모집단이 달라
어느 쪽도 틀린 값이 아닙니다.
| 결정 | 답 | 수치에 걸려 있나 |
|---|---|---|
| V-1 Venue | 만들지 않는다 | ❌ 서브레딧이 20건이든 6건이든 Venue 에 채울 값이 members 하나인 것은 같다 |
| V-2 (R-1) | ③ 계정 미생성 | ❌ ③은 아무것도 버리지 않는다. /user/ 가 18건이면 ②의 손해가 커질 뿐이고, 우리는 ②를 안 골랐다 |
| R-4 검색 | ① 호출 0회 | ❌ 0콜이라 건수와 비용이 무관하다. 0건이면 그 경로가 안 돌 뿐이고, 오면 처리한다 |
| R-5 share | ① UNSUPPORTED | ❌ 10건이든 14건이든 처리가 같다 |
🔴 제가 "R-4·R-5 의 무게가 이 숫자에 걸려 있다" 고 적었던 것은 과장이었습니다 — 실제로 대조해 보니 네 결정 모두 건수와 무관합니다. 수치가 결정을 가르는 자리는 비용이 건수에 비례하는 선택지뿐인데, 고른 답이 전부 호출 0회이거나 추가 호출 없음이라 그 자리가 생기지 않았습니다.
앞으로 인용할 기준은 report 입니다 — 실제 파이프라인이 보게 될 모집단
(--min-af-count 3 필터가 프로덕션에도 걸린다)과 같기 때문입니다.
| # | 물음 | 답 |
|---|---|---|
| R-3 | /user/ 도 kind 로 분기하나 | ① kind 로 분기하고 무엇이 오든 그것을 만든다 |
| R-4 | 검색 | ① G-4 대로 호출 0회로 검색어 행 1건 |
| R-5 | share (IP 차단) | ① UNSUPPORTED 로 둔다 (현행) |
| R-6 | 자리 없는 11필드 | ① 전부 data 로 (카르마 3종 포함) |
| R-8 | [deleted] 계정 | ① [deleted] 면 계정을 만들지 않는다 |
| R-9 | classify catch-all | ① 현행 유지 — 유료 게이트 켤 때 다시 본다 |
| R-10 | crawledAt vs observedAt | ① Content 에만 담는다 |
| R-11 | 검색 키에 서브레딧 | 🔄 절충안 — 키는 쿼리, 서브레딧은 data |
post.author 로 계정을 만드나 — R-18 이 걸린다답: ③ — post 경유로는 계정을 만들지 않습니다. 근거는 V-2 절에 있습니다.
초안은 ②(양쪽을 username 만으로)를 권장하며 "직접 조회 쪽이 손해" 라 했는데,
그 손해의 크기를 /user/ 18건 으로 잡고 있었습니다. 실제 관측은 고유 1건이라
②의 이득(모양 통일)이 거의 0 이고 손해(9필드 폐기)만 남습니다.
①은 실측 후 더 비싸졌습니다 — 유저 URL 이 21건을 뱉어 추가분이 $0.04 가 아니라 $0.062 였고, 전량 적용하면 월 +$26 입니다.
답: 아무것도 만들지 않고, 부르지도 않습니다.
초안은 ①(응답 kind 를 따라 post 를 저장)을 권장했습니다. 근거는
"이미 받은 것을 버리는 게 아깝다" 였는데, 받는 것이 모더레이터의 규칙 안내글이라는 것이
실측으로 드러났습니다(V-1 근거 ③). 저장하면 운영자가 토큰에 엮이는 잘못된 간선이 생깁니다.
②(Venue 만 만든다)를 막던 근거는 "2필드짜리 껍데기" 였는데
실제로는 5필드(불변 communityId 포함) 였습니다. 그래도 쓸 값이 members 하나라
Venue 자체를 두지 않는 쪽으로 갔습니다.
→ /r/{sub} 는 호출 0회 · 링크 1행. 서브레딧 정보는 글 URL 을 부를 때
content.data 로 공짜로 들어옵니다.
/user/{name} 이 user 응답을 준다고 보장되나R-2 와 같은 축입니다. subreddit URL 이 post 를 주는 것이 확인됐으니,
/user/ 도 다른 것이 올 수 있습니다.
🔄 V-2 로 이 카드의 무게가 줄었습니다. 계정을 만드는 경로가 /user/ 하나뿐이라,
어긋남이 생길 수 있는 자리도 그 하나입니다(관측 고유 1건). 남는 물음은 "글 URL 이 유저를 주면 어쩌나" 쪽입니다.
초안은 "실측 근거가 없다" 였는데 이제 있습니다. /user/spez → 21건이 오는데
첫 건이 user_profile 이고 나머지는 그 유저의 댓글 20 + 글 1 입니다.
즉 items[0] 만 쓰는 현행 방식에서 유저 URL 은 유저를 줍니다.
그래서 이 카드는 "어느 쪽이 안전한가" 가 아니라 "규칙을 한 곳에 둘 것인가" 로만 남습니다 — ②를 골라도 실제로 걸러낼 대상이 없습니다(어긋나지 않으므로). 다만 순서가 계약이 아니라는 점은 남습니다 — actor 가 정렬을 바꾸면 조용히 깨집니다.
/r/{sub}/search?q= 를 어떻게 끝내나관측 7건. G-4 가 이미 규칙을 정해뒀습니다 —
검색은 호출 0회로 검색어 행 1건을 만들고 키는 쿼리 정규화값입니다(X-10).
ContentSubtype.SEARCH 도 이미 있습니다.
다만 G-4 에 단서가 붙어 있습니다 — "TikTok·Instagram 검색도 같은 규칙을 따르되, 그쪽은 유료 fetch 가 이미 가능해 부를지 말지는 소셜별로 갈릴 수 있다". Reddit 도 유료로는 부를 수 있습니다.
/r/{sub}/s/{shareId} — 10건이 미해석입니다관측 10건(6.2%)으로 적지 않습니다.
해석하면 post 인데 Reddit 이 우리 IP 를 전 경로 차단(403) 해 무료 HEAD 로 못 풉니다
(qna Q2 실측: /s/·일반 subreddit·일반 post·old.reddit 전부 403, redd.it 만 301).
그런데 유료 actor 는 부를 수 있습니다. actor 가 URL 을 받으므로 share 링크를 그대로 넣으면 actor 쪽에서 리다이렉트를 따라갈 가능성이 있습니다 — 미검증입니다.
| 객체 | 필드 | 왜 중요한가 |
|---|---|---|
| Content | removedByCategory · removedBy · bannedBy |
모더레이터 삭제 = 스캠·스팸 tell |
| Content | domain · outboundUrlHost |
드레이너·사칭 도메인 tell |
| Content | subredditSubscribers | 게시 시점 서브레딧 규모 스냅샷 |
| Content · Account | crawledAt ×2 |
as-of 앵커 — actor 가 직접 주므로 우리 fetch 시각보다 정확하다 |
| Account | totalKarma · linkKarma · commentKarma |
계정 나이와 함께 봇 판별 축 |
카르마 3종의 자리가 갈립니다. Account 라 시계열이 없어(G-17) metrics/data 선택에
기능 차이가 없습니다. AccountMetricsInput 은 followers 하나뿐이라 어느 쪽이든 신설이 필요합니다.
subredditSubscribers 와 membersCount — 같은 수인데 출처가 둘답: 출처가 하나뿐이라 고를 것이 없어졌습니다.
membersCount 는 dataType:'community' 응답에만 있는데
그 응답을 얻는 URL 경로가 없습니다(키워드 검색 전용 — V-1 정리 2건째).
따라서 실제로 존재하는 값은 post 에 동봉된 subredditSubscribers 하나입니다.
Venue 를 두지 않으므로 갈 자리도 하나입니다 —
content.data.subredditSubscribers. 원래 이름을 지킵니다(G-7).
[deleted] 계정을 어떻게 하나계정이 삭제되면 authorName 이 '[deleted]' 로 치환됩니다.
보조키가 없습니다 — parsedAuthorId 를 fetcher 에서 뺐기 때문입니다
(audit: "username 이 불변이라 보조키가 불필요하다").
그대로 두면 platform_key='[deleted]' 인 계정 하나에 삭제된 모든 작성자가 병합됩니다.
design §9 에 이미 한계로 올라가 있습니다.
/r/ 없이 온 루트 경로가 전부 서브레딧으로 분류됩니다 —
reddit.com/settings 가 reddit / 'settings' 가 됩니다.
fetcher 착수 때 Q4 로 올려두고 열어둔 건입니다.
🔄 비용 논거가 사라졌습니다(2026-08-11). 초안은 "이 catch-all 이 만드는 키는 subreddit 이라 1건이 $0.04 로 다른 소셜의 8~15배" 였는데, V-1 로 서브레딧 sourceType 이 호출 0회가 되면서 가짜 키의 비용도 0 이 됩니다. 남는 것은 비용이 아니라 데이터 위생입니다 — reddit/'settings' 같은 행이 링크로만 쌓입니다.
다만 관측 집계가 없어(scaffold 부재) 추측으로 예약어를 만들면 진짜 서브레딧을 막습니다 — 그 위험은 그대로입니다.
crawledAt 을 담나 — observedAt 과 겹칩니다Reddit actor 는 Content 와 Account 양쪽에 crawledAt 을 줍니다.
audit 이 이것을 "mutable 지표의 as-of 앵커. actor 가 직접 주므로 우리 fetch 시각보다 정확하다"
로 판정했습니다.
| 객체 | 스키마에 관측 시각이 | 그래서 |
|---|---|---|
| Account | observedAt 이 필수 필드로 있다 |
둘이 겹친다 — 우리가 넘긴 시각 vs actor 의 크롤 시각 |
| Content | 없다 | crawledAt 이 유일한 as-of 앵커다 |
Content 쪽은 담아야 합니다. 안 담으면 score·upVotes 가 언제 기준인지
알 수 없고, metric_series 포인트의 at 은 우리 관측 시각이라 다른 값입니다.
답: ①도 ②도 아닌 절충안입니다.
platformKey = normalizeFreeText(q) ← 8소셜 공통 규칙 유지(G-21) data.communityName = 'solana' ← 서브레딧은 여기 (글과 같은 자리)
🔴 ①({sub}/{q})이 G-21 과 정면으로 부딪혔습니다. G-21 은
"검색 행을 만드는 이유가 이 밈이 여러 소셜에서 동시에 검색되는가를 보는 것이라,
소셜마다 키 규칙이 다르면 그 비교가 무너진다" 입니다. 키를 solana/wendys 로 두면
TikTok·X 의 wendys 와 문자열이 안 맞아 Reddit 만 비교에서 빠집니다.
R-11 의 원래 논거("서브레딧마다 뜻이 다르다")도 맞아서 둘 다 옳고 상충했습니다.
절충안은 키는 공통 규칙을 지키고 서브레딧은 data 로 보존합니다.
감수하는 대가 — 서로 다른 서브레딧의 같은 검색이 한 행이 되고
data 가 먼저 온 쪽으로 굳습니다. 그 대가가 작은 이유는 관측이 report 기준 0건이기 때문입니다
(초안의 7건 은 audit 집계). 반대로 G-21 을 깨는 것은
8소셜 공통 규칙을 Reddit 하나 때문에 무너뜨리는 것입니다.
⚠️ 덤으로 발견 — classify 가 segments.indexOf('search') > 1 이라
전역 검색 reddit.com/search?q=x 는 검색으로 안 잡힙니다 — catch-all 로 흘러
reddit / 'search' 라는 가짜 서브레딧 키가 됩니다. R-9 ①(현행 유지) 범위 안이라
지금은 두지만 R-9 를 열 때 같이 봅니다.
kind 를 따를 것인가" 하나로 셋이 같이 정해집니다.ContentDataInput+6 · AccountDataInput+4,
각각 세 곳을 고칩니다.searchCommunities 를 켜서 community 응답이 오는지 먼저 확인해야 ①이 성립합니다($0.04 내외).docs/features/social-generator/reddit.md 로 옮겨 적습니다.
이 문서는 그 뒤 착수 시점의 기록으로 남습니다.
아직 고른 것이 없습니다.