remote-access — 로컬 PC Claude(로컬 MCP) 모바일 원격 양방향 접속
목표: 페페 로컬 PC에서 실행하는 Claude 세션(로컬 MCP — claude-code·Filesystem 등)을 모바일에서 송·수신 양방향으로 제어. 작업 실행은 로컬 유지, 구글 원격 데스크톱 의존 제거. 상태: 방안 확정(Claude Code Remote Control) · 셋업 미착수 (2026-06-11)
🔶 루트 NOW 이관 — 진행·미결 (2026-08-19 대청소, 페페 지시)
루트
HANDOFF.md를 pncad 만 남기고 비웠다. 아래는 그때 옮겨온 원문(문구 무변경).
- remote-access ⏳QC1(사무실 회계PC) SSH = QC1측 개통 완료(
main@192.168.0.25, 키.secrets\qc1_ed25519) · 접속 검증만 대기 — 원인은 사무실 회선 다운(CCTV도 불통), 미니PC는 WG 터널 정지로 인터넷 정상 복구. 회선 살면C:\dev\tools\restart_wg_poin.ps1관리자 1회 → 코디 검증. 💡split-tunnel 전환 제안 대기. →projects/remote-access/{handoff,rules,archive}.md·rules/remote.md
▶ 다음 세션 즉시 이어갈 지점 (NOW)
✅2026-08-22 — gpubox: 4070 집PC WOL 기상 + 작업완료 셧다운 워커 — 왕복 실측 성공
- ✅범인 = BIOS
ErP Ready켜져 있었다(페페가 끔). ErP 는 S5 에서 대기전력을 거의 완전히 끊어 NIC 이 매직패킷을 못 듣는다 → WOL 원천 불가. Windows 쪽(WakeOnMagicPacket·빠른시작·유선)이 전부 정상인데 안 깨어나면 BIOS ErP / Deep Sleep 부터 본다. Deep Sleep·PCIE Devices Power On 은 건드리지 않고 ErP 하나로 해결됐다. - ✅왕복 실측 =
off→ 종료 확인 9초 → 매직패킷 → 기상 33초.jobE2E = 실행 → 결과 회수(95B,RTX 4070 Ti SUPER / 566.36 / 16376 MiB) → 확인 → 셧다운 → 꺼짐 확인까지 rc=0. - ✅보강 = 기상 실패 시 ARP 에서 MAC 을 찾아 「올라왔는데 IP 가 바뀐 것」과 「전원 자체가 안 들어온 것」을 구분해 보고한다(앞선 판정이 이 둘을 못 갈랐다).
- 🔴백스톱 결함 수정(같은 날) — 판정이 「GPU 유휴 + 로그인세션 0」이었는데 그건 SSH 로 도는 설치·렌더·학습 중과 정확히 같은 상태다. 30분짜리 작업이 통째로 잘렸을 것(Unity Editor 설치 직전에 발견). → sshd ESTABLISHED 연결도 본다(
watchdog.ps1별도 파일로 분리 +setup_gpupc.ps1임베드 동기화). 배포용gpubox.py push추가 — SSH Session 0 에선 UNC/SMB 가 무조건 오류 67 이라 scp 만 된다([[ssh-session0-unc-always-error67]]). - ⚠IP 자가추적 추가 — 기상 실패 시 ARP 에서 MAC 을 찾아
config.json을 스스로 고친다(relocate). 공유기 DHCP 예약이 없어도 굴러가고, 「안 깨어남」과 「IP 만 바뀜」을 갈라 보고한다. - ⚠CDP 크롬 9334 는 headless 로 떠 있다 — CDP 로는 붙는데 화면엔 아무것도 안 보인다.
Browser.setWindowBounds·bring_to_front둘 다 무의미(창 자체가 없다). 판정 =win32gui.EnumWindows에 크롬 창이 0개. 보이게 하려면 그 프로필 크롬만 골라 kill 하고tools/cdp-profiles/launch_delix0731.bat로 재실행한다(페페 일반 크롬은 건드리지 않는다). - ⏳남은 것 = 공유기 DHCP 예약(
34-5A-60-32-30-F9→192.168.45.2). 안 걸면 IP 가 드리프트해config.json의host가 어긋난다. ⏳집PC 홈에 테스트 잔여물gpubox_test.csv1개(다음 기상 때 삭제). - 목적 = 4070 그래픽카드 쓸 때만 집PC를 켠다. 미니PC(
192.168.45.48)와 집PC가 같은 집 공유기 = 페페 확인 → 미니PC가 WOL 송신기(매직패킷은 L2 브로드캐스트라 같은 망이어야 간다). 추가 하드웨어 0. - 끄기 판정 = 유휴감지 아니라 「작업프로세스·데이터 전달 완료 확인 후」(페페 결정) → 판정 주체 = 데이터 받는 쪽인 미니PC. 집PC는 스스로 안 끈다. 회수 실패하면 안 끈다(데이터부터 건진다).
- 산출물 =
C:\dev\tools\gpubox\—gpubox.py(미니PC: keygen/status/wake/off/run/job/selftest) ·setup_gpupc.ps1(집PC 관리자 1회: sshd+방화벽+키, NIC WakeOnMagicPacket,powercfg /h off, 백스톱 예약작업, config.json 출력). 키 =.secrets\gpubox_ed25519생성 완료. - 백스톱 = 집PC 예약작업
gpubox-backstop(SYSTEM·창없음) — GPU 5% 미만 + 세션 0 이 30분 연속이면shutdown /t 60. 오케스트레이터가 죽어 켜진 채 방치되는 경우만 잡는다. - 검증 =
gpubox.py selftestOK(매직패킷 102B·MAC 16회·구분자 무관·잘못된 MAC 거부·닫힌포트 판정) ·status는 config 없음 정상 종료. - 🔴막힌 곳 = 집PC가 꺼져 있어 MAC·IP를 모른다 → 페페 물리작업 3개: ①BIOS 에서 Wake on LAN/PME 켜기 ②유선랜 연결(Wi-Fi WoL 비신뢰) ③관리자 PowerShell 에서
setup_gpupc.ps1 -PubKey "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAICp8Pj+9ROMoJgEnqniiksMw9DvdqCBsd2HXx1a8Fw3x gpubox"→ 나온 JSON 을config.json에 저장. 그다음 코디가off→wake왕복 실측. - ⚠공유기에서 집PC DHCP 예약 필요(IP 바뀌면
host가 어긋난다). - ⚠스크립트 전달 함정(26.8.22 실측) — 집PC에서
.\setup_gpupc.ps1하면 「not recognized」다. 파일은 미니PC에만 있다. 전달 = 미니PCdev공유(C:\dev, 이미 열려 있다) → 집PC 관리자 PS 에서Copy-Item \\192.168.45.48\dev\tools\gpubox\setup_gpupc.ps1 $env:TEMP+Set-ExecutionPolicy Bypass -Scope Process(서명 없어 정책에 막힌다). - ✅집PC 실체 확정 =
poin-local, LAN192.168.45.2, MAC34-5A-60-32-30-F9(유선 이더넷 802.3 Up · Wi-Fi 는 Disconnected), 계정delix, RTX 4070 Ti SUPER 16GB. tailnetpoin-local(100.108.234.44)도 이 집PC가 맞다(미니PC 개명 잔재라던 앞선 추정은 틀렸다). - 🔑sshd 포트 = 22 아니라
2222(2026-06 remote-control 셋업 잔재).setup_gpupc.ps1이 sshd 를 「이미 있으면」 건너뛰면서 포트는 기존sshd_config를 그대로 쓰는데 방화벽만 22 를 열어 접속이 죽었다 → 스크립트가sshd_config의Port를 읽어 방화벽·config 에 쓰도록 수정. 포트를 가정하지 마라. - 🔑
powercfg /h off만으론 빠른시작이 안 꺼진다 — 실행 후에도HiberbootEnabled=1이었다(실측). 빠른시작이 켜져 있으면 종료 시 NIC 이 죽어 WOL 이 원천 불가 → 스크립트가HiberbootEnabled를 DWord 0 으로 직접 설정하도록 수정. 집PC 는 0 으로 적용 완료. - 🔴WOL 왕복 실측 = 실패(26.8.22).
off로 정상 종료(19초) → 매직패킷 180초 재송신 ×2회 → 안 깨어남. LAN 전체 스윕(1~254 ping 후 ARP)에34-5A-60이 없다 = 실제로 안 켜졌다(DHCP IP 변동 오판 아님, 확인함). Windows 쪽은 전부 정상(WakeOnMagicPacket Enabled · Hiberboot 0 · 유선 Up) → 남은 원인은 BIOS. ⏳페페 물리작업 = 전원 켜고 BIOS(ASRock, Del) → Advanced > ACPI Configuration 에서 Deep Sleep = Disabled(S5 에서 NIC 전원까지 끊는 항목, 최유력) · PCIE Devices Power On = Enabled · ErP 있으면 Disabled. 그 뒤 코디가off→wake재실측.
✅2026-08-11 — QC1 SSH 개통·접속 검증 완료 + 절전 해제 (어제 회선다운 → 복구 후 성공)
- ✅
ssh qc1실접속 성공 —main@192.168.0.25, 키C:\dev\.secrets\qc1_ed25519,host=QC1 user=main. QC1 = Win10 22H2(19045.6466),main= 로컬 관리자(키는administrators_authorized_keys인증).~/.ssh/config에Host qc1별칭 추가(poinimos01·poin-lap 양식). - ✅절전 해제(페페 지시) —
powercfg /change standby-timeout-ac|dc 0+hibernate-timeout-ac|dc 0, 검증 STANDBYIDLE·HIBERNATEIDLE 현재값 AC/DC 전부0x00000000. 🔑간헐 타임아웃 범인 = QC1 절전(S3), 페페가 깨움 → 이제 안 잠. 회선(어제 다운)은 복구됨(WG 경로로192.168.0.25정상 도달, 초기 패킷손실은 절전 탓). - ⚠함정 = ①빈 출력 ≠ 인증실패(절전/패킷손실 타임아웃),
ConnectionAttempts=3·ConnectTimeout≥15②원격 cmd^|파이프 ssh층에서 깨짐 → 필터는 로컬 bash ③QC1 출력 cp949 → 판정은 ASCII 토큰(0x00000000). - 남은 것 없음. GUI 필요시 sshd=Session 0 →
schtasks /IT(RDP 금지).
어제(8/10) 회선다운 이력 — 참고
### ⏳2026-08-10 — **QC1 SSH 개통 = QC1측 완료 · 접속 검증만 대기(원인 = 사무실 회선 다운, 미니PC는 정상 복구)** - **21:35 결론** = 페페가 `restart_wg_poin.ps1` 관리자 실행 → 바운스해도 핸드셰이크 0(`ping .0.1` False) → **스크립트가 터널 자동 Stop** → **미니PC 인터넷 즉시 정상화**(1.1.1.1·텔레그램 OPEN 실측, `notify.py` 200 복구). 기본경로 `0.0.0.0/1` 사라짐 확인. - 🔴**진짜 원인 = 사무실 회선 다운**(페페 확인: "별도 연결로 회사 CCTV 접속했는데 안 됨"). 미니PC측 조치할 것 없음. 정황 일치 = 사무실PC `poinimos01` 테일넷 offline · DDNS는 112.170.234.238 그대로(스테일 가능) · tracert는 통신사 백본까지만. - ⏳**회선 복구 후 = 미니PC에서 `C:\dev\tools\restart_wg_poin.ps1` 관리자 1회**(Stop된 터널을 올린다 — 스크립트가 stop→start 순서로 수정됨) → 코디가 `ssh -i C:\dev\.secrets\qc1_ed25519 main@192.168.0.25 hostname` 기능검증. - 📐**구조 파악(페페 질문 "켜는 순서 때문인가?")** = 순서 무관, **설계가 full-tunnel**이다. conf `AllowedIps = 0.0.0.0/0` = "전 대역을 터널로". WireGuard-Windows는 이걸 `0.0.0.0/1`+`128.0.0.0/1` 두 라우트로 깔아서 물리 NIC의 `0.0.0.0/0`보다 **프리픽스가 길어 metric과 무관하게 항상 이긴다** → 터널이 켜지면 미니PC의 **모든 인터넷이 사무실 회선 경유**(+`DNS = 168.126.63.1`도 그쪽). 터널이 죽으면 그대로 블랙홀 = 오늘 사고. 터널 정지 후 라우팅 테이블에 `이더넷 2 0.0.0.0/0`만 남은 것으로 재확인. - **이 터널에 얹혀 있는 것 4개**(split 전환 시 유지 필요) = ①NAS `192.168.0.101`·사무실PC `192.168.0.41` 공유폴더 ②**Tailscale 서브넷 라우터 광고 `192.168.0.0/24`**(노트북·폰의 NAS 접근이 미니PC→WG 경유) ③QC1 SSH `192.168.0.25` ④imos MSSQL은 **공인 IP `112.170.234.238,64910`**(nesting/dbquery.ps1·order-automation) — 지금은 터널 헤어핀으로 나간다. - 💡**제안(미실행)** = `poin` 을 **split-tunnel로 바꾸면**(AllowedIPs `0.0.0.0/0` → `10.73.241.0/24, 192.168.0.0/24`) 사무실이 죽어도 미니PC 인터넷은 안 죽는다. 오늘 손해의 대부분이 이 blast radius였다. 대가 = 사무실 경유 공인 IP를 못 쓴다(쓸 일 없으면 순이득). 적용 = conf 수정 후 터널 재임포트(관리자). - **QC1측 결과(페페 실행 회신)** = host `QC1` · ssh user **`main`**(관리자 True) · sshd Running/Automatic · 22 LISTENING · 방화벽룰 True(10.73.241.0/24, 192.168.0.0/24, 100.64.0.0/10) · **QC1 LAN IP = `192.168.0.25`**(그 외는 169.254 APIPA = 미사용 NIC). → **접속 명령 = `ssh -i C:\dev\.secrets\qc1_ed25519 main@192.168.0.25`**. - ❌**접속 실패 · 원인 = QC1이 아니라 미니PC의 WG 터널** — `ssh 192.168.0.25:22` timeout인데 **NAS `192.168.0.101:445`·라우터 `192.168.0.1:80`도 전부 timeout**(8/1엔 둘 다 정상) = 사무실 LAN 전체가 안 닿는다. 실측 = 인터페이스 `poin` Up·서비스 Running인데 **`Get-NetAdapterStatistics -Name poin` = RX 0 / TX 0** = 부팅 후 핸드셰이크 0. - 🔑**추정 근본원인** = 미니PC가 **2026-08-10 08:39 윈도우 업데이트로 재부팅**(이벤트 1074) → WG가 DDNS 엔드포인트 `poinimos.iptime.org`를 네트워크 준비 전에 해석 실패한 채 올라옴(현재 수동 `Resolve-DnsName` = 112.170.234.238 정상). **터널 서비스 바운스로 재해석**시키면 된다. - 🚨**파급이 사무실 LAN에 그치지 않는다 — 미니PC 인터넷 전체가 죽어 있다.** `poin`은 full-tunnel(`Get-NetRoute` = `0.0.0.0/1`·`128.0.0.0/1` metric 0)이라 **살아있지만 죽은 터널이 default 경로를 블랙홀**로 만든다. 실측 = `1.1.1.1:443`·구글·텔레그램 전부 timeout, **텔레그램 알림 broker도 `api.telegram.org` 연결 실패(HTTP 500 반환)** → 이번 답변 알림은 **노트20 카톡으로 대체 발송**(`poin-agent/phone.py`, `P.send('신동승', …)` = True). Tailscale(100.x)만 별도 인터페이스라 생존 → 코디 세션·DNS는 멀쩡해 **"인터넷 정상"으로 오진하기 쉽다**. - 그래서 스크립트에 **실패시 자동 안전판** 넣음 — 바운스 후에도 rx 0이면 터널을 **Stop** 해서 미니PC 인터넷부터 되살린다(사무실 LAN은 그대로 불통). - **21:2x 재확인(페페 "다시 확인해봐")** = 변화 없음 — `_wg_restart_result.txt` 없음(=스크립트 미실행), 서비스 Running·rx/tx 0 유지, 사무실 LAN·공인망 전부 timeout. **바인드 테스트로 원인 확정**: 물리 NIC `192.168.45.48` 바인드는 `1.1.1.1:443` OPEN, 터널 IP `10.73.241.2` 바인드는 timeout → 물리 인터넷 정상 + 죽은 터널의 경로 하이재킹이 범인. 폰(테일넷, 별도 회선)에서 사무실 공인 IP `112.170.234.238:64910`·`poinimos.iptime.org:443`도 timeout이지만 두 포트 다 공인 개방 여부 불명이라 **사무실측 생사 판정 근거로는 약함**(터널 바운스가 먼저). - ⏳**페페 = 미니PC에서 `C:\dev\tools\restart_wg_poin.ps1` 관리자 1회 실행**(코디 Bash는 비관리자 → `Restart-Service 'WireGuardTunnel$poin'` 액세스 거부 실측). 스크립트가 rx/tx·`ping 192.168.0.1`·`qc1:22`까지 찍고 `C:\dev\_wg_restart_result.txt`에 남긴다 → 코디가 그 파일 읽고 `ssh main@192.168.0.25 hostname`으로 기능검증. - 📌**재부팅마다 재발하면** 그때 SYSTEM 예약작업 워치독(핸드셰이크 없으면 터널 재시작) 추가. 1회성일 수 있어 지금은 안 만든다. - 지시(페페) = "사무실 회계직원 PC를 코디가 SSH 원격 가능하게. 스크립트 만들어서 그 PC에서 실행하면 적용되게. PC 이름 = **QC1**(실제 컴퓨터 이름도 QC1)". - **QC1 = tailnet 미가입**(`tailscale status` 실측 = poin-mini/poinimos01/폰/EC2/노트북뿐) → **Tailscale 설치 안 시킨다**(계정 인증 = 사람 필요). 경로 = **WireGuard 사무실VPN**, 미니PC 10.73.241.2 → 사무실 LAN 192.168.0.x. 터널 실측 정상(192.168.0.1 ping 3ms). - 스크립트 = **`C:\dev\tools\enable_ssh_qc1.ps1`**(ASCII, 관리자 1회 = `rules/remote.md` §0-5 게이트). `enable_ssh_lap.ps1` 형태 재사용 — OpenSSH.Server 설치 → sshd Automatic+start → **기본 룰(Any) 끄고** `Cody-SSH-QC1`(22 ← `10.73.241.0/24`,`192.168.0.0/24`,`100.64.0.0/10`) → 공개키를 `~/.ssh/authorized_keys` + `administrators_authorized_keys` **양쪽**(QC1 계정이 관리자인지 모른다) + ACL → 결과를 `\\10.73.241.2\dev\_qc1_ssh_result.txt`로 회신(실패 시 화면 붙여넣기). - 🔑**192.168.0.0/24 를 허용에 넣은 이유** = ipTIME이 WG 트래픽을 NAT하면 출발지가 `192.168.0.1`로 보인다. 안 넣으면 "포트는 열렸는데 안 붙는" 재실행 왕복(=관리자 게이트 1회 더)이 생긴다. - 키 = **`C:\dev\.secrets\qc1_ed25519`**(pub `…lH/il poin-mini->qc1`, ACL 잠금 완료). 접속 = `ssh -i C:\dev\.secrets\qc1_ed25519✅2026-08-01 — 미니PC 인터넷 무선→유선 전환(페페 실행) · 전 경로 실측 정상
- 배경 = 미니PC가 Wi-Fi(SK)를 갈아탈 때마다 sshd 재시작 + Tailscale 터널 재수립이 겹쳐 사무실PC→미니PC Remote-SSH가
port 22: Connection timed out으로 끊기던 문제(코디 메모리vscode-remote-ssh-poin-mini-timeout). 페페가 유선(Realtek 2.5GbE)으로 교체 = 원인 자체 제거. - 전환 후 실측(읽기전용) = 기본경로
이더넷 2192.168.45.48(DHCP, 게이트웨이 192.168.45.1) · Wi-Fi Disconnected(옛 IP .109·default route 항목은 잔존하나 인터페이스 down이라 미사용) · Tailscale100.108.234.45Online + Funnel 유지 · PrimaryRoutes192.168.0.0/24유지 · 포워딩Tailscale/poinEnabled 유지(인터페이스 안 바뀜) · WGpoin10.73.241.2 Connected · sshd Running·22 LISTENING. - 기능검증 = 사무실 LAN 왕복 OK — NAS
192.168.0.101:445True, 사무실PC192.168.0.41:64910True. → 서브넷 라우터(노트북·폰의 NAS 접근)·user-brief MCP Funnel 전부 영향 없음. - ⚠남은 제약(변화 없음) = 유선
이더넷 2도 Public 프로필 → sshd 방화벽은 Private만 허용이라 같은 망 LAN 직결 SSH는 여전히 막힘(Tailscale 경로만 통과). 필요해지면 그때 룰 추가.
✅2026-07-31 — 노트북→NAS 개통: 미니PC = Tailscale 서브넷 라우터 (WG 피어등록 불필요해짐)
- 요구(페페) = 사무작업 중 노트북에서 VPN으로 NAS
\\192.168.0.101\공유폴더직접 열기(수동 작업). 기존 계획인 WG 노트북 피어는 ipTIME 라우터 admin 자격에 막혀 몇 달째 미개통이었다. - 경로 재선정 = NAS 실측 결과 웹
/cgi/base/login.cgi·펌웨어 2018·SSH 22 없음 = 임베디드 어플라이언스 → NAS에 Tailscale 설치 불가. 남은 2안 중 A. 미니PC 서브넷 라우터 채택(페페 결정 "A 먼저, B는 나중"). 근거 = 라우터 admin 불필요·노트북에 WG 설치 0·kill-switch 함정 없음·폰 등 tailnet 전 기기가 사무실 LAN 도달. 대가 = 미니PC 상시가동 전제 + 홉 1개. - 실행 3단 = ①미니PC
tailscale set --advertise-routes=192.168.0.0/24(up은 기존 플래그 리셋이라 금지 — Funnel 살아있음 확인) ②admin 콘솔 라우트 승인(코디가 CDP 9334로, 페페 결정) →Awaiting Approval→Approved③Windows IP 포워딩(진짜 관문)Tailscale·poin인터페이스 Enabled — 스크립트C:\dev\tools\subnet-router\enable_forwarding.ps1, 관리자 1회 UAC. - 검증 = 미니PC
PrimaryRoutes: ['192.168.0.0/24']+ 노트북 탐색기에서\\192.168.0.101\공유폴더실접속 성공(페페 확인). 노트북--accept-routes불필요(Windows 자동 수신). - 삽질 기록(같은 데 두 번 빠지지 말 것) = ①playwright 1.61이 Chrome 150 attach에서 무한대기 → 로우 CDP 헬퍼
tools/cdp-profiles/cdp.py신설 ②Radix 커스텀 체크박스(진짜 컨트롤button[role=checkbox]) ③좌표 클릭 전scrollIntoView누락 ④폰 adb shell은 VpnService 밖이라 검증 도구로 무효(미니PC 테일넷 IP조차 안 감 → "안 된다"는 결과가 오판을 부를 뻔). 전역 함정은rules/tooling.md·rules/remote.md에 이관. - ⏳남은 것 = B안(WG 노트북 피어)은 필수 → 선택으로 강등. A가 대용량 파일에서 느릴 때만 추가(공존 가능, ipTIME admin 필요). / 미니PC가 꺼지면 노트북 NAS 접속도 끊긴다는 점만 페페가 인지.
- 규칙 =
projects/remote-access/rules.md
2026-07-17 — WireGuard 사무실VPN: 미니PC 가동확인 + 노트북 피어 준비 (⏸️B안으로 강등 — ipTIME 피어등록)
- 서버 = 사무실 ipTIME 공유기(
poinimos.iptime.org:48584, 서버 pubkeyZFlVRainhBgqz0dDZl2/Ocqlpj8lhbpew7KnMnNqID8=), WG 서브넷 10.73.241.0/24. 미니PC(POIN-MINI) = 10.73.241.2, 터널poin가동 중(핸드셰이크 실시간·10.8GiB 수신 실측, full-tunnel 0.0.0.0/1+128.0.0.0/1). 원본 conf=C:\dev\poinwg.conf(활성본=WireGuardData\Configurations\poin.conf.dpapi). 사무실 LAN 192.168.0.x(NAS .101) 이 터널로 도달. - 노트북 피어(7/15 생성분): conf=
C:\dev\wireguard-laptop.conf— 10.73.241.3/24, pubkeyfFD5OFeOdExiWtBGT4zgjsdEhpzgmSIAdO2pygrz7FQ=, PSK는 미니PC와 동일 공유. ⏳유일 잔여 = ipTIME 관리자(http://192.168.0.1, 터널 경유 도달 확인)에서 피어 등록: 공개키 fFD5…+PSK+허용IP10.73.241.3/32. 라우터 admin 자격 기록 없음 → 페페 직접 or 자격 제공 시 코디 처리. 등록 후 노트북에 WireGuard 설치→conf 임포트→활성→\\10.73.241.2\dev테스트. ⚠노트북에 Tailscale 병행 시 kill-switch(Block untunneled traffic) 켜지 말 것(과거 100.64 차단 사건). - dev 공유 주소: 미니PC
C:\dev= SMB 공유dev(Everyone FULL). WG 경유\\10.73.241.2\dev/ Tailscale 경유\\100.108.234.45\dev. 방화벽 인바운드 룰SMB-WireGuard-10.73.241(TCP445 ← 10.73.241.0/24) 추가 완료(2026-07-17 —poin인터페이스가 Public 프로필이라 필요했음).
2026-07-12 — 웹/모바일 채티 user_brief 연동 (원격 MCP 커넥터)
- 페페 지시 "웹채티·모바일채티가 user_brief 사용". 채티=claude.ai 대화형(Anthropic 클라우드 실행)이라 로컬파일·사설 tailnet(100.x)·localhost 전부 못 봄 → 유일 경로=공개 HTTPS로 노출된 원격 MCP 커스텀 커넥터(웹 1회 등록 시 iOS/Android 자동 동기화, read+write 도구 지원). remote-control 재활용안은 "대화형 채티가 아니라 코디 세션 원격호출"이라 페페 의도와 달라 제외.
- 구축(
C:\dev\tools\user-brief-mcp):server.py=FastMCP streamable-http(mcp 1.28), bearer 토큰 미들웨어(Authorization: Bearer또는?token=), 도구 3개 —list_projects,read_seed(project?)(최소셋 HANDOFF+BRIEF.global+BRIEF.),
append_note(inbox/chatty-.md, project 화이트리스트·경로탈출 차단). 함정: Funnel 뒤 Host가 localhost 아니면streamable_http_appDNS리바인딩 보호가 421 Misdirected* →TransportSecuritySettings(allowed_hosts=[Funnel도메인, localhost])로 해결. - 노출:
tailscale funnel --bg 8788→https://poin-mini.tailc5d3c1.ts.net/mcp(TLS 자동, serve config 영속=재부팅 유지). 상시=schtasksuser_brief_mcp5분 주기(부팅자동+watchdog, 포트 점유 시 중복 인스턴스 즉시 종료,run_server.vbs콘솔숨김). - E2E PASS: 로컬 무토큰 401·토큰 200 / Funnel 무토큰 401·토큰 200 initialize(serverInfo user-brief) / 기존서버 죽인 뒤
schtasks /run→curl 200(task 기동 검증) / selfcheck 18프로젝트. - 회수: user_brief/CLAUDE.md 런북 "세션 시작"에
inbox/chatty-*.md읽어 해당 handoff 반영 후inbox/archived/이동 규칙 편입. - ✅페페 커넥터 등록 완료(2026-07-12): claude.ai 커스텀 커넥터 등록됨 → 채티가 이 커넥터로 붙어
read_seed·append_note실동작 확인(채티가 inbox에 "완료처리 요청" 메모를 남긴 것으로 read+write 양방향 검증). 등록 URL=https://poin-mini.tailc5d3c1.ts.net/mcp?token=<.token값>, 가이드=tools/user-brief-mcp/README.md. ⚠보안: Funnel=공개 인터넷, 토큰이 유일 방어(.tokengitignore, 유출시 회전).
2026-06-24 후속9-d — 세션 목록 출처 구분(VS Code/터미널/데스크톱 배지)
- 페페: "세션 목록은 잘 나오는데 웹 세션이랑 구분이 안 됨". 진단: 진짜 claude.ai 웹 세션은 로컬에 없음(API 전용). 로컬 jsonl은 첫 줄
entrypoint필드로 출처 구별됨(실측:claude-vscode=VS Code 데스크톱 확장 /sdk-cli=터미널·8822 CLI /claude-desktop=데스크톱앱). 페페의 "웹 세션 구분"=실질적으로 세션 출처 구분. 수정: server.jssessionMetaFromFile(한 번 읽기로 제목+entrypoint 동시 추출)+sourceOf로/past가source(vscode/cli/desktop/other) 반환. index.htmlsrcBadge()로 과거세션 행에 출처 배지(🖥️ VS Code 파랑 / 📱 터미널 초록 / 💻 데스크톱 보라) — 폰 시트는 아이콘+배지, DeX 스트립은 배지. 검증: /past 40개 source 정확(vscode 다수·빈건=구세션 entrypoint 없음), node --check PASS, 8822 재기동. ⚠배지 시각은 폰 눈확인.
2026-06-24 후속9-c — 세션누적 버그 근본수정 + 백스페이스/키바 + serve-web 폐기 + 앱 8822 확정
- 페페 폰 실측 후 6건. 🐛핵심버그(3번): "접속할 때마다 새 세션만 누적, VS Code 공유세션 안 뜸". 진단: 8822는 격리 안 함(VS Code와 같은
~/.claude/projects/C--dev,/pastAPI가 38개 정상 반환·첫 항목이 데스크톱 라이브 세션)=공유는 이미 됨. 누적 원인=시작 시 무조건connect()+mode=new라 매 접속 fresh 세션 생성. 수정:startSession()신설 — ①localStorage 마지막 sid가 아직 라이브면 attach ②라이브 있으면 최근 것 attach ③없으면 최근 로컬 과거세션 resume ④그것도 없으면 new. 마지막 sidlocalStorage영속. 검증: 같은 sid 3회 재접속→라이브 1개 유지(누적 안 됨) PASS. - 3번-UI: DeX 좌측 스트립·폰 시트에 🟢라이브 + 💬로컬 과거(VS Code 포함) 두 섹션 렌더(라이브 id는 과거에서 제외), 시작·8초주기
refreshLists가 /live+/past 둘 다 로드, 과거 클릭=resume 라이브 생성 후 attach(resumePast). - 1번 백스페이스: 키바에 ⌫(\x7f) 키 추가(폰 키보드 백스페이스 누락 대비 확실한 fallback). 5번 키바 재정리: 그룹화(중단 ^C·Esc / 편집 ⌫·Tab·⇧Tab / 방향키+↵ Enter(초록 강조·복구) / 유틸 ⌃T태스크·⌃O사고·⌃L클리어·⌃U줄삭제 전부 한글 레이블+title) + ↻새로고침 키(현재세션 재연결=reloadCurrent). ^T=태스크목록·^O=thinking/전사펼침·^L=화면클리어·^U=입력줄삭제.
- 2번 세벌식: 페페 "불필요"(폰 키보드로 한글) → 제외.
- 4번+6번 serve-web 폐기:
watchdog.ps1을 8822만 감시로 재작성(8820 serve-web·8821 tlsproxy 블록 제거). 실행 중 serve-web/tlsproxy 종료(8820·8821 LISTEN 사라짐 확인).CodeWebWatchdog작업은 유지(이제 8822만 관리). codyremote 앱:MainActivity.defaultUrl()을 폰·DeX 모두 MOBILE_URL(8822) 로(기존 DeX→serve-web 8821 라우팅 제거), 모드 메뉴에서 serve-web 프리셋 삭제(기본 8822/직접입력만), 헤더 주석 갱신. APK 재빌드 완료(build/cody-remote.apk16935B 서명OK) — ⚠설치는 폰 미연결로 보류(adb devices 비어있음, 무선 디버깅 재페어링 필요 [[android-apk-build-and-adb-wireless]]). - 검증: index.html 인라인JS·server.js node --check PASS, 8822 재기동 PID 3132, 재접속 누적 안 됨·백스페이스 전송 PASS. ⚠시각·터치·DeX 레이아웃·실제 백스페이스 삭제·앱 설치는 폰 눈확인.
- 사고/주의: serve-web 종료 시
Stop-ProcessCommandLine 매칭(serve-web|server-main)이 너무 넓어 무관한 bash/node도 매칭(exit 255). 8822·메인세션은 무사했으나 광매칭 위험 — 다음엔 포트 OwningProcess로 정확히 종료할 것.
2026-06-24 후속9-b — UI 다듬기(폰/DeX 분기·reload 버튼·DeX 타이틀 제거) + 격리 불필요 결론
- 페페 폰/DeX 실측 후속 4건. ① 2줄 하단바=모바일 전용:
@media(min-width:760px)에서#btm을flex-direction:row;flex-wrap:wrap으로 1줄화(DeX는 넓어 2줄 불필요). ③ reload 버튼 2종: 세션목록 새로고침(스트립 헤더↻ #strip-reload+ 시트 타이틀↻ #sheet-reload→refreshLists()+renderPast()) + 현재세션 다시불러오기(시트#row-reload-cur→reloadCurrent()=WS 재접속·ring buffer 재생). ④ DeX 타이틀바 가림 해결: DeX(≥760px)에서#topbar{display:none}(좌측 스트립이 세션정보 표시·상단 타이틀 중복이라 제거, 폰은 유지). index.html만 수정, node --check PASS, 8822 재기동 PID 9644, 서빙 HTML에 4요소 확인. - ② CLAUDE_CONFIG_DIR 격리 — 불필요 결론(페페 질문): 격리는 원래 serve-web 다워크스페이스에서 claude 여러 개가
~/.claude공유 시 OAuth락/토큰 경합(행) 막던 Phase3 해결책. 지금 8822는--session-id로 트랜스크립트 분리됨(세션 안 섞임 검증완료) + 한 사람·한 계정·한 PC 용도라 경합 실익 작고, 격리는 OAuth refresh 핑퐁·sync 인프라·로그인루프 재발([[claude-config-dir-breaks-login]]) 위험이 큼 → 공유 모드 유지가 맞음, 격리 잔여작업에서 제외. 동시세션 행이 실제 관찰되면 그때 도입. - 잔여(축소): serve-web(8820/8821) 자동기동 중단 · codyremote 앱 기본경로 8822 확정 · 폰/DeX 눈확인.
2026-06-24 후속9 — 멀티세션 중복버그 근본수정 + effort/thinking 칩 + 하단바 2줄 (Ultracode 워크플로 리서치)
- 페페 폰 실측 후 요구 3건 + 버그 1건: ①effort/thinking 선택 가능하게+하단바 2줄+연관성 재정렬 ②/context 너무 자세함(usage 하위만) ③세션이동 로컬/웹 섞임 → 구분. + 치명버그: "닫지않고 이어받기가 멀티세션이 아니라 같은 세션 중복 띄우기로만 나옴, 새 세션 만들어도 기존 대화 텍스트가 떠서 새건지 알 수 없음".
- Ultracode 워크플로(서브3병렬 사실조사+GPT종합): thinking 전달법(바이너리 디컴파일까지)·/context 출력구조·웹세션 실체 조사. 확정사실: (a)
--effort <low/med/high/xhigh/max>플래그 존재(실측 확인) (b) thinking은 CLI 플래그 없음 → 인세션 Alt+T=\x1bt(ESC+t) PTY 전송이 정답(즉시반영, claude가 'Thinking on/off' 3초표시→출력파싱으로 칩 갱신) (c)/context"요약만" 네이티브 옵션 없음·ANSI 출력 자르기는 brittle → 페페 결정 "그냥 두기" (d) 웹세션=api.anthropic.com/v1/sessions(OAuth+beta헤더)로만 조회·fragile → 페페 "웹세션 볼 필요 없고 로컬만 분리하려던 것" → 웹탭 불필요(기존/past가 이미 로컬 C--dev만 읽음). - 🐛 근본버그 원인·수정(핵심): WS 기본
mode='continue'라 새 세션마다claude --continue(=cwd 최근대화 이어받기) 실행 → 매번 같은 최근대화가 떠 독립 세션이 안 됐음. 또 레지스트리 id(randomUUID)가 claude 실제 세션과 무관. 수정:--session-id <내uuid>로 그 id의 fresh 빈 세션 생성(실측:claude --session-id <uuid> -p가 그 id jsonl 정확히 생성 확인), 레지스트리 id = claude 세션 id 통일,--continue제거. server.jsbuildArgs(resume이면--resume <jsonl id>, 아니면--session-id <id>)·createSession(resume은 그 id, 새건 새uuid)·WS 기본 modecontinue→new. - 항목1 구현(index.html): 하단바를 2줄로(
#btmflex-column +.btm-row×2) — 행1=🧵세션·/명령·▦/context, 행2=⚡모델·🎚effort·💭thinking·👤Max(연관성: 세션/명령 vs 추론설정). effort 칩=탭하면 순환(low→max), 새 세션 생성 시--effort전달(기본 xhigh=settings.json과 일치). thinking 칩=\x1bt전송+'Thinking on/off' 출력 정규식 감지로 ON/OFF 표시(⚠입력 대기 중에만 동작). 가짜칩 완전 제거됨. - 항목2·3: /context 그대로(작업 없음). 세션시트는 로컬만(웹탭 안 만듦, "📜 로컬 과거 세션 복원 (C:\dev)" 라벨 명시).
- 검증(8822 재기동 PID 8756 + Node ws 실측 PASS): 세션A(effort=low)·B(effort=high) 각각 fresh 생성 → 서로 다른 id·A의 마커가 B에 안 섞임·새 세션 빈 화면(이전 대화 안 뜸)·effort A=low/B=high 정확 전달·
\x1bt전송 정상. node --check(server.js)·인라인JS check PASS. 잔존 continue 세션은 재기동으로 정리(in-memory). ⚠시각·터치·DeX·thinking 토글 실동작은 폰 눈확인 필요. - DeX 확인(페페 질문): DeX UI=별도 아님. 같은 8822·같은 index.html, 화면폭
@media(min-width:760px)로 좌측 세션 스트립 분기. server.js 수정(세션버그·effort·thinking) DeX에도 자동 동일 적용. serve-web(8820/8821) 폐기 방침 유지(자동기동 중단은 잔여). - 잔여: ① 폰·DeX 눈확인(2줄 바·effort순환·thinking ON/OFF·세션 독립) ② CLAUDE_CONFIG_DIR 격리(.claude-ws-*) 되살리기 ③ serve-web 자동기동 중단 ④ codyremote 앱 기본경로 8822 확정.
2026-06-24 후속8 — 8822 모바일/DeX 터미널 "격리 멀티세션 멀티플렉서"로 전면 재작성
- 목표 재정의(중요): 페페가 원한 건 "VS Code 확장 패널 UI"가 아니라 "여러 격리 세션을 닫지 않고 목록 보며 전환"이었음. serve-web(8820)은 claude-code 확장이 web 미지원(package.json
main만·browser없음=web 확장호스트 부재 → 패널 안 뜸. tunnel만 원격 Node 확장호스트라 가능하나 vscode.dev=MS릴레이)이라 폐기 확정. 8822(claude를 node-pty로 감싼 웹터미널) 가 정답 — 실행은 미니PC(C:\dev·로컬MCP·user_brief 그대로), 폰은 원격 화면/입력. 세션은~/.claude/projects/C--dev/*.jsonl(데스크톱·폰 공유,claude --resume/8822 둘 다 가시). - 리서치(서브에이전트 3병렬: VS Code확장 기능전수 + CLI 슬래시/단축키 + 모바일 멀티세션 UX) + GPT v2 의논으로 기능 망라→중요도(P0/P1/P2/skip)→코디 구현가능/키전달충분/PTY불가 3분류. 핵심 통찰: PTY 래퍼에서 "구현"=Claude 기능 복제가 아니라 ①멀티세션 오케스트레이션 ②모바일 입력만. 슬래시명령·vim·@멘션·rewind 등은 CLI가 이미 함→키만 전달(버튼=입력보조). diff수락버튼·인라인편집·채팅패널=확장전용 skip. 과잉구현 경고 반영.
- server.js 재작성(
tools/codeweb/mobile/server.js): ① PTY를 WS와 분리해 서버가 소유(SESSIONSMap) — WS close=detach만, PTY 안 죽임(명시/live/kill만 종료). 이게 "닫지 않고 이동"의 본질(기존은 close→kill). ② ring buffer(256KB/세션) → 재접속 시 최근출력 재생으로 화면 복원. ③ API:GET/POST /live(라이브세션 목록/생성),POST /live/kill·/live/rename(wrapper 메타),GET /past(과거 jsonl=resume후보, 라이브와 분리). ④ WS에sid있으면 그 세션 attach, 없으면 새로 생성(여러 기기 동시 attach 허용). MAX_LIVE=16, exited+무클라 5분후 정리. 격리(CLAUDE_CONFIG_DIR=.claude-ws-*)는 후속 — 지금은 공유모드로 멀티세션 전환부터 확정(~/.claude명시 금지 = 로그인루프 [[claude-config-dir-breaks-login]] 유지,delete childEnv.CLAUDE_CONFIG_DIR). - index.html 전면 재작성(폐기 사유=페페 지적: 스크롤 부자연·디자인 안세련·effort/think 버튼 장식·의미없는 우상단버튼·전환시 kill): 터미널 우선 인광초록 디자인(--grn #39ff5e). 가짜 칩 전부 제거→실제 동작만: 🧵세션(라이브 개수·시트), ⚡모델(새세션 생성 시 적용), /슬래시(터미널에 문자열 전송=Claude실행), ▦/context 버튼, 👤Max. 멀티세션 UI: 폰=하단 시트(🟢떠있는세션 닫지않고전환 + +새세션 + 📜과거복원), DeX=좌측 세로 세션 스트립(@media min-width:760px). 세션 rename(✎, P2 채택). 키바 확장: ^C ⇧Tab(권한모드순환
\x1b[Z) ^T(태스크\x14) ^O(thinking\x0f) + 기존. 터치 스크롤 직접구현(xterm 네이티브 없음→touchmove→scrollLines+관성, 마우스모드면 프로그램에 양보). visualViewport로 키보드 가림 대응(main 높이=visualViewport.height) + ResizeObserver fit + orientationchange. WebGL 실패→canvas 폴백. - 검증(8822 재기동 PID 15252 + Node ws 실측 7체크 PASS): ①새세션 생성 ②attach 입력→출력(MULTI_OK) ③detach 후 PTY 생존(status=running·attached=0) ④재접속 버퍼재생 복원 ⑤두 세션 동시 공존 ⑥rename 반영(한글 UTF-8 정상) ⑦kill만 종료. node --check(server.js)·인라인JS 추출 check PASS. ⚠시각·터치감·DeX 실측은 헤드리스 불가 → 폰에서 앱 재실행(또는 플로팅 ⋮→모바일 터미널 8822)해 눈으로 확인 필요.
- 잔여/후속: ① 폰·DeX 실측(디자인·터치·세션전환 눈확인) ② 세션별 CLAUDE_CONFIG_DIR 격리(
.claude-ws-*, Phase3new_session.py재사용) 되살리기 — 단 로그인루프 방지조건 테스트 고정 필요(현재 공유모드) ③ codyremote 앱 기본경로 8822 확정·serve-web(8820/8821) 자동기동 중단 검토(이제 안 씀) ④ 슬래시 팔레트·키바 폰 실사용 피드백.
2026-06-24 후속7 — 모바일 로그인 무한루프 근본수정 + 앱 모드갇힘 영구개선
- 페페 증상: ① "8822에서 로그인하라고 계속 나옴, 터미널이라 OAuth 링크 클릭·브라우저 못 열어 아무것도 못 함" ② serve-web가 폰(모바일)모드에 떠서 앱 재시작해도 그대로. 요구="로그인 자동 처리 + 앱 영구개선".
- 로그인 근본원인(확정): 후속6에서 GPT 권고대로 넣은 명시
CLAUDE_CONFIG_DIR=~/.claude(server.js)가 범인. Claude Code의 로그인·온보딩 상태는~/.claude.json(홈 루트 파일)에 있다. CONFIG_DIR을~/.claude(디렉터리)로 명시하면 claude가 config를 그 디렉터리 기준으로 찾아 홈루트.claude.json을 못 봄 → 매 접속 신규 온보딩(테마 선택)+"Select login method" picker 발생(자격증명.credentials.json은 있어도). 후속5에서 plainclaude(미설정)가Claude Max로 깨끗이 부팅됐던 게 증거. 진단 도구: 8822 서버에 직접 붙는 WS 캡처 클라이언트로 터미널 출력 그대로 관찰(폰 화면 무관·안전) — mode=new에서 테마→로그인 picker 재현, 토큰 유무 무관(둘 다 재현)으로 토큰 무죄·CONFIG_DIR 유죄 확정. - 시도→폐기:
CLAUDE_CODE_OAUTH_TOKEN(agent-dialogue-hub .env의 108자, 빈 CONFIG_DIR-p서 TOKEN_OK로 유효 확인) 주입 → 인터랙티브 온보딩엔 무효(토큰 빼도 동일하게 온보딩+로그인 재현). 토큰 경로·파일·gitignore 라인 전부 제거. - 수정(server.js): 명시 CONFIG_DIR 제거. 대신
const childEnv={...process.env,TERM,...}; delete childEnv.CLAUDE_CONFIG_DIR;— 설정하지 않고, 부모 env 누수만 제거해 항상 기본(~/.claude.json=로그인·온보딩,~/.claude/projects/C--dev=세션 공유).osrequire·토큰 로직 삭제. 검증 PASS: WS 캡처 mode=new =Claude Code v2.1.186 · Opus 4.8(1M) xhigh · Claude Max · C:\dev · ❯ 프롬프트로그인/온보딩 없이 부팅. 서버 PID 12884 health OK. - 앱 모드갇힘 영구개선(codyremote): 원인=
MainActivity가 접속 URL을 SharedPreferences에 저장→저장값이 화면폭 자동라우팅을 영구 무시, 게다가 폰 다이얼로그 빠른버튼이 "serve-web"이라 모바일로 되돌릴 탈출구 없음. 즉시 조치=adb shell pm clear dev.poin.codyremote로 pref 리셋(폰 384dp<600→8822 자동복귀, 스크린샷 확인). 영구=promptUrl()을 리스트 다이얼로그(① 자동[화면크기 기준=pref 삭제 후 defaultUrl] ② 모바일 터미널 8822 ③ serve-web 8821 ④ 직접 입력…)로 교체 +promptCustomUrl()분리. Gradle 없이build_apk.sh재빌드(16935B, 서명 OK)+adb install -r(02:09 설치 확인). - 잔여(페페): 폰에서 모바일터미널 재접속(또는 앱 재실행)하면 로그인 없이 바로 Claude Max 세션. 기본 mode=continue라 cwd 최근 세션 이어받기(지금은 이 디버깅 대화가 최근이라 보일 수 있음 → 🧵칩 '새 세션'으로 깨끗이 시작 가능). ⚠continue가 데스크톱 라이브 세션과 같은 트랜스크립트면 동시입력 금지. 앱 롱프레스→메뉴에서 '자동'으로 언제든 모드 복귀.
- 재발방지 메모리: [[claude-config-dir-breaks-login]] (명시 CLAUDE_CONFIG_DIR=~/.claude 금지).
- 추가 UX(같은 세션 후속): ① serve-web 롱프레스 무효 해결 — VS Code가 롱프레스를 가로채서 codyremote
MainActivity에 네이티브 플로팅 메뉴 버튼(FrameLayout 위 반투명 ⋮, 탭=모드메뉴·드래그=이동) 추가, 재빌드·설치(02:32). ② 모바일 세션 선택기 — server.js에GET /sessions(~/.claude/projects/C--dev/*.jsonl→ id·첫 사용자메시지 제목·mtime, 최근순 40개) 추가, index.html 🧵칩이 세션 시트(이어받기/새세션 + 폴더 세션 목록)를 열어 탭하면mode=resume&sid=<id>로 재연결. ③ 터치 스크롤·가로폭 —.xterm-viewport에-webkit-overflow-scrolling:touch(관성)+touch-action:pan-y+스크롤바 숨김(가로폭 회수),#terminal패딩 축소, orientationchange/resize/visualViewport에서 fit() 재계산(가로·세로 컬럼 꽉 채움). 검증: server.js·인라인JSnode --checkOK,/sessions29개 반환, 페이지 시트·CSS 포함. ④ 렌더링 = VS Code식 WebGL 렌더러 전환(xterm 5.5 +@xterm/addon-webgl0.18, 실패 시 canvas→DOM 폴백) — 또렷한 모노스페이스+GPU 스크롤, 폰트 스택/letterSpacing/lineHeight 정리. ⋯ 버튼의 13↔16 토글(가로폭 깨짐) 제거→옵션 시트(글씨 A−/A+ 단계·재연결). ⑤ 세션 전환 "안 됨" 근본원인=CONFIG_DIR 명시(또는 빈 문자열)면claude --resume <id>가 "No conversation found", unset이면 정상 → 후속7 로그인 수정(CONFIG_DIR unset)으로 이미 동반 해결. 라이브 실측: mode=resume로 그 세션 대화 복원 확인. ⑥ 검증-수정 루프 워크플로(요청) 가동 — WS로 라이브 8822 직접 테스트, 1라운드 5체크 전부 PASS(new 깨끗 로그인·/sessions·resume 특정세션·resume+모델 RM_OK·구문). ⚠실제 터치감/폰트/가로세로 시각은 헤드리스 불가 → 폰에서 페이지 리로드(앱 재실행 또는 플로팅 ⋮→모바일 터미널) 후 눈으로 확인 필요.
2026-06-24 후속6 — 세션 공유 통일(CONFIG_DIR) + GPT 의논 v2(API/로컬읽기) + 모바일 세션모드
- 페페 요구: ① 모바일에서 VS Code Claude 세션이 공유돼 보여야(안 보임) ② 원격에서 생성한 세션도 VS Code에 생성/가시 ③ 기본폴더 항상 C:\dev ④ GPT 의논도구로 앱제작 상의·보완. "작업 전 핵심요약 보고" 게이트.
- 진단(실측): Claude Code 세션=
<CONFIG_DIR>/projects/<cwd슬러그>/*.jsonl. 데스크톱 확장·모바일터미널(8822)은 이미~/.claude/projects/C--dev/공유(28 트랜스크립트; server.js cwd=C:\dev·CONFIG_DIR 미오버라이드라 기본 ~/.claude). 진짜 분기점=serve-web 통합터미널만C:\dev\.vscode\settings.json의terminal.integrated.env.windows.CLAUDE_CONFIG_DIR=C:\dev\.claude-ws-codeweb로 격리(그러나.claude-ws-codeweb\projects없음=거의 미사용). 라이브 동시 attach는 파일기반이라 불가 → 현실적 산출물="공유 history + continue/resume". - GPT 의논 v2로 검증(로컬파일 직접 읽음): 진단 맞음, "통일이 정답(동시 15세션이 주 패턴 아니므로)" + 선행 필수=broker 훅+deny-list를
~/.claude/settings.json에 보존. → 실측:~/.claude/settings.json과.claude-ws-codeweb/settings.json이 byte-identical(격리는 글로벌 설정의 사본일 뿐) → 병합 불필요, 격리 제거해도 게이트 유지. - 수정 3 파일:
1.
C:\dev\.vscode\settings.json—terminal.integrated.env.windows(CONFIG_DIR override) 제거 → serve-web 통합터미널도~/.claude사용. (전역 envCLAUDE_CONFIG_DIR부재 확인: 프로세스·User·Machine 모두 비어 있음.) 2.tools/codeweb/mobile/server.js—const os+CLAUDE_CONFIG_DIR=path.join(os.homedir(),'.claude')를 pty env에 명시 주입(부모 env 누수 무관 결정적). 세션모드mode쿼리(continue→--continue기본·new→플래그없음·resume→--resume <sid>sid는^[0-9a-fA-F-]{8,80}$만 허용). makeHtml에 mode 주입. 3.tools/codeweb/mobile/index.html— 하단바에 🧵 세션칩(session-chip, 이어받기↔새세션 토글→ws.close+재연결) +wsUrl에&mode=추가 + cfg/URL서 mode 기본 continue. - GPT 의논도구 v2 신설(페페 "api키로 상의하는 이전 커밋을 버전2로"): 기존
gpt-consult=browser(ChatGPT Plus 웹UI·무과금·로컬파일 못읽음)와 별도로gpt-consult-v2=OpenAI API(종량·로컬 C:\dev/github/notion/web 읽기) MCP 등록(claude mcp add gpt-consult-v2 -s user -e GPT_BACKEND=api -- <venv python> <hub/mcp_server.py>). 코드 무변경 — API+로컬읽기 경로는 이미hub/adapters/{gpt,gpt_tools}.py에 완성,.env의GPT_BACKEND=browser만 덮고 있었음.mcp_server.py의load_dotenv(override=False)라 MCP env 주입api가.envbrowser를 이김. v1 유지(빠른 잡담=v1, 로컬코드 의논=v2). - 검증: v2 어댑터 바인딩=
hub.adapters.gpt·연결 PASS(gpt-5.5-2026-04-23, $0.001) / server.jsnode --checkOK / 8822 재기동 PID 26640 1초내 LISTENING / 갱신 HTML 서빙(session-chip×3·mode=continue·라벨"이어받기")·/healthOK. - GPT 추가 보완점(미적용·노트): effort/think 칩은 UI만·CLI 미전달(오해 소지 → 별도 처리 권장). WS close가 pty 즉시 kill(모바일 네트워크 약함 → grace timeout 검토). 토큰 URL query 노출 → Tailscale ACL 우선. xterm CDN 로드(vendoring/SRI 권장). 격리(
.claude-ws-codeweb) 폐기로session-isolationsync 워처 무용(disable=install_autostart.ps1 -Remove선택). - 잔여(페페 직접): 폰에서 모바일터미널 열어 기본 '이어받기'로 데스크톱 대화가 보이는지 실측 + '새 세션' 토글 확인. ⚠continue 기본은 데스크톱 라이브 세션과 같은 트랜스크립트 이어쓰기(동시입력 금지).
2026-06-24 후속5 — 모바일 터미널(8822) HTTPS+WSS+PTY 폰 완전 동작 확인 (실측 PASS)
- 모바일 터미널 서버(8822) 폰에서 완전 동작 실증:
tools/codeweb/mobile/server.js(HTTPS+WSS+node-pty) +index.html(xterm.js v5.3.0) +start_mobile_silent.vbs+watchdog.ps1(8822 TCP 리스닝 감시+재기동) — 폰 실측 스크린샷(cody5.png) PASS: 녹색점(WSS 연결됨)·"poin-mini" 호스트 배지·"default" 모델 칩·Claude Code v2.1.186 Sonnet 4.6 · Claude Max / C:\dev 기동 화면·터미널 프롬프트·터치 키보드 바(^C Tab ↑↓←→ Esc Enter)·하단 상태 칩(⚡default|ℹhigh|💬OFF|👤Max) 정상 렌더. - 폰 라우팅: S25 Edge dm.density=3.0 → 1080/3.0=360dp < 600dp → 폰 모드(8822) 정상 선택.
- 직전 오류 근본원인: 이전 세션
ERR_CONNECTION_ABORTED는 서버 기동 전 타이밍 이슈 — 코드 변경 불필요. - 잔여 사용자 액션: ① Tailscale ACL로 8820/8821/8822를 폰(100.106.4.88)만 허용 ② 과금 1턴 claude.ai Usage 확인 ③ 분실 시 token.txt 회전+폰 노드 해지.
- 하우스키핑:
tools/codeweb/mobile/.gitignore에node_modules/추가 완료.
2026-06-23 후속4 — serve-web 8820 상시화 + HTTPS(자체서명 TLS 프록시) + 앱=진짜 원격 클라이언트 (폰 실측 PASS)
- B(serve-web 상시화)+앱 8820 전환 완료 = 폰에서 진짜 VS Code+Claude Code 동작(디자인 뷰어 아님). 노출 전 적대적 사전 리뷰 워크플로 16에이전트로 점검(보안·과금·내구성·WebView호환·운영) → 원래 blocker(WebView가 VS Code 못띄움)는 적대검증서 반박(워크벤치는 SW 없이 부팅, 메인UI/편집기/터미널/Claude Code 정상; 확장 웹뷰패널만 깨짐).
- 근본 난관 = secure context: serve-web 워크벤치 연결 인증이
crypto.subtle(Web Crypto, 44회 사용)로 secret mint →http://<테일넷IP>는 비보안 컨텍스트라 crypto.subtle undefined → WSUnauthorized client refused(server-main.js). (Phase0가 됐던 건 localhost=secure였던 것.) 토큰은 302vscode-tkn쿠키로 전달되나 쿠키만으론 불충분(crypto가 핵심). - 해결 = HTTPS 자체서명 TLS 리버스 프록시 + 앱 NSC 신뢰:
tools/codeweb/tlsproxy/(openssl CA:TRUE 자체서명 인증서[SAN=IP+poin-mini.tailc5d3c1.ts.net+127.0.0.1] + Nodeproxy.js=TLS 종단→127.0.0.1:8820raw 파이프, HTTP·WSS 투명 처리). 앱:https://100.108.234.45:8821/?tkn=로드 +res/xml/network_security_config.xml로 그 인증서를 trust-anchor 등록(WSS까지 신뢰 — onReceivedSslError로는 WSS 못잡음, NSC가 정답·루트/클라우드 토글 불필요) + manifestnetworkSecurityConfig·allowBackup=false+ CookieManager 활성. build_apk.sh에 aapt2 compile res 추가. 폰 실측 PASS: 워크벤치 연결·C:\dev파일트리 로드(=WSS 정상). - 상시화·견고: serve-web(
start_codeweb_silent.vbs)+프록시(tlsproxy/start_proxy_silent.vbs) +CodeWebWatchdog(schtasks/SC MINUTE /MO 1, register_task MaxValue버그→schtasks 수정·무관리자). 워치독은 포트가 아니라 curl HTTP 헬스체크(좀비 listening 소켓 탐지→server-main node kill→재기동; IWR은 PS5.1서 302에 거짓음성이라 curl.exe 사용). serve-web 부모 죽이면 자식 node가 8820 소켓 고아화(LISTEN이지만 000) — 헬스체크가 잡음. 현재 8820=20264·8821=5820·task Ready·heartbeat OK. - 보안(리뷰 종합): 방화벽 신규 불필요 — Tailscale-In이 전 포트를 모든 피어에 개방(codeweb-8820 규칙 redundant), 실질 게이트=24자 연결토큰. ⚠사용자 액션 권장: ① Tailscale ACL로 8820/8821을 폰(100.106.4.88)만 허용(AWS·사무실 피어도 현재 도달 가능) ② 과금 1턴 claude.ai Usage 확인(코드상 OAuth 확정·ANTHROPIC_API_KEY/SDK엔트리포인트 없음) ③ 분실 시 token.txt 회전+폰 노드 해지. ④ 깔끔한 유효 인증서 원하면 Tailscale admin서 HTTPS Certificates 토글→
tailscale serve로 전환(현재 미활성이라 자체서명 사용). CONFIG_DIR 격리(.claude-ws-codeweb)로 serve-web 터미널 경합 0(sync 워처 동기화). token.txt·tlsproxy/*.pem는.gitignore. - 앱 롱프레스→주소변경(기본 serve-web, 'C2 목업' 8799 프리셋). 다음: 위 사용자 액션 + 실 refresh 핑퐁 관찰.
2026-06-23 후속3 — C2 채택 + 모델/노력도/사고/계정 컨트롤 + Android 앱 빌드·설치(실측 PASS)
- 컨셉 확정 = C2(패널·카드). 페페 추가요구로 C2 폰·DeX에 컨트롤 추가: 모델 선택 + 노력도(effort: low/medium/high/xhigh/max) + 사고(thinking) 토글 + 계정·사용량(Max·rate limit 소진율). 폰=modebar 위 '모델·노력도·사고+계정 바'(
.mebar/.me-pick), DeX=Claude 패널 헤더(⚡모델 ▾ 🎚노력도 ▾ 💭사고)+상태바 우측👤 Max·사용량 62%(.sti.usg). Playwright+폰 실측 렌더 확인. - Android 앱 "코디 원격" 빌드·설치·실측 PASS: WebView 풀스크린 래퍼(
C:\dev\tools\codyremote\, pkgdev.poin.codyremote,MainActivity.java+AndroidManifest.xml+build_apk.sh). 기본 로드 URL=http://100.108.234.45:8799/mockup-c2-panel-phone.html(롱프레스→주소변경, 'serve-web 8820' 프리셋), 몰입형 전체화면, INTERNET/RECORD_AUDIO/cleartext. 폰 설치+실행+화면캡처로 C2 UI(+모델/노력도/사고 바) 정상 렌더 확인. 앱은 8799 라이브 로드라 목업 수정=앱 재실행 시 자동 반영(재빌드 불필요). 다음 단계: serve-web 8820 상시화 후 앱 기본 URL을 8820으로 전환. - 재사용 인프라(메모리 [[android-apk-build-and-adb-wireless]]): adb=
C:\dev\tools\platform-tools\adb.exe. 빌드 툴체인=C:\dev\tools\android-build\(JDK17 + sdk: build-tools/34.0.0 + platforms/android-34). Gradle 없이 수동 빌드: aapt2 link→javac(-encoding UTF-8 -source 8)→d8→dex 주입(python zipfile)→zipalign→apksigner. 핵심 함정:.bat툴(sdkmanager/d8/apksigner)은 Git Bash에서 직접 exec 불가 → java 메인 직접 호출(java -cp lib/d8.jar com.android.tools.r8.D8,java -jar lib/apksigner.jar). 무선 디버깅: 폰 galaxy-s25-edge 테일넷100.106.4.88, 페어링 포트·코드는 일회성(매번 폰 '페어링 코드로 기기 페어링' 재오픈),adb pair IP:PAIRPORT CODE성공 후 mDNS 서비스명으로 자동 online(별도 connect 포트 불필요).
2026-06-23 후속2 — sync 워처 스케줄러+워치독(크래시 자동복구) + 프론트 3컨셉 목업
- 스케줄러+워치독 완료(무관리자): sync 워처를 Startup 단순 자동시작 → 스케줄러 기반 크래시 자동복구로 격상. 산출물
session-isolation/:watchdog.ps1(pythonwsync_credentials.py미가동 시 재기동, OK는watchdog-last.txt하트비트 덮어쓰기로 로그 무증식)·run_watchdog_hidden.vbs·register_task.ps1(schtasks/SC MINUTE /MO 1,-Status/-Remove). 함정 해결:Register-ScheduledTask의RepetitionDuration [TimeSpan]::MaxValue가 무효 XML(P99999999DT23H59M59S) 생성 → 등록 실패(codeweb 원본 동일 버그·devplan '관리자 필요' 오진의 진짜 원인) → schtasks.exe로 우회 = 무관리자 성공. 작업명ClaudeCredSyncWatchdog(1분 주기, 로그온 후 ~1분 내 기동 + 단일인스턴스 = 죽으면만 재기동). 검증: 등록 성공·워치독 heartbeat 분당 갱신(21:19→21:34 OK pid=15996)·Startup 중복항목 자동제거. 잔여: 다음 재부팅 시 자동기동 1회 눈확인. - 프론트 3컨셉 목업 완료: 같은 필수기능으로 3컨셉 × (모바일+DeX) = 6화면(
devplan/, 서브에이전트 3병렬). C1 터미널 우선(mockup-c1-terminal-{phone,dex}.html, 모노스페이스·인광초록·터미널 스트림/우세) · C2 패널·카드(mockup-c2-panel-*, 파란 악센트·카드 정돈형·완성형 3분할 IDE) · C3 집중·글래스(mockup-c3-focus-*, 보라/틸 글래스모피즘·포커스 피드). 모바일=터미널 중심뷰+라이브 피드백, DeX=다양한 디테일. 전부 공통mockup-common.css/js(토큰·#tipbox 호버·QA Helper) 링크·data-qa/data-tip완비(폰 28~29·DeX 54~55). 비교 갤러리mockup-concepts.html신설 +remote-access.html목업 섹션에 링크. Playwright 6화면+갤러리 렌더 검증 PASS(컨셉 차별성·필수기능 커버·favicon404만). 서빙http://100.108.234.45:8799/mockup-concepts.html. 다음: 페페가 QA Helper로 컨셉 택1·수정요청 → 반복.
2026-06-23 Phase3 — 세션 지정 폴더(CLAUDE_CONFIG_DIR) 격리 PoC 완료 (병목 해결, 전 항목 PASS)
- 멀티세션 제한 = 2층위로 진단 확정: ① 계정 rate limit = 공유 천장(
rateLimitTier가 구독에 묶임 → 폴더 격리로 못 내림, 동시세션 절제·상위구독만 대응) ② 로컬 OAuth/락 경합 = 병목 실체(claude.exe 15개가~/.claude하나 공유 →.credentials.json·락·projects/충돌 간헐 행) → ②가 격리로 해결 대상. (직전 직렬화 락/타임아웃은 완화, 격리가 근본해결.) - PoC 산출물 =
C:\dev\tools\codeweb\session-isolation\:new_session.py(격리 CONFIG_DIRC:\dev\.claude-ws-<name>생성 + 공유 storeC:\dev\.claude-cred에서 자격증명 시드 +<ws>\.vscode\settings.json에terminal.integrated.env.windows.CLAUDE_CONFIG_DIR주입) ·sync_credentials.py(OAuth refresh 핑퐁 중화기 — 최신expiresAt자격증명을 전 폴더에 전파,--watch상주) ·README.md(설계·결과·다음단계). - 실측 PASS(토큰 만료 173분 여유 창에서 안전 실행): (a) 격리 CONFIG_DIR에서
claude -p→ISOLATED_OK(exit0) 재로그인 없이 인증 (b) 격리 폴더에 자체projects/·sessions/·.claude.json= 락·트랜스크립트 분리 (c) 중앙.credentials.jsonmtime 불변·projects수 불변 = 라이브 15세션 무영향 (d) 핑퐁 중화기: 한 폴더expiresAt올리니 sync가 store·전 폴더에 최신 전파(전부 일치) PASS. - 핵심 발견/주의: 하드링크(
--link)는links=2로 기계적 가능하나 sync의os.replace(atomic-rename)가 링크를 깸 → copy + sync 워처가 정석(하드링크 실험적·실refresh 생존 미검증). 중앙~/.claude는 READ-only(시드 복사)만, sync 기본 스코프는 중앙 제외. - 다음 단계: ① ✅ sync 워처 상시화 완료 ② 세션 사이드바/상태바 확장(D9·D23,
devplan/handoff-dex-design.md) ③ 다음 자연 만료(~3h) 때 실 refresh 핑퐁 1회 라이브 관찰 ④ 계정 천장(①) 운영가이드. 테스트 잔여물(.claude-ws-*·.claude-cred) 정리 완료(system as-found). - 2026-06-23 후속 — sync 워처 상시화(A 진행) 완료: 핑퐁 중화기를 로그온 자동시작 상주화. 산출물 추가
session-isolation/:sync_credentials.py에--log(pythonw 무콘솔용 Tee 로깅) 추가 +sync_watch_silent.vbs(pythonw 무콘솔 기동) +install_autostart.ps1(무관리자 Startup 폴더 등록-Status/-Remove/-Start). 설치 = Startupclaude-cred-sync.vbs생성(실 VBS 절대경로 호출) + 즉시 기동. 라이브 검증 PASS: 상주 워처(pid live)가 wsA 갱신을 ~16초(1주기) 만에 wsB·store 자동 전파(logs/sync.log[hh:mm:ss] synced 2 dir(s)), 중앙 mtime 불변. 0세션이면 무해 idle. ⚠Startup은 로그온 1회 기동이라 프로세스 강제종료 시 다음 로그온까지 미복구(루프는 try/except 자기치유) — 크래시복구 필요시register_task스케줄러+워치독 별도. 검증은 expiresAt 인위변경(전파 메커니즘 입증)이라 실 OAuth refresh 생존은 다음 자연만료 때 관찰.
2026-06-22 재설계 — 채택안 전환: code serve-web 테일넷 직결(기본 요금제)
- 페페 요구 재정의: ① 워커 경합 제거 ② 멀티세션 라이브 입·출력(포크 거부) ③ VS Code 플러그인 + 모바일 앱 ④ 미니PC 서버에만 직결(Anthropic/MS 릴레이 아님).
- 검토 끝에 폐기: 공식 RC(Anthropic 릴레이 → ④ 위반)·포크 주입(라이브 아님 → ② 위반)·SARA/claude-agent-sdk 허브(SDK가
CLAUDE_CODE_ENTRYPOINT=sdk-py주입 → "Agent SDK 별도 크레딧풀(2026-06-15~)" 위험 → 기본요금제 미보장)·code tunnel(MS 릴레이 경유). - 채택 = VS Code 내장
code serve-web(본체 설치됨·code-tunnel.exe확인): 미니PC에서code serve-web --host 0.0.0.0 --port 8820 --connection-token <비밀>로컬 바인딩 → 테일넷 직결(릴레이 0). 확장·파일·claudeCLI 전부 미니PC 실행 = 진짜 인터랙티브 = 기본 요금제 보장. 폰=브라우저 PWA standalone(주소창 숨김), 패널 미흡 시 통합터미널claude보증 폴백. 경합=워크스페이스별CLAUDE_CONFIG_DIR격리(유일 미지수=다폴더 OAuth refresh 핑퐁 → Phase0 실측 게이트). - 산출/등록: devplan 대시보드(
C:\dev\devplan)에 "🖥️ 원격접속" 탭 +remote-access.html페이지 신설(설계 전문 + 결정 스트립POST /api/decisionid=remote-access).build_dashboard.py에.pagetab링크 반영·재빌드(index.html 239,095B). 서빙http://100.108.234.45:8799/remote-access.html(8799=app.py). 실제 셋업은 결정 대기(Phase0 빌링·격리 실측 후). 플랜 전문 =C:\Users\delix\.claude\plans\nested-shimmying-fox.md. - 프론트 디자인 목업(진행 중·계속 수정): 원격접속 페이지에 프론트 시안 추가 — 메인 목업 2종(폰 PWA·DeX FHD) + 상세 페이지 2종
mockup-phone.html·mockup-dex.html(요소·버튼마다 호버 말풍선으로 기능 설명) + 공통mockup-common.css/js(QA Helper: 요소 클릭→수정요청 메모→📋 복사로 전달, localStorage 저장). 메인 목업에 "자세히 보기" 버튼. Playwright 검증 PASS. 서빙/remote-access.html·/mockup-phone.html·/mockup-dex.html(8799). 파일 모두C:\dev\devplan\(정적, 재빌드 불필요). - 다음 방향(페페 지시 2026-06-22): 백엔드 작업 먼저 진행(serve-web Phase0 빌링·OAuth격리 실측 → Phase1 상시화·방화벽·autostart), 프론트 디자인은 QA Helper 피드백으로 계속 수정(병행). 즉 페페가 QA Helper로 수정사항을 모아 전달 → 코디가 목업 반복 수정.
- 백엔드 Phase0 실증(serve-web) — 코디 2026-06-22:
C:\dev\tools\codeweb\스캐폴드(start_codeweb.bat·start_codeweb_silent.vbs·watchdog.ps1·run_watchdog_hidden.vbs·register_task.ps1·firewall.ps1·README.md·token.txt·data/) +code serve-web --host 0.0.0.0 --port 8820 --connection-token-file … --default-folder C:\dev기동 → 8820 LISTENING·토큰 게이트·브라우저 VS Code 워크벤치 풀 로드(C:\dev 탐색기·git 브랜치·소스제어)·Claude Code 채팅 패널 존재 확인(Playwright). serve-web=VS Code 1.125.0code-tunnel.exe serve-web. 남은 게이트=① 요금제(1턴 후 claude.ai Usage 확인) ②firewall.ps1(관리자)+폰 접속 ③register_task.ps1상시화. ⚠ 현재 serve-web는 세션 백그라운드(영구화=register_task). - 디자인 전달 명세 2종(목업-only 방지) — 코디 2026-06-22:
handoff-mobile-design.md·handoff-dex-design.md(devplan) — 폰/DeX 전 요소를 기능 × 백엔드 연결 × 분류([기본]/[배선]/[커스텀]⚠) 표로 정리 + 커스텀 구현 필요 목록(세션 사이드바/칩 전환·폰 인앱 위험명령 승인·커스텀 상태바 CONFIG_DIR/serve-web·음성 등) + 수정본 분류 미정 금지 규칙. remote-access.html 카드에 "📄 디자인 전달 명세" 링크. 서빙/handoff-mobile-design.md·/handoff-dex-design.md(8799).
(이전) 채택 방안 = Claude Code Remote Control
- 채택 방안 = Claude Code Remote Control(공식, 2026-02 리서치 프리뷰). "Claude Desktop을 모바일에서 보기"는 직접 불가 → Claude Code 세션을 원격 제어하는 방식이 요구조건 3개(① 로컬 실행 ② 로컬 MCP 사용 ③ 모바일 양방향)를 모두 충족.
- 셋업 절차(미실행): 로컬 git-bash에서
claude실행 → 세션 내/remote-control(또는claude --remote-control로 시작) → 출력된 QR 스캔으로 Claude 모바일 앱 연결, 또는 앱 하단 Code 탭 세션 목록에서 컴퓨터 아이콘+초록점 세션 선택. 기본 비활성이라 명시적으로 켜야 함. - 검증 기준(셋업 후 확인할 것): 모바일에서 보낸 프롬프트가 로컬 파일시스템·로컬 MCP에 대해 실행되는지(@ 입력 시 로컬 프로젝트 경로 자동완성), 터미널↔모바일 대화 동기화, 발신(모바일→로컬 지시)·수신(로컬 진행상황 모바일 확인) 양방향.
텔레그램 완전 양방향 — 재검토 (2026-06-14)
- 페페 요청: "현재 쓰는 텔레그램을 완전 양방향으로 로컬 코디 제어". 결정 = 착수 보류(보고만). 착수 시 권한 수위 = 거의 무인 bypass 선호(acceptEdits+승인게이트 절충은 차선).
- 핵심 발견: 이미 절반 보유 —
tools/cody-permission-broker/broker.py가 텔레그램 봇토큰·chat_id 화이트리스트·long-polling 수신루프·인라인버튼/텍스트 명령 파서·risk/deploy 승인게이트·notify-step/done을 LIVE 운영. 남은 건 "일반 텍스트 → 코디 세션 주입 → 응답 회신" 디스패처 하나. - 3경로: (A) 공식 Channels 플러그인
claude --channels plugin:telegram@claude-plugins-official(연구프리뷰 v2.1.80+, 전용봇 별도페어링, 유지보수 최소) / (B) Remote Control=모바일앱·웹, 텔레그램 아님→제외 / (C) 기존 broker 확장=현쓰는 봇 그대로+승인게이트 통합,claude -p --resume --output-format stream-json또는 Agent SDK 영속세션. 권장=C(또는 A로 PoC 후 C 하이브리드). - 착수 시 미결: 보안(텔레그램=임의명령 통로, 토큰유출=PC장악 → RISK_APPROVAL_POLICY 범주), 권한모드 충돌(코디가 텔레그램으로 권한 재질의 루프), 세션수명 supervisor, 출력 4096자 청크·rate-limit, 동시성, headless 원격MCP 첫턴 미로딩(#43298→
--bare --mcp-config), Agent SDK 별도 크레딧풀(2026-06-15~, CLI-p면 무관).
아키텍처 확정 (2026-06-14 오후)
- 페페 결정: (1) 모바일↔VS Code 동일화면 = 공식 Remote Control(서버모드
claude remote-control, 자작 0) + (2) 병렬 세션 = 텔레그램 "토픽(포럼) 한 그룹"(토픽1=세션1, broker가message_thread_id로 라우팅) + (3) 권한 = 거의 무인 bypass(단 chat_id+토픽 allowlist·기존 risk 게이트 유지). A(셋업)로 진행 중. - 핵심 제약: 토픽은 그룹에서만 됨 — 봇과의 1:1 개인채팅 불가. 페페가 폰에서 ① 새 그룹 생성(나+봇) ② 설정→Topics 켜기 ③ 봇 관리자(manage topics) ④ broker
config.json telegram_chat_id를 새 그룹 id로 교체 필요. 그룹 생성 전엔 새 chat_id 미확정 → broker 코드는 feature-flag OFF 기본으로 선반영, 폰 셋업 후 활성·검증. - 대안(보류): 봇을 2~3개로 늘려 봇1=세션1(개인채팅 유지 가능)도 가능하나 관리 분산 → 장기엔 토픽 한 그룹이 우위.
- 로컬 웹 대시보드(broker 위 Flask, 세션별 패널 멀티뷰) = 보류. 페페가 "추후 필요 시 직접 진행" 명시(2026-06-14). 네이티브 앱 자작은 비권장(Remote Control 중복 + VS Code 세션엔 공개 API로 못 붙음, 자체 headless 세션만 굴림).
재조사 결론 — SARA 기반 검토 후 "적정 규모로 축소·보류" (2026-06-14 저녁)
- 페페 지시: 작업 마무리 + 이미 VS Code+user_brief 시드복원으로 매우 원활 + SARA 전체 자원 쓸 필요 없음. → 결론: 텔레그램 병렬 fleet은 과대(over-built)·보안 부적격 → 보류. 모바일↔VS Code는 공식 Remote Control(코드 0)로 충족, 현 워크플로 유지.
- 설계 변천: ① broker
claude -p서브프로세스 설계 → 폐기(Windowsclaude.cmd%VAR% 유출·파이프 데드락 등). ② SARA(claude-agent-sdk) 기반 텔레그램-토픽 브릿지로 대체 설계(stream_route/_active_clients/_active_chains/continuation_manager/broker_gate 재사용) → 적대검증서 보안 평결 reconsider → 보류. - 보류 사유(착수 시 반드시 해결할 차단요인): ① 포럼 멤버십=shell+승인권한 — broker는 chat.id로만 인증(from.id 미검증), 포럼 supergroup의 전 토픽이 같은 chat.id라 그 그룹 누구든 코디 구동+위험/배포 [승인] 가능 → owner from.id allowlist 필수. ② 봇 1개면 getUpdates 충돌 — Telegram은 토큰당 getUpdates 소비자 1개, broker가 이미 long-poll 중 → 두 루프가 업데이트 경쟁해 broker 승인 콜백 유실 → 별도 봇 필수(선택 아님). ③ 실제 차단은 disallowed_tools(permission_mode 아님) — bypassPermissions로 해도 Bash/PowerShell은 disallowed라 안 돎; "자유"를 주려면 disallowed에서 raw shell 제거해야 하는데 restart_gate가 그 자기수정은 못 잡음. ④ 평문 응답·WebFetch 토큰 exfil 무게이트 — 권장 stream_chat 경로는 마스킹 0(’cat .env’/‘print env’가 OAuth 토큰을 토픽에 평문 노출), WebFetch는 AUTO_ALLOW·게이트 우회; broker config.json에 telegram_token 평문 저장(Read는 ungated). ⑤ D0 라이브 체크아웃 분기 — 실행 중은
c:\dev\tools\vscode_sara(구버전, stream_route/codi_cli_runner/restart_gate 없음), 신버전은c:\dev\SARA. SARA 재사용·안전 전제가 라이브엔 부재. - 산출물 위치(휘발성 temp): 워크플로 출력
…/tasks/wg2b2f02y.output(broker 설계)·…/tasks/wvl5ahpkt.output(SARA 설계+검증). 재개 시 재생성 가능. - 결정: 코드 0줄(미착수). 재개하려면 위 ①~⑤ 선결 + 무인 bypass 대신 권한게이트 유지(approval-gated) 최소판부터.
채택·셋업 — Max 요금제 + 공식 Remote Control (2026-06-14 밤)
- 경로 확정: Max 구독 유지 → 공식 Remote Control 채택(claude.ai OAuth=구독 과금). SARA(
claude-agent-sdk, 2026-06-15~ 별도 크레딧풀) 비채택. claude v2.1.176에claude remote-control가용 —--capacity 32(네이티브 병렬) ·--permission-mode·--spawn(same-dir/worktree/session). 텔레그램 토픽 모델 불필요(병렬을 RC가 직접 제공). - 결정: 권한 posture = acceptEdits + broker 게이트 유지(위험명령은 :7777 → 텔레그램 승인 그대로). durability = server 모드 상주 + 워치독. cwd=
C:\dev기본 + user_brief 시드로 프로젝트 복원. - 보안 재평가: 평결 "reconsider"의 5블로커 중 4개(포럼=shell+승인권한·봇 getUpdates충돌·disallowed_tools 실차단·D0 체크아웃분기)는 텔레그램봇+SARA+bypass 산물 → 경로전환으로 소멸. 잔존 1개=토큰 exfil(평문응답/WebFetch)은 기존 데스크톱 Claude Code에도 있던 선행위험(RC 미악화); acceptEdits+게이트로 위험명령 차단, 추가강화(egress ASK_USER·broker 토큰 평문→env)는 선택.
- 현 인프라: Tailscale tailnet에 폰(galaxy-s25-edge 100.106.4.88)·집(poin-local 100.108.234.45)·사무실(poinimos01 100.101.40.17)·EC2(100.73.87.48) 이미 포함. 모바일은 RC(Anthropic 릴레이, 인바운드 포트 0)로 직접 연결, Tailscale은 데스크톱 SSH 백본으로 병존. broker 권한게이트는 RC 세션에도 전역 PreToolUse 훅으로 적용.
- 셋업 산출물:
C:\dev\tools\remote-control\(start_remote_control.bat=포그라운드 테스트, start_remote_control_silent.vbs=히든, watchdog.ps1, run_watchdog_hidden.vbs, register_task.ps1, README.md). 순서 = 최초 1회 포그라운드 실행 + 폰 Claude앱 Code탭에서 "poin-local" 세션 페어링 → 확인되면 register_task.ps1로 autostart+워치독 등록. (페어링은 페페 폰에서 직접 — 미완.) - MCP 상속 확인(2026-06-14):
claude mcp list가 C:\dev·프로젝트 양쪽 동일 + 프로젝트.mcp.json부재 → 5개 MCP 전부 user(전역) 스코프라 RC 세션(cwd=C:\dev)에 그대로 상속. 목록=claude.ai Notion/Autodesk(연결)·claude.ai Google Drive(미인증, 재인증 필요)·playwright(plugin)·context7. RC는 같은 PC·같은 claude.ai 계정·--bare미사용이라 로컬·원격 MCP 모두 따라옴. 주의: RC 스크립트에--bare금지, 원격 MCP 첫턴 로드는 페어링 때/mcp로 확인.
셋업 실행 — autostart 등록 + 기동 (2026-06-14 밤)
- 완료:
C:\dev\tools\remote-control\스크립트 ASCII로 정리(한글은 README만 — bat 한글이 cp949 콘솔서 깨져 명령오류 났던 것 수정). 작업 스케줄러 RemoteControl(AtLogOn)·RemoteControlWatchdog(1분주기) 등록(State=Ready) → 재부팅(로그온) 시 자동 실행. 현재 RC 서버 실행 중(claude.exe). - 동의 자동화: 첫 실행 시
Enable Remote Control? (y/n)프롬프트에서 숨김실행이 멈추는 문제 → silent.vbs에echo y|로 자동 응답. (대안=포그라운드 bat 1회 y 입력=영구 활성) - 확인 완료(2026-06-14): 폰 Claude앱 Code탭에 "poin-local" 노출 확인 → echo y 자동동의 성공 + end-to-end 동작. 남은 검수=세션 접속해 프롬프트 1턴·2세션 병렬·
/mcp도구로딩(폰에서 페페가 직접). - 사고/교훈: stop.ps1 최초판이 커맨드라인 'claude'+'remote-control' 광매칭이라 leftover bash 셸까지 종료시킴(exit 255). 메인 세션 무사. → 매칭을 claude.exe/node.exe 한정으로 수정(status/stop/watchdog 모두). 셸·메인세션 절대 미터치.
- 관리:
status.ps1(상태+rc.log),stop.ps1(서버만 종료),register_task.ps1 -Status|-Remove. 로그 logs\rc.log·watchdog.log.
추가 경로 — VS Code Remote-SSH(데스크톱↔데스크톱, Tailscale) (2026-06-13 진단)
- 모바일용 Remote Control과 별개로, 사무실 PC → 집 PC(코디 실행기) 를 VS Code Remote-SSH로 접속해 사용 중. 경로 = Tailscale 테일넷(인바운드 포트 개방 없음).
- 집 PC(
poin-local) 서버측 = 정상 상수: sshd Running·LISTEN 0.0.0.0:2222(PID 가변), 방화벽 인바운드OpenSSH Server 2222=Allow/Any, Tailscale IP100.108.234.45(고정), 사무실 PC=poinimos01(100.101.40.17) 동일 테일넷. - 함정/해결: SSH config의
HostName을 사설 LAN IP(예 10.73.241.2/192.168.x)로 두면 사무실에서 도달 불가(timeout) → 반드시 집 PC Tailscale IP100.108.234.45+ Port 2222. 사무실 config =C:\Users\poinpc\.ssh\config의Host home-pc→HostName 100.108.234.45. (집 LAN은 Wi-Fi APIPA·"미니" 192.168.45.2로 가변이라 LAN IP 직지정 금지.) 빠른 확인: 사무실에서ssh -p 2222 delix@100.108.234.45 powershell -c "hostname".
확정 사실 (요지)
- 아키텍처: 동기화 레이어. 실행 환경은 로컬 머신에 유지, 클라우드(Anthropic API)는 기기 간 메시지 라우팅만. 로컬 프로세스가 아웃바운드 HTTPS로 API에 등록·폴링 → 머신에 인바운드 포트 안 염(구글 원격·ngrok·SSH 터널 불필요).
- 로컬 MCP 유지: 파일시스템·MCP 서버·도구·프로젝트 설정 전부 로컬 그대로. 페페의 claude-code·Filesystem MCP 그대로 사용 가능.
- 양방향: 터미널/모바일/웹(claude.ai/code)에서 메시지 교환 동기화. 모바일 Code 탭에서 세션 지휘 가능.
- 요금/플랜: Pro/Max 대상 리서치 프리뷰. 전 플랜 사용 가능하나 Team·Enterprise는 관리자 토글 필요.
제약·리스크 (셋업 전 인지)
- 세션당 원격 연결 1개. 터미널 프로세스 종료·
claude종료 시 원격 세션도 종료 → 수동 재시작 필요. - 네트워크 단절 ~10분이면 프로세스 종료 → 장시간 무인 백그라운드 실행용 아님. "이미 떠 있는 로컬 세션에 모바일로 이동성 부여"가 본 용도.
- 멀티롤 워크플로우 접점: 코디(Claude Code) 세션을 이 방식으로 띄우면 모바일에서 코디를 직접 지휘 가능. 채티(채팅 AI)는 Remote Control 대상 아님(이건 Claude Code 한정 기능).
대안 (보류)
- Claude Code Channels — Telegram·Discord에서 세션 제어. 페페가 이미
desktop-notify로 텔레그램 알림 사용 중이라 친숙. 메신저 선호 시 후보. - 구버전 우회(SSH 터널·tmux·ngrok)는 Remote Control이 대체 → 비채택.
미결 (페페 결정)
- ① 어느 세션을 원격화할지 — 코디(Claude Code) 단독 vs 범용 claude 세션.
- ② Remote Control 단독 vs Channels(텔레그램) 병행/대체.
- ③ 셋업 실행 시점 — 다음 세션에서 페페 폰+로컬 동시 진행.
위험작업 (승인 필요)
원격 노출 성격이나 인바운드 포트 미개방·Anthropic 라우팅이라 외부 공개(Funnel) 아님. 실제 셋업(토글 on·앱 연결)은 페페 폰·로컬에서 직접. 외부 노출 확대 시 별도 승인.
[코디] 26.8.7(금) — poin-lap 코파일럿 키 차단 (SSH 원격 레지스트리)
- poin-lap SSH = 관리자 토큰(
ssh poin-lap→poin-lap\delix, 키C:\dev\.secrets\poin_lap_ed25519). HKLM 쓰기까지 됨 → 노트북 설정 변경은 GUI 없이 원격 처리 가능. - ✅[페페] 26.8.7 재부팅 후 키 무동작 확인 — 종결.
- ✅최종 원인 = Windows 표준 경로. 코파일럿 키 = Shift+Win+F23 → 셸이
mscopilot.exe "ms-copilot:hotkey?press=tap"직접 실행(ms-copilot:프로토콜 핸들러는 HKLM/HKCU 어디에도 등록돼 있지 않다 — 프로토콜 무력화는 헛수고). - 조치 =
HKLM\SYSTEM\CurrentControlSet\Control\Keyboard Layout\Scancode Map에 F23(0x6E) 무효화 20바이트:00×8 | 02 00 00 00 | 00 00 6E 00 | 00×4. 원래 값 없었음 → 되돌리려면 값 삭제. - ⚠재부팅 필요(kbdclass가 부팅 시에만 읽는다). "적용했는데 아직 되네"의 99%가 이것.
- ⛔오답 2개(둘 다 원복 완료) — 레노보 쪽은 범인이 아니었다.
- BIOS
Lenovo_BiosSetting255개 전수 확인 → 코파일럿/AI 키 항목 없음. 펌웨어 토글로는 못 끈다. HKLM\SOFTWARE\Lenovo\ShortcutKey\AppLaunch\Ex_17(→dxpserver.exe /c)를 무동작으로 바꿔도 키는 계속 동작 → Ex_17은 코파일럿 키가 아니다. 원복함. (다른 ID 참고:2=화면잠금3=전원설정6=오디오설정8=마우스설정Ex_13=돋보기)- 🔑교훈 — 키 정체는 추측하지 말고 측정한다. 400ms 폴링으로
Get-CimInstance Win32_Process신규 PID+CommandLine 로깅해 두고 키를 누르면 범인이 커맨드라인째 찍힌다. 사람 타이밍 없이 확인하려면keybd_event로 조합을 직접 주입(Session 1 필요 →schtasks /IT /RU <user>). VK: LSHIFT=0xA0LWIN=0x5BF23=0x86. - 함정 3개(전부 실측)
1.
ssh <host> powershell -NoProfile -Command -에 heredoc으로 여러 줄짜리foreach{...}·here-string을 넣으면 출력 없이 조용히 종료(한 줄씩 프롬프트처럼 처리). 원격 PS는 한 문장 = 한 줄. 2. SSH에서Start-Process로 띄운 백그라운드 프로세스는 SSH 세션 끊기면 같이 죽는다 → 오래 도는 건 예약작업(SYSTEM)으로. 3.schtasks /create기본값 = "배터리로 실행 중이면 시작 안 함" → 노트북에서/run해도state=Queued로 안 돈다.Set-ScheduledTask -Settings (New-ScheduledTaskSettingsSet -AllowStartIfOnBatteries -DontStopIfGoingOnBatteries)로 해제. - 뒷정리: 테스트용 예약작업(
keywatch/sendf23)·스크립트·C:\ProgramData\pepe전부 삭제 확인. 노트북에 남은 변경은 Scancode Map 하나뿐.