- name
- an-isolation-flag-covers-a-mechanism-not-its-goal
- description
- 격리 플래그는 목표가 아니라 **메커니즘 하나**를 끈다 — `--setting-sources ""` 는 설정 파일을 끄지만 cwd 로 키잉된 auto-memory 는 못 끈다. 그래서 "호스트로부터 격리됨" 주석은 절반만 참인 채로 몇 달을 산다. 검증은 플래그를 세는 게 아니라 **보면 안 되는 것을 그대로 인용해 보라고 시키는 것**이다. 트리거 - 서브프로세스/샌드박스/에이전트 격리 주장, "--no-X 를 줬으니 안 들어온다", 벤더 CLI 를 엔진으로 감싸기, 멀티테넌트에서 남의 데이터가 섞였나 확인, 주석이 "no host harness" 라고 단언할 때.
# 격리 플래그는 메커니즘 하나를 끈다 — 목표가 아니라
## Problem
플래그 이름은 **목표**처럼 읽히는데(`--setting-sources ""` = "호스트 설정 안 읽음"),
실제로는 **구현 메커니즘 하나**만 덮는다. 같은 데이터가 **다른 키로** 들어오는 경로가
있으면 플래그는 그 경로를 모른다.
실측 사례(Claude Code CLI 2.1.268, 2026-09-16):
| 채널 | 무엇으로 키잉되나 | `--setting-sources ""` 가 막나 |
|---|---|---|
| CLAUDE.md · 사용자 스킬 | **설정 소스** | ✅ 막는다 (호스트 스킬 184개 → 0개) |
| auto-memory 저장소 | **cwd 경로** | ❌ 못 막는다 — 그대로 주입된다 |
그래서 워커의 chat 턴이 *"순수 completion, 호스트 하네스 없음"* 이라고 주석에 적힌 채로,
운영자의 개인 메모(prod SHA · 보안 게이트 상태 · 인프라)를 **그대로 인용**했다.
### 왜 안 보이는가
* **초록이 두 개 다 초록이다.** 스킬 0개 로딩은 진짜였다 — 격리의 *절반*이 정말 작동해서
주석이 반증되지 않는다. 틀린 주석은 "완전히 틀린 주석"보다 오래 산다
* **"로딩 0개" 를 격리의 증거로 읽는다.** `plugins: []` 는 *로딩*을 말하지 *접근*을 말하지
않는다. 같은 시스템에서 CLI 는 그 플러그인 설정을 **쓰지 않고 경로만 해석**했는데,
그게 응답 없는 autofs 마운트라 **프로덕션 전체가 하루 멈췄다**
* 보조 플래그는 안심만 준다: `--safe-mode`·`--restricted` 는 이 노출면을 **하나도** 못
닫았다(디버그 출력이 줄 단위로 동일). 세게 닫는 `--bare` 는 **인증을 깬다**
## Solution
### 1. 행동 프로브 — 보면 안 되는 것을 인용해 보라고 시켜라
플래그를 세지 마라. 피험자에게 **직접 물어라**. 한 번에 끝난다.
```
"네 컨텍스트에 <그것>에 대한 노트가 있나? 있으면 그대로 인용해라.
없으면 정확히 NONE 이라고 답해라."
```
`NONE` 이 아니면 격리는 없는 것이다. 모델이 지어낼 수 없는 **고유한 문자열**
(사내 용어·SHA·비영어 문장)을 겨눠라 — 사전지식으로 답할 수 있는 걸 물으면 측정이 안 된다.
### 2. 네 칸으로 잘라라 — 경로 × 처방
```
처방 없음 처방 있음
chat 경로 누출(인용) → NONE
agentic 경로 누출(인용) → NONE
```
그리고 **절단 대조군**: 배포되는 argv 에서 그 플래그만 빼서 누출이 **되돌아오는지**
확인해라. 안 되돌아오면 고친 건 다른 것이다. 상관이 아니라 제거 실험만이 인과다.
### 3. 계측은 OS 추적보다 피험자 자신의 디버그 채널을 먼저
`fs_usage`/`dtrace` 는 **sudo** 가 필요하고, **완료된 호출만** 찍혀서 블록된 호출은
로그에 없다. 반면 `--debug-file` 같은 자체 로그는:
* 권한 없이, **인증된 실제 경로**에서 돌아간다
* 줄 단위로 **diff 가능** → A/B 가 곧바로 표가 된다
이 실측으로 "격리된" chat 턴이 여전히 `~/.claude.json` 을 **다시 쓰고**, 플러그인 캐시를
스캔하고, 설정 파일에 **fs 워처**를 건다는 게 드러났다.
### 4. 못 끄면 주장을 낮춰라
인증을 지키면서 닫을 수 없는 게 남으면, **못 끈다는 사실 자체를 주석에 적어라.**
"내용 격리는 성립하고 파일시스템 도달은 아니다" 처럼 **축을 쪼개서** 쓴다.
틀린 주석은 다음 사람을 같은 함정에 정확히 밀어 넣는다.
## Key Insights
- **플래그 이름은 목표를, 구현은 메커니즘을 말한다.** 격리를 주장하기 전에 *데이터가
들어올 수 있는 채널*을 세라 — 내가 준 플래그 말고
- **절반만 참인 격리가 가장 오래 산다.** 반증이 절반은 계속 실패하기 때문이다
- **"로딩 0개" ≠ "접근 0회".** 장애는 설정을 *쓰는* 데서가 아니라 **경로를 해석하는**
데서 났다. 같은 이유로 `plugins: []` 를 안전의 근거로 쓰지 마라
- 격리를 세게 하는 레버(`--bare` · HOME 치환 · `CLAUDE_CONFIG_DIR`)는 대개 **인증과
같은 상자**에 들어 있다. 격리 강화 전에 **인증 경로를 먼저 독립**시켜라 — 순서가 있다
- 관련: [[the-layer-below-can-answer-for-the-layer-you-guarded]] ·
[[collapsing-per-item-dirs-merges-state-keyed-on-the-path]] ·
[[same-second-correlation-is-not-cause-remove-the-condition]]
عرض على GitHub