요약: 경영전략 질문 하나를 넣으면 서로 다른 벤더의 LLM 세 개가 3라운드 토론을 벌이고, 출처가 검증된 전략 리포트를 내놓는 엔진 ‘레오파드’를 고도화했다. 핵심은 경영학과 커리큘럼 11개 분과 × 33개 세부과목을 ‘학문 렌즈’로 정의해, 제안·공격·종합 전 과정에 주입하고 리포트가 각 분과를 실제로 다뤘는지 LLM 호출 없이 기계로 검사하는 것이다. 라이브 런에서 사회자가 33개 세부과목 전부를 짚은 리포트가 나왔다.

1. 왜 만들었나

LLM 하나에게 “이 사업 전략 어때?”라고 물으면 대체로 친절한 동의가 돌아온다. 반대로 사람 컨설턴트를 셋 붙이면 서로 논쟁하면서 전제의 구멍이 드러난다. 레오파드는 후자를 코드로 만든 것이다.

역할 백엔드 하는 일
제안자 Claude (claude-agent-sdk) 전략안 정확히 3개 제시
도전자 Codex CLI 전략안의 실패 경로를 공격
사회자 Hermes CLI 승패 없이 합의·쟁점·미해결·권고 정리

라운드는 R0(웹 수집) → R1(개진) → R2(반박) → R3(종합)로 흐르고, 산출물은 report.md, transcript.md, sources.json, events.jsonl(SQLite 원장 포함)로 남는다. 인용 게이트가 수집 목록에 없는 URL을 본문에서 제거하고, 출처 없는 수치를 경고로 올린다.

2. 학문 렌즈 — 커리큘럼을 데이터로

경영학과에서 배우는 것은 대충 이렇게 나뉜다: 경영 일반, 조직·인사, 회계, 재무·금융, 마케팅, 생산·물류, 경제, 통계·계량, 정보기술, 법·윤리, 창업. 문제는 LLM 토론이 이 중 서너 개(대개 마케팅과 재무)만 맴돌다 끝난다는 것이다.

그래서 11개 분과 × 33개 세부과목을 파이썬 데이터로 정의했다. 분과마다 핵심 질문이, 세부과목마다 전략에 던지는 질문(focus)과 감지 키워드(markers)가 붙는다.

Lens(
    key="accounting", name="회계",
    question="숫자가 회계적으로 성립하고 세무 리스크가 없는가",
    subs=(
        SubDiscipline("재무회계", "손익·재무 상태가 어떻게 표시되는가", (...)),
        SubDiscipline("원가관리회계", "원가 구조와 단위경제가 성립하는가",
                      ("원가", "고정비", "변동비", "손익분기", "단위경제", ...)),
        SubDiscipline("세무회계", "세금이 손익을 바꾸지 않는가", (...)),
    ),
)

이 모듈 하나가 단일 출처다. 여기서 세 가지가 파생된다.

  1. 프롬프트 브리핑 — R1 제안자는 전략안마다 11분과를 모두 짚어야 하고(무관하면 근거를 대고 “해당 없음”), 도전자는 분과·세부과목을 무기로 공격하고, R3 사회자는 ## 렌즈 점검 절에 분과별 결론을 한 줄씩 쓴다. 다뤄지지 않은 분과는 미검토로 드러내야 한다.
  2. 커버리지 게이트 — 리포트 렌더 시 종합이 각 세부과목 키워드를 실제로 언급했는지 검사해서 분과별 상태 표를 붙인다. LLM을 다시 부르지 않는 결정적 검사다.
  3. 누락 경고 — 안 다뤄진 분과는 리포트 최상단에 “이 리포트만으로 의사결정하지 말라”는 경고로 올라간다. 게이트는 실행을 실패시키지 않는다 — 사람이 보고 판단한다.

핵심 설계 원칙: ‘다룸’ 판정은 깊이를 보장하지 않는다. 커버리지는 누락 검출용 휴리스틱이고, 리포트에도 그렇게 명시된다. LLM의 성실함을 믿는 대신, 불성실이 눈에 보이게 만드는 쪽을 택했다.

3. 라이브 런 — Windows에서 터진 것들

파이프라인 검증 겸 실제 주제(파트너 정산 엔진 SaaS의 국내 시장 진입 전략)로 라이브 런을 돌렸다. 세 번 만에 완주했는데, 실패 두 번이 전부 Windows 특유의 함정이었다.

1차: 제안자 전멸. claude-agent-sdk가 npm 배치 스크립트(claude.cmd) 실행을 보안상 거부한다(cmd.exe 인젝션 위험). 네이티브 claude.exe가 필요한데, SDK 휠에 번들된 exe를 찾아 연결해 해결했다. 같은 이유로 R0 웹 수집도 조용히 0건이 됐었다 — 실패가 빈 목록으로 삼켜지는 경로는 위험하다.

2차: 사회자 전멸. 에러는 “Hermes CLI not found”였는데 exe는 멀쩡했다. 진짜 원인은 R3 종합 프롬프트가 토론 전문 포함 45,000자라 Windows 명령줄 32,767자 한계를 넘은 것. 이때 나는 WinError 206이 파이썬에서 FileNotFoundError로 표면화되고, 어댑터가 “CLI 없음”으로 오인 보고한다. 해법은 25,000자 초과 시 프롬프트를 UTF-8 파일로 스풀하고 사회자가 파일을 읽게 하는 핸드오프.

3차: 완주. 수집 12건(금융위·한국은행 보도자료, 전금법 개정 로펌 뉴스레터, 경쟁사 보도 등) → R1 제안 13,925자 / 공격 9,663자 → R2 반박 15,868자 / 재공격 7,215자 → R3 종합. 사회자는 47,000자 전문을 파일로 받아 정상 종합했다.

4. 결과물 — 33/33 커버리지

사회자 리포트의 렌즈 점검 절이 이렇게 나왔다(발췌):

  • 회계: 재무회계(자금 비취급에 따른 파생 이점 구체적), 원가관리회계(고객별 변동원가 및 기대손실 미포함), 세무회계(원천징수·계산서 기능책임 불확실).
  • 창업: 창업론(실데이터 유료 파일럿·반복 사용만 검증단위로 인정), 벤처경영(“왜 incumbent가 안 하느냐”에 답 필요), 사업계획서(단계별 중단 예산 없음).

미검토 없음 — 모든 11개 학문 렌즈 세부과목이 적어도 한 번 이상 논의·비판됨.

커버리지 게이트도 11분과 전부 ‘다룸’, 33개 세부과목 전부 감지로 판정했다. 권고는 “유료 파일럿 전 시장성 주장 유보”, “법률의견은 고객 사업모델별 실질 검토” 같은 구체적 행동으로 나왔고, 각 항목에 실제 출처 URL이 붙었다.

흥미로운 건 토론의 질이다. 도전자가 “규제 의무·문의 증가와 실제 유료 수요, 가격, CAC, 공헌이익은 다르다”고 치면, 제안자가 수정하고, 사회자가 “무엇을 확인하면 결판나는지”를 쟁점마다 적는다. 단일 LLM의 친절한 동의로는 안 나오는 출력이다.

5. 배운 것

  • 커리큘럼은 좋은 체크리스트다. 경영학과 4년 과정은 사업을 보는 관점의 분류체계로 이미 검증돼 있다. 그걸 프롬프트 미사여구가 아니라 데이터+게이트로 만들면 LLM 토론의 사각지대가 구조적으로 줄어든다.
  • 검증은 생성보다 싸다. 커버리지 게이트는 정규식과 문자열 매칭뿐이다. LLM 호출 0회로 88개 테스트가 돈다. 비싼 생성 경로의 품질을 싼 검증 경로가 감시하는 구조.
  • 에러 메시지를 믿지 마라. “CLI not found”의 진짜 원인이 argv 길이 한계였던 것처럼, 플랫폼 경계(Windows·subprocess·SDK)에서는 에러가 원인을 가리킨다. 재현 실험이 정답.

레포는 private이지만, 구조가 궁금하면 댓글로. 다음 단계는 사회자까지 Nous 모델로 분리해 3벤더(Anthropic/OpenAI/Nous) 완전 교차 검증을 만드는 것이다.