@kaydash9999/banker-plugins 0.10.0 → 0.12.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (30) hide show
  1. package/.claude-plugin/marketplace.json +1 -1
  2. package/.claude-plugin/plugin.json +1 -1
  3. package/CHANGELOG.md +39 -0
  4. package/README.md +73 -11
  5. package/codex/manifest.json +8 -1
  6. package/commands/setup.md +2 -0
  7. package/package.json +6 -1
  8. package/skills/3d-intro-build/SKILL.md +214 -0
  9. package/skills/3d-intro-build/references/LICENSE +21 -0
  10. package/skills/3d-intro-build/references/NOTICE.md +32 -0
  11. package/skills/3d-intro-build/references/assemble.mjs +252 -0
  12. package/skills/3d-intro-build/references/azure-adapter.mjs +495 -0
  13. package/skills/3d-intro-build/references/curate.mjs +301 -0
  14. package/skills/3d-intro-build/references/index-template.html +73 -0
  15. package/skills/3d-intro-build/references/prompts.md +171 -0
  16. package/skills/3d-intro-build/references/scrub-engine.js +448 -0
  17. package/skills/3d-intro-build/references/serve.mjs +123 -0
  18. package/skills/3d-intro-setup/SKILL.md +196 -0
  19. package/skills/3d-intro-setup/references/azure-adapter.mjs +495 -0
  20. package/skills/lineage/SKILL.md +126 -134
  21. package/skills/lineage/lineage.py +1041 -354
  22. package/skills/motion-graphic-make/SKILL.md +57 -0
  23. package/skills/motion-graphic-setup/SKILL.md +141 -0
  24. package/skills/ralph-qa/SKILL.md +59 -32
  25. package/skills/refresh-readme/SKILL.md +3 -3
  26. package/skills/vertical-pptx/SKILL.md +409 -0
  27. package/skills/vertical-pptx/build_a4p.js +923 -0
  28. package/skills/vertical-pptx/build_a4p.py +916 -0
  29. package/skills/vertical-pptx/verify_a4p.mjs +2168 -0
  30. package/skills/vertical-pptx-setup/SKILL.md +223 -0
@@ -0,0 +1,57 @@
1
+ ---
2
+ name: motion-graphic-make
3
+ description: "(banker) 10초 내외 내레이션 없는 무료 모션 그래픽(킨네틱 타이포·통계·차트·로고·하단자막·지도)을 hyperframes motion-graphics 워크플로에 위임 제작 — 렌더링 로직은 소유하지 않는 얇은 래퍼. 'motion-graphic-make'/'모션 그래픽 만들어줘'/'모션 그래픽 제작'/'motion graphics' 시 사용."
4
+ ---
5
+
6
+ # motion-graphic-make — 무료 모션 그래픽 제작 (hyperframes 위임)
7
+
8
+ 짧고(약 10초 내외, 최대 ~30초) 내레이션 없는 디자인-주도 모션 그래픽을 만든다.
9
+ 이 스킬은 **얇은 래퍼(thin wrapper)** 다 — 실제 창작·렌더링 로직을 전혀 소유하지 않고, hyperframes(Apache-2.0, HeyGen 오픈소스)의 `/motion-graphics` 워크플로에 그대로 위임한다.
10
+ 전제조건(Node≥22·ffmpeg) 설치는 `motion-graphic-setup` 스킬이 담당한다.
11
+ 답변은 한글(기술 토큰 영문).
12
+
13
+ ## 0. 전제조건: hyperframes (없으면 설치부터)
14
+ 이 스킬은 hyperframes CLI 가 설치·정상 동작해야 한다.
15
+ **진행 전 가용성을 먼저 확인**하고, 문제가 있으면 **설치부터 안내**한다(추정·임의 재설치 금지):
16
+ - 확인: `npx hyperframes doctor`
17
+ - 실패/미설치면 먼저 `motion-graphic-setup` 스킬로 설치(Claude Code: `/banker:setup` → motion-graphic-setup / Codex: `banker-motion-graphic-setup`). 설치·검증 후 이 스킬을 이어서 진행한다.
18
+
19
+ ## hyperframes 란 (요약)
20
+ hyperframes 는 HTML/CSS + 시크(seek) 가능한 애니메이션(GSAP·CSS·Lottie·Three.js 등)을 결정론적 MP4/투명 오버레이 비디오로 렌더링하는 오픈소스 프레임워크다.
21
+ 진입점은 `/hyperframes` 라우터다 — 모든 "영상/애니메이션 만들어줘" 요청을 적절한 창작 워크플로로 분기하는 역량 지도다.
22
+ 이 스킬이 다루는 대상은 그 창작 워크플로 중 하나인 `/motion-graphics` — 짧고 내레이션 없는 디자인-주도 모션 그래픽 하나로 한정된다.
23
+ 더 길거나·내레이션이 있거나·멀티씬이면 hyperframes 자신이 `/general-video` 등 다른 워크플로로 재라우팅한다(이 스킬이 판단하지 않는다).
24
+
25
+ ## 무료 폼 카테고리 (검색 불필요 · 유료 API 없음)
26
+ `asset_needs` 가 비어 있어 사용자가 콘텐츠를 직접 제공하는 6개 카테고리 — 전부 무료로 동작한다.
27
+
28
+ | 카테고리 | 내용 |
29
+ |---|---|
30
+ | `kinetic-type` | 문구/제목의 모션 타이포그래피 |
31
+ | `stat` | 히어로 숫자 카운트업 + 링 |
32
+ | `charts` | 막대/선/원형/레이스 차트 |
33
+ | `logo-reveal` | 로고 스팅 / 브랜드 락업 |
34
+ | `lower-thirds` | 이름/직함 바, 콜아웃, 소셜 오버레이 |
35
+ | `maps` | 지역 하이라이트 · 지점 연결 · 위치 줌 |
36
+
37
+ 검색이 필요한 카테고리(웹페이지/뉴스/트윗/이미지 합성)도 hyperframes 안에 존재하지만, 검색 프로바이더가 없으면 자동으로 asset-free 로 성능이 저하(degrade)한다 — 이 스킬의 초점은 위 6개 무료 폼 카테고리다.
38
+ 이미지 생성이 필요한 경우에 한해 `GEMINI_API_KEY`/`GOOGLE_API_KEY` 를 선택적으로 쓰며, 없으면 생성 단계를 건너뛸 뿐 실패하지 않는다.
39
+
40
+ ## 이 스킬이 소유하지 않는 것
41
+ **GSAP 애니메이션 작성, HTML 컴포지션 코딩, ffmpeg 인코딩, headless Chrome 캡처 — 이 중 어느 것도 이 스킬이 직접 구현하지 않는다.**
42
+ 전부 hyperframes 자체 서브에이전트(director/builder)와 CLI(`lint`/`check`/`snapshot`/`render`)가 수행한다.
43
+ 이 규칙을 여기서 재서술하면 hyperframes 본체와 어긋나는 사본이 생긴다 — 정본은 항상 hyperframes 쪽이다.
44
+ 이 스킬의 역할은 **호출 · 전제조건 확인 · 렌더 승인 게이트 강제**뿐이다.
45
+
46
+ ## 흐름
47
+ 1. **plan** — 사용자 요청(브리프)을 그대로 hyperframes `/motion-graphics`(필요시 `/hyperframes` 라우터 경유)에 전달한다. 카테고리 자동 분류와 초안 계획은 hyperframes 가 수행한다.
48
+ 2. **build** — hyperframes 가 카탈로그 블록을 재사용해 컴포지션 HTML 을 만든다(이 스킬의 직접 코드 작성 없음).
49
+ 3. **lint / check / snapshot** — hyperframes CLI 가 결함을 사전 검출하고, 필요하면 자체 리페어 패스를 한 번 더 돈다.
50
+ 4. **사용자 승인 게이트** — "미리보기 먼저 볼지, 바로 렌더할지" 하나만 묻는다. 미리보기를 고르면 hyperframes Studio 로 보여주고 다시 같은 질문으로 돌아온다.
51
+ 5. **render** — **명시적 렌더 승인 이후에만** 실행한다. 불투명 결과는 MP4, 오버레이가 필요하면 투명 webm/mov 로 렌더한다.
52
+
53
+ **렌더는 사용자의 명시적 승인 없이는 절대 실행하지 않는다** — 승인 전에는 미리보기 단계에서 멈추는 것이 기본값이다.
54
+
55
+ ## 완료 보고
56
+ 렌더가 끝나면 산출물 경로, 실제 길이(duration), 사용된 컴포지션/프레임 id, 확인에 쓴 스냅샷 시점을 함께 보고한다.
57
+ 렌더 없이 미리보기에서 멈췄다면, 어디까지 진행됐고 다음에 무엇을 승인하면 렌더로 이어지는지만 짧게 보고한다.
@@ -0,0 +1,141 @@
1
+ ---
2
+ name: motion-graphic-setup
3
+ description: "(banker) 모션 그래픽 제작 도구 hyperframes 설치 전제조건 확보: Node>=22 + ffmpeg(OS 패키지 우선, project-local ffmpeg-static 폴백) 후 npx hyperframes init/skills update/doctor. 'motion-graphic-setup'/'모션 그래픽 설치'/'hyperframes 설치' 또는 /banker:setup 시 사용."
4
+ ---
5
+
6
+ # motion-graphic-setup — hyperframes(모션 그래픽 CLI) 설치
7
+
8
+ 무료(free) 모션 그래픽 제작 도구 hyperframes 의 실행 전제조건을 설치한다.
9
+ hyperframes 는 Node.js CLI 로, HTML/CSS/GSAP 로 만든 애니메이션을 headless Chrome + ffmpeg 로 MP4/투명 오버레이 비디오로 렌더링한다.
10
+ 실제 모션 그래픽 제작은 `motion-graphic-make` 스킬(hyperframes `/motion-graphics` 위임)이 담당하고, 이 스킬은 그 전제조건만 갖춘다.
11
+ **OS·arch·기존 설치 여부를 먼저 감지**해 알맞은 경로를 고른다.
12
+ 설치는 **멱등**(이미 있으면 skip·검증만). 답변은 한글(기술 토큰 영문).
13
+
14
+ ## 0. 감지 (먼저, 추정 금지)
15
+ ```bash
16
+ echo "OS=$(uname -s)"
17
+ echo "ARCH=$(uname -m)"
18
+ echo "root=$([ "$(id -u)" = 0 ] && echo yes || echo no)"
19
+ [ -f /etc/os-release ] && . /etc/os-release && echo "distro=$ID ${VERSION_ID}"
20
+ command -v node >/dev/null && echo "node=$(node -v)" || echo "node=미설치"
21
+ command -v npx >/dev/null && echo "npx=yes" || echo "npx=미설치"
22
+ command -v npm >/dev/null && echo "npm=$(npm -v)" || echo "npm=미설치"
23
+ command -v ffmpeg >/dev/null && ffmpeg -version 2>&1 | head -1 || echo "ffmpeg=미설치"
24
+ ```
25
+ ```powershell
26
+ $PSVersionTable.PSVersion
27
+ winget --version
28
+ if (Get-Command node -ErrorAction SilentlyContinue) { node -v } else { "node: 미설치" }
29
+ if (Get-Command ffmpeg -ErrorAction SilentlyContinue) { (ffmpeg -version)[0] } else { "ffmpeg: 미설치" }
30
+ ```
31
+ **이미 설치 확인**: `node -v` 가 22 이상 **이고** `ffmpeg` 가 존재 **이고** `npx hyperframes doctor` 가 통과하면, 아래 §1~§3 은 건너뛰고 §4 검증만 수행한다.
32
+
33
+ ## 1. Node ≥22 확보
34
+ 목적은 Node>=22 확보이지 특정 설치 경로 강제가 아니다.
35
+ 이미 nvm 등 버전 매니저로 관리 중이면 `nvm install --lts && nvm alias default 'lts/*'` 로 충분하다(멀티버전 관리·RHEL8 glibc 사전확인 등 상세 절차는 `setup-node` 스킬 참조).
36
+
37
+ ### macOS (Apple Silicon / Intel)
38
+ ```bash
39
+ brew install node
40
+ node -v
41
+ ```
42
+ Apple Silicon(`/opt/homebrew`)·Intel(`/usr/local`) 차이는 `brew` 가 자동 흡수 — 스크립트는 두 아키텍처에 동일 적용.
43
+
44
+ ### Linux — Ubuntu / Debian
45
+ ```bash
46
+ curl -fsSL https://deb.nodesource.com/setup_22.x | sudo -E bash -
47
+ sudo apt-get install -y nodejs
48
+ node -v
49
+ ```
50
+ 배포 기본 apt 저장소의 `nodejs` 는 버전이 낮은 경우가 많아 NodeSource 22.x 저장소를 사용한다.
51
+
52
+ ### Linux — RHEL8 / Rocky8
53
+ ⚠️ dnf AppStream 모듈의 `nodejs` 스트림은 미러 구성에 따라 22 미만일 수 있다 — 사전 확인: `dnf module list nodejs`.
54
+ ```bash
55
+ sudo dnf module reset -y nodejs
56
+ sudo dnf module enable -y nodejs:22 2>/dev/null || \
57
+ curl -fsSL https://rpm.nodesource.com/setup_22.x | sudo -E bash -
58
+ sudo dnf install -y nodejs
59
+ node -v
60
+ ```
61
+ 22 스트림이 없거나 sudo 가 불가하면 **`setup-node` 스킬로 위임**(nvm 경로, RHEL8 glibc 2.28 사전확인 포함) — 이쪽이 더 안전하다.
62
+
63
+ ### Windows
64
+ ```powershell
65
+ winget install --id OpenJS.NodeJS.LTS -e
66
+ node -v
67
+ ```
68
+ 여러 Node 버전을 넘나들어야 하면 nvm-windows: `winget install --id CoreyButler.NVMforWindows -e` 후 `nvm install lts && nvm use <설치된 버전>`.
69
+ > ⚠️ winget Node 와 nvm-windows 를 동시에 설치하지 않는다(PATH 충돌 — 상세는 `setup-node` 함정 참조).
70
+
71
+ **위 경로가 모두 막히면(권한 없음·미러 문제 등) → `setup-node` 스킬로 위임한다.**
72
+
73
+ ## 2. ffmpeg 확보
74
+ hyperframes 렌더러(headless Chrome 캡처 + ffmpeg 인코딩)가 요구하는 `ffmpeg` 실행 파일을 확보한다.
75
+ 1순위는 시스템 패키지, 2순위(권한 없음/오프라인/저장소 미제공)는 프로젝트-로컬 `ffmpeg-static` npm 폴백이다.
76
+
77
+ **★ banker 플러그인 자체(스킬 파일·npm 패키지 배포물)에는 ffmpeg 바이너리를 절대 번들하지 않는다.** 아래 폴백은 사용자 프로젝트의 `node_modules` 에만 설치된다.
78
+
79
+ ### macOS
80
+ ```bash
81
+ brew install ffmpeg
82
+ ffmpeg -version | head -1
83
+ ```
84
+
85
+ ### Linux — Ubuntu / Debian
86
+ ```bash
87
+ sudo apt-get install -y ffmpeg
88
+ ffmpeg -version | head -1
89
+ ```
90
+
91
+ ### Linux — RHEL8 / Rocky8
92
+ ⚠️ 기본 BaseOS/AppStream 저장소에는 `ffmpeg` 가 없다(라이선스 문제로 RPM Fusion 필요).
93
+ ```bash
94
+ sudo dnf install -y https://download1.rpmfusion.org/free/el/rpmfusion-free-release-8.noarch.rpm
95
+ sudo dnf install -y ffmpeg
96
+ ffmpeg -version | head -1
97
+ ```
98
+ 사내망/에어갭 등으로 RPM Fusion 접근이 막히면 dnf 를 포기하고 바로 아래 폴백으로 진행한다.
99
+
100
+ ### Windows
101
+ ```powershell
102
+ winget install --id Gyan.FFmpeg -e
103
+ ffmpeg -version
104
+ ```
105
+
106
+ ### 폴백 — project-local `ffmpeg-static` (시스템 패키지 설치가 불가할 때만)
107
+ ```bash
108
+ npm install --no-save ffmpeg-static
109
+ export FFMPEG_PATH="$(node -e "console.log(require('ffmpeg-static'))")"
110
+ "$FFMPEG_PATH" -version | head -1
111
+ ```
112
+ - `--no-save`: 전역이 아니라 **현재 프로젝트의 `node_modules`** 에만 받는다 — 사용자 워크스페이스 소관이며 banker 플러그인 소관이 아니다.
113
+ - hyperframes 가 이 바이너리를 인식하는지는 §3 의 `npx hyperframes doctor` 로 확인한다.
114
+ - 재강조: 이 폴백은 사용자 프로젝트에 설치되는 npm 의존성일 뿐, banker 플러그인 저장소(`skills/`)나 배포 아티팩트에는 어떤 ffmpeg 바이너리도 포함되지 않는다.
115
+
116
+ ## 3. hyperframes 설치 · 최신화
117
+ ```bash
118
+ npx hyperframes init
119
+ npx hyperframes skills update
120
+ npx hyperframes doctor
121
+ ```
122
+ - `init`: 최초 실행 시 스캐폴딩과 함께 전역 스킬셋(라우터 `/hyperframes` + `hyperframes-*` 도메인 스킬 + `media-use`)을 설치하고, 이미 있으면 최신 여부만 GitHub 기준으로 확인한다.
123
+ - `skills update`: 코어 스킬만 골라 최신화한다(비대화형 환경 권장 경로) — 이미 최신이면 no-op.
124
+ - `doctor`: Node·ffmpeg·설치된 스킬 등 실행 환경을 종합 진단한다.
125
+
126
+ ## 4. 검증 (보고 의무)
127
+ ```bash
128
+ node -v # v22.x.x 이상 기대
129
+ command -v ffmpeg >/dev/null && ffmpeg -version | head -1 || echo "시스템 ffmpeg 없음 — ffmpeg-static 폴백 확인"
130
+ npx hyperframes doctor # 종합 진단(node/ffmpeg/스킬셋)
131
+ ```
132
+ 4-field 보고: 변경(설치 경로·ffmpeg 확보 방식) / Evidence(위 출력) / 검증(`node -v`≥22 + `hyperframes doctor` 통과) / Unknown(권한·네트워크 제약으로 시스템 ffmpeg 불가 등, 가짜 성공 금지).
133
+
134
+ ## 함정
135
+ - **RHEL8/Rocky8 dnf 모듈 nodejs 버전**: AppStream 스트림이 22 미만일 수 있음(사전 `dnf module list nodejs` 확인) → NodeSource 저장소 또는 `setup-node`(nvm) 로 위임.
136
+ - **RHEL8/Rocky8 ffmpeg 미제공**: BaseOS/AppStream 에 없음(라이선스) → RPM Fusion 필요, 접근 막히면 `ffmpeg-static` 폴백.
137
+ - **ffmpeg 바이너리 미번들 원칙**: `ffmpeg-static` 폴백은 사용자 프로젝트 `node_modules` 한정 — banker 플러그인 배포물에는 절대 포함하지 않는다(라이선스·배포 크기·플랫폼별 바이너리 불일치 회피).
138
+ - **GEMINI_API_KEY 는 선택**: AI 이미지 생성이 필요한 카테고리에서만 쓰이고, 무료 폼 카테고리(kinetic-type·stat·charts·logo-reveal·lower-thirds·maps)는 키 없이 전부 동작한다 — 이 스킬은 어떤 API 키도 요구하지 않는다.
139
+ - **Windows PATH 충돌**: winget Node 와 nvm-windows 동시 설치 금지(상세는 `setup-node` 함정 참조).
140
+ - **새 셸에만 반영**: NodeSource/dnf 모듈 설치 직후 PATH 갱신은 새 터미널이 필요할 수 있다.
141
+ - **hyperframes 스킬 갱신은 네트워크 필요**: `hyperframes init`/`skills update` 는 GitHub 에서 최신 스킬을 당겨온다 — 오프라인/에어갭 환경이면 실패를 정직히 보고(가짜 성공 금지).
@@ -1,25 +1,18 @@
1
1
  ---
2
2
  name: ralph-qa
3
- description: "(banker) 작업 결과를 별도 세션·다른 LLM으로 ralplan+critic 로직으로 독립 검증/개선 반복(자기승인 방지). 'ralph-qa'/'교차검증'/'다른 LLM으로 검증'/'독립 QA' 시 사용."
3
+ description: "(banker) 작업 결과를 다른 LLM으로 독립 검증/개선 반복(자기승인 방지): Codex CLI 우선 → 없으면 GPT 등 다른 모델을 curl 로 직접 → 그것도 없으면 다중 에이전트 합의. 'ralph-qa'/'교차검증'/'다른 LLM으로 검증'/'독립 QA' 시 사용."
4
4
  ---
5
5
 
6
6
  # ralph-qa — 교차-LLM 독립 검증 루프
7
7
 
8
- 방금 만든 작업 결과를 **같은 모델·같은 세션이 자기채점**하는 대신, **다른 LLM + 다른 세션**에
9
- 넘겨 `ralplan --deliberate`(설계 optimal 검토)와 `ralph --critic=critic`(수용 기준 검증) 로직을
10
- 적용하고, 지적을 반영해 **APPROVE까지 반복**한다. 핵심 가치는 **독립성**(anti-self-approval):
11
- 저자와 검증자가 다른 모델이라야 편향·맹점이 드러난다.
8
+ 방금 만든 작업 결과를 **같은 모델·같은 세션이 자기채점**하는 대신, **다른 모델**에 넘겨
9
+ `ralplan --deliberate`(설계 optimal 검토)와 `ralph --critic=critic`(수용 기준 검증) 로직을 적용하고,
10
+ 지적을 반영해 **APPROVE까지 반복**한다. 핵심 가치는 **독립성**(anti-self-approval): 저자와 검증자가
11
+ 다른 모델이라야 편향·맹점이 드러난다.
12
12
 
13
- **런타임 매핑 (다른-LLM 경로).**
14
- - **Claude Code(OMC)**: `omc ask codex --agent-prompt critic "..."`(= ralph의 `--critic=codex` 경로),
15
- 또는 `/ccg`(Codex+Gemini+Claude 합의 레인), 또는 `omc ask gemini`. 검증자 = **Codex/Gemini**.
16
- - **Codex(OMX)**: OMX `$ask`(구 `ask-claude`/`ask-gemini` 통합 진입점) 로 **Claude/Gemini** 에게 검증 위임.
17
- - 저자 런타임과 **다른** 모델을 고르는 게 목적 — 대응 경로가 없으면 최소한 **다른 세션·다른 에이전트
18
- 프롬프트**로라도 독립성을 확보한다(완전 독립엔 미달임을 명시).
19
-
20
- **모델·effort.** `--model <id>` 로 검증 LLM을 지정(예: 강한 추론 모델). effort 지원 모델은
21
- `--effort xhigh` 전달. ⚠️ 사용자가 예로 든 `gpt-5.6-sol` 은 **미인식 모델 ID** — 리터럴로 박지 말고
22
- **설치 환경에서 사용 가능한 다른-LLM으로 파라미터화**하라(기본은 위 매핑의 기본 경로).
13
+ **검증자 우선순위 (한 줄 요약).** ① 다른-LLM CLI(**Codex CLI 우선**) → ② 다른 모델 직접 호출(`curl`,
14
+ 크리덴셜 있을 때) → ③ 다중 에이전트 합의(최후). 위에서부터 **사용 가능한 첫 경로**를 쓴다 — 진짜 다른
15
+ 모델이 닿으면 그걸 쓰고, 다중 에이전트 합의는 다른-LLM 경로가 전무할 때만.
23
16
 
24
17
  ## 언제 쓰나
25
18
  - 방금 완성한 구현/설계/문서를 **배포·확정 전** 독립 검증하고 싶을 때.
@@ -28,7 +21,7 @@ description: "(banker) 작업 결과를 별도 세션·다른 LLM으로 ralplan+
28
21
 
29
22
  ## 쓰지 않을 때
30
23
  - 사소한 변경(교차-LLM 왕복 비용이 이득을 초과).
31
- - 다른 LLM 프로바이더 auth가 없고 대체 독립 경로도 없을 때(→ 최소 같은-런타임 `critic` 에이전트로 폴백).
24
+ - 어떤 독립 경로도 없을 때는 폴백(③ 다중 에이전트)이 있으나, 그마저 과하면 그냥 `critic` 한 번.
32
25
 
33
26
  ## 워크플로
34
27
 
@@ -36,35 +29,69 @@ description: "(banker) 작업 결과를 별도 세션·다른 LLM으로 ralplan+
36
29
  검증 대상 = {작업 결과 요약 + **수용 기준(acceptance criteria)** + 변경 파일 목록 + 관련 코드}.
37
30
  기준이 없으면 원 작업에서 도출(vague "잘 됐나?" 금지 — 검증 가능한 기준으로).
38
31
 
39
- ### 2. 다른 LLM·다른 세션으로 위임 (독립성)
40
- 위 런타임 매핑 경로로 **두 렌즈**를 함께 요청(`--lens` 로 선택, 기본 both):
41
- - **ralplan --deliberate 렌즈**: 이 접근이 **optimal** 한가? 더 단순·빠르·유지보수 좋은 대안이 있나?
42
- 프리모템 3시나리오, 원칙 위반 여부.
43
- - **ralph --critic=critic 렌즈**: **수용 기준 하나하나**를 신선한 증거로 검증. 변경 파일뿐 아니라
44
- **관련 코드(호출자·피호출자·공유 타입·인접 모듈)** 까지 검토.
32
+ ### 2. 검증자 선택 — 다른-LLM 우선, 다중 에이전트 합의는 최후 (독립성)
33
+ 목적은 **저자 모델과 다른 모델**로 검증하는 것. 아래 우선순위로 **사용 가능한 첫 경로**를 택한다:
34
+
35
+ 1. **다른-LLM CLI — Codex CLI 우선.** `command -v codex` 로 사용 가능하면 Codex 에 위임한다.
36
+ - Claude Code(OMC) 저자: `omc ask codex --agent-prompt critic "..."`(= ralph 의 `--critic=codex` 경로),
37
+ 또는 `/ccg`(Codex+Gemini+Claude 합의 레인).
38
+ - 저자가 **이미 Codex** 면 Codex 는 "다른 모델"이 아니므로 건너뛰고 Claude/Gemini(OMX `$ask`)를 ①로 삼는다.
39
+
40
+ 2. **다른 모델 직접 호출 via `curl` (Codex CLI 가 없을 때).** 저자와 **다른** 모델(예: GPT)의
41
+ OpenAI 호환 엔드포인트+API 키가 환경/설정에 있으면 `curl` 로 직접 그 모델을 검증자로 쓴다 —
42
+ CLI 래퍼 없이도 진짜 다른 모델이라 독립성이 산다.
43
+ - 엔드포인트·키·모델 ID 는 **환경에서 읽어 파라미터화**한다(하드코딩 금지). 예:
44
+ `"${OPENAI_BASE_URL:?}"`·`"${OPENAI_API_KEY:?}"`·`"${RALPH_QA_MODEL:?}"`, 또는 Codex 설정
45
+ `~/.codex/config.toml` 의 provider(`[model_providers.*]` 의 `base_url`·`env_key`).
46
+ - 호출 예(모델·엔드포인트는 환경값; 프롬프트에 수용 기준 + 두 렌즈를 담아 판정을 JSON 으로 받는다):
47
+ ```bash
48
+ curl -sS "${OPENAI_BASE_URL:?}/chat/completions" \
49
+ -H "Authorization: Bearer ${OPENAI_API_KEY:?}" -H 'Content-Type: application/json' \
50
+ -d "$(jq -n --arg m "${RALPH_QA_MODEL:?}" --arg p "$PROMPT" \
51
+ '{model:$m, messages:[{role:"user", content:$p}]}')"
52
+ ```
53
+ (`jq` 로 페이로드를 안전 구성 — 없으면 동등한 JSON 이스케이프로 대체.)
54
+ - ⚠️ 저자와 **같은 모델 계열이면 독립성이 없으므로 이 경로를 쓰지 않는다**(예: 저자=Codex(GPT)
55
+ 에서 GPT-curl 금지 — 그땐 Claude/Gemini 로).
56
+
57
+ 3. **자체 다중 에이전트 합의 루프 (다른-LLM 경로가 전무할 때, 최후).** 독립 에이전트 **N개(기본 3)** 를
58
+ 서로 다른 렌즈로 띄워 **정족수 합의**로 판정한다:
59
+ - 렌즈: ① ralplan 최적성(더 단순·빠른 대안?) ② critic 수용기준(기준 하나하나 신선한 증거로)
60
+ ③ 적대적 반증(REJECT 를 적극 시도).
61
+ - 판정: **과반 APPROVE** 여야 통과. 확인된 블로커가 **1건이라도** 있으면 ITERATE.
62
+ - 같은 베이스 모델이라 **완전 독립은 아님**(다양성+정족수로 근사) — 단일 자기채점보다 훨씬 강하지만
63
+ ①·② 가 가능하면 반드시 그쪽을 먼저 쓴다.
64
+
65
+ 경로 ①·② 는 **두 렌즈**(ralplan 최적성 + critic 수용기준)를 함께 요청한다(`--lens` 로 선택, 기본 both).
66
+ 경로 ③ 은 렌즈를 에이전트로 분담한다.
45
67
 
46
68
  ### 3. 판정 수신 → 반영
47
- 외부 LLM의 판정(`APPROVE` / `ITERATE` / `REJECT`)과 구체 이슈를 받는다. `APPROVE` 아니면:
48
- 원 런타임에서 이슈 수정 → **같은 외부 LLM으로 재검증**(2단계 반복).
69
+ 검증자(경로 ①~③)의 판정(`APPROVE` / `ITERATE` / `REJECT`)과 구체 이슈를 받는다. `APPROVE` 아니면:
70
+ 원 런타임에서 이슈 수정 → **같은 검증 경로로 재검증**(2단계 반복).
49
71
 
50
72
  ### 4. 종료
51
- - `APPROVE` → 검증 통과 보고(검증자 모델·판정 근거 명시).
73
+ - `APPROVE`(경로 ③ 은 과반) → 검증 통과 보고(**검증 경로·검증자 모델·판정 근거** 명시).
52
74
  - 같은 이슈가 **3회+ 재발** → 근본 블로커로 보고(무한루프 금지).
53
- - auth/프로바이더 장애 → 정직히 보고하고 폴백 경로 안내(같은-런타임 critic).
75
+ - 다른-LLM auth/프로바이더 장애 → 정직히 보고하고 **경로 ③(다중 에이전트)** 으로 폴백.
54
76
 
55
77
  ## 플래그
56
78
  | 플래그 | 효과 | 기본 |
57
79
  |---|---|---|
58
- | `--model <id>` | 검증 LLM 모델 지정 | 런타임 매핑 기본 경로 |
80
+ | `--model <id>` | 검증 LLM 모델 지정(경로 ①·②) | 환경/매핑 기본 |
59
81
  | `--effort xhigh` | effort 지원 모델에 전달 | 미지정 |
60
82
  | `--lens=critic\|plan\|both` | 적용 렌즈 | both |
83
+ | `--agents=N` | 폴백(경로 ③) 에이전트 수 | 3 |
61
84
  | `--max=N` | 최대 반복 | 5 |
62
85
 
63
86
  ## 함정
64
- - **자기채점 금지가 본질** — 저자 모델·세션으로 검증하면 독립성이 사라진다. 반드시 **다른 LLM**.
65
- - **auth env**: 비대화형 셸은 `~/.bashrc` 미로드로 프로바이더 토큰이 없으면 `401`(스킬 문제 아님).
66
- `source ~/.bashrc` 후 교차-LLM 호출. 토큰 자체가 없으면 폴백 경로로.
67
- - **모델명 하드코딩 금지** — 예시 모델(`gpt-5.6-sol` 등)을 리터럴로 박지 말고 파라미터화.
87
+ - **자기채점 금지가 본질** — 저자 모델·세션으로 검증하면 독립성이 사라진다. 반드시 **다른 모델**을 먼저 찾고,
88
+ 없을 때만 경로 ③(다중 에이전트)으로 근사한다.
89
+ - **경로 탐지 순서** — `command -v codex`(①) → 다른-모델 크리덴셜 유무(②, env/`config.toml` provider) →
90
+ 둘 다 없으면 ③. "다중 에이전트"를 다른-LLM 이 있는데도 먼저 쓰지 말 것.
91
+ - **curl 경로 auth** — 비대화형 셸은 `~/.bashrc` 미로드로 키가 없으면 `401`(스킬 문제 아님).
92
+ `source ~/.bashrc` 후 호출. 엔드포인트/키/모델은 **환경값**으로만(하드코딩·커밋 금지).
93
+ - **같은 모델 계열 금지(②)** — 저자와 같은 모델을 curl 로 불러오면 독립성이 없다. 계열이 다를 때만.
94
+ - **모델명 하드코딩 금지** — 예시 모델 ID 를 리터럴로 박지 말고 파라미터화.
68
95
  - **수용 기준 없이 검증 금지** — "잘 됐나?"가 아니라 검증 가능한 기준 대비 판정.
69
96
 
70
- ARGUMENTS: [--model <id>] [--effort xhigh] [--lens=critic|plan|both] [--max=N] [검증 대상/기준]
97
+ ARGUMENTS: [--model <id>] [--effort xhigh] [--lens=critic|plan|both] [--agents=N] [--max=N] [검증 대상/기준]
@@ -127,9 +127,9 @@ node -e "const m=require('./codex/manifest.json');console.log(m.surfaces.filter(
127
127
  node -e "const p=require('./package.json');console.log(p.version, JSON.stringify(p.dependencies||{}))"
128
128
  ```
129
129
 
130
- **앞의 두 줄이 갈리면 그 차이가 사실이다.** 이 저장소에서 실제로 갈린다: 디렉터리는 49 인데 `SKILL.md` 보유는 48 이다.
130
+ **앞의 두 줄이 갈리면 그 차이가 사실이다.** 이 저장소에서 실제로 갈린다: 디렉터리는 55 인데 `SKILL.md` 보유는 54 이다.
131
131
  `skills/ultra-init-workspace/` 는 런타임 산출물 디렉터리라 `SKILL.md` 가 없고, 그래서 배포 매니페스트에도 없고 `package.json` `files[]` 도 negation 으로 뺀다.
132
- 즉 "디렉터리를 세면 스킬 수" 라는 그럴듯한 가정이 **여기서 1 을 더 센다.** 세 곳(매니페스트·`files[]`·테스트의 `SKILL.md` 필터)이 이미 48 을 말하는데 디렉터리 카운트만 49 라면, 틀린 쪽은 카운트다.
132
+ 즉 "디렉터리를 세면 스킬 수" 라는 그럴듯한 가정이 **여기서 1 을 더 센다.** 세 곳(매니페스트·`files[]`·테스트의 `SKILL.md` 필터)이 이미 54 를 말하는데 디렉터리 카운트만 55 라면, 틀린 쪽은 카운트다.
133
133
 
134
134
  **README 는 어떤 경우에도 사실이 아니다. 그리고 사실을 세는 명령도 틀릴 수 있다. 세 소스가 같은 값을 말할 때만 통과다.**
135
135
 
@@ -139,7 +139,7 @@ node -e "const p=require('./package.json');console.log(p.version, JSON.stringify
139
139
 
140
140
  | README 주장 | 위치 | 코드 사실 | 근거 | 판정 |
141
141
  |---|---|---|---|---|
142
- | "스킬 42개" | 10행·131행 | 48 | `ls -d skills/*/SKILL.md` = 48, 매니페스트 skill 표면 = 48 (디렉터리 카운트는 49 라 셋 중 혼자 다르다) | 드리프트: 2곳 다 고침 |
142
+ | "스킬 42개" | 10행·131행 | 53 | `ls -d skills/*/SKILL.md` = 54, 매니페스트 skill 표면 = 54 (디렉터리 카운트는 55 라 셋 중 혼자 다르다) | 드리프트: 2곳 다 고침 |
143
143
  | "`--fast` 지원" | 60행 | 없음 | 파서에 해당 플래그 없음 | 드리프트: 문장 삭제 |
144
144
  | "Node 18+ 필요" | 20행 | `engines.node: ">=18"` | package.json | 통과 |
145
145