Claude Code 하네스를 한 Mac에서 섞지 않고 쓰기: macOS 사용자로 나누고 Orca로 붙이기
gstack, pstack 같은 하네스 프레임워크를 내 Claude Code 설정과 섞지 않고 써 보려고 격리 방법을 비교했습니다. 하네스마다 macOS 사용자를 두고 Orca 원격 호스트로 붙인 구성과 확인 방법, 비용, 밟은 함정을 정리합니다.
요약
- gstack, pstack 같은 하네스 프레임워크를 제 Claude Code 설정과 섞지 않고 써 보고 싶었습니다.
- 홈이나 설정 폴더만 바꾸는 방법은 같은 사용자로 실행되므로 하네스 코드가 제 파일에 닿습니다.
- 하네스마다 macOS 사용자를 만들고, 그 사용자의 Orca 런타임을 제 Orca 앱에 원격 호스트로 붙였습니다.
- 환경 하나는 대기 중에 메모리를 약 300MB 쓰고, localhost 서비스는 사용자를 나눠도 공유됩니다.
하네스와 decode
모델에 도구와 실행 루프, 컨텍스트 관리를 붙여 에이전트로 일하게 하는 틀을 하네스라고 부릅니다. Claude Code도 하네스이고, gstack이나 pstack 같은 하네스 프레임워크는 여기에 스킬과 지침, 훅을 더해 일하는 방식을 바꿉니다.
새 하네스 프레임워크를 만나면 직접 만든 decode 스킬로 먼저 해독합니다. decode는 저장소를 읽어 정체성을 한 줄로 요약하고, 다섯 가지 축으로 판정합니다.

pstack은 gstack의 옛 버전을 복사해 이름을 바꾸고 문서 두 개만 새로 쓴 파생본이었습니다. 리포트는 축마다 값과 근거 좌표, 증거 종류를 붙입니다.
decode 5축 판정표 보기

해독한 하네스는 통제권 축에 나란히 놓습니다. 왼쪽일수록 하네스가 작업 순서를 정하고, 오른쪽일수록 사람이 필요한 도구를 골라 부릅니다.


해독이 쌓이면서 점이 7개로 늘었습니다. gstack과 pstack은 가운데에서 조금 왼쪽이고, 제 하네스는 오른쪽 끝 가까이에 있습니다.
설치로 섞이는 설정
decode는 설치하거나 실행하지 않고 코드와 문서만 읽어 판정합니다. 실제로 어떻게 도는지 보려면 설치해야 하는데, 설치하면 제 환경이 바뀝니다.

gstack을 README 기본 절차대로 설치하면 스킬 56개가 더해집니다. 글로벌 CLAUDE.md에 gstack 절이 들어가고 Stop 훅도 걸립니다. pstack은 스킬 30개를 더합니다.
반대 방향도 문제입니다. 제 사용자로 Claude Code를 띄우면 스킬 169개와 플러그인 21개, MCP 서버 7개가 함께 실립니다. 여기에 하네스를 얹으면 결과가 하네스 덕분인지 제 설정 덕분인지 가를 수 없습니다.
OpenMontage를 해독했을 때도 프로젝트 스킬 48개가 한꺼번에 들어오는 것이 걸렸습니다. 업무별로 나눠 쓰는 claude.ai 계정도 기본 설정으로는 한 사용자에 한 계정만 로그인됩니다.
그래서 조건을 이렇게 잡았습니다.
- 제 글로벌 지침과 스킬, 훅, MCP, 자동 메모리를 건드리지 않는다
- 하네스 여러 개와 저장소 여러 개를 동시에 돌린다
- 메인 세션이 띄운 자식 세션이 지정한 하네스를 싣고, 끝나면 완료 신호를 보낸다
- sudo 비밀번호 입력으로 작업 세션이 끊기지 않는다
같은 사용자 안에서 나누는 방법
Claude Code는 사용자 수준 설정을 홈 폴더의 ~/.claude 에 둡니다(설정 파일 위치). 사용자를 바꾸지 않고 이 위치를 옮기는 방법부터 따져 봤습니다.
| 방법 | 새는 곳 |
|---|---|
| 프로젝트 설정 파일로 덮기 | 사용자 스킬과 MCP 서버, 훅이 그대로 실립니다 |
HOME 교체 | 로그인이 풀리고, 절대경로로 제 파일에 쓰는 것을 막지 못합니다 |
CLAUDE_CONFIG_DIR 교체 | 로그인이 풀리고, 제 설정에 건 Orca 연동 훅이 빠집니다 |
제 터미널에서 sudo -u | 자식 세션이 제 Orca 런타임 소켓을 읽지 못해 완료를 보고하지 못합니다 |
| VM이나 컨테이너 | macOS 도구를 쓸 수 없고 Orca 터미널과 이어지지 않습니다 |
하네스 코드는 홈 경로를 직접 쓰기도 합니다. pstack 코드는 ~/.claude 를 35번 참조하므로, 설정 폴더만 옮기면 그 코드는 여전히 원래 홈을 봅니다.
macOS 기본 sudo 설정은 sudo -u 에 제 HOME을 그대로 넘깁니다. 다른 사용자로 실행할 때는 -i 를 붙여야 그 사용자의 홈으로 바뀝니다.
sudo -u 에서 소켓 권한을 열어 주면 완료 보고는 되지만, 하네스 코드가 제 Orca를 조종할 수 있게 됩니다. 같은 사용자로 도는 방법으로는 하네스 코드를 파일 권한으로 막을 수 없어서, macOS 사용자를 따로 만들기로 했습니다.
macOS 사용자로 나누기

Claude Code는 실행한 사용자의 홈에서 로그인 정보와 지침, 스킬, 훅, MCP 설정, 자동 메모리를 읽습니다. 사용자가 다르면 이것들이 통째로 갈립니다.
대조군(하네스 없음)과 gstack, pstack에 사용자를 하나씩 만들고, 다른 claude.ai 계정용으로 하나를 더 뒀습니다.
주 그룹
macOS 사용자는 보통 주 그룹이 staff입니다. 제 홈 폴더는 staff 그룹에 읽기와 진입을 열어 두고 있었고, ~/.claude 폴더는 755, settings.json 은 644였습니다.
주 그룹이 staff인 시험 사용자는 제 설정 파일과 홈에 둔 저장소를 읽을 수 있습니다. 그래서 사용자마다 같은 이름의 전용 그룹을 주 그룹으로 줬습니다.
권한 위임 대상을 묶는 공통 보조 그룹도 하나 뒀습니다. 새 파일은 상위 폴더의 그룹을 물려받으므로 보조 그룹으로 열리는 파일은 생기지 않고, 점검 때 0건인지 확인합니다.
계정 형태
로그인 화면에 나오지 않는 숨김 사용자이고 암호 인증이 없습니다. 화면 로그인이나 su, SSH 암호 로그인으로 들어갈 수 없습니다.
관리자 그룹에는 넣지 않았습니다. 원격 로그인과 화면 공유 접근 그룹이 관리자 그룹을 포함하는 구조라서, 관리자가 아니면 그쪽에도 들어가지 않습니다.
권한 방향
- 제 사용자는 시험 사용자 홈을 읽기 전용 ACL로 읽습니다
- 시험 사용자는 제 홈과 다른 시험 사용자 홈을 읽지 못합니다
- 시험 사용자에게는 sudo 규칙이 없습니다
관리자 권한 위임
사용자를 만들고 데몬을 등록하려면 root 권한이 필요한데, 에이전트 셸에는 터미널이 없어 sudo 비밀번호를 받지 못합니다. 그래서 범위를 좁힌 권한 위임 규칙을 한 번 설치했습니다.
제 사용자는 시험 사용자로만 비밀번호 없이 명령을 실행하고, root 대상과 환경 변수 전달은 막았습니다. root가 필요한 일은 이름과 번호를 검증하는 관리 스크립트 하나로만 합니다.
그 대가로 제 사용자로 도는 모든 프로세스가 시험 사용자를 관리할 수 있습니다. 시험 사용자에서 제 사용자로 올라오는 권한은 생기지 않습니다.
Orca 원격 호스트로 붙이기
Orca는 코딩 에이전트 여러 개를 병렬로 다루는 데스크톱 앱입니다. 설정의 원격 서버 화면에는 「이 앱을 다른 머신에 연결합니다」라고 적혀 있는데, 저는 여기에 같은 Mac의 시험 사용자를 붙였습니다.

lab-empty는 하네스 없는 대조군이고, lab-gstack과 lab-pstack에는 각 하네스를 설치했습니다. lab-alt는 다른 claude.ai 계정으로 로그인한 대조군입니다.
시험 사용자마다 Orca 런타임을 시스템 데몬으로 상주시키고, 계정을 만들 때 한 번 페어링했습니다. 작업 트리를 만들 때는 실행 위치 목록에서 로컬 Mac과 시험 환경 중 하나를 고릅니다.

메인 세션은 자식 세션을 띄울 때 호스트를 지정하고, 자식 세션이 끝나면 완료 신호를 받습니다. 연결은 제 앱에서 시험 환경 쪽으로만 맺어집니다.
키체인 대화상자
시험 환경을 붙일 때마다 제 화면에 이 대화상자가 떴고, 닫을 때까지 런타임 시작이 멈췄습니다.

- 원인: 키체인이 없는 사용자로 띄운 Orca가 비밀 값을 저장할 키체인을 찾습니다
- 대응: 키체인을 쓰지 않는 실행 옵션으로 띄우고, 대화상자에서는 취소만 누릅니다
「기본값으로 재설정」은 저장된 암호와 키, 인증서를 지웁니다. 대화상자가 제 화면 세션에 떠 있어 제 키체인이 대상일 수 있으므로 누르지 않았습니다.
Dock의 응답 없음 아이콘
시험 환경 세 개를 붙이자 Dock에 Orca 아이콘이 늘었고 응답 없음으로 표시됐습니다.

- 원인: 시험 사용자의 런타임이 제 화면 세션에 일반 앱으로 등록됐습니다
- 대응: 백그라운드 앱으로 뜨게 합니다. 제 Orca와 구분되지 않으니 강제 종료는 누르지 않습니다
그 밖의 데몬 함정
- 데몬 설정에서 새 보안 세션을 만들게 하면 데몬은 실행 중인데 서버가 열리지 않았습니다. 그 옵션을 뺐습니다
- 먼저 띄운 런타임이 남아 있으면 다음 기동이 단일 인스턴스 잠금에 걸려 조용히 끝납니다. 그 사용자의 Orca 프로세스가 0개인지 보고 다시 띄웁니다
격리 확인
권한 점검
대조군 시험 사용자로 돌린 점검입니다. 사용자 이름만 바꿔 적었습니다.

하네스 지문
하네스가 실제로 무엇을 싣는지는 claude -p 의 init 이벤트로 셉니다. 그 세션에 실린 스킬과 플러그인, MCP 서버 목록이 이 이벤트에 들어 있습니다.
# 확인할 사용자의 셸에서 실행한다claude -p "ok" --output-format stream-json --verbose --max-turns 1 2>/dev/null \ | jq -c 'select(.type == "system" and .subtype == "init") | {skills: (.skills | length), plugins: [.plugins[]?.name], mcp: [.mcp_servers[]?.name]}'stream의 첫 줄이 init이 아닐 수 있어서 subtype 으로 골라냅니다.
같은 claude.ai 계정으로 로그인하면 계정에 연결된 스킬과 커넥터가 모든 환경에 똑같이 따라옵니다. 그래서 하네스 없는 대조군의 지문을 기준선으로 둡니다.
다른 계정으로 로그인한 대조군은 기준선 스킬이 26개로, 같은 계정 대조군의 29개와 달랐습니다. 그래서 계정마다 대조군을 따로 둡니다.
돌려 본 결과
대조군과 gstack, pstack 호스트에 시험 저장소를 두 개씩 붙이고, 메인 세션 하나에서 자식 세션 6개를 한 번에 띄웠습니다. 각 세션은 자기 환경의 사용자 이름과 사용자 스킬 폴더 항목 수를 파일에 적었고, 6개 모두 완료 신호를 보냈습니다.

대기 중인 환경 하나는 메모리를 약 300MB 씁니다. 디스크는 하네스에 따라 0.2GB에서 2.6GB입니다.

Claude Code 쪽 함정
- 처음 띄운 Claude Code의 “Try the new fullscreen renderer?” 안내가 자식 세션에 보낸 첫 과제를 가져갔습니다. 로그인할 때 안내를 미리 넘겨 둡니다
- 폴더 신뢰 질문의 기본 선택이 “No, exit”라서 새 저장소에서 자식 세션이 바로 끝났습니다. 저장소를 붙일 때 신뢰를 미리 기록합니다
- 설정 파일에 써 둔 권한 모드 기본값을 첫 대화형 실행이 auto로 한 번 다시 썼습니다. 한 번 띄우고 종료한 뒤 다시 설정합니다
sudo -i로 넘긴 빈 문자열 인자가 사라졌습니다. 시험 사용자 홈에 스크립트 파일로 써서 실행합니다- 사용자마다 Claude Code가 따로 자동 갱신돼 호스트끼리 버전이 갈릴 수 있습니다. 실행할 때마다 버전을 기록합니다
남은 한계
- OS 사용자 분리는 파일과 프로세스 권한만 나눕니다. localhost에서 도는 TCP 서비스는 호출한 사용자를 가리지 않아서, 시험 환경의 하네스 코드도 제가 띄운 로컬 서비스에 닿습니다
- 저는 작업 흐름이 막히지 않도록 로컬 서비스를 열어 뒀습니다. 같은 구성을 만든다면 인증 없이 도는 로컬 관리 화면이 있는지 먼저 확인할 만합니다
- 키체인 없이 뜬 Orca는 “The OS keychain is unavailable, so secrets are stored unencrypted.” 로그를 남기고, 그 사용자의 Orca 비밀 값을 암호화하지 않고 저장합니다
- 재부팅 뒤 자동으로 다시 붙는지와 계정을 지우는 절차가 잔재 없이 끝나는지는 아직 실측하지 않았습니다
개인 하네스와 회사 하네스 분리에 쓸 때
같은 구성으로 개인 하네스와 회사 하네스를 나눌 수도 있습니다. 다만 지금 구성은 시험 환경을 믿지 않는 전제라 그대로 옮기면 안 됩니다.
- 제 사용자가 시험 환경을 읽고 관리하며 Orca 페어링으로 터미널까지 엽니다. 회사 환경을 이렇게 붙이면 제 사용자 쪽 도구가 회사 환경의 로그인 파일과 설정을 다룰 수 있으니, 읽기 ACL과 권한 위임, 페어링 범위를 다시 정해야 합니다
- 회사가 MDM이나 시스템 폴더의 설정 파일로 이 Mac에 배포한 Claude Code 관리형 설정은 개인 하네스 사용자에게도 적용됩니다(조직이 강제하는 설정 확인). 회사가 권한 확인을 건너뛰는 모드를 막아 두면 개인 하네스에서도 그 모드를 쓸 수 없습니다
- claude.ai 관리 콘솔에서 내려주는 관리형 설정은 그 조직 계정으로 로그인한 사용자에게만 적용됩니다(서버 관리 설정의 보안 고려 사항). 개인 하네스 사용자가 개인 계정으로 로그인해 있으면 회사 콘솔의 설정은 내려오지 않습니다
- 네트워크와 localhost 서비스는 여기서도 나뉘지 않습니다
- 회사 계정과 자료를 개인 기기에서 다뤄도 되는지는 회사 정책을 먼저 확인해야 합니다
고르는 기준
| 하려는 것 | 맞는 방법 |
|---|---|
| 한 프로젝트에서 설정 몇 개만 바꿔 보기 | 프로젝트 설정 파일 |
| 설정 파일 위치만 따로 두기 | CLAUDE_CONFIG_DIR |
| 외부 하네스 코드를 제 파일에서 떼어 놓고 여러 개를 나란히 비교하기 | 하네스마다 macOS 사용자를 두고 Orca 원격 호스트로 연결 |
| 네트워크까지 떼어 놓기 | VM이나 컨테이너 |
시험 환경 스킬
시험 환경을 만들고 쓰고 닫는 절차는 Claude Code 스킬 하나로 묶었습니다. 「gstack 시험 계정 만들어줘」라고 요청하면 스킬이 계정 준비를 차례로 진행합니다. 「lab-gstack 닫아줘」라고 하면 작업 보존을 확인한 뒤 Orca 연결과 사용자를 정리합니다.

이번에는 환경을 만들고 자식 세션을 띄우는 데까지 했습니다. 같은 과제를 세 환경에 맡겨 결과를 비교하는 일은 다음 단계로 남겼습니다.
관련 콘텐츠
Claude Code 스킬 중앙 관리: 심볼릭 링크로 깔끔하게
늘어나는 Claude Code 스킬 저장소를 한 곳에서 관리하고 프로젝트별로 필요한 스킬만 연결하는 방법입니다.
productivityClaude Code 대화 기록을 분석해 스킬로 만들 일 찾기
로컬에 쌓이는 Claude Code 대화 기록을 컨텍스트로 활용해 반복 패턴을 찾고 이를 Claude Skill로 자동화하는 방법입니다.
productivity폰에서 내 터미널 이어받기: cmux 원격 제어와 막힌 소켓을 뚫은 이야기
이동 중에도 작업하던 터미널을 폰에서 그대로 이어받고 싶었습니다. Tailscale로 폰과 Mac을 묶는 흔한 구성인데, cmux가 '자기가 띄운 프로그램만 들여보내는' 벽을 새로 세워 둔 탓에 막혔습니다. 그 과정과, Claude Code 공식 원격 기능과 둘을 같이 쓰는 이유까지 풀어 봅니다.