session-relay 작업 규칙
📑 인덱스
-
🆕 신규 — 최근 확립된 규칙
-
🚪26.9.2(수) [페페 지시] 인계가 끝나면 현 세션 탭을 스스로 닫는다 — 브릿지 v1.7
/closetab. 성공 조건 3개를 전부 만족할 때만 닫는다 = ①프리필 ②Enter ③새 세션 transcript 에 지시문 + assistant 응답. ③이find_transcript의 새 반환값replied다 — 「Enter 전송 OK」·「프리필 완료」는 증거가 아니다(예전부터의 규칙을 코드로 굳혔다). 🔴닫을 탭은/newsession시점에 붙잡는다. 닫을 때 「지금 활성 탭」을 찾으면 방금 연 새 세션을 닫는다 (새 탭이 활성이므로). 확장에requesterTab을 두고 열기 전에 채운다. 🔴탭만 닫는다 — VS Code 창은 절대 안 닫는다. 새 세션이 같은 창의 탭이라 창을 닫으면 인계받은 세션까지 죽는다. 🔴응답을 먼저 주고 1.5초 뒤에 닫는다(확장setTimeout).relay.py는 닫히는 그 탭의 Bash 자식이라 먼저 닫으면 HTTP 응답도 못 받고 죽는다 → 체인 기록·텔레그램 보고가 통째로 유실된다(코덱스 지적 「자기 종료 경합」). ⛒순서 = 검증 →guard.report(텔레그램·체인) → 맨 마지막에close_self(). ⚠확장 코드를 고쳐도 창을 Reload 하기 전엔 v1.6 이 돈다 — 그동안엔/closetab이 404 라 안 닫히고[유지]만 찍는다(안전한 실패). 끄는 스위치 =--no-close-self. -
⛔26.8.30(일) [코디] 「입력창이 세션을 번갈아 포커스」 조사 — 세션릴레이는 무죄, 범인 후보는 음성 쪽이었다. 세션릴레이에서 상시 도는 것은
SessionRelay-Calibrate(주 1회 목 10:00,claude -p /usage헤드리스, 창 조작 0) 하나뿐이다.relay.py의bring_to_front/SendInput은 수동 실행 경로에서만 돈다 — 예약·훅·워치독 트리거가 없다(전수 확인). 실제로 잡힌 상주 위험물 =cody-mcp-gateway/scripts/voice_relay_watch.py(HKCU RunCodyVoiceRelayWatch) — 음성 세션 릴레이 워커인데 30초 폴링하다 임계에 닿으면os.startfile("codex://new?prompt=…")로 전면 창을 뺏고keybd_event로 Enter 를 주입한다. 26.8.13부터 유령 pythonw 2개가 살아 있었다 → 26.8.30 자동시작 키·프로세스 모두 제거(음성 시스템 폐기와 함께). - 🔑상주 도구를 껐다 = 트레이 아이콘을 닫았다가 아니다. 트레이만 닫으면 HKCU Run 이 다음 로그온에 되살리고, 짝 워커(voicecody↔voice_relay_watch)는 트레이와 무관하게 계속 돈다. 끄는 자리 = 자동시작 키 + 프로세스 + 훅 세 곳 전부.
- 🔍포커스 탈취 진단 순서 — 먼저
GetForegroundWindow()를 0.15초 간격으로 40초 찍어 본다. 변화가 0이면 OS 포그라운드 문제가 아니라 앱 내부(VS Code 안에서 어느 클로드 세션 입력창이 포커스인지) 다 → 범인은claude-vscode.focus를 부르는 쪽(cody-bridge/send·/relay)이거나 클로드 확장 자체. 창 밖을 파면 헛수고. - §1 넘기는 시점 · §2 인계문 · §3 실행 · §4 금지
🆕 신규
- 🆕26.10.17(토) [코디] Z.ai Coding Plan 키는 «API Keys → Personal Coding Plan» 탭에서 따로 만든다 — Standard 탭 키(26.10.16부터)는 표준 종량 API 전용이라 플랜 호출이 전부 HTTP 429 · 코드 1113 「Insufficient balance or no resource package」로 막힌다. 인증은 통과해서 «키가 맞는데 잔액 없음»처럼 보이는 함정(플랜 Valid · 등급 무관 · 모델·엔드포인트 바꿔도 동일 · 콘솔 Last used = Not used). 자동화용 종량 결제(Q3 a)는 Standard 키 + 잔액 충전으로 따로 간다.
- 🆕26.10.1(목) [코디] 앤트로픽 프로모션·보상 리셋은 정기 주 앵커(월 22:00)를 안 옮긴다 — 그 주는 «리셋 이후»만 센다. 리셋을 모르고 정기 주 전체로 역산하면 한도가 부푼다(실측 9/3 7% → 역산 $4,119, 9/2 리셋 반영 시 $1,630). 기록 =
C:\dev\tools\claude-usage\resets.json(applies false = 기록만). ⚠calibrate 를 매일 돌릴 땐 보정은 주 1회로 묶는다(낮은 % 반올림 오차로 한도가 날마다 출렁임) · ⚠guard.py70% 게이트는 아직 리셋을 모른다(정기 주 전체 = 보수적). - 🆕26.10.1(목) [코디] transcript 의
"usage"줄을 그냥 더하면 1.9~2.5배 부푼다 — 같은 API 응답이 콘텐츠 블록마다 여러 줄(같은message.id+requestId, input·cache 는 같고 output 만 커짐)로 찍힌다. 실측 = 26.9.28~10.1 창guard.weekly_tokens107.6M vs 중복제거 55.3M.guard.py게이트·calibrate.py역산 한도(state.json 413.6M)는 이 부푼 지표끼리라 서로는 맞지만 주마다 부풀림 비율이 달라(9/24 2.46배 · 10/1 1.94배) 한도가 출렁인다. 중복 제거판 =C:\dev\tools\claude-usage\usage_stats.py(키 = id 쌍 · 값 max). 또 토큰 수 자체보다 cache_read 뺀 API 환산 $ 가 /usage 와 더 잘 맞는다(백테스트: 토큰 기준 10/1 주 오차 +18%p, $ 기준 +2%p — opus 5.5 전환 주). guard 수정은 미착수(총괄 판단). - 🆕26.9.26(토) [페페] 체인 상한 임시 20회 = 26.9.27(일) 23:59 KST 까지 — [코디] 26.9.25 임시 20회가 기한 없이 남아 있던 걸 보고 기한 장치를 넣었다:
state.jsonmax_chain_until(ISO) 이 지나면guard.load_state가 기본 5로 되돌리고 다음 저장 때 파일에도 반영(test_guard.py2항목 · ALL PASS). ⛒임시로 올릴 땐 반드시 기한을 같이 적는다. - 🔻26.9.23(수) [페페 지시] 클로드 한도가 차면 OpenRouter 로 자동 폴백한다 —
fallback.py. 「오픈라우터·지피티를 미리 연결하고 클로드 한도가 끝나면 자동으로 다른 AI가 대체해 개발을 잇는다」. 대체 층위 = 모델만 교체(Claude Code 껍데기·훅·스킬·seedchain 규칙이 전부 산다). OpenRouter 가 Anthropic 네이티브/api/v1/messages를 줘서 로컬 프록시가 필요 없다 — 환경변수 3개면 끝이다. ⛒env 는 세션 시작 때만 읽힌다 → 돌던 세션은 그 자리에서 모델을 못 바꾼다. 새 세션이 유일한 경로라 릴레이를 그대로 재사용했다(새로 만든 건 env 스위치 하나). ⛒전역settings.json오염이 최대 함정(코덱스 지적) — 켜 둔 동안 뜨는 모든 세션이 폴백으로 샌다. → 새 세션이 응답을 시작한 즉시 원복(finally로 실패 시에도). 이미 뜬 세션은 프로세스 env 를 들고 있어 유지된다. ⛒Stop 훅은 10초 타임아웃 →go를 동기 호출하면 죽는다.pythonw로 떼어 보낸다(콜드 0.64초·웜 0.09초 실측). ⛒Claude Desktop 앱은 안 된다(계정 로그인 직결, MCP 만 붙는다). VS Code 확장·터미널claude만 된다. 🔑한도에러 실측 문자열 =isApiErrorMessage:true+You've hit your weekly limit · resets 10pm (Asia/Seoul). 500 서버오류와 구분해야 한다(그건 폴백 대상이 아니다). 발동 = 주간 95% 또는 이 에러 · 쿨다운 30분. 📌[페페] 결정 = 폴백 세션도 위험작업 게이트는 평소와 동일하되 이력에 공급자·모델을 박는다 →notify.py provider_tag()가 env 를 보고[OR/<모델>]을 자동으로 붙인다(폴백 세션의 자식 프로세스라 상속된다). 📌모델 =z-ai/glm-5.3-flash($0.15/$0.50 · ctx 1.31M, OpenRouter API 실측 조회) · 무료 백업nvidia/nemotron-3.5-lightning:free. ⚠무료 티어는 코딩 에이전트엔 대체로 부족하다(한 턴이 수만 토큰) — Groq 200k/일·Gemini 10~15RPM 은 몇 턴이면 끝. 실효 무료는 Mistral 1B/월과 OpenRouter($10 1회 충전 시:free모델 1,000req/일)뿐. GitHub Models 는 26.7.30 종료. - 🔑2026-09-16 [코디] 「지금 살아 있는 Claude 세션·상태」 단일 출처 =
C:\Users\delix\.claude\sessions\<pid>.json—sessionId·entrypoint(claude-vscode / sdk-cli)·name(ListAgents 이름)·status(busy / idle / waiting)·statusUpdatedAt·bridgeSessionId(remote-control 원격 세션). pid 생존은 tasklist 로 대조(죽은 pid 파일이 남는다). ListAgents 와 같은 값이다. ⚠idle≠ 완전정지 — 26.9.16 실측 dev-59(remote-control, transcript 18:54 조용)가 claude.exe 자식bash.exe로 Monitor 감시 루프를 돌리고 있었다 → 정지 판정엔 자식 프로세스(MCP 서버 제외) +<sid>\subagents\*.jsonlmtime 을 같이 본다. sdk-cli(remote-control) 세션은status필드가 없다. 조사 스크립트 원형 = D2 세션(e626b029) scratchpadreg.py·sess.py. - 2026-08-26 「돌고 있는 다른 세션에 지시 전달」 =
tools/cody-bridge/send_to_window.py. 릴레이(relay.py)는 새 세션을 여는 도구라 이 용도엔 못 쓴다(/newsession이 sessionId=undefined 고정). 진행중 세션에 넣는 경로는 브릿지/send(클립보드+입력창 포커스) + Ctrl+V + Enter 뿐 — voicecody 의 VS Code 경로와 같은 절차인데 음성 데몬(numpy·whisper) 을 안 끌고 온다. 절차 =relay.find_vscode_window/bring_to_front/foreground_info로 전면 재확인 후에만 키 전송(위 「무효라서 안전에 기대지 않는다」 규칙 그대로). 사용 =PYTHONUTF8=1 python tools/cody-bridge/send_to_window.py --file <msg.md> --title dev. - 🔑대상 세션 특정 = 창 제목이 제일 확실하다(
… - dev - Visual Studio Code앞이 그 창의 활성 Claude 탭 이름). 스크립트가[1] 전면화 OK: <제목>으로 찍어주니 그걸 보고 판정한다. 브릿지 창이 여러 개면--title로 좁힌다. - 도달 검증 = 대상 세션 transcript(
~/.claude/projects/C--dev/<sid>.jsonl) 에서 보낸 문구를 grep. 작업중이면queue-operation enqueue→ 소비되면remove가 찍힌다./send200 은 도달 증거가 아니다(확장은 포커스만 준다,pasted:false). - 2026-07-30 사용량 한도는 주 1회 자동보정한다(페페 지시). 예약작업
SessionRelay-Calibrate(매주 목 10:00,pythonw= 창 없음)이calibrate.py로/usage를 실행해 주간%·리셋시각을 읽고, 같은 창 로컬 토큰으로 한도를 역산해 10% 넘게 어긋나면state.json갱신 + 텔레그램 보고(임계 이내면 조용히)./usage실행 실패·형식 변경은 실패로 보고한다(조용한 실패 금지). 사용률 3% 미만이면 역산 오차가 커서 건너뛴다. ⚠calibrate.py는 셸을 안 거치고 인자 배열로 실행하므로 MSYS 경로변환이 아예 개입하지 않는다(수동으로 Bash 에서 칠 때만MSYS_NO_PATHCONV=1필요). - 2026-07-30 구독 사용률은
claude -p "/usage"로 실측한다(페페 아이디어, 실측 성공). 로컬 파일·transcript 어디에도 플랜 한도/사용률이 없어서 못 구하는 줄 알았는데, CLI 헤드리스로 슬래시 명령이 돈다. ⚠Git Bash 가/usage를 경로(C:/Program Files/Git/usage)로 바꾸므로MSYS_NO_PATHCONV=1필수(안 붙이면 "내장 명령이라 못 돌린다"는 엉뚱한 답이 온다). 결과 = 세션 %·주간 %(모델별)·리셋 시각·요청수까지 나온다. - 2026-07-30 사용량 게이트 캘리브레이션(Max 20x):
/usage주간 19% ↔ 같은 창 로컬 토큰 68,109,289 →weekly_token_budget = 358,000,000역산, 코디 계산 19.0% 로 일치 확인. 주간 창은 롤링 7일이 아니라 고정 리셋 시각 기준(week_reset_iso, 실측 8/3 22:00 KST) — 롤링으로 세면 2.1일 창에 7일치를 넣어 3배 부풀려진다. 한 달에 한 번쯤/usage와 대조해 보정. - 2026-07-30 릴레이 안전장치 3종(페페 지시). ①체인 상한 —
chain_window_h(12h) 안에max_chain(5)회를 채우면 텔레그램 승인을 받아야 이어간다(무한 릴레이 = 토큰 낭비 방지). ②매 릴레이 텔레그램 보고 — 요약·새 세션 id·체인 회차·주간 사용량을 broker/ask로 보내되 기다리지 않는다(자동 진행 유지). 그 문자에중단이라고 답장하면 다음 릴레이의 preflight 가 읽고 막는다(해제 =state.json의stopped_reason→ null). ③주간 사용량 70% 초과 시 매 릴레이 승인제. 승인 무응답(600초)이면 진행하지 않는다(안전측). 임계값은 전부tools/session-relay/state.json. - ⚠2026-07-30 사용량 지표에서
cache_read는 기본 제외. 실측 7일 = cache_read 33.7억 vs 나머지 1.6억 → 캐시 읽기가 95% 라 그냥 더하면 지표가 통째로 왜곡된다(캐시 읽기는 매 요청마다 전체 컨텍스트를 다시 세고 단가도 1/10). 단가 비례로 반영하려면usage_read_weight=0.1. - 2026-07-30 도달 검증은 "실행 전 파일 스냅샷"으로 자기 자신을 걸러야 한다. 인계문 문자열은 릴레이를 돌린 세션의 transcript 에도 들어 있어서(그 세션이 인계문을 작성했으니까)
find_transcript가 자기 자신을 새 세션으로 잡고[OK]를 냈다 — 첫 실전에서 실측. 실행 전transcript_files()스냅샷을exclude로 넘긴다. 검증이 통과했다고 새 세션이 열린 게 아니다: 세션 ID 가 지금 세션과 다른지 눈으로 확인할 것. - 🔴 2026-07-30 키 전송은 "무효라서 안전"에 기대지 않는다(사고 후 확립). 07-29 기록 "코디 Bash 는
GetForegroundWindow()=0이라 SendInput 무효"를 믿고--enter-only를 코디 Bash 에서 테스트했더니 Enter 가 실제로 나갔고 전면 창인 Chrome(YouTube)이 받았다. → 키를 보내는 코드는 대상 창 특정 → 전면화 → 전면 재확인 3단계를 통과해야만 전송한다(enter_into_vscode). 창을 못 찾으면 무조건 미전송, 자체검사t_window_guard가 이를 강제한다. - 2026-07-30 릴레이는 Enter 까지 자동(페페 승인). Enter 주체 = 브릿지 확장 v1.6(
/newsession {prompt, submit}). 확장은 VS Code 프로세스 안에서 돌므로 자식 프로세스의 SendInput 이 먹고, 창 전면화도 헬퍼가 자동으로 한다(페페 지시 "코디가 실행하는 것이니 창 전면화도 자동").--submit기본auto=bridge. 확장이 구버전이면 relay 가 종료코드 8 + "Enter 만 누르면 된다" 안내. - 2026-07-30 실사용 = 페페의 사용자 VS Code 인스턴스(페페 정정). CDP 격리 인스턴스(
launch_vscode_cdp.vbs)는 개발·검증 전용이다.auto가 CDP 를 자동 탐색하지 않는 이유 = 프리필한 창(브릿지 포트)과 CDP 포트가 다른 창일 수 있어 엉뚱한 세션에 Enter 가 박힌다. - 2026-07-29 세션 넘기기 기준 = 컨텍스트 50~60% 구간에서 작업 단계를 끊을 수 있는 지점을 확인한 뒤 진행(페페 지시). 근거 = 60% 넘겨 넘기면 인계문 쓸 여유 자체가 부족.
- 2026-07-29 릴레이 전 시드 갱신 + 커밋이 선행 조건(페페 지시). relay.py가
seedchain미커밋 변경을 게이트로 강제한다(--force는 예외용). - 2026-07-29 코디 Bash는 대화형 데스크톱이 아니라 SendInput이 조용히 무효(
GetForegroundWindow()=0) → 코디가 Enter를 누르는 경로는 CDP뿐이고, 그 CDP도 평소엔 없다(위 2026-07-30 항목이 이 규칙을 대체·정정한다).
§1 넘기는 시점
- 컨텍스트 50%에 도달하면 "지금 끊어도 되는 단계인가"를 본다.
- 끊을 수 있으면 넘기고, 아니면 그 단계를 끝낸 뒤 60% 전에 넘긴다.
- 넘기기 직전 순서 = 시드 갱신 → 로컬 커밋 → 인계문 작성 → relay 실행.
§2 인계문에 반드시 넣는 것
- 작업 폴더 / 이번 작업에서 확정된 규약(네이밍·구조·금지사항)
- 이미 끝난 것 / 남은 것 (남은 것은 번호로)
- 손대면 안 되는 파일과 그 이유
- 보고 형식(마커를 넣으면 relay
--expect로 자동 채점된다) - 시드 포인터(
BRIEF.<P>.md,projects/<P>/handoff.md) — 새 세션이 §0 시드 체인을 다시 읽는다
§3 실행 (실사용 = 사용자 인스턴스)
PYTHONUTF8=1 python C:/dev/tools/session-relay/relay.py \
--prompt-file <인계문.md> --workspace "C:/dev" --title dev \
--thinking on
- ⛒
--model·--effort금지(26.9.23 페페) —C:\dev\.claude\settings.local.json에 써져 사용자 기본(opus 5.5 · medium)을 덮는다. 정본 =rules\runbook.md「세션 릴레이」. - 🔴설정의
"model"은 별칭(opus)으로 쓴다 — 전체 ID(claude-opus-5-5)를 넣으면 VS Code 확장의 노력도 컨트롤·표시가 통째로 사라진다(26.9.23 실측, 페페 제보). 확장은 모델 목록(별칭 기준)의supportsEffort로 표시를 정하는데 전체 ID 는 목록에서 못 찾는다.opus=claude-opus-5-5로 풀리는 것 헤드리스 확인. [코디] --submit생략 = 프리필까지.[OK] 새 탭 입력창에 지시문이 들어갔다가 뜨면 페페가 그 창에서 Enter.- 대상 창 =
--title(워크스페이스 이름) 권장.--focused는 페페가 그 창을 보고 있을 때만. --submit cdp:<port>는launch_vscode_cdp.vbs로 띄운 개발·검증 인스턴스 전용.
§4 금지
- 진행 중인 다른 세션 창으로 넘기지 않는다 — 반드시 포트/타이틀로 대상 창을 명시한다.
- 인계문에 비밀값(토큰·비번)을 적지 않는다. 경로 포인터만.
- 시드 미갱신 상태로
--force강행하지 않는다(다음 세션이 옛 상태를 읽는다).
🆕 신규
- 🆕26.10.21(화) [코디] 사무실 창에 세션 열기 =
relay.py --port 38766 --no-close-self(38766 = Remote-SSH 창dev [SSH: poin-mini]브릿지, 포트장부 등록함). ⚠[STOP] 클라이언트 Enter 실패: … LOCK kb=True는 거짓 실패일 수 있다 — 사무실C:\dev\_relay_enter.log엔 8초 뒤OK Enter가 찍혔고 새 세션(c673fb42)도 응답했다. 판정은 transcript 로 한다. - 🆕26.10.6(화) [코디] 한글 자판 트레이 =
C:\dev\tools\ime-tray\tray.py(pythonw 상주 · HKCU RunImeTray· 뮤텍스ime-tray-hangul-layout· 좌클릭 토글 · 메뉴 두벌식/세벌식 최종/종료 · 아이콘 2/3 · 2초 폴링). 키 =HKCU\Software\Microsoft\IME\15.0\IMEKR\InputMethod(0 두벌식·1 세벌식390·2 세벌식최종) +Timestamp·…\InputMethod\KOR\roaming\mon\MoSetting. 실측: 레지스트리 쓰기만으로 재부팅 없이 적용 — 새 프로세스는 즉시, 열린 창은 «다음 포커스 진입» 때(같은 창에 포커스 안 옮기고 치면 옛 자판). 트레이 클릭이 포커스를 옮기니 실사용은 즉시. ⚠IME 검증에PostMessage키는 무용(IME 우회 → 'kf' 그대로) — Session1 자기 테스트창 + 전경확인 후SendInput만 됨(유휴 20초+ 가드). - ✅[코디] 26.10.9 노트북(poin-lap) 설치 — 같은 경로
C:\dev\tools\ime-tray\tray.py(+C:\dev\tools\{nowin,session0guard}.py, MD5 일치·코드 수정 0) · Python312 pythonw · HKCU RunImeTray· pip pystray·Pillow ·/IT1회 기동 pid 22912 Session1 ·--checkOK(설치 전 값 InputMethod=2) · Win11 NotifyIconSettingsIsPromoted=1(pythonw 항목 1개 = 두 pythonw 트레이 공유). - 🆕VS Code X버튼 = 최소화(26.8.23(일) [코디] 페페 지시 · 26.10.3(토) [페페] 숨김→최소화 전환) — X 실수클릭으로 세션 날리던 사고 차단. 도구 =
C:\dev\tools\vscode-tray\vstray.pyw(pythonw 상주, HKCU Run 자동시작). X/Alt+F4 를 저수준 훅으로 삼키고SW_MINIMIZE(작업표시줄 버튼 유지 → 누르면 그 창 복원) → 프로세스 살아있어 클로드코드 세션 유지. 트레이 클릭 = X로 최소화한 마지막 창 복원. 트레이 우클릭 = 창별 복원·전체복원·창 리로드(ctrl+alt+shift+r주입, keybindings.json 에 등록함)·VS Code 재시작·진짜 종료. 상세·한계 =C:\dev\tools\vscode-tray\README.md. - ⚠막지 못하는 경로 = 관리자권한 Code 창(UIPI로 훅이 입력을 못 봄) ·
File>Exit· 작업표시줄 우클릭 닫기 · 전체화면(타이틀바 없음이라 개입 안 함). 이 경로들은 그대로 종료된다. - ⚠히트박스가 하드코딩(클라이언트 우측 46 × 상단 32 CSS px, dpi/zoomLevel 로 스케일). VS Code 가 타이틀바 디자인 바꾸면 X 클릭이 그냥 종료로 샌다 →
vstray.pyw상단BTN_W_CSS/TITLE_H_CSS조정 후test_vstray.py. - ⚠X 는 닫지 않고 최소화만 하므로 hot-exit 가 안 돈다 — 최소화 상태로 PC 가 죽으면 미저장 백업이 없다(진짜 종료·로그오프 때만 돈다).
- 🆕[코디] 26.10.3(토) 함정 3개(수정함, 상세 = README 「고친 이력」): ①LL 훅에서 «삼킨 DOWN 의 짝 UP» 을 기다리는 플래그는 모든 DOWN 에서 덮어써라 — UP 을 놓치면(관리자 창·데스크톱 전환·훅 타임아웃) 다음 아무 클릭의 UP 을 삼켜 작업표시줄 클릭이 씹힌다 ②외부에서
SW_RESTORE를 보내면 최대화 창이 풀린다 — 숨긴 창 복원은IsIconic일 때만 RESTORE, 아니면 SHOW ③트레이 아이콘을 «떠 있는 프로세스 경로»로만 뽑으면 로그인 직후엔 기본 창 아이콘이 박힌다 — 설치 경로 선해결. ④외부에서SW_HIDE한 창은 작업표시줄 버튼이 사라져 고정 아이콘 클릭 = 빈 새 창(Code 기본openWithoutArgumentsInNewWindow:on) → 그래서 X 를 최소화로 전환했다(페페 결정).