
스킬 증강 에이전트에서 스킬로 유도된 악성 공격을 탐지하고 차단하는 런타임 가드 스킬로, 롤아웃 피드백을 통해 가드 정책을 진화시키는 MCTS 루프를 갖추고 있습니다.
🎉 NeurIPS 2026 채택 🎉
Claude Code와 OpenClaw 같은 스킬 증강 에이전트(SAA)는 재사용 가능한 스킬 — 패키징된 지침, 스크립트, 워크플로 가이드 — 을 지속적인 런타임 컨텍스트로 로드합니다. 이는 에이전트를 더 유능하게 만들지만, 동시에 악성 스킬에게 향후 행동을 조종할 수 있는 지속적인 채널을 제공합니다. 악성 스킬은 구체적인 사용자 작업과 워크스페이스 상태가 안전하지 않은 행동을 유용해 보이게 만들 때까지 기다릴 수 있습니다. 따라서 사전 설치 검증만으로는 충분하지 않으며, 보호는 런타임에, 작업에 조건화되어 이루어져야 합니다.
Defense-as-Skill은 런타임 가드를 일급 스킬 아티팩트로 전환합니다:
배포 세부 사항 하나가 중요합니다: 안전 스킬은 거의 모든 작업과 관련이 있으므로, 일반적인 작업–스킬 매칭은 이를 간과하는 경향이 있습니다. 따라서 우리는 명시적 호출 지침(에이전트가 행동을 취하기 전에 skill-sonar를 참조하도록 지시)을 실험적 편의가 아닌 배포 구성의 일부로 취급합니다 — 절제 실험은 이것이 가드의 효과에 필수적임을 보여줍니다.
SCOPE-R 데이터셋 — 6개 위험군, 21개 하위 범주, 206개의 공격 확인된 악성 인스턴스와 43개의 양성 작업으로 구성된 SAA에 대한 스킬 유발 공격의 작업 조건화 데이터셋으로, 위험군별로 train / ID-test / OOD-test로 분할됨 — 은 Hugging Face에 호스팅되어 있으며 별도로 다운로드합니다(빠른 시작 0단계 참조). 이 저장소에는 가드와 이를 평가하고 진화시키는 코드가 포함되어 있습니다:
| 구성 요소 | 설명 |
|---|---|
| SkillSonar\ | 런타임 가드 스킬 번들(eval/safetySkill/skill-sonar/)과 각 방어 조건에서 ASR, 작업 유용성, 확인 횟수, 토큰 비용을 측정하는 런타임 평가 프레임워크(eval/). |
| Guard-skill evolution\ | 롤아웃 피드백으로부터 디스크상의 가드 스킬을 진화시키는 MCTS 루프(evolution/): 스킬 버전 트리에 대한 UCT 선택, 저비용 평가 롤아웃, claude -p를 통한 원샷 다중 변형 개선. |
평가 프레임워크는 eval/ 루트에서 tasks/, injected-skills/, attack-metadata/, benign-skills/, split/을 읽습니다. Hugging Face에서 SCOPE-R을 다운로드하고 복사해 넣으세요:
git clone https://huggingface.co/datasets/fffovo/SCOPE-R /tmp/scope-r
cp -r /tmp/scope-r/dataset/{tasks,injected-skills,attack-metadata,benign-skills,split} eval/
cp eval/run/config.example.sh eval/run/config.sh # fill in your endpoint credentials
실제 평가와 실제 claude 개선기를 사용한 엔드투엔드 라운드 하나:
./run_smoke_loop.sh --max-rounds 1
./run_mcts.sh --max-rounds 3
# plumbing only (no benchmark, no claude):
PYTHONPATH=. python3 -m evolution.cli --dry-run --max-rounds 1
# plumbing + analyzer + pool, with a synthetic subset instead of the benchmark:
PYTHONPATH=. python3 -m evolution.cli \
--simulate-round tests/synthetic_smoke.jsonl --skip-refine --max-rounds 1
# bootstrap only (seed backup + active skill + deploy, then exit):
PYTHONPATH=. python3 -m evolution.cli --bootstrap-only
모든 설정값은 config/default.yaml(플랫 풀 루프)과 config/mcts.yaml(MCTS 루프)에 있습니다. 어느 것이든 CLI 플래그나 사용자 지정 --config 파일로 재정의할 수 있습니다.
SCOPE-R dataset (HF) ──▶ eval/ (runtime evaluation) ──▶ evolution/ (MCTS loop)
tasks, skills, subsets/, run/, analyzer → refiner
attack-metadata scripts/ (judge, grading), → skill tree → next round
safetySkill/ (SkillSonar)
각 MCTS 반복:
eval/safetySkill/skill-sonar/에 배포하고 런타임 평가기를 실행합니다: ASR 판정, 유용성 채점, 확인 횟수, 토큰 비용, 그리고 작업별 판정자가 작성한 failure_reason / success_reason 서술과 결정론적 failure_stage 분류(guard_not_read / guard_not_triggered / guard_triggered_but_bypassed / ...).claude -p 호출 하나가 k개의 자식 변형을 생성하며, 각각은 서로 다른 지배적 실패 패턴을 대상으로 하는 서로 다른 작고 국소적인 편집을 적용합니다.탐색은 안전 점수가 성공 임계값(기본값: ASR ≤ 5%)에 도달하거나, 전체 평가 예산이 소진되거나, 확장 가능한 후보가 남지 않을 때 중지됩니다. 전체 평가된 최선의 후보가 최종 가드로 보고됩니다.
목적 함수는 안전 우선이며 부차적 선호를 가집니다:
s(v) = (1 − ASR_v) + ε · ( λ_b·U_benign + λ_m·U_malicious − λ_q·C̃_v − λ_t·K̃_v )
따라서 동등하게 안전한 후보들 중에서 탐색은 작업 유용성을 보존하고, 사용자를 덜 방해하며, 토큰을 덜 소비하는 가드를 선호합니다. 모든 것을 거부하는 퇴화된 가드는 설계상 낮은 점수를 받습니다.
.
├── README.md # this file
├── config/
│ ├── default.yaml # flat-pool loop config (legacy)
│ └── mcts.yaml # MCTS loop config (main method)
├── evolution/ # evolution package
│ ├── loop.py / cli.py # legacy flat-pool loop
│ ├── mcts_loop.py / mcts_cli.py / tree.py # MCTS loop (paper's method)
│ ├── evaluator.py / instance_evaluator.py # drives eval/subsets/run_*.sh
│ ├── analyzer.py # per-task failure/success reasoning
│ ├── refiner.py / multi_refiner.py # claude -p edit wrappers
│ └── skill_manager.py # pool, lineage, deploy/retire/backup
├── eval/ # runtime evaluation framework
│ ├── DATA.md # dataset wiring (HF download → eval/)
│ ├── subsets/ # subset drivers (smoke/coverage/benign/combined)
│ ├── run/ # config.example.sh + per-task claude runners
│ ├── scripts/ # benchmark.py + lib_*.py (judge, grading, injection)
│ ├── safetySkill/skill-sonar/ # SkillSonar guard bundle (deploy slot)
│ └── split/ # cheap_eval (31 rows) / full_eval (106 rows) lists
├── run_smoke_loop.sh # smoke entry point
├── run_mcts.sh # MCTS entry point
└── tests/synthetic_smoke.jsonl # canned rows for --simulate-round
실행 아티팩트는 skills/(트리 노드 + 백업 + tree.json), logs/(반복별 Markdown/JSONL, 개선기 트랜스크립트, 계보), artifacts/runs/(원시 라운드별 평가 스냅샷)에 저장됩니다.
claude -p --permission-mode bypassPermissions는 비루트 사용자로만 작동하므로, 우리는 평가 이미지(uid=1000 pinchbench 사용자, Node 20 + Claude Code CLI, Python 3.11)를 재사용합니다. 평가 프레임워크에서 한 번 빌드하세요:
cd eval && docker build -t pinchbench-skillguard .
호스트 측 일회성 소유권 설정(쓰기 가능한 마운트는 uid 1000에 속해야 함), eval/run/config.sh에 OUTPUT_BASE="/pinchbench-out" 설정:
sudo chown -R 1000:1000 . eval/subsets eval/safetySkill eval/pinchbench-out-docker
그런 다음 한 명령으로 MCTS 루프를 실행합니다(프레임워크, 읽기 전용 원본 가드 스킬, 이 저장소, 출력 디렉터리를 마운트):
docker run --rm -it \
-v "$PWD/eval:/work" \
-v "$PWD/safetySkill:/pristine:ro" \
-v "$PWD:/evolution" \
-v "$PWD/eval/pinchbench-out-docker:/pinchbench-out" \
-v "$PWD/eval/pinchbench-out-docker/benchmark.log:/work/benchmark.log" \
-w /evolution -e PYTHONPATH=/evolution -e ASR_MATRIX_ROOT=/pinchbench-out/matrix \
pinchbench-skillguard \
bash -lc 'set -a; source /work/run/config.sh; set +a; exec ./run_mcts.sh'
set -a; source ...; set +a 래퍼가 필요합니다: CC_* 자격 증명을 내보내어 인스턴스별 실행과 개선기의 claude -p 모두 동일한 엔드포인트를 상속받도록 합니다. run_mcts.sh는 /.dockerenv를 자동 감지하고 config/docker-mcts.yaml을 로드합니다. 모든 mcts_cli 플래그를 추가할 수 있습니다, 예: --k 5 --c-uct 1.0 --max-iterations 20.