---
date: 2026-04-24
host: WSL → Mac mirror
status: resolved-2026-04-25
related: project_instagram_autopost_success
summary: "맥에서 호출된 인스타 자동 포스팅이 시크릿/repo 부재로 침묵 실패 → WSL에서 미러링으로 복구"

---

# 4/24 인스타 자동 포스팅 누락 — Mac 호출 시 시크릿/인프라 부재

## 발생

2026-04-24 일자 /insta-post 호출이 Mac 세션에서 시도됐을 때 가드 fail. 원인 분석 (Mac directive msg 2565 KST 12:23):

- `~/.claude/secrets/instagram.json` 만들어진 곳: WSL `/home/ssamssae/.claude/secrets/instagram.json` (Apr 24 06:57, 274 bytes, 0600).
- `~/insta-autopost/` repo: WSL `/home/ssamssae/insta-autopost/` (render.py, publish.py, posted.json, GET_TOKEN.md, out/, templates/, .git).
- Mac 본진은 둘 다 없음 (Mac 사전 점검에서 MISSING 확인).
- `/insta-post` SKILL.md 의 가드는 시크릿 존재 + worklog 존재 두 겹 → Mac 에서 시크릿 없으면 즉시 abort.

→ 이날 인스타 포스팅이 자동으로 안 올라갔음. 강대종님이 다음 날 발견.

## 해결 (2026-04-25 13:45 KST, WSL → Mac 미러링)

Mac directive (msg 2565) 기반 WSL `@Myclaude2` 가 SCP 로 미러링 수행:

### 1) 사전 검증

```
$ ls -la ~/.claude/secrets/instagram.json
-rw------- 1 ssamssae ssamssae 274 Apr 24 06:57 ...

$ ls -la ~/insta-autopost/
GET_TOKEN.md  out  posted.json  publish.py  render.py  templates  .git  .gitignore
```

WSL 양쪽 정상.

### 2) Mac 측 사전 점검

```
$ ssh user@100.74.85.37 'ls -la ~/.claude/secrets/instagram.json'
ls: /Users/user/.claude/secrets/instagram.json: No such file or directory

$ ssh user@100.74.85.37 'if [ -d ~/insta-autopost ]; then echo EXISTS; else echo MISSING; fi'
MISSING
```

둘 다 없으니 백업 불필요.

### 3) 시크릿 SCP

```
$ scp -p ~/.claude/secrets/instagram.json user@100.74.85.37:~/.claude/secrets/instagram.json
$ ssh user@100.74.85.37 'ls -la ~/.claude/secrets/instagram.json'
-rw------- 1 user staff 274 Apr 24 06:57 /Users/user/.claude/secrets/instagram.json
```

`-p` 옵션으로 0600 모드 보존됨. 별도 chmod 600 불필요. 시크릿 내용은 텔레그램·로그·터미널 stdout 어디에도 echo/cat 안 함.

### 4) insta-autopost 폴더 SCP

```
$ scp -rp ~/insta-autopost user@100.74.85.37:~/
$ ssh user@100.74.85.37 'ls ~/insta-autopost/'
GET_TOKEN.md
out
posted.json
publish.py
render.py
templates
```

posted.json 양쪽 동기화 시점: **2026-04-25 13:45 KST** (이 SCP 직후, WSL 의 4/24 마지막 상태 그대로 Mac 에 복사). 이후 양방향 동기화 정책은 다음 turn 결정 사항.

### 5) Mac 측 venv 체크

```
$ ssh user@100.74.85.37 'ls ~/.claude/tools/venv/bin/python 2>/dev/null && echo VENV_OK || echo VENV_MISSING'
VENV_MISSING
```

⚠️ **Mac 측 Pillow/requests venv 미설치** — `~/.claude/tools/venv/bin/python` 부재. /insta-post SKILL.md 가 이 절대경로를 호출하므로 Mac 에서 실행하려면 venv setup 필요. 다음 turn 후속 작업.

## 미러링 검증 상태

- ✅ Mac 시크릿 미러링 (0600 모드 보존)
- ✅ Mac insta-autopost 폴더 미러링 (.git 포함, 모든 핵심 파일 도착)
- ⚠️ Mac venv MISSING — Pillow + requests 설치 필요 (다음 turn)
- ⏸ posted.json 양방향 동기 정책 — 미정 (다음 turn)
- ⏸ 토큰 만료 ~2026-06-23 (60일) 알림 자동화 — 미정

## 다음 액션 후보

1. Mac 측 `~/.claude/tools/venv` 생성 + Pillow/requests/python-dateutil 설치
2. posted.json 동기화 정책: WSL 이 SoT 인가, 양쪽 commit 시 git push/pull 인가, ~/insta-autopost 자체를 git remote 로 묶을 것인가
3. 토큰 만료 D-7 알림 자동화 (현재 GET_TOKEN.md 수동 절차)
4. /insta-post SKILL.md 의 시크릿/folder 부재 가드 fail 시 텔레그램 즉시 보고 (그날 누락 모르고 지나가는 것 방지)

## Mac venv setup 진행 (2026-04-25 13:50 KST)

WSL → Mac 인계 directive (msg 6979) 기반 Mac `@MyClaude` 가 7단계 진행. 결과 부분 PASS + finding 1건.

### 사전 검증 (step 1-2)

- /sync exit=0, claude-skills b260ead 도착, issue 파일 받음
- `~/.claude/secrets/instagram.json` 274 bytes 0600 확정 (cat 안 함)
- `~/insta-autopost/` 6개 핵심 파일 + .git + .gitignore 모두 도착

### venv + 의존성 (step 3-4)

```
$ python3 -m venv ~/.claude/tools/venv
$ ~/.claude/tools/venv/bin/python -V
Python 3.13.5
$ ~/.claude/tools/venv/bin/pip install --upgrade pip
pip 25.1.1 → 26.0.1
$ ~/.claude/tools/venv/bin/pip install Pillow requests python-dateutil
$ ~/.claude/tools/venv/bin/python -c "import PIL, requests, dateutil; print(...)"
Pillow=12.2.0 requests=2.33.1 dateutil=2.9.0.post0
```

✅ directive 최소 세트 import 검증 PASS.

### dry-run SKIP — finding: render.py 추가 의존성 (step 5)

`~/.claude/tools/venv/bin/python render.py --help` 시도 결과:

```
ModuleNotFoundError: No module named 'playwright'
```

원인: render.py L21 `from playwright.async_api import async_playwright` — directive 가 명시한 최소 세트(Pillow/requests/dateutil)에 누락. 그 외 추가 발견:

- publish.py 는 stdlib 만 사용 (json + urllib.request + subprocess), 추가 패키지 불필요. WSL directive 가 명시한 `requests` 도 사실 publish.py 코드상 미사용
- chromium 번들은 Mac 표준 위치 `~/Library/Caches/ms-playwright/chromium-1217/` 에 이미 존재 (Playwright MCP 가 2026-04-16 깔아둠) → Python playwright 도 같은 번들 재사용 가능, 별도 다운로드 불필요

render.py 에 `--dry-run` 옵션 부재 (`--date / --title / --hook / --worklog / --output` 만). directive 룰 "render.py 가 dry-run 모드 미지원이면 step 4 import 검증 통과만으로 PASS 처리하고 publish.py 호출은 절대 하지 말 것" 에 따라 step 5 **SKIP**. publish.py 미호출.

### 현재 상태

- ✅ venv 생성 + pip 26.0.1
- ✅ Pillow/requests/python-dateutil import PASS
- ⚠️ render.py 추가 의존성 finding: `playwright` Python pkg 미설치 → 현재 상태로는 /insta-post 호출 시 또 ModuleNotFoundError
- ✅ chromium 번들 기존 활용 가능 (추가 다운로드 0)
- ⏸ /insta-post 양방향 호출 가능 여부: 강대종님 결정 후 추가 작업 1건 필요

### 강대종님 결정 대기

A) `~/.claude/tools/venv/bin/pip install playwright` 추가 설치 → render.py 실 dry 호출 (--title "smoke" --hook "test" --output ~/insta-autopost/out/dummy.png) 로 PNG 1080×1350 검증 → 정리 → /insta-post 양쪽 그린

B) /insta-post SKILL.md 의 의존성 정의 갱신 (Pillow/requests/dateutil + playwright) — WSL directive 보강 따로 필요

A 가 1단계로 끝남 (chromium 번들 재사용으로 다운로드 비용 0).

## A 진행 결과 (2026-04-25 14:04 KST)

강대종님 OK (msg 6986) 후 A 경로 진행 완료.

### playwright Python pkg 설치

```
$ ~/.claude/tools/venv/bin/pip install playwright
Successfully installed greenlet-3.4.0 playwright-1.58.0 pyee-13.0.1 typing-extensions-4.15.0
```

### chromium 번들 호환성 — 추가 다운로드 발생

기존 `~/Library/Caches/ms-playwright/chromium-1217/` 은 npm playwright-core 1.60.0-alpha (Apr 16 Playwright MCP 가 깐 것). Python playwright 1.58.0 은 별도 빌드 `chromium_headless_shell-1208` 요구 → mismatch:

```
playwright._impl._errors.Error: BrowserType.launch: Executable doesn't exist at
.../chromium_headless_shell-1208/chrome-headless-shell-mac-arm64/chrome-headless-shell
```

`playwright install chromium` 으로 91.1 MiB 추가 다운로드 (280MB 풀 크롬 아니고 headless shell 만 받음, render.py 가 헤드리스로 동작하므로 충분):

```
Chrome Headless Shell 145.0.7632.6 (playwright chromium-headless-shell v1208)
downloaded to ~/Library/Caches/ms-playwright/chromium_headless_shell-1208
```

### 실 dry 호출 PASS

```
$ ~/.claude/tools/venv/bin/python render.py \
    --title "Mac venv smoke" \
    --hook "이건 검증용 더미 카드" \
    --date 2026-04-25 \
    --output ~/insta-autopost/out/dummy-mac-smoke.png
/Users/user/insta-autopost/out/dummy-mac-smoke.png

$ ls -la ~/insta-autopost/out/dummy-mac-smoke.png
-rw-r--r--  73156 Apr 25 14:04 dummy-mac-smoke.png

$ python -c "from PIL import Image; im=Image.open(...); print(im.size, im.mode)"
(2160, 2700) RGB
```

✅ PNG 73KB, 크기 2160×2700 (CANVAS 1080×1350 @ device_scale_factor=2 retina). 정리 완료(`rm dummy-mac-smoke.png`).

### 최종 상태

- ✅ Mac venv: Python 3.13.5, pip 26.0.1, Pillow 12.2.0, requests 2.33.1, dateutil 2.9.0.post0, **playwright 1.58.0 추가**
- ✅ chromium_headless_shell-1208 번들 Mac 표준 위치 설치
- ✅ render.py 실 dry-run PASS (PNG 1080×1350 @2x 정상 생성/정리)
- ⛔️ publish.py 미호출 (인스타 실 POST 0건, posted.json 변경 0)
- ✅ /insta-post Mac 측 양방향 호출 가능 상태 확정

### 발견 — WSL directive 의 의존성 정의 갱신 권장

WSL `/insta-post` SKILL.md 의 venv 의존성 명시는 현재 `Pillow + requests + python-dateutil` (publish.py 가 사실 stdlib 만 쓰니 `requests`/`python-dateutil` 도 불필요). 정확한 최소 세트는 **`Pillow + playwright` + `playwright install chromium`** 만이면 충분. 다음 turn 후속 작업 후보 (강대종님 결정).

### 남은 후속

- WSL `/insta-post` SKILL.md 의존성 갱신 (위 finding 반영)
- posted.json 양방향 동기 정책 (WSL SoT? git remote? — 미정)
- 토큰 만료 D-7 알림 자동화 (~2026-06-23, GET_TOKEN.md 수동 절차)
- /insta-post SKILL.md 가드 fail 시 텔레그램 즉시 보고 패치

## SKILL.md 갱신 (2026-04-25 14:25 KST, WSL @Myclaude2)

Mac 의 finding (render.py 가 playwright Python pkg 필요, requests/python-dateutil 사실 미사용) + 가드 fail 보고 누락 두 건 한꺼번에 SKILL.md 에 반영.

### 1) 의존성 섹션 신설

기존엔 의존성 명시가 흩어져 있었음 ("실패 시" 섹션의 `playwright install chromium` 한 줄 정도). 새로 "사전 조건 → 의존성 (Python venv)" 서브섹션 추가:

- 최소 세트: `Pillow + playwright` + `playwright install chromium`
- requests / python-dateutil: 불필요 명시 (publish.py 가 stdlib 만 사용)
- 새 기기 미러링 시 두 줄 명령으로 끝나는 절차 박음

### 2) 가드 재정렬 + 텔레그램 보고

기존 가드 #1, #2 (worklog / 중복) → 가드 #0~#3 으로 4단계 분리:

- 가드 #0 (venv 점검): `~/.claude/tools/venv/bin/python` 부재 → 텔레그램 알림 + 중단
- 가드 #1 (worklog 점검): 부재 시 텔레그램 알림 + 중단 (기존엔 silent abort, 4/24 누락 사례 재발 방지)
- 가드 #2 (시크릿 점검): 부재 시 기기 가드 흐름 + 자동 호출 시 텔레그램 알림
- 가드 #3 (중복 점검): 누락 아님 — 텔레그램 알림 불필요, 채팅 회신만

이후 절차 step 4-8 → 6-10 으로 시프트.

### 3) 다음 단계 절차 번호 정렬

가드 5개 (#0~#3 + 시크릿) → 카드 렌더 = step 6, 캡션 = 7, 발행 = 8, 텔레그램 = 9, cleanup = 10. 가드 #3 의 dedup 보호 layer 언급도 가드 #3 으로 정정.

### 커밋

`feat(insta-post): add venv guard, plain dependency spec, telegram alert on miss` (1183a3c → rebase 후 07a10a2 push). Mac 측은 다음 /sync 때 받음.

### 남은 후속 (이번 turn 미해결)

- posted.json 양쪽 동기화 정책 — 강대종님 OK 받기 전 WSL 단독 결정 안 함
- 토큰 만료 D-7 알림 — Mac directive 의 캘린더 등록 (2026-06-16 09:00 KST) 으로 처리됨 → 별도 자동화 작업 필요 없음, 이 후속 항목 닫음
