Empirical Study · Dynamic Workflows · 2026

적대적 검증은 LLM 코드 감사의 거짓 양성을 100% 걸러냈다

Adversarial Verification for False-Positive Suppression in LLM-Based Code Auditing — A Dynamic-Workflow Empirical Study

저비용 스캐너가 보고한 7건의 의심 결함을, 그것을 찾지 않은 독립 검증자가 전부 반증했다 — 확정 결함 0건. "생성자 ≠ 채점자" 분리가 노이즈를 흡수한다.

100%
거짓 양성 억제율 (7/7)
7 → 0
원시 발견 → 확정 결함
17
에이전트 / 419K 토큰
68
백그라운드 총 소요

핵심 결과 한눈에

① 병렬 스캔 (Haiku ×3)
의심 결함 보고
7건
② 적대적 검증 (Opus ×2 관점, 14표)
거짓 양성으로 반증
7건
③ 최종 산출
확정
0건

14개 검증 표결 중 지지표 0 — 단순 기각이 아닌 적극 반증

반박이 인용한 구체적 증거 유형 (저비용 스캐너가 놓친 컨텍스트) 2타입 시스템 보장 1경계 검증 3의도된 설계 (주석·테스트) 1수학적 불변식 2언어 스펙 보장 1비-보안 맥락

Abstract

배경. 저비용 LLM을 코드 전수 스캔에 투입하면 높은 재현율과 함께 다량의 거짓 양성이 발생하며, 단일 패스 감사는 이 노이즈를 사람에게 전가한다. 본 연구는 Anthropic Dynamic Workflows 위에서, 발견을 그것을 생성하지 않은 독립 에이전트가 적대적으로 반박하는 다단계 파이프라인(D1)의 거짓 양성 억제 효과를 실증한다.

방법·결과. 프로덕션 백엔드의 3개 큐 모듈을 Haiku 3개가 병렬 스캔(7건 보고)하고, 각 발견을 Opus 검증자가 correctness·security 2관점에서 반박(기본 real=false)했다. 결과 7건 전부(100%)가 기각되어 확정 결함은 0건이었으며, 모든 반박은 코드·테스트·언어 스펙의 구체적 증거에 근거했다. 비용은 17 에이전트·419K 토큰·68초였다.

Keywords: 동적 워크플로우, 멀티에이전트 오케스트레이션, 적대적 검증, LLM 코드 감사, 거짓 양성 억제  ·  CCS: Software verification; Multi-agent systems

1서론

LLM 코드 감사의 핵심 긴장은 재현율과 정밀도의 상충이다. 저비용·고속 모델을 모듈마다 병렬 투입하면 넓은 범위를 빠르게 훑지만, 좁은 컨텍스트와 얕은 추론으로 "패턴은 의심스럽지만 실제로는 의도된 설계"인 항목을 결함으로 과대 보고한다. 단일 패스 파이프라인은 이 거짓 양성을 인간 리뷰어에게 전가하여 감사 도구의 실효 신뢰도를 떨어뜨린다[1].

Anthropic이 2026년 research preview로 공개한 Dynamic Workflows[2,3]는 Claude가 작성한 JavaScript 오케스트레이션 스크립트를 백그라운드에서 실행해 수십~수백 서브에이전트를 단일 세션에서 병렬 조율한다. 본질적 이점은 병렬화가 아니라 반복 가능한 품질 패턴—발견을 독립 컨텍스트의 다른 에이전트가 적대적으로 검증—을 코드로 고정한다는 점이다. 본 연구는 이를 실제 프로덕션 백엔드에 적용해 다음을 묻는다.

RQ1. 독립 에이전트의 적대적 검증은 저비용 스캐너의 거짓 양성을 얼마나 억제하는가?
RQ2. 기각된 발견에 대해 검증자가 제시하는 반박 근거는 어떤 유형으로 분류되는가?
RQ3. 이 다단계 오케스트레이션의 자원 비용(에이전트·토큰·시간)은 어느 정도인가?

기여. (i) Dynamic Workflow 기반 적대적 코드 감사 파이프라인의 설계·실행을 기술한다. (ii) 프로덕션 코드 7개 발견 전수의 검증 결과와 근거 유형 분류를 제시한다. (iii) 절차를 재사용 스킬(dynamic-workflow)로 고정해 재현성을 확보한다.

2배경 및 관련 연구

2.1Dynamic Workflows

Dynamic Workflow는 "누가 계획을 들고 있는가"에서 서브에이전트·스킬·에이전트 팀과 구분된다[2]. 서브에이전트는 Claude가 매 턴 결정하고 중간 결과가 컨텍스트에 적재되는 반면, 워크플로우는 루프·분기·중간 결과를 스크립트 변수가 보유해 컨텍스트엔 최종 답만 남는다. 동시 최대 16 에이전트, 런당 1,000개로 제한되며 세션 내 재개가 가능하다. 대표 사례로 Bun의 Zig→Rust 포팅(약 75만 줄, 테스트 99.8% 통과, 11일)이 있다[3,4].

2.2적대적 검증과 거짓 양성

LLM 정적 감사의 거짓 양성은 주로 (a) 좁은 컨텍스트의 호출 그래프 미파악, (b) 타입·언어 스펙이 이미 배제한 시나리오의 과대 가정, (c) 의도된 설계를 결함으로 오인에서 발생한다. 본 연구의 적대적 검증은 생성자와 채점자를 분리해 자기 확증 편향을 차단하고, 검증자에게 "반박하라(default real=false)"는 회의적 사전을 부여한다. 다관점(correctness·security) 검증은 동일 반박 반복보다 넓은 실패 모드를 포착한다[2].

3시스템 설계

파이프라인(D1)은 Scan → Verify → Loop 세 위상으로 구성된다(그림 1).

지시 1개버그+보안 감사
병렬 스캔 ×3Haiku · 모듈별
적대적 검증Opus · 2관점
결과 1개거짓양성 제거
그림 1. D1 적대적 감사 파이프라인. 각 발견은 그것을 찾지 않은 검증자 2명에게 전달되며, 과반 지지 미만이면 폐기된다. 신규 발견이 없을 때까지 반복한다.

3.1형식적 절차

모듈 집합 M, 라운드 r마다: (1) 각 m∈M을 스캐너가 병렬 스캔. (2) 누적 seen에 없는 신규 발견 F만 추출. (3) 각 f∈F를 검증자 집합 V={correctness, security}가 독립 반박, 지지표(real=true)가 임계 τ 이상이면 확정. (4) 신규 발견이 없으면 종료. 핵심 불변식은 dedup이 누적 seen 기준이라는 점—이를 어기면 기각 발견이 매 라운드 재등장해 수렴하지 않는다.

3.2구현

// D1 핵심 루프 (요약) — 신규 발견 0이 될 때까지
while (dry < 1) {
  const found = (await parallel(MODULES.map(m => () =>
    agent(`Scan ${m} for bugs/security/race...`,
      { model: 'haiku', phase: 'Scan', schema: SCAN })))).flatMap(r => r.findings)
  const fresh = found.filter(f => !seen.has(key(f)))   // 누적 dedup
  if (!fresh.length) { dry++; continue }
  fresh.forEach(f => seen.add(key(f)))
  const judged = await parallel(fresh.map(f => () =>
    parallel(['correctness', 'security'].map(lens => () =>
      agent(`Independently REFUTE "${f.title}" via ${lens}. Default real=false.`,
        { phase: 'Verify', schema: VERDICT })))
    .then(votes => ({ f, real: votes.filter(v => v.real).length >= 1 }))))
  confirmed.push(...judged.filter(j => j.real).map(j => j.f))
}

4실험 설정

표 1. 실험 구성 파라미터.
대상 코드베이스send-grid-test/elysia-server (Elysia + Bun, 프로덕션)
대상 모듈lib/queue/index.ts, mastra-job-id.ts, sequence-email-scheduler.ts
스캐너 모델Claude Haiku 4.5 (모듈당 1, 병렬 3)
검증자 모델Claude Opus 4.8 (발견당 2, 관점 = correctness·security)
확정 임계값 τ≥ 1 지지 (보수적 — 거짓양성 억제를 보수적으로 측정)
종료 조건신규 발견 0 (dry = 1)

대상은 의도적으로 좁은 슬라이스(5파일 중 3파일)로 선정해 비용을 측정 가능한 수준으로 제한했다[2]. 검증자에겐 전체 코드베이스 Read 권한이 부여돼 호출처·타입 정의·테스트까지 추적할 수 있다.

5결과

5.1RQ1 — 거짓 양성 억제율

표 2. 위상별 발견 수.
위상발견비고
스캔 보고 (raw)7Haiku ×3, medium 3 / low 4
적대적 검증 후 확정0전 관점 real=false
기각 (거짓 양성)7억제율 100% (7/7)

7건은 14개 검증 표결(7×2 관점)에서 단 한 표의 지지도 얻지 못했다. τ≥1 보수적 임계값에서도 확정 0건은, 검증자들이 단순 기각이 아니라 적극적으로 반증했음을 의미한다.

5.2RQ2 — 반박 근거 유형 분류

14개 반박 표결을 코딩한 결과 근거는 6개 유형으로 분류됐다(중복 허용). 이는 저비용 스캐너가 어떤 컨텍스트를 놓치는지에 대한 분류 체계를 제공한다.

표 3. 반박 근거 유형과 해당 발견.
근거 유형설명발견
① 타입 시스템 보장TypeScript 유니온/옵셔널이 무효 입력을 컴파일에서 배제F2, F3
② 경계 검증라우트 boundary(TypeBox format:"uuid")가 enqueue 전 검증·거부F3
③ 의도된 설계주석·테스트로 문서화된 멱등성/레거시를 결함으로 오인F1, F2, F4
④ 수학적 불변식Math.max(120, …) 클램프가 음수 TTL을 구조적으로 차단F4
⑤ 언어 스펙 보장ES Map 삽입순서·단일스레드 no-await 불변으로 동시성 오탐 무효화F5, F7
⑥ 비-보안 맥락jitter는 부하분산용이며 암호 경계 아님 → CSPRNG 불필요F6

특기점: 다수 반박이 발견 본문의 자기 격하("minor", "low severity", "No actual bug here", "typically acceptable")를 인용했다(F5, F6, F7). 저비용 스캐너가 확신 없는 패턴 매칭을 결함으로 승격시키는 경향을 검증이 포착함을 보인다.

5.3RQ3 — 자원 비용

표 4. 실행 자원.
지표
총 에이전트17
서브에이전트 토큰418,618
도구 호출59
총 소요 (백그라운드)68.3 초
스캐너 : 검증자 비율3 : 14

비용 대부분(검증 14 vs 스캔 3)이 검증 단계에 집중됨은 설계 의도와 일치한다: 넓게 싸게 훑고(Haiku), 좁게 깊게 확인한다(Opus). 17 에이전트는 동시 16 한도 안에서 운용됐다.

6논의

"생성자 ≠ 채점자"의 효과. 7건 전수 기각은 검증자가 까다로워서가 아니라, 생성자가 접근 못 한 컨텍스트(호출처·타입 정의·테스트·언어 스펙)를 동원했기 때문이다. 동일 모델이 자기 발견을 재평가했다면 자기 확증 편향으로 상당수가 통과했을 가능성이 높다. 분리가 핵심 기제다.

다관점의 가치. 두 관점은 같은 발견을 다른 각도에서 공격한다. F6(Math.random jitter)에 security는 "타이밍 공격 방어가 아님", correctness는 "스로틀 강제는 Redis Lua가 원자적 수행"이라는 상보적 반박을 냈다. 동일 반박 2회였다면 이 폭을 얻지 못했다.

실용적 함의. 단일 패스 Haiku 감사를 채택했다면 사람이 7건 거짓 양성을 일일이 조사해야 했다. 적대적 검증 계층은 419K 토큰·68초로 이 인적 노이즈를 0으로 만들었다—"틀리면 비싼" 시나리오에서 워크플로우가 정당화되는 지점이다.

7타당성 위협

7.1내적 타당성

확정 0건은 코드가 견고했기 때문일 수도, 검증자가 과도하게 회의적이었기 때문일 수도 있다. real=false 사전 때문에 거짓 음성 위험이 존재한다—진짜 결함도 함께 기각됐을 수 있다. 다만 각 반박이 구체적 코드 증거를 인용한 점(부록 A)은 기계적 기각이 아님을 시사한다.

7.2외적 타당성

대상은 단일 코드베이스의 잘 문서화·테스트된 3개 모듈이다. 문서·테스트가 빈약한 코드에선 ③(의도된 설계) 반박이 약화될 수 있다. 7건은 표본이 작아 억제율 100%를 일반 모집단으로 외삽할 수 없다.

7.3구성 타당성

"거짓 양성" 판정 자체가 LLM 검증자에 의존하므로 순환성 위험이 있다. 이상적으로는 인간 전문가 라벨과 대조해야 하며, 본 스모크에선 반박의 코드 인용을 통한 추적 가능성으로 부분 완화했다.

7.4재현성

Dynamic Workflows는 research preview로 API 표면이 변동될 수 있다[2]. 동일 스크립트·입력은 재개 시 캐시 결과를 반환하나, 신규 실행의 LLM 비결정성은 발견 집합을 변화시킬 수 있다.

8한계와 향후 과제

  • 거짓 음성 미측정. 알려진 버그를 주입(mutation)해 검증자가 실제 결함을 통과시키는지(recall) 측정해야 한다.
  • 임계값 민감도. τ·관점 수·검증자 모델의 ablation이 필요하다.
  • 표본 확대. 11개 도감 패턴 전체·다수 코드베이스로 확장해 억제율 분포를 추정한다.
  • 인간 정답 대조. 전문가 라벨과의 일치도(κ)로 구성 타당성을 강화한다.
  • 비용-효익 곡선. loop-until-dry의 라운드 수와 한계 발견율의 관계를 모델링한다.

9결론

Dynamic Workflow 상의 적대적 검증 파이프라인이 저비용 LLM 스캐너의 거짓 양성을 효과적으로 억제함을 프로덕션 코드에서 실증했다. 7건의 원시 발견은 독립 검증자의 구체적·코드 기반 반박에 의해 전수 기각됐고(억제율 100%), 근거는 타입 시스템·경계 검증·의도된 설계·수학적 불변식·언어 스펙의 유형으로 분류됐다. 419K 토큰·68초의 비용은 "생성자 ≠ 채점자" 분리가 만드는 신뢰도 이득을 정량화한다. 향후 거짓 음성 측정과 임계값 ablation으로 작동 한계를 규명할 것이다.

References

  1. 본 실험 산출물: Run wf_b1013006, 대상 elysia-server/src/lib/queue, 2026-06-04. 부록 A에 발견 전문 수록.
  2. Anthropic. Orchestrate subagents at scale with dynamic workflows. Claude Code Docs. code.claude.com/docs/en/workflows.
  3. Anthropic. Introducing dynamic workflows in Claude Code. 2026. claude.com/blog.
  4. InfoQ. Claude Code Adds Dynamic Workflows for Parallel Agent Coordination. 2026. infoq.com.

Appendix A — 발견 전문 및 적대적 반박

스캐너가 보고한 7건 전수. 각 항목의 한국어 요약과 검증자 2명(correctness·security)의 영문 반박 원문. 모든 판정 real: false. 카드를 눌러 펼치세요.

C. Lee (GRINDA AI) · Claude Opus 4.8 (Anthropic Dynamic Workflows, research preview)

Dynamic Workflow 실증 연구 · dynamic-workflow 스킬 스모크 테스트 · Run wf_b1013006 · 2026-06-04 · 인쇄(⌘P) 시 논문 레이아웃 최적화