# 3단계 레이어 설계 — 플랫폼 출판/배포 (인스트럭션 기반, 2026-09-04)

> 상태: **단계 1 설계** · 수정: "설치기" → **"인스트럭션"** (INSTRUCTION-NOT-INSTALLER 철학 적용).
> ①워크센터(`g/install.sh`) · ②ADB 무인관제(`g/adb-care.sh`) 다음의 3번째 층.
> 셀마다 **DeepSeek Aider 에이전트**가 있으므로 고정 설치 코드를 주지 않는다. 목표 상태 +
> 검증 방법 + 함정만 명세하고, 에이전트가 그 셀/계정 환경에 맞게 판단·실행한다.

---

## 1. 왜 인스톨러가 아닌가 (본질)

플랫폼 출판 설정은 **계정마다·환경마다 편차가 심하다**:
쿠키 추출 경로/방식(카카오·네이버·구글 연동, 2FA, 브라우저 세션), YouTube OAuth 상태,
Playwright 유무, 토큰 만료, 네트워크/WiFi, 셀마다 설치 상태가 다름.

→ 고정 스크립트는 이 편차를 분기로 다 못 담고, 담을수록 깨진다 (eae-univ 철학 문서 증거 그대로).
→ **해법**: 목표 + 검증 + 함정 명세서 = 인스트럭션. 실행은 그 자리에서 에이전트가.

## 2. 위치 / 산출물

```
① install.sh   → 일할 수 있는 기계 (Termux→proot Ubuntu→/root/work)
② adb-care.sh  → 재부팅 무인복구 노드
③ publish-인스트럭션 → 셀 계정으로 플랫폼 출판 (본 문서) ← NEW
```

- 전달 파일: `g/publish-instruction.md` (Pages에서 curl로 내려받음)
- 실행자: 워크센터 안의 에이전트(Aider/DeepSeek 또는 Claude Code) — 스스로 진단·구현
- 복붙 1줄(랜딩 Step 3): 인스트럭션을 워크센터로 받아 에이전트에게 실행 지시
- 산출물: `configs/publish.env.sh`(셀 계정 입력) + **대시보드**(본인이 채워야 할 슬롯 표시)

## 3. 재사용 결정 (전수 파싱 결과 → 원칙)

| 원칙 | 내용 |
|---|---|
| **복붙 금지 / 헬레나 계정 금지** | 워크스페이스의 헬레나·파크시 하드코딩 계정(`eae_kr`, `@HelenaPark-e7c`, 카카오/네이버 쿠키, YT refresh) **재사용 절대 금지**. 셀 계정만. |
| **셀 오버레이** | 셀 전용 설정(`configs/publish.env.sh`) + 계정 쿠키 저장소 + 대시보드만 얹음 |
| **API형 vs 쿠키형 분리** | YouTube/Telegram = env 토큰 자동. 티스토리/네이버 = 계정별 추출 방식 분기(§4). |
| **에이전트가 판단** | 정확한 명령 시퀀스는 안 준다. 목표·검증·함정을 주고 그 환경에서 직접 진단·구현. |

## 4. 플랫폼별 env 스키마 + 계정별 쿠키 추출 (계약)

`configs/publish.env.sh` (셀 유저가 입력, shell source → 계정별 구조화 가능):

```bash
# 공통
CELL_ID="hoyadang"  OWNER_NAME="호야당"
# YouTube (API형 — env로 자동 활성)
YT_ACCOUNT_EMAIL= YT_CHANNELS= YT_CLIENT_ID= YT_CLIENT_SECRET= YT_REFRESH_TOKEN=
# Telegram (보고 채널, ①과 공용)
TG_TOKEN= TG_CHAT=
# 티스토리/네이버 (쿠키형 — 계정마다 추출 방식이 다름)
PUB_ACCOUNTS_tistory="hoyadang kushi"
PUB_ACCOUNTS_naver="hoyadang"
PUB_EXTRACT_hoyadang_tistory="paste"    # paste|login|file — 계정마다 다름
PUB_COOKIE_hoyadang_tistory="configs/cookies/hoyadang_tistory.json"
PUB_EXTRACT_kushi_tistory="login"       # 2FA 없는 계정만
PUB_COOKIE_kushi_tistory="configs/cookies/kushi_tistory.json"
# Discord(선택)
DISCORD_WEBHOOK=
```

→ 인스트럭션은 이 파일의 **각 계정 `PUB_EXTRACT_*`를 읽고 해당 경로만** 진행.
미지정/미입력 계정 = 대시보드 슬롯(⬜/🟡)으로 남김. 에이전트가 그 계정 성격(2FA 여부 등)을
진단해 `paste`/`login`/`file` 중 맞는 쪽으로 안내·구현.

## 5. 대시보드 (마지막 산출물 — 셀이 채우는 대시보드)

- `dashboard/index.html` (셀 로컬 웹) + `dashboard/status.json` (기계 판독)
- 상태 4단계: ⬜ 미설정 / 🟡 인증 대기(추출방식·자격증명 없음) / ✅ 활성 / ❌ 오류(만료·불일치)
- 퀵 커맨드: `yt up <mp4> <제목>` · `pub tistory <제목>` · `pub naver <제목>` · `tg "메시지"`
- 템플릿은 빈 슬롯이 보이는 틀 — 셀이 env를 채울수록 상태가 채워짐

## 6. 파일 배치 (repo)

```
g/publish-instruction/       # 3단계 인스트럭션 단계 묶음 (단계 2 — 캐파 배려 분할)
   00-index.md               #   지도 + 진행 규칙 (한 번에 한 단계)
   01-diagnose.md … 07-final-check.md
g/publish-instruction/_archive-v1-single.md  # v1 통합본 보관
g/publish.d/                 # (단계 3) 어댑터 템플릿: dashboard.template.html · status 스펙
index.html  # 랜딩 Step 3 (단계 4)
README.md   # 3단계 섹션
```

**캐파 분할 근거**: DeepSeek Aider는 문맥 제한 → 통합본 한 방울은 꼬인다. 단계 파일 하나만
읽고, 끝나면 [완료 보고] 후 멈춤 → 사람 "다음" → 다음 파일. (Claude Code 증분 실행 기준)

## 7. 단계별 작업 (복잡도 분할)

1. [x] **설계** (본 문서) — 인스트럭션 전환 + env/계정별 추출 계약
2. [x] `g/publish-instruction/` 단계 묶음 v1 (00~07, 캐파 배려) — 2026-09-04
3. [ ] `g/publish.d/` 템플릿 + 대시보드 생성 규격
4. [ ] 랜딩 Step 3 + README + 배포 검증

---
*기록: dtslib + Claude · 2026-09-04 · 철학: INSTRUCTION-NOT-INSTALLER (eae-univ 확정본) 준용*
