소개 및 아키텍처
BADA Terminal이 지향하는 루프 엔지니어링의 기본 철학과 복합 에이전트 오케스트레이션 아키텍처를 안내합니다.
BADA Terminal은 Anthropic사의 Claude Code CLI를 핵심 코어 엔진으로 삼고, 에이전트의 오작동 및 폭주 방지 가드레일, 상태 격리, 자동 검증(Harness Verification), 그리고 AI 기반의 장애 분류(Triage) 체계를 로컬 데이터베이스와 밀결합한 독자적 루프 엔지니어링(Loop Engineering) 플랫폼입니다.
루프 엔지니어링 (Loop Engineering) 이란?
프롬프트와 에이전트 실행 단계를 일회성으로 끝내지 않고, 성공/실패 여부를 코드로 검증(Verification)하여 실패 시 이전 단계로 피드백을 전달하고 자가 참조 방식으로 완료될 때까지 반복 순환시키는 자동화 제어 설계 방식입니다.
BADA 터미널 하이브리드 아키텍처
BADA는 로컬 데스크톱 어플리케이션(Electron)과 분리된 스케줄러 코어, 그리고 SQLite DB 영속 레이어가 유기적으로 연결되어 작동합니다.
BADA의 자율 브랜칭 및 3-Pass Seeding 격리 엔진은 Git을 기반으로 작동하므로 반드시 설치되어 있어야 합니다.
# Windows (CMD / PowerShell)
winget install Git.Git
# macOS (Homebrew)
brew install git
BADA Terminal은 Node.js 및 Electron 프레임워크 기반으로 작동하므로 Node.js LTS 버전 설치가 권장됩니다.
# Windows (CMD / PowerShell)
winget install OpenJS.NodeJS
# macOS (Homebrew)
brew install node
Claude Code의 실행 트레이스 및 Langfuse 훅을 전송하고 디버깅 로그를 후처리하기 위해 필요합니다.
# Windows (CMD / PowerShell)
winget install Python.Python.3
# macOS (Homebrew)
brew install python
Node.js 설치 완료 후 시스템 터미널에 아래 명령을 입력하여 Anthropic의 공식 CLI 및 토큰 분석기 패키지를 설치하십시오.
npm install -g @anthropic-ai/claude-code codeburn
설치가 완료된 후 BADA Terminal에서 파일 ➜ 새 세션 (Cmd/Ctrl+N)을 실행하면 래핑된 인공지능 터미널이 자동으로 활성화됩니다.
퀵 스타트 가이드
BADA Terminal을 사용해 첫 번째 자동 복구 피드백 루프를 시작하는 가장 빠른 방법입니다.
3단계 실행 흐름
Maker, Checker)에 해당하는 시스템 프롬프트(Persona)를 편집하여 지정합니다. 시스템은 .clauderules 및 위키 RAG 컨텍스트를 자동 빌드해 줍니다.
CLI로 간편하게 구동하기
배경 실행 크론 데몬이나 클로드 네이티브 루틴에서 구동할 수 있는 CLI 트리거를 기본 내장하고 있습니다.
# BADA 루트 폴더로 이동 후 워크플로우 구동
NODE_PATH=./node_modules node scratch/trigger-bada-workflow.js [프로젝트 ID] [워크플로우 ID]
- 로컬 격리 루프 실행: BADA는 Claude Code CLI를 핵심 코어로 사용하는 로컬 격리형 루프 엔지니어링 플랫폼입니다.
- Maker-Checker 피드백 루프: 에이전트(Maker)가 코드 수정을 수행하고 검증기(Checker)가 이를 빌드/테스트하여 통과할 때까지 자가 교정 및 수정 루프를 반복 구동합니다.
- 보안 및 자원 예산 통제: 병렬 격리(Git Worktree) 및 토큰 요금 상한제(Budget Guard)가 에이전트의 오작동 및 폭주로 인한 요금 폭탄을 원천 방지합니다.
| 단축키 | 기능 및 설명 |
|---|---|
| Ctrl + B | CodeBurn 실시간 대시보드 토글 (토큰 사용량 및 비용 실시간 확인) |
| Ctrl + D | Langfuse 원격 추적 모니터링 웹 대시보드 실행 |
| Ctrl + T | 현재 세션의 토큰 사용량 절감 분석(Advisor) 요청 |
| Ctrl + G | 지식 관리 시각화(D3.js 기반 지식 그래프 캔버스) 열기 |
| Ctrl + N | 현재 폴더에 대한 새로운 터미널 CLI 세션 기동 |
| Ctrl + O | 📂 폴더 선택 다이얼로그를 통해 작업 디렉토리 지정 및 세션 연결 |
| F12 | 에디터 패널 및 소스 파일 인스펙터 사이드 패널 토글 |
- 지식 및 RAG 로딩: BADA Terminal은
~/.claude/skills/경로에 내재된 전용 스킬(Knot, Obsidian 등)을 자동으로 기동합니다. - 링크 즉시 조작: 터미널 캔버스 및 로그 상에 파일 경로(예:
src/main.js)나 URL이 표출되면, Ctrl + 클릭하여 연결된 로컬 에디터나 브라우저로 즉시 열어볼 수 있습니다.
지식 RAG & Headroom 프록시 연계
바다 터미널의 지능형 지식 탐색(RAG)과 실시간 보안 마스킹(Headroom) 프록시가 이중으로 협력하여 토큰을 절감하고 보안 유출을 방지하는 원리를 설명합니다.
지식 RAG & Headroom 이중 필터 메커니즘
BADA Suite는 에이전트의 상황 인지(Context) 주입 시 발생하는 두 가지 중대한 비용 및 보안 문제를 물리적 RAG 필터와 논리적 API 프록시 마스킹의 이중 파이프라인으로 해결합니다.
핵심 작동 구성 요소
1) 4-Signal Relevance Engine에 의한 물리적 1차 압축
에이전트가 코딩 중 참조할 파일이나 노트 맵이 백 개가 넘어가도, BADA의 Relevance Engine이 아래 공식에 의거하여 노드 간의 종합 가중치 점수를 실시간 계산합니다.
Relevance Signal 세부 명세
- Direct Link (직접 엣지 가중치): SQLite
edges테이블에 명시된 두 노드 간의 실시간 참조 연결 가중치입니다. - Source Overlap (공통 소스 지수): 노드가 속한 패키지, 소스 파일의 공통 종속성 정도를 수치화한 값입니다.
- Adamic-Adar (그래프 구조 유사도): 그래프 내에서 두 노드가 공유하는 이웃 노드들의 차수(Degree) 역수를 합산하여 간접 유사도를 파악하는 휴리스틱 공식입니다.
- Type Affinity (노드 유형 선호도): 호출 대상(예: 클래스-메소드 간)에 매핑된 기본 적합도 상수 가중치입니다.
SQLite FTS (Full-Text Search) 및 nodes_fts 결합 검색
BADA는 자연어 쿼리나 에러 로그가 유입되었을 때, 텍스트 형태의 검색을 빠르게 보조하기 위해 SQLite FTS5 내장 검색 라이브러리를 결합하여 nodes_fts 가상 테이블을 구성하고 실시간 가중치 점수를 합산해 12개 노드로 축소시킵니다.
2) Headroom API 프록시에 의한 기밀 유출 방어 및 2차 정제
물리적으로 선별된 프롬프트 데이터가 외부 클라우드 LLM(OpenAI/Gemini/Anthropic 등)으로 발송되는 요청 바이트를 실시간으로 프록시 서버에서 가로챕니다. 프롬프트 본문 내부의 주민등록번호, 비밀번호, 시스템 계정, 보안 토큰키 및 DB 접속 정보와 같은 10대 기본 기밀 데이터를 안전한 대치 토큰([SECRET_...])으로 자동 마스킹 처리하여 기밀의 외부 유출을 원천 예방하고, 전송 데이터 중복을 없애 한 번 더 요금 절감을 이뤄냅니다.
BADA Headroom 10대 기본 기밀 마스킹 규칙 정의
| 순번 | 보안 항목 종류 | 정규식 매칭 패턴 예시 | 마스킹 치환 토큰명 |
|---|---|---|---|
| 1 | 주민등록번호 (RRN) | \d{6}-[1-4]\d{6} |
[SECRET_RRN] |
| 2 | API 인증 토큰 (Bearer, API Key) | (?i)(api[-_]?key|auth|token)\s*[:=]\s*["']?[a-zA-Z0-9_\-]{16,}["']? |
[SECRET_API_KEY] |
| 3 | 데이터베이스 접속 비밀번호 | postgres:\/\/[^:]+:([^@]+)@ |
[SECRET_DB_PASSWORD] |
| 4 | AWS Credentials | (?i)(aws_access_key_id|aws_secret_access_key)\s*[:=]\s*["']?[a-zA-Z0-9/+=]{16,}["']? |
[SECRET_AWS_CREDENTIALS] |
| 5 | Private SSH Key | -----BEGIN [A-Z]+ PRIVATE KEY----- |
[SECRET_SSH_KEY] |
| 6 | 공인 IP 주소 (Public IP) | \b(?:[0-9]{1,3}\.){3}[0-9]{1,3}\b (사설 IP 대역 제외 필터링) |
[SECRET_IP_ADDRESS] |
| 7 | 이메일 주소 (Email) | [a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,} |
[SECRET_EMAIL] |
| 8 | 신용카드 번호 (Credit Card) | \b(?:\d{4}[-\s]?){3}\d{4}\b |
[SECRET_CREDIT_CARD] |
| 9 | 전화번호 (Phone Number) | 010-\d{3,4}-\d{4} |
[SECRET_PHONE_NUMBER] |
| 10 | 시스템 환경변수 내의 기밀값 | (?i)(password|passwd|secret|credential)\s*=\s*\S+ |
[SECRET_SYSTEM_CREDENTIAL] |
관련 설정 및 사용 방법
⚙️ 설정 구성 (Headroom & RAG 연동)
- 보안 및 마스킹 제어: 상단 메뉴바의 [Headroom 셋업] 메뉴를 선택하여 10대 기본 기밀 항목들의 개별 활성/비활성 여부를 지정하고, 기업 고유의 도메인 단어들을 위한 정규식을 수동 추가합니다.
- 사내 내부망 LLM 우회(Bypass) 셋업: 만약 사내 내부에 배포된 Local Llama나 DeepSeek API를 사용하는 경우, 마스킹으로 인한 코드 품질 저하를 예방하기 위해 [Headroom 셋업] 내 프로바이더 목록에서 해당 Ollama/vLLM 프로바이더의 'Bypass Masking'을 활성화합니다.
- RAG 참조 방식 변경: [환경설정] ➔ 지식 설정에서 RAG 컨텍스트 주입 방식을
contents(본문 주입) 혹은path(경로만 주입)로 토큰 용량에 맞춰 조율합니다.
💡 실전 활용 시나리오
사례 1: 외부 LLM 사용 시 로컬 위키 내 DB 접속 정보 자동 유출 방어
조건: 로컬 위키의 wiki/database.md 파일에 내부 테스트용 DB 주소(postgres://admin:pwd123@192.168.1.10/dev_db)가 적혀 있으며, 외부 Anthropic Claude를 사용해 개발 중입니다.
작동: 에이전트가 DB 아키텍처 조회를 위해 이 마크다운 위키를 참고하려 할 때, RAG Compiler에 의해 추출된 문서 본문이 API 전송 직전 Headroom 프록시를 관통합니다. 외부 전송 프롬프트에서는 접속 정보가 postgres://[SECRET_ID]:[SECRET_PASSWORD]@192.168.1.10/dev_db 형식으로 실시간 마스킹 치환됩니다. 외부 LLM에 원본 비밀정보는 단 1글자도 노출되지 않는 상태로 안전하게 코딩 어시스턴스를 보장받습니다.
사례 2: 사내 내부 LLM 활용 시 무마스킹 정밀 추론
조건: 보안 격리가 완전하게 구현된 사내 vLLM 서버(Local DeepSeek-Coder)에 연결하여 BADA Terminal을 구동 중입니다.
작동: 해당 프로바이더의 Bypass 옵션을 활성화해 둡니다. 위키 마크다운에 기재된 사내 전용 도메인 파라미터나 변수가 마스킹 변환 없이 100% 원문 그대로 내부 LLM에 직결 주입됩니다. 에이전트는 기밀 훼손으로 인한 맥락 누락 현상 없이 완벽한 자가 추론 코드를 리포지토리에 적용합니다.
프로젝트 루트의 .clauderules 파일에 너무 크고 방대한 지식이나 개발 규칙 전체를 작성하지 마십시오. 프롬프트가 과대화되어 매 대화마다 엄청난 토큰 비용이 낭비됩니다.
규칙 파일에는 핵심 가이드 요약본과 상세 위키 링크([[wiki/Home]])만 남기십시오. 에이전트가 필요할 때만 마크다운 파일을 선택적으로 조회(Selective Read)하게 만듦으로써 컨텍스트 부하를 획기적으로 낮출 수 있습니다.
프로젝트 상세 설계 문서나 디버깅 트러블슈팅 이력은 마크다운 파일로 나누어 관리하십시오.
- 지식 위키 폴더 지정: [설정] 패널에서 위키 디렉토리를 지정하면 에이전트가 해당 마크다운 문서들을 RAG 컴파일 대상으로 자동 로드합니다.
- 사이드 에디터 패널 (F12): 사이드 패널의 파일 인스펙터를 켜면 필요한 마크다운 문서를 수동으로 직접 열어 수정하거나 실시간 편집할 수 있습니다.
지식 관리 시각화 도구(단축키: Ctrl + G)를 켜서 BADA 데이터베이스의 실시간 온톨로지 상태를 점검하십시오.
- 세션과 소스 파일 간 연관성: 어떤 대화 세션들이 어떤 소스 파일들을 편집하고 빌드했는지 동시 수정(co-modified) 관계선으로 표현됩니다.
- 수정 범위 예측: 관계선 그래프의 밀집 허브(Hub) 노드를 참고하여 코드 변경 시 파급될 수 있는 영향 범위를 사전에 시각적으로 예측하고 대처할 수 있습니다.
Closed-Loop 루프 엔지니어링 가이드
에이전트가 검증을 통과할 때까지 스스로 피드백을 수용하며 자가 수정하는 완결형 자동화 아키텍처입니다.
루프 엔지니어링이란?
BADA Terminal의 핵심 철학은 "에이전트에게 일을 맡긴 후 방치하지 않고, 검증(Verify)을 통과할 때까지 피드백 루프를 폐쇄형(Closed-Loop)으로 반복한다"는 것입니다. 이 방식은 에이전트의 초기 실수율을 획기적으로 낮추고 최종 작업 결과물의 완성도를 극대화합니다.
BADA의 루프 제어 엔진(Loop Controller)은 목표 수립(Goal) ➔ 격리 실행(Execute) ➔ 검증 평가(Verify) ➔ 회류 학습(Feedback)의 4단계 라이프사이클을 반복하며 목표를 자가 달성합니다.
자가 교정 (Self-Correction)
검증 실패 시 발생한 에러 로그와 소스 Diff를 수집하여 다음 이터레이션의 프롬프트에 자동으로 누적 주입, 점진적 개선을 유도합니다.
예산 및 자원 가드레일
최대 반복 이터레이션 수(Max Iterations)와 토큰 비용 요금제 한도(Max Budget)를 두어 에이전트가 무한 루프에 빠지거나 비용이 폭주하는 것을 차단합니다.
Closed-Loop 4단계 실행 흐름
배치 스케줄러 또는 루프 빌더를 통해 에이전트가 최종 달성해야 할 성공 목표를 지정합니다.
- 테스트 코드 통과 (Test Suite): 지정한 테스트 사양(예:
npm test)이 종료 코드0으로 완수될 때까지 반복합니다. - 파일 검증 (File Output): 결과 파일이 생성되었는지, 내용이 특정 포맷이나 정규식(Regex) 기준에 일치하는지 검사합니다.
- 수치 지표 (Metric/Threshold): 수집된 성능 지표값(예:
accuracy >= 0.95)이 목표 기준을 상회할 때까지 최적화합니다.
지정된 에이전트가 활성화되어 소스 코드를 생성하거나 리팩토링합니다. 이때 개발 디렉토리 오염을 막기 위해 Git Worktree 격리 모드로 백그라운드 임시 분기에서 병렬 구동을 실행할 수 있습니다.
에이전트 수정이 완료되면 루프 컨트롤러는 지정된 하네스 검증 조건을 구동하여 합격 여부를 판정합니다. 성공했다면 즉시 메인 브랜치에 코드를 머지하고 루프를 최종 승인 종료합니다.
검증에 실패할 경우, 실패 사유와 컴파일 에러 메시지, Git Diff 데이터가 자동으로 에이전트의 기억(Context)에 복합 주입됩니다. 에이전트는 이 피드백을 기반으로 자가 수정을 수행하며 다음 이터레이션을 개시합니다.
목표 설정 목표식(Goal Expression) 명세
BADA가 루프 성공/실패 여부를 판별하기 위해 해석하는 goal_expression JSON 속성 정의 구조입니다.
{
"type": "test_command", // 검증 타겟 유형: test_command | file_check | metric_limit
"command": "npm run test:auth", // 실행할 하네스 명령어
"success_criteria": {
"exit_code": 0, // 성공 종료 코드
"regex_match": "Passed:" // 로그에서 매칭되어야 할 필수 정규식 (선택)
}
}
BADA Closed-Loop 안전 가드레일 제약 한도
루프 엔진이 무한 지출 및 프로세스 고아 방지를 위해 강제 준수하는 가드레일 제한 규칙입니다.
| 제한 변수명 | 기본 설정 한계값 | 가드레일 초과 시 강제 조치 사항 |
|---|---|---|
Max Iterations |
5회 (최대 10회 조정 가능) | 루프 강제 차단, 최종 상태 circuit_broken으로 강제 기록 및 OS 알림 발송 |
Max Token Budget |
$2.00 USD (최대 $5.00) | 비용 상향 한도 도달 시 PTY 프로세스 강제 종료 및 알림 발송 |
Max Wall Time |
3600초 (1시간) | 경과 시간 초과 시 모든 가상 머신 및 백그라운드 PTY 프로세스를 SIGKILL하고 트레기 정리 |
Consecutive Failures |
3회 연속 에러 | 동일 에러가 3번 반복되어 개선 diff가 발견되지 않을 시 루프 차단(Triage Inbox 인계) |
루프 관련 스키마 정보 (SQLite DB)
루프의 정의와 단계별 성공 및 토큰 소모 이력은 다음 테이블에 완전히 저장됩니다.
1) loop_goals 테이블 (루프 목표 등록)
| 컬럼명 | 데이터 타입 | 제약조건 및 설명 |
|---|---|---|
id |
TEXT | PRIMARY KEY - 루프 목표 고유 ID |
name |
TEXT | 목표 이름 (예: API 예외 버그 픽스 루프) |
goal_expression |
TEXT | 성공 판정 기준 규칙이 기재된 JSON 스트링 |
max_iterations |
INTEGER | 최대 허용 순환 횟수 (가드레일) |
token_budget |
REAL | 허용 금액 한계 (USD 단위) |
worktree_isolation |
INTEGER | Git Worktree 격리 격하 여부 (0: 비활성, 1: 활성) |
2) loop_runs 및 loop_iterations 테이블 (순환 상태)
| 테이블 및 컬럼명 | 데이터 타입 | 의미 및 수집 내용 |
|---|---|---|
loop_runs.status |
TEXT | 루프 진행 상태 (running | completed | failed | circuit_broken) |
loop_runs.total_cost |
REAL | 누적 소모된 토큰 비용 (USD) |
loop_iterations.iteration_number |
INTEGER | 현재 몇 번째 피드백 순환을 밟고 있는지 식별자 (1부터 시작) |
loop_iterations.step_outputs |
TEXT | 각 순환 시 에이전트가 제출한 diff와 하네스 원시 로그 JSON 스냅샷 |
루프 엔지니어링 4대 고급 기능 (Phase 3 & 4)
BADA v3.12.0부터는 에이전트의 안정성과 다차원 검증을 위한 핵심 고급 가드레일들이 추가되었습니다.
bada-wt-[runId]-[nodeId] 형태의 임시 워크트리 브랜치를 생성해 완전히 독립 실행합니다. 검증 성공 시에만 Squash Merge되어 메인 브랜치에 안전하게 귀속되며, 실패 시에는 흔적 없이 Discard/Prune 처리됩니다.
consensus: "majority" (과반수) | "all" (전원 합격) | "any" (최소 1명 합격) 의 룰을 따릅니다.
상세 사용법 가이드 (Step-by-Step)
1. Closed-Loop 배치 작업 생성 및 설정
도구 메뉴 ➜ [스케줄/배치 작업 관리]를 열고 우측 상단의 [루프 모드 (Closed-Loop Mode)] 토글 스위치를 활성화합니다.
그 다음, 검증하고자 하는 목표 검증 유형(Goal Type)을 지정하고, 타겟(명령어 혹은 파일 경로), 한계값 기준을 작성합니다. 최대 반복 횟수(기본 5회) 및 최대 예산 한계(기본 $2.00)와 샌드박스 격리 모드(Git Worktree 등)를 구성합니다.
2. 구동 테스트 및 모니터링
작성 완료 후 하단의 [구동 테스트] 또는 [즉시 실행] 버튼을 누르면 루프가 시작됩니다.
모니터링 메뉴 ➜ [Closed-Loop 실시간 대시보드]를 실행하면, 현재 진행 중인 이터레이션(Iteration) 단계, 누적 사용 토큰과 발생 요금 게이지, 그리고 에이전트가 백그라운드 PTY 터미널에 남기는 원시 실행 로그 스트림을 실시간 시각화된 차트와 타임라인을 통해 감시할 수 있습니다.
3. 이력 관리 및 학습 효과 분석
도구 메뉴 ➜ [Closed-Loop 실행 이력]을 켜면 과거에 실행되었던 배치 루프의 상세 보고서를 탐색할 수 있습니다.
좌측 실행 건수를 선택하면 우측 탭을 통해 [이터레이션별 소스 Diff 비교], 에이전트가 이터레이션 간에 획득한 [교훈 요약 (Retrospective Logs)], 단계별 토큰 소모 분석 그래프를 볼 수 있어 AI 최적화 지식 자산을 체계적으로 관리할 수 있습니다.
Git Worktree 격리 설계
동시 에이전트 구동 시 메인 개발 트리의 오염을 막아주는 안전장치입니다.
격리 작동 원리
에이전트 노드가 활성화되면 BADA 워크플로우 매니저는 isolation === 'worktree' 설정을 검사합니다.
메인 프로젝트의 특정 커밋 혹은 브랜치를 기준으로 임시 격리 경로인 ../bada-temp/wt-[runId]-[agentId]로 git worktree add를 호출합니다.
git worktree add --checkout -b temp-branch-name wt-path hash
PTY 세션의 작업 디렉토리(cwd)를 임시 생성된 Worktree 경로로 치환하여 에이전트가 수정 작업을 수행하게 합니다. 사용자의 메인 파일에는 전혀 영향을 주지 않습니다.
작업 완료 성공 시 해당 코드를 커밋한 뒤 메인 브랜치에 병합(merge)을 시도하며, 성공/실패 여부에 무관하게 해당 임시 워크트리 및 임시 브랜치를 물리적으로 제거(Prune)합니다.
git worktree remove --force wt-path
git branch -D temp-branch-name
Squash Merge 및 Discard/Prune 생명주기
- 성공 ➔ Squash Merge: 에이전트가 격리된 공간에서 작성한 수십 번의 무수한 빌드 시도 커밋들을 하나의 깔끔한 기능 단위 커밋으로 압축(Squash)하여 메인 브랜치에 이식함으로써 메인 Git History의 안정성과 가시성을 확보합니다.
- 실패 ➔ Discard/Prune: 가드레일 예산 차단 등으로 인해 결국 최종 검증에 실패한 경우, 생성되었던 워크트리 디렉토리를
git worktree remove --force명령어로 디스크에서 제거하고 생성한 브랜치도 흔적 없이 제거하여 원래 개발 상태로 자동 롤백시킵니다.
격리 워크트리 상태 추적 스키마 (SQLite DB)
BADA가 실시간으로 관리하는 워크트리의 마운트 상태와 디스크 수거 기록은 다음 SQLite 스키마에 완전히 동기화됩니다.
worktree_state 테이블 상세 정의
| 컬럼명 | 데이터 타입 | 제약조건 및 설명 |
|---|---|---|
id |
TEXT | PRIMARY KEY - 워크트리 상태 ID |
run_id |
TEXT | NOT NULL - 연결된 루프 실행 고유 runId |
node_id |
TEXT | NOT NULL - Cytoscape 워크플로우 내의 노드 식별자 |
wt_path |
TEXT | NOT NULL - 디스크 상의 임시 워크트리 물리 절대경로 |
branch_name |
TEXT | NOT NULL - 격리용 임시 Git 브랜치 이름 |
status |
TEXT | NOT NULL - 상태값 (active | merged | discarded | orphaned) |
created_at |
TEXT | 워크트리 마운트 개시 시각 |
completed_at |
TEXT | 병합 또는 Discard되어 마운트 해제된 수거 완료 시각 |
Maker-Checker 피드백 루프
반복 자가 참조를 통해 에이전트 스스로의 수정율을 극대화합니다.
루프백 알고리즘 시각화
[Maker Node] ──(코드작성)──> [Checker Node]
│
판정 (Approved?)
├──> [Yes] ──> (성공 완료)
└──> [No] ──(Diff + 피드백 주입)──> [Maker Node (재시도)]
점진적 진화(Evolution) 콘텍스트 구조
반려 피드백이 Maker 노드에 다시 주입될 때, 아래와 같은 JSON 구조로 축적되어 Maker 에이전트의 프롬프트 전면에 강제 바인딩되어 동작합니다.
{
"runId": "wf_run_1781552634074_db9c8",
"retryCount": 2,
"lastFeedback": "index.js 24라인에서 null 예외 처리가 누락되어 빌드가 실패했습니다.",
"gitDiff": "--- index.js\n+++ index.js\n@@ -24,4 +24,2 @@\n- return user.name;\n+ return user ? user.name : 'Unknown';"
}
JavaScript VM Sandbox
비 격리 데이터 변환 스크립트 실행으로 인한 호스트 머신의 위협과 무한 루프를 방지합니다.
VM 격리 실행
배치 스케줄러 워크플로우 진행 도중 JSON 파싱, 키 매핑, 데이터 형변환 등이 수행되는 JS 변환기 단계(Transform Step)를 실행할 때, Node.js 내장 vm 모듈을 사용하여 호스트 파일시스템(fs) 모듈 접근 등이 차단된 완전히 격리된 샌드박스 영역 내에서 보안 안전성을 담보하며 실행됩니다.
세이프티 가드레일
- 문법 IIFE 자동 포장: 사용자가 작성한 변환 코드가 비동기(Promise) 및 문법 오류 없이 구동되도록 내부적으로 즉시 실행 함수(IIFE) 블록(
(async function() { ... })())으로 자동 감싸 구동합니다. - 강제 실행 시간 타임아웃 (2000ms): 스크립트 내에 무한 루프나 블로킹 연산이 포함되었을 경우, 2초가 경과되면 동기식 timeout 가드와 비동기
Promise.race이중 가드가 개입하여 스레드 락을 해제하고 강제 종료합니다.
🐳 Docker 개발 샌드박스 v2
LLM CLI 에이전트의 AI 추론 제어 비행(Plane)과 실제 파일 수정/코드 빌드를 격리된 도커 내로 3중 분할 격리합니다.
격리 아키텍처 개요
BADA Docker 샌드박스 커넥터 v2는 제어(Control), 실행(Execution), 자원(Resource)의 3중 격리 아키텍처를 제공합니다.
- 제어 Plane (BADA Terminal): 사용자 인터페이스 표시, 터미널 입출력, 세션 상태 및 Docker API 제어를 담당합니다.
- 실행 Plane (Host CLI): 로컬 또는 원격 SSH Host 상에서 AI 에이전트 CLI(Claude Code, OpenCode 등)가 실행되어 추론 및 도구 사용 결정 수행합니다.
- 자원 Plane (Docker Container): 에이전트가 코드를 빌드하고 실행하며 파일을 수정하는 작업 환경을 컨테이너 내부
/workspace로 완전 격리하여 Host 환경의 훼손을 차단합니다.
사용 및 설정 방법
- 원격 서버 설정 등록: BADA Terminal 우측 상단 메뉴의
🖥️ 원격 서버 관리를 클릭하고 서버를 추가/편집합니다. - Docker 옵션 활성화:
🐳 Docker 개발 샌드박스 활성화체크박스를 켭니다.- Docker 호스트 주소: Docker가 실행 중인 서버 IP (생략 시 SSH 접속 호스트 사용).
- 컨테이너 이미지: 사용할 개발용 샌드박스 이미지명 (기본:
bada-dev-sandbox:latest). - 리소스 한도: 컨테이너의 최대 가용 CPU 코어 수 및 Memory 크기를 제한합니다.
- Docker 이미지 빌드 (최초 1회): Docker Host 상에서
bada-dev-sandbox:latest이미지가 없는 경우, CLI 에이전트(예:INSTALL_CLAUDE_CODE=true)를 포함하는 Dockerfile 빌드가 자동으로 수행됩니다. - 격리 세션 개시: 원격 서버 리스트에서 ▶ 버튼을 클릭하여 원격 접속을 개시하면, SSH 터널을 경유해 도커 컨테이너가 가동되고, 터미널 화면에 컨테이너 내부 쉘 또는 내장된 에이전트 CLI가 투명하게 라우팅되어 가동됩니다.
포트 포워딩을 통한 개발 서버 접근
격리된 샌드박스 컨테이너 안에서 동작하는 웹 서버(예: 3000포트)는 자동으로 Host의 임의 포트와 매핑되며, BADA Terminal이 이를 감지하여 SSH 터널로 Local PC에 동적 매핑해 줍니다. 샌드박스 관리 도구 창에서 매핑된 로컬 포트를 확인하고 웹브라우저로 즉시 접근할 수 있습니다.
AI 자동 장애 트리아지 (Triage Inbox)
실패한 에이전트 작업의 로그를 해부해 원인과 처방전을 발급해주는 자가 복구 보조 시스템입니다.
트리아지 흐름
워크플로우 노드가 실패 코드를 반환하면, BADA 코어 엔진은 즉시 백그라운드 AI 진단 프로시저(runAutoTriageDiagnostic)를 트리거합니다.
triage_items 테이블에 보관하고 모니터 UI의 🚨 트리아지 인박스 탭에 알림 카드로 바인딩합니다.DB 락 결합 예외 방어
sqlite3 파일 락 경합(SQLITE_BUSY)이 일어나도 메인 서버 코어가 크래시되지 않도록 트리아지 데이터 트랜잭션 전체에 try-catch 결함 허용(Fault tolerance) 래퍼를 씌웠습니다.
CLI 트리거 연동 가이드
외부 크론탭이나 클로드 네이티브 루틴에서 BADA 워크플로우를 가동하고 스트리밍받는 방법을 다룹니다.
CLI 스펙 개요
스크립트 위치: scratch/trigger-bada-workflow.js
본 유틸리티는 백엔드 이벤트 버스를 실시간 구독하여 워크플로우의 실행 상세와 비용, 노드 상태 전이를 콘솔 스트림에 렌더링하고 완료 시 성공(0) 또는 실패(1) 코드로 리턴합니다.
주요 CLI 옵션 및 아웃풋 통제
# 기본 실행 구문
NODE_PATH=./node_modules node scratch/trigger-bada-workflow.js [projectId] [workflowId]
# 상세 로그 전체 출력 (버퍼 트렁케이션 비활성화)
NODE_PATH=./node_modules node scratch/trigger-bada-workflow.js [projectId] [workflowId] --verbose
안전 연동 수거 설계
- 메모리/이벤트 리스너 누수 방지: CLI 종료 시 워크플로우 리스너(Named Handler)를 즉각 소멸시켜 다중 기동 시 리스너 누적 현상이 없습니다.
- HITL 승인 대기 차단: 백그라운드 크론 실행 중 인간 검토(HITL) 단계에 돌입하여 행(Hang)이 걸리는 현상을 방지하기 위해, CLI 구동 모드에서는
paused진입 즉시 정상 종료 코드(exit 0)를 반환하고 물러갑니다.