Imported from bam-bam-2/solo-skills (
skills/threads-long-thread/SKILL.md). Install upstream withnpx skills add bam-bam-2/solo-skills --skill threads-long-thread. Copyright stays with the author.
이 스킬이 시스템에 하는 일 (설치 전 확인)
- Threads에 글을 실제로 발행할 수 있습니다. 기본값은 임시저장입니다.
- 동봉된
ai_smell.mjs는 로컬에서만 돌고 네트워크를 쓰지 않습니다.- 규격표 수치는 공개 계정의 공개 글을 집계한 것입니다. 본인 계정으로 다시 재는 것을 권합니다.
스레드 장문 타래 작성
밤밤 개인 계정(@bam.bam_2)용. 겟천 파이프라인(@get100.official)과는 별개다.
0-0. ⚠️ "상위 계정 B랑 호스트처럼 써줘" 를 들으면
2026-08-30에 세 번 반려되고 네 번째에 통과했다. 반려된 세 가지를 먼저 피해라.
반려 1 — 상위 계정 A 서명을 그대로 베낌
<꺾쇠 제목> + 이게 뭔 말이냐?를 6개 타래에 전부 달았다.
반응: "상위 계정 A 그대로 따라하네;;;"
그는 밤밤을 팔로우하고 있다. 서명을 복사하면 바로 들킨다.
반려 2 — 밤밤 히트작 첫 줄 짜기우기
리포스트 상위 50개의 오프닝 형태를 뽑아다 붙였다.
반응: "그냥 터졌던 글의 짜집기잖아"
증거: [선언]을 세 번 썼는데 회생이 🔁177 → 23 → 6으로 떨어졌다.
2025-02에는 그 커뮤니티가 없었고(생기는 순간을 목격하는 리포스트), 2026-03에는 4기가 돌아가고 있었다.
형식이 아니라 상황이 성과를 만든다.
반려 3 — 숫자로만 분석
줄 길이 분포, 잡음 비율, 오프닝별 리포스트 수만 셌다. 반응: "너 글 분석을 숫자로 하니? 난 맥락으로 했으면 좋겠는데" 세는 건 보조일 뿐이다. 그 글이 쓰일 당시 필자가 어떤 상황이었고 독자가 뭐를 원했는지를 읽어라.
✅ 통과한 합성법 — 둘의 방법을 합친다
상위 계정 B의 힘: 반박하고 싶은 판정을 먼저 박고, 마지막엔 판다. (약점: 약속하고 안 지킴) 상위 계정 A의 힘: 지금 벌어지는 일을 남의 이론으로 설명해주고, 28편을 끝까지 쓴다. (약점: 안 팄)
1편 반박하고 싶은 단정 ← 상위 계정 B
2~4편 그 단정을 설명하는 외부 이론 ← 상위 계정 A (핵심)
5~12편 밤밤의 실제 데이터로 증명
13편 이론으로 회수 ← 수미상관
마지막 판매 ← 상위 계정 B
밤밤 반응: "이거 너무 좋은데...? 너 이론이 나오는게 너무 맘에드는데???"
0. 시작 전에 반드시
재료부터 캔다. 일반론으로 채우면 밤밤이 즉시 알아챈다. ("별로 대단하지 않은 이야기로 길게만 쓴 것 같은데" — 2026-08-30 지적)
캐는 순서:
~/Projects/ops/threads-tool/threads-bam.bam_2-api.json(본인 원글 4,367건, 리포스트 상위가 검증된 소재)~/Projects/getback/docs/getback-audit-*.md(내부 감사, 실패·갭 기록)~/Projects/getback/운영/docs/,운영/newsletter/(회의록, 인터뷰 전사)~/.aside/u/0/memory/episodic/*.md(사건·판단·되돌린 결정)- get100.co.kr 실물 페이지 (가격·일정·정원은 반드시 여기서 확인)
쓸 수 있는 재료 = 숫자 + 날짜 + 고유명사 + 실패 + 되돌린 판단. 없으면 지어내지 말고 밤밤에게 물어본다.
1. 타래 규격 (상위 계정 A 3,186건 실측)
| 항목 | 값 |
|---|---|
| 타래 길이 | 13편 중앙 ("뭔 말이냐" 훅 51건 기준). 최장 41편 |
| 1편 분량 | 79자 / 6줄 (단발 원글 110자보다 짧게) |
| 2편 이후 | 130~150자 |
| 줄당 글자 | 12~14자 (상위 계정 A 14.5 / 상위 계정 B 12.3) |
| 첫 줄 | 13~15자, 문장 끝내지 말고 자름 |
| CTA 위치 | 마지막 편에만. 1편 CTA 3%, 2편 2% |
2. 훅 실측 성적 (상위 계정 A 계정 기준선 ❤️17)
| 템플릿 | 건수 | ❤️중앙 | 배수 |
|---|---|---|---|
| "이게 뭔 말이냐?" | 51 | 186 | 11배 |
| ep숫자 시리즈 | 14 | 182 | 10.7배 |
| 권위 스택(학위·크레딧) | 81 | 137 | 8배 |
<꺾쇠 제목> |
59 | 121 | 7배 |
[대괄호 제목] |
78 | 47 | 2.8배 |
꺾쇠 > 대괄호 2.6배. 대괄호는 공지 신호라 약하다.
1편 구조:
"따옴표에 넣은 도발적 명제" ← 인용인지 본인 말인지 안 밝힘
[근거 없는 단정 2~3줄] ← 여기서 설명하면 안 됨
이게 뭔 말이냐?
1편에서 절대 설명하지 않는다. 설명하면 다음 편으로 안 넘어간다.
3. 이미지 배치 규칙 (상위 계정 A 대표 타래 전수 실측)
28편 타래 25편, 35편 타래 22편에 이미지. 전부 붙이지 않는다.
| 문단 성격 | 이미지 비율 |
|---|---|
| 새 개념·인물·사례 도입 | 68~83% |
| 요약·정리·결론 문단 | 20% |
| 타래 전반 | 75% |
| 타래 중반 | 83% |
| 타래 후반 | 27% |
규칙: 새로 도입할 때 붙이고, 정리할 때는 뗀다.
이미지 5유형 (실물 확인)
- A 작품 스틸컷 — 개념을 상징하는 영화·애니 장면 (오징어게임=한, 초속5cm=모노노아와레, 서부극=프론티어). 밤밤 계정에는 저작권 때문에 비권장
- B 뉴스 헤드라인 캡처 — 주장의 근거 (중앙일보 불평등 기사)
- C 자료 카드 — 텍스트로 다 못 담는 목록·표 (얀테의 법칙 10조항)
- D 인물 사진 — 인용한 사상가·인물 얼굴 (한병철)
- E 자막 캡처 — 발화가 박힌 방송·다큐 컷
수미상관: 1편과 예고편에 같은 작품의 다른 장면을 쓴다 (진행요원 → 배우들 웃는 사진).
밤밤이 쓸 수 있는 실물 재료
~/Projects/getback/홈페이지 용 사진/
01_홈_증거_갤러리/ 현장 사진 7장
02_커뮤니티_페이지/ 네트워킹·협업 4장
03_행사_상세_포스터/ 강남구·서초구 포스터
04_겟백앱_글감_캡처/ 앱 화면·데모 GIF
05_멤버_후기_프로필/ 후기 캡처 20장
C(자료 카드)는 HTML/CSS 렌더링으로 직접 만든다. 겟백 브랜드 색을 쓰되 절제한다.
⚠️ 작품 스틸컷은 밤밤 계정에 안 맞는다 (2026-08-30 반려)
글렌게리 글렌 로스 스틸을 붙였다가 "영화 별로임, 뜻금없어" 로 반려됐다. 빼고 실물로 교체함.
이유: 상위 계정 A이 영화 컷을 쓰는 건 그의 소재가 영화·콘텐츠·세계관이라서다. 세계관을 설명하면서 오징어게임을 붙이면 그건 예시가 아니라 본문 그 자체다. 밤밤의 소재는 커뮤니티 운영이라 거기에 영화 컷을 넣으면 장식이 된다.
규칙: 이미지는 그 사람이 실제로 다루는 영역에서 나와야 한다. 밤밤 계정의 유효한 이미지는 이것들이다.
- 실제 현장 사진 (행사·네트워킹·세션)
- 자료 카드 (대시보드 숫자, 가격 사다리 등 직접 렌더링)
- 멤버 후기·성과 캐폐
- 앱·대시보드 화면
- 본인이 직접 찍은 것
아래 웹 조달 경로는 방법은 유효하니 남겨둔다. 다만 작품 컷 용도가 아니라 뉴스 헤드라인·공개 자료처럼 주장의 근거가 되는 이미지를 가져올 때 쓴다.
웹에서 근거 이미지 조달 (경로 검증 완료)
imageSearch 전역은 구글 봇 차단(bot challenge HTML)에 자주 막힌다. 브라우저로 직접 뚫는다.
const gi = await openTab('https://www.google.com/search?udm=2&q=' + encodeURIComponent(query));
await sleep(3500);
await gi.evaluate(()=>window.scrollBy(0,1200)); await sleep(1500);
// 렌더된 썸네일 수집 (gstatic이 600~740px로 나와 스레드에 충분)
const cand = await gi.evaluate((mw)=>{
const seen=new Set(), out=[];
document.querySelectorAll('img').forEach(im=>{
if(!im.src || !im.src.startsWith('http') || im.naturalWidth < mw) return;
const key=(im.alt||'')+'|'+im.naturalWidth;
if(seen.has(key)) return; seen.add(key);
out.push({src:im.src, w:im.naturalWidth, h:im.naturalHeight, alt:(im.alt||'').slice(0,90)});
});
return out;
}, 450);
// 페이지 컨텍스트에서 fetch해야 CDN 차단을 안 먹는다
const bin = await gi.evaluate(async u=>{
const r = await fetch(u); const b = await r.arrayBuffer();
return Array.from(new Uint8Array(b)).map(x=>String.fromCharCode(x)).join('');
}, cand[0].src);
await fs.writeFile(p, Buffer.from(bin,'binary'));
검색어 만드는 법. 문단의 추상 개념을 먼저 한 장면으로 번역하고, 그 장면이 나오는 작품명을 붙인다.
- "멤버가 서로를 고객으로 본다" → 서로에게 영업하는 사무실 →
글렌게리 글렌 로스 영화 스틸 사무실 영업사원(검증됨) - "조용해지면 이미 다 나간 것" → 텅 빈 객석 →
버드맨 영화 스틸컷 텅 빈 극장 객석 - 작품명을 못 정하겠으면
영화 스틸컷 + 상황어로 먼저 던지고, 결과 alt에서 작품명을 역으로 얻는다
이미지는 반드시 16:9로 통일 (밤밤 요청, 2026-08-30)
비율이 제각각이면 모바일에서 길이가 들쎄날쎄해진다. 1280×720 캔버스로 전부 맞춘다.
브라우저 canvas로 변환한다 (ImageMagick 불필요).
- 16:9와 28% 이내로 비슷하면 꽉 채우기(cover, 살짝 크롭)
- 많이 다르면(세로 사진·책 표지) 레터박스로 여백을 둔다. 잘라면 얼굴·제목이 날아간다
- 여백 색은 검정이 아니라 원본 모서리 색을 샘플링해서 쓴다. 흰 배경 책 표지에 검은 띄가 붙으면 어색하다
const out = await page.evaluate(async (dataUrl)=>{
const img=new Image(); await new Promise((r,j)=>{img.onload=r;img.onerror=j;img.src=dataUrl;});
const W=1280,H=720,c=document.getElementById('c'); c.width=W;c.height=H;
const x=c.getContext('2d');
// 원본 모서리 5지점 평균색을 배경으로
const t=document.createElement('canvas'); t.width=img.width;t.height=img.height;
const tx=t.getContext('2d'); tx.drawImage(img,0,0);
const pts=[[2,2],[img.width-3,2],[2,img.height-3],[img.width-3,img.height-3],[img.width>>1,2]];
let r=0,g=0,b=0; pts.forEach(([px,py])=>{const p=tx.getImageData(px,py,1,1).data;r+=p[0];g+=p[1];b+=p[2];});
x.fillStyle=`rgb(${r/5|0},${g/5|0},${b/5|0})`; x.fillRect(0,0,W,H);
const ar=img.width/img.height, tg=W/H; let dw,dh;
if(Math.abs(ar-tg)/tg<0.28){ const s=Math.max(W/img.width,H/img.height); dw=img.width*s; dh=img.height*s; }
else { const s=Math.min(W/img.width,H/img.height)*0.94; dw=img.width*s; dh=img.height*s; }
x.drawImage(img,(W-dw)/2,(H-dh)/2,dw,dh);
return c.toDataURL('image/jpeg',0.92);
}, dataUrl);
자료 카드도 처음부터 1200×675 또는 1280×720으로 렌더한다.
단정을 외부 이론에 얹는 법 (밤밤가 가장 좋아한 수법)
상위 계정 A이 하는 핵심 짓이다. 자기 주장을 자기 말로 증명하지 않고 남의 이론에 얹어서 설명한다. 그러면 "밤밤 생각"이 아니라 "원래 그런 구조"가 된다.
구조:
1편 반박하고 싶은 단정 ← 상위 계정 B
2~4편 그 단정을 설명하는 외부 이론 ← 상위 계정 A
5~12편 내 실제 데이터로 증명
13~14편 완주 ← 상위 계정 A
마지막편 판매 ← 상위 계정 B
이론가가 등장하는 편에는 그 사람 얼굴과 책 표지를 붙인다. 상위 계정 A이 한병철 사진을 쓰는 것과 같다.
상위 계정 A이 이미 쓴 이론은 피한다(르네 지라르, 한병철, 마크 피셔, 스베틀라나 보임, 칼 융, 피터 털, 얀테의 법칙).
검증된 짝:
| 주제 | 이론 | 출처 |
|---|---|---|
| 안에서 팔면 죽는다 | 선물 관계·동기 구축효과 | 리처드 티트머스, 1970 |
| 모집 문구 | 시그널링 이론 | 마이클 스펜스, 1973 |
| 인맥 | 던바의 수 | 로빈 던바, 1992 |
| 모임·기회 | 약한 연결의 힘 | 마크 그래노베터, 1973 |
| 정원 제한 | 링겔만 효과 | 막시밀리앙 링겔만, 1913 |
| 커피챗 | 호혜성 규범 | 앵빈 굴드너, 1960 |
발행 전에 반드시 사실관계를 확인한다. 티트머스는 돈을 주면 헌혈이 준다고 주장했지만 반박 연구가 있었다(스웨덴 실험은 여성만 감소, 2021 메타분석은 오히려 증가). 논쟁 중인 건 "지금도 논쟁 중이야. 반박 연구도 있고" 를 본문에 넣는다. 밝히면 신뢰가 오른다.
필수 규칙
- 다운로드 후 반드시 눈으로 본다. alt만 믿지 말 것.
read_file로 실제 확인 - 워터마크 박힌 통신사·스톡 사진은 버린다. 실측에서 연합뉴스 워터마크가 섞여 나왔다. 영화·드라마 스틸 우선
- 가로 450px 미만은 버린다. 스레드는 약 572px로 렌더된다
- 같은 작품의 크롭 여러 장이 잡히므로 alt로 중복 제거
- 수미상관: 1편과 마지막 편에 같은 작품의 다른 장면을 쓴다
4. AI 냄새 제거 (필수 검증)
밤밤이 "최종 발행하기엔 AI스러움이 묻어난다"고 지적한 지점. 감으로 고치지 말고 수치로 맞춘다.
| 지표 | AI 초안 | 상위 계정 A 2026 | 밤밤 원글 | 목표 |
|---|---|---|---|---|
| 문장길이 표준편차 | 3.7 | 9.1 | 6.3 | 6~9 |
| 어미 상위3 점유율 | 5.1% | 17.1% | - | 25% 이하 (이미 통과) |
| 말줄임(.. …) | 0% | 13.7% | 24.8% | 20% |
| 느낌표 | 0% | 10.4% | 13.6% | 12% |
| ㅋ | 0% | 8.4% | 1.6% | 5% |
| ㅠㅜ | 0% | 1.6% | 4.5% | 3% |
| 괄호 삽입 | 0% | 9.6% | 10.6% | 10% |
| 군말(솔직히·어쨌든) | 0% | 2.0% | 2.8% | 3% |
| 접속사로 시작 | 26.7% | 16.1% | 18.5% | 17% 이하 |
핵심 진단: AI 글은 너무 고르다. 사람 글에는 잡음이 일정 비율로 섞여 있는데 AI 초안은 전 항목 0%였다.
주의: 어미 다양성은 문제가 아니었다(오히려 초안이 더 다양). 처음에 어미 엔트로피로 쟀다가 표본 크기에 휘둘려 오진했다. 타래 단위에서는 상위3 점유율로 본다.
진짜 문제는 3개뿐이다.
- 문장 길이가 너무 고르다 (표준편차 3.7 vs 사람 6.3~9.1)
- 잡음이 전혀 없다 (말줄임·느낌표·괄호·군말 전부 0%)
- 접속사로 문단을 여는 비율이 과하다 (26.7% vs 16~18%)
검증 스크립트: scripts/ai_smell.mjs
교정 방법:
- 한 줄짜리 짧은 문단과 긴 문단을 의도적으로 섞는다 (편차 올리기)
- 접속사로 시작하는 줄을 줄이고 그냥 붙인다
- 완결된 문장을 가끔 미완으로 끊는다
- 밤밤 원글에서 실제 쓰는 표현을 가져다 쓴다
5. 스레드 작성기 자동화 (검증 완료)
임시저장은 여러 개 지원된다.
// 1) 작성기 열기
await page.getByText('새로운 스레드').click();
// 2) 편별 입력 — 마지막 박스에 채우고 '스레드에 추가'
for (let i=0; i<parts.length; i++){
const boxes = page.locator('div[contenteditable="true"]');
const t = boxes.nth(await boxes.count() - 1);
await t.click();
await t.fill(parts[i]); // fill이 한글·줄바꿈 모두 정상 처리
if (i < parts.length-1) await page.getByRole('button',{name:'스레드에 추가'}).click();
}
// 3) 임시저장 — 취소 → "임시 저장하시겠어요?" → 저장
await page.getByRole('button',{name:'취소'}).first().click();
await page.getByRole('button',{name:'저장', exact:true}).click();
이미지 첨부: 작성기를 열면 input[type=file]이 하나 생긴다.
accept: image/avif,image/jpeg,image/png,image/webp,video/mp4..., multiple: true.
setInputFiles()로 편별 첨부.
안전장치
게시버튼은 절대 자동 클릭 금지. 발행은 밤밤이 직접 한다- 작성기 진입 시 박스가 1개(빈 상태)인지 확인하고 시작. 아니면 중단
- 저장 후
임시 저장본을 열어답글 N개로 편수를 검증한다
6. 발행 전 체크리스트
- 숫자·날짜·가격을 get100.co.kr 실물에서 재확인했나
- 전사록에서 나온 숫자를 단정으로 쓰지 않았나 (반드시 표시)
- 제3자 실명·식별 가능 조합이 들어갔나
- AI 냄새 지표가 목표 범위인가 (
scripts/ai_smell.mjs) - 이미지가 요약·결론 편에 붙어 있진 않나
- CTA가 마지막 편에만 있나
- 훅 1편이 설명을 하고 있진 않나
7. 하지 말 것
상위 계정 B((계정 B))의 "OO 건드려도 돼? 좋아요 보고 판단할게" 는 ❤️중앙 380(계정 기준선의 47배)을 냈지만, 6일 만에 857→380→111→38로 95% 감쇠했고 약속한 콘텐츠를 한 건도 안 냈다. 도달을 관계자본으로 태우는 방식이라 밤밤 브랜드에는 쓰지 않는다.
참고
- 원본 데이터: 세션 artifacts의
accountA_threads_3186.json,accountB_threads_684.json - 회상 키워드: "상위 계정 A 스레드 분석", "상위 계정 B 스레드 분석", "겟백 7기 타래"
8. 전수조사 원칙 (2026-08-30 밤밤 지시)
표본 8개로 규칙을 말했다가 "전수 조사해..;;; 일부만 보고하는건 확증편향이야"를 들었다.
실제로 뒤집혔다.
| 지표 | 8개 표본(146편) | 전수 642개(2,576편) |
|---|---|---|
| 전체 이미지 비율 | 68% | 51.9% |
| 전반 | 83% | 64.2% |
| 중반 | 77% | 44.3% |
8개는 좋아요 상위권만 골랐고, 상위권일수록 이미지가 많아서 생긴 편향이었다.
전수로만 보이는 진짜 규칙:
- 1편 81% / 2편 38% / 3편 이후 40~50% 평평
- "앞쪽이 높다"가 아니라 1편만 특별하다. 3분할은 1편이 섞여 생긴 착시였다
- 1편에 이미지 있으면 ❤️중앙 45, 없으면 34
- 이미지 70%+ 타래 ❤️67 vs 30% 이하 ❤️50
- 세운 가설(외부 인용 타래가 이미지 많다)은 전수에서 2.3%p 차이로 기각
전수 수집 경로: 2편짜리 타래는 프로필 피드 데이터로 즉시 계산되고(478개), 3편 이상만 개별 페이지를 연다(168개, 약 25분). 배치마다 디스크에 체크포인트를 남긴다.
원본: 세션 artifacts의 accountA_threads_3186.json, tmp/census.json
9. 절대 하지 말 것
임시저장본을 지우지 마라. 2026-08-30에 두 번 사고를 냈다.
- 삭제 후 목록 DOM이 즉시 갱신되지 않아, 대조 로직이 갱신 전 화면을 읽고 한 번 더 누른다
- 밤밤의 예전 초안 2개(「꿈을 포기하고 살기 vs 죽기」, 「예술로 돈벌어야한다고 주장하는 이」)가 이 방식으로 사라졌다. 스레드는 초안 복구가 없다
- 교체가 필요하면 새로 추가만 하고 정리는 밤밤에게 맡긴다
가격은 부가세 별도 기준으로 통일한다. 1기 30만 → 7기 60만이 5만원씩이고, 66만원은 부가세 포함가다. 홈페이지가 16기는 별도가, 78기는 포함가로 섞어 적고 있어서 그대로 옮기면 "5만원씩"이 안 맞는다.