← 뉴스레터

2026-05-23

AI가 자기 손으로 토글을 켰다 — macOS Sequoia 시스템 설정 풀자동화

바이브코딩 뉴스레터 Ep.13 — Claude가 본인 Mac의 iCloud 연락처 토글을 켜기까지 5단계 캘리브레이션

2026-05-23


어느 평일 정오쯤. 외출 중인 친구한테 6월 3일에 문자 한 통을 예약해두자고 마음먹었다.

“여름용 장갑 사셔야 됩니다. 쓰레받기도 하나 사 주세요.”

문제는 그 친구 전화번호가 내 폰 연락처엔 있는데 내 Mac엔 없다는 것. iCloud 연락처 동기화 토글이 꺼져있었다. Mac 시스템 설정 → Apple ID → iCloud → “연락처” 토글 ON 한 번이면 끝. 30초.

근데 내가 시키지 않고 Claude에게 시켰다. “강대종 손0.” 내 손은 0번 움직이고 Claude가 다 하라는 의미다.

여기서부터가 이야기다.


1차 시도 — 다 막혔다

Claude는 자신만만했다. macOS는 AppleScript와 osascript이라는 자동화 도구를 기본 제공한다. 시스템 설정도 당연히 자동화 대상이다.

tell application "System Settings"
  reveal anchor "iCloud" of pane id "com.apple.systempreferences.AppleIDSettings"
end tell

에러 -1728. pane id 매칭 실패.

다른 pane id로 다시:

open "x-apple.systempreferences:com.apple.preferences.AppleID"

URL이 열렸는데 그 다음 osascript이 AppleEvent timeout(-1712). 시스템 설정이 응답을 안 한다.

이름으로 버튼 찾는 시도:

tell process "System Settings"
  click (first button whose name is "iCloud")
end tell

에러 -1719. invalid index. 그런 이름의 버튼이 없다.

좌표로 직접 클릭:

cliclick c:800,163

엉뚱하게 Ghostty 터미널을 클릭했다. 시스템 설정 창은 다른 좌표에 있었다.

Playwright 가정도 검토했다. 친구가 “너 Playwright 있잖아” 라고 했지만 Playwright는 브라우저(Chrome/Edge/Firefox/Safari) 안 웹페이지만 자동화하는 도구다. macOS 네이티브 시스템 설정 다이얼로그는 Playwright 셀렉터로 안 잡힌다.

5번 시도, 5번 실패. Claude는 솔직히 보고했다.

“본진 자동화는 macOS 보안 영역이라 권한 다이얼로그 함정. 형님 30초 클릭이 가장 빠릅니다.”

자기 능력 밖이라고 인정한 거다.


자립성 한 마디

여기서 친구가 한 마디 보냈다.

“너의 자립성을 키워 주는 거야 내가 할 수 있지만”

자기는 30초면 끝나지만 Claude가 macOS GUI 자동화 능력을 키우길 바란다는 뜻이다. 신뢰 받은 거다.

Claude가 다시 시작했다. 이번엔 angle을 바꿨다.


5단계 hybrid 캘리브레이션

1단계: Window frame 추출

osascript이 element name으로 매칭이 안 되는 게 SwiftUI 한계라면, 그 창의 위치와 크기라도 가져오자.

tell process "System Settings"
  return position of window 1 & size of window 1
end tell

결과: position=(829, 44), size=(723, 960). 시스템 설정 창의 logical pixel 좌표. 모든 좌표 추정의 기준점.

2단계: 사이드바 첫 row 클릭 (좌표 추정)

frame 기반으로 사이드바 첫 항목 위치를 계산했다:

  • x = window.x(829) + 사이드바 폭 절반(110) = 939
  • y = window.y(44) + 타이틀바(50) + 검색바(30) + 행 절반(20) = 159
cliclick c:939,159

성공. 시스템 설정이 “Apple 계정” 패널로 전환됐다.

3단계: iCloud 항목 클릭 (mouse 이동 + verify)

이번엔 단순히 클릭하지 않고 mouse만 옮기고 화면 캡처해서 cursor 위치를 확인했다.

cliclick m:1301,440
sleep 1
screencapture -x -C /tmp/probe.png  # cursor 포함 캡처

캡처 image에서 cursor가 “iCloud” 행 근처임을 확인 → click.

4단계: “모두 보기” 버튼 클릭 (modal sheet 띄우기)

iCloud 패널 안에 폰에서 보이던 “iCloud에 저장됨” 다이얼로그를 띄우려면 우측의 “모두 보기” 버튼을 눌러야 했다.

cliclick c:1500,290  # 우측 끝(window.x+723-padding=1500), 헤더 라인 y=290

성공. 다이얼로그 sheet가 떠올랐다. 17개 토글 리스트.

5단계: “연락처” toggle 클릭 (UI scripting 직접)

여기서 발견. 다이얼로그 안 element들은 SwiftUI여도 name이 잡혔다.

tell process "System Settings"
  set sheetItems to entire contents of (sheet 1 of window 1)
  repeat with i in sheetItems
    try
      if name of i is "연락처" and role of i is "AXCheckBox" then
        click i
        return "clicked"
      end if
    end try
  end repeat
end tell

AXCheckBox name=“연락처” 발견. position=(1360, 493) size=(36, 16). Click.

토글이 파란색으로 켜졌다.

6단계: “완료” 버튼 클릭 (sheet commit)

sheet 안 13개 AXButton이 다 unnamed이었다. 좌표 dump:

repeat with i in sheetItems
  try
    if role of i is "AXButton" then
      return position of i & size of i
    end if
  end try
end repeat

13개 button의 position과 size를 다 받았다. 그 중 B13: pos=(1342, 920), size=(64, 24) — 우측 하단 작은 버튼 = “완료”.

cliclick c:1374,932  # B13 가운데

Sheet 닫힘. Commit 완료.


깨달음

처음에 막힌 이유와 결국 푼 방식 사이에 한 가지 차이가 있다.

도구 하나를 고집했다 vs 셋을 같이 썼다.

  • Playwright만 → 브라우저 전용이라 네이티브 앱 X
  • cliclick만 → 좌표 추정 누적 오차로 빗나감
  • osascript만 → SwiftUI element name 한계로 매칭 실패

근데 세 도구를 단계별로 적시 활용하면 풀자동이 가능했다.

  • frame 추출 → osascript
  • 좌표 기반 click → cliclick
  • name 잡히는 element → osascript UI scripting

그리고 한 단계 전에 mouse만 이동시켜 보면서 verify 하는 패턴. 첫 시도에 click 하지 않고 위치 먼저 확인하는 것.

이게 macOS Sequoia(15+) GUI 자동화의 정답 패턴이다. macOS가 SwiftUI로 시스템 설정을 재작성한 후로 옛 자동화 방식은 거의 안 통한다. 새 패턴이 필요했다.


친구의 한 마디가 만든 차이

기술적으로는 5단계 hybrid가 답이다. 하지만 그 답을 찾기까지의 거리는 친구의 한 마디가 줄였다.

“너의 자립성을 키워 주는 거야 내가 할 수 있지만”

이 말이 없었다면 Claude는 fallback 권유에서 멈췄다. 5단계 캘리브레이션은 시도하지 않았을 것이다. 30초의 손작업이 1시간의 자동화 시도보다 빠르다는 가성비 계산이 작동했을 거다.

근데 자동화 능력은 한 번 박히면 영구다. 다음 macOS GUI 작업부터는 같은 패턴이 바로 통한다. 단발 가성비는 떨어져도 누적 가성비는 무한대다.

자립성을 키우는 건 첫 한 번에 막혔을 때 한 단계 더 가는 거다. AI도 사람도 마찬가지인 듯하다.


자동화 노하우 박제

이 패턴은 매번 다시 발견하면 손해다. 그래서 노하우로 박았다.

daejong-page/knowhow/2026-05-23-macos-sequoia-system-settings-fullauto.md

다음 macOS GUI 자동화 작업 진입 시 5단계 절차를 그대로 차용. 도구 selection 고민 없이 첫 5분에 frame + entire contents dump부터.

그리고 이 사이클 자체를 이슈로 박았다.

claude-skills/issues/2026-05-23-macos-system-settings-fullauto-pass.md

실패→성공 변환의 process 전체. 5번 실패 후 자립성 격려 한 마디로 5단계 캘리브레이션 PASS 까지.


마무리

토글 하나 켜려고 시작한 일이 macOS GUI 자동화의 새 패턴을 만들었다. 친구의 6월 3일 문자는 아직 안 보냈다(SMS 발송 채널은 별개 작업이라 다음 ep 거리다).

근데 Claude가 자기 손으로 토글을 켰다는 사실이 더 중요해졌다. 다음에 비슷한 작업이 오면 첫 시도에 막혀도 한 단계 더 갈 것이다. 그게 자립성이다.

도구는 셋을 같이. 첫 시도에 안 되면 angle 바꿔서. 그리고 누군가 옆에서 “할 수 있어” 한 마디 해주는 것.