← 목록
AI 2026-07-11 7KB 읽기 7분

CrownyAI 브라우저 P0 3건 — 엔터 실행 배선·히트맵 전역충돌 격리·네이티브 터미널 런처

개요

감사(오케스트레이터)가 확정한 CrownyAI(=CrownyBrowser) 3대 P0 결함을 수정:

  1. 터미널 앱에서 Enter가 무동작(keyDown에 Return 분기 전무)
  2. 11개 렌더sh가 전부 /tmp/웹히트맵.psv를 공유 → 멀티탭 시 웹탭 링크 무효화
  3. crowny-terminal-native 빌드(4판 체계 맥환경버전)로 가는 진입점이 메뉴에 없음 + 죽은 분기(라이터 없는 /tmp/터미널네이티브입력.psv) 잔존

P0-1 — Enter=실행 배선

native/crowny-browser.m CrownyAppView keyDown: (라인 973~1004 부근)에 신규 분기 추가. service=="터미널"이고 Return 키(keyCode 36/76 또는 문자 \r/\n)면:

  1. 조합세션 중이면 appRunComposeCmd(@"COMMIT", @"")로 먼저 커밋
  2. actionScriptForService(앱목록.psv SSOT)로 터미널액션.sh 조회
  3. "실행" 액션 문자열을 /tmp/앱액션인자.txt(NFC 파일 경유, NSTask argv NFD 분해 회피)로 넘겨 mouseDown 제네릭 디스패치(:1164 부근)와 동일한 appRunTask(@"/bin/bash", ...) 패턴으로 실행
  4. [self reload]로 PPM 반영
기존 mouseDown의 [실행] 버튼 경로를 그대로 재사용해 회귀 리스크를 최소화. 다른 서비스(계산기/시계/3D 등)는 이 분기에 진입하지 않아 영향 없음.

P0-2 — 히트맵 전역충돌 격리

native/m3-배선/페이지배선.py는 원래도 CROWNY_HITMAP env를 지원했으나(:408) 기본값이 전역 /tmp/웹히트맵.psv였고, 11개 렌더sh(계산기/시계/날씨/뷰어(메모)/북마크/설정/파일/터미널/할일/런처/웹) 중 웹 탭을 제외한 10개가 이 env를 설정하지 않아 매 렌더마다 /tmp/웹히트맵.psv를 자기 앱의 빈 링크 목록으로 덮어써(웹탭이 없는 앱은 LINK 엔트리가 0개) 웹탭이 열려 있을 때 다른 탭으로 전환하면 웹탭 링크 히트맵이 통째로 날아갔다.

수정: 계산기렌더.sh·시계렌더.sh·날씨렌더.sh·뷰어렌더.sh·북마크렌더.sh·설정렌더.sh·파일렌더.sh·터미널렌더.sh·할일렌더.sh·런처렌더.sh 10개 각각에

bashexport CROWNY_HITMAP="${CROWNY_HITMAP:-/tmp/히트맵_<앱이름>.psv}"
추가(BAESUN 호출 전, 기존 CW/CH export 블록 옆). 웹렌더.sh는 미수정 — 기본값 /tmp/웹히트맵.psv를 그대로 유지해 webClickCanvasX(:1059 부근, service=="web" 전용 리더)와 정합. 페이지배선.py 자체는 읽기만 하고 수정하지 않음(지시 준수).

crowny-browser.m의 히트맵 로드부는 webClickCanvasX 한 곳뿐이며 service=="web"에서만 호출되므로 .m 수정은 불필요(비-web 앱들은 별도의 /tmp/히트맵.psv(화면.한선 _히트등록 하드코딩, 이벤트루프.한선이 읽음) 메커니즘을 쓰며, 이는 이번 작업 범위 밖).

P0-3 — 네이티브 터미널 런처 + 죽은 분기 제거

crowny-browser.mCrownyBrowserDelegate 메서드 openNativeTerminal: 추가(openSettings: 근처): /Users/ef/crowny-terminal-native/build/크라우니터미널.app 존재 가드 후 NSWorkspace openApplicationAtURL:configuration:completionHandler:로 실행, 없으면 NSAlert 안내. File 메뉴에 "네이티브 터미널 열기" 항목 추가(집사 AI 항목 옆). crowny://app/런처 카드는 추가하지 않음(레지스트리 앱 아님, 지시대로).

src/터미널앱.한선에서 라이터 없는 죽은 분기 제거:

  • _니미리 = 읽기("/tmp/터미널네이티브입력.psv") + _표시줄수 오버라이드 (구 27~28행)
  • _네이티브입력 플래그 + 만약(_네이티브입력==0){...} 래퍼 (구 156~176행) — 항상 0이었으므로 무조건 실행으로 단순화(동작 불변)

빌드·검증

  • make CrownyBrowser — 클린 빌드(경고 2건은 기존 미사용 함수, 무관). make web(전체) 통과.
  • 바이너리 3곳(native/CrownyBrowser, CrownyBrowser.app, CrownyAI.app) mv로 배치, sha256 3곳 동일 확인(fd22d0190b2e622ebb71bf24443aa41441d03e5826c185db33175a33476cdc09).
  • 헤드리스 검증:
  • 터미널렌더.sh 실행 → /tmp/히트맵_터미널.psv 생성 확인, /tmp/웹히트맵.psv(사전에 더미 링크 기록) 오염 없음 확인
  • 나머지 9개 앱 렌더sh(계산기/시계/날씨/뷰어/북마크/설정/파일/할일/런처) 1회씩 스모크 — 전부 OK, BUILD_FAIL/CMD_FAIL/BAESUN_FAIL/RENDER_FAIL 0건
  • /tmp/웹히트맵.psv가 10개 앱 렌더 후에도 최종까지 최초 더미 콘텐츠 그대로 보존됨을 확인
  • 터미널앱.한선 단독 컴파일 exit0(hanseonc_high, 12421 큐브)
  • PPM 픽셀 스캔으로 하단 입력행(y=CVH-46 부근) 존재 확인(non-background pixel 발견, rgb=(153,128,74))
  • 터미널액션.sh 실행 기존 경로 스모크(회귀 없음)
  • Enter 배선(P0-1)은 코드 리뷰 + 빌드로 확인. 실제 macOS GUI에서 Enter 키 입력 → 명령 실행 확인은 사용자 실측 필요(헤드리스 환경 한계).
  • 관련 파일

    • /Users/ef/CrownyBrowser/native/crowny-browser.m — keyDown Enter 배선(:973~1004), openNativeTerminal: 메서드(:5263 부근), File 메뉴 항목(:6088 부근)
    • /Users/ef/CrownyBrowser/native/터미널렌더.sh, 계산기렌더.sh, 시계렌더.sh, 날씨렌더.sh, 뷰어렌더.sh, 북마크렌더.sh, 설정렌더.sh, 파일렌더.sh, 할일렌더.sh, 런처렌더.sh — CROWNY_HITMAP 앱별 격리
    • /Users/ef/CrownyBrowser/src/터미널앱.한선 — 죽은 분기 제거
    • /Users/ef/CrownyBrowser/native/CrownyBrowser, CrownyBrowser.app, CrownyAI.app — 신규 바이너리(sha 동일)

    잔여 이슈

    • Enter 실측(실제 GUI 키입력)은 사용자 확인 필요.
    • /Users/ef/crowny-terminal-native/build/에는 크라우니터미널.app 번들이 아직 없고 raw 실행파일(크라우니터미널)만 존재 — 메뉴 클릭 시 현재는 존재 가드에 걸려 NSAlert만 뜬다. .app 번들 빌드가 완료되면 자동으로 정상 동작.
    • /tmp/히트맵.psv(화면.한선 _히트등록, 비-web 앱 버튼 클릭 디스패치용, 이벤트루프.한선이 읽음)는 여전히 전역 공유 — 이번 P0-2 범위(웹링크 히트맵)와 별개 메커니즘이라 미수정. 향후 별도 티켓 후보.
    크라우니코드: lookup MISS 1건(브라우저_터미널_엔터실행) / 생성 1건(ObjC 네이티브 이벤트 배선, 기존 프로젝트 컨벤션상 .한선 동반 대상 아님 — Cocoa 이벤트 라우팅 글루) / learn 추가 1건.