← 목록
게이트웨이 2026-06-10 11KB 읽기 11분

원크라우니 Wave6 T4 — gateway 핸드오프 + 고수준 컴파일러 인자손상 버그 리포트

개요

원크라우니 백엔드 두 개(API :9420, 동적앱 웹 :9421)를 도메인으로 라우팅하기 위한 gateway 세션용 등록 핸드오프와, 크라우니앱뷰가 우회 코드로 회피해 온 고수준 hanseonc_high 다단계 함수 인자손상최소재현 시도 + 정직 보고.

  • 작성: 2026-06-10
  • 트랙: 원크라우니 Wave6 / T4-gateway핸드오프+컴파일러버그리포트
  • 작성 세션 책임 한계: 백엔드 LISTEN까지만. gateway.yaml 직접 편집 안 함 (gateway 세션 담당).
  • crowny-ports.sh는 읽기/check만 수행, set은 제안만.

1. Gateway 등록 핸드오프 (gateway 세션이 실행)

1-1. 대상 백엔드 (백엔드 세션이 LISTEN 책임짐)

서비스포트소스역할
원크라우니 API9420/Users/ef/crowny-app/원크라우니API.한선6개 한선씨 모듈 REST API. TCP대기(9420)
원크라우니 웹9421/Users/ef/crowny-app/원크라우니웹.한선동적앱 SSR/페이지. TCP대기(9421)
두 백엔드 모두 소스에 포트가 하드코딩되어 있고(변수 포트 = 9420/9421), 주석으로 "gateway.yaml 미등록, 백엔드 LISTEN까지만 책임"을 명시하고 있음.

1-2. 포트 레지스트리 현황 (crowny-ports.sh check — 실측)

$ crowny-ports.sh check 9420
[사용가능] 포트 9420는 gateway.yaml에 미등록
[주의] 프로세스 실행 중: PID=23034 (/Users/ef/CrownyOS/crownyc/crownyc)
        ↑ crownyc VM 프로세스(테스트/실행 중). 9420 LISTEN 점유 아님 — 등록 무방.

$ crowny-ports.sh check 9421
[사용가능] 포트 9421는 gateway.yaml에 미등록

$ crowny-ports.sh get one.crowny.org
[미등록] 'one.crowny.org' 서비스를 찾을 수 없습니다   ← 도메인 사용 가능

$ crowny-ports.sh get app.crowny.org
app.crowny.org → :9820 (crowny-app)                   ← app.crowny.org 점유됨, 재사용 금지

결론: 9420/9421 모두 레지스트리 미등록·도메인 미충돌. one.crowny.org 도메인도 비어 있음. app.crowny.org은 :9820(crowny-app)이 점유 중이므로 원크라우니에는 one.crowny.org 권장.

1-3. gateway 세션이 실행할 제안 명령 (실행은 gateway 세션 — 본 세션은 제안만)

도메인 라우팅 등록(레지스트리 + gateway.yaml 동시 갱신)은 crowny-ports.sh set로 선언한다. 업스트림 도메인을 분리할지(웹=루트 도메인, API=경로 또는 서브도메인) 두 안 제시:

안 A — 웹을 one.crowny.org 루트, API는 api.one.crowny.org 서브도메인:

bash# gateway 세션에서만 실행:
~/.claude/scripts/crowny-ports.sh set one.crowny.org 9421 onecrowny-web
~/.claude/scripts/crowny-ports.sh set api.one.crowny.org 9420 onecrowny-api

안 B — 단일 도메인 one.crowny.org 아래 경로 프록시(/api → 9420, 그 외 → 9421): gateway.yaml에서 한 서비스 항목에 경로 기반 업스트림을 지원할 때만 채택. crowny-ports.sh set은 1도메인=1포트 모델이므로, 경로분기는 gateway.yaml 수기 편집 필요 → gateway 세션이 아래 항목을 직접 작성:

yaml# gateway.yaml 추가 항목 (gateway 세션 작성) — 안 A 기준
- name: onecrowny-web
  domain: one.crowny.org
  upstream: http://127.0.0.1:9421
  spa: true
  cors:
    origins:
    - https://crowny.org
    - https://one.crowny.org
    methods:
    - GET
    - POST
    - OPTIONS
    credentials: true
  healthCheck: http://127.0.0.1:9421/health   # 백엔드 /health 라우트 확인 필요(아래 잔여이슈)
  headers:
    X-Crowny-Service: onecrowny-web
  timeout: 60
  maxBodySize: 20m
  compress: true
  rateLimit:
    window: 60
    max: 300
- name: onecrowny-api
  domain: api.one.crowny.org
  upstream: http://127.0.0.1:9420
  cors:
    origins:
    - https://crowny.org
    - https://one.crowny.org
    - https://api.one.crowny.org
    methods:
    - GET
    - POST
    - OPTIONS
    credentials: true
  headers:
    X-Crowny-Service: onecrowny-api
  timeout: 60
  maxBodySize: 20m
  compress: true
  rateLimit:
    window: 60
    max: 300

권장: 안 A (서브도메인 분리 — crowny-ports.sh set 1:1 모델과 일치, 충돌 검증 자동).

1-4. gateway 세션 체크리스트

  1. crowny-ports.sh check 9420 / check 9421 재확인(LISTEN 점유 여부).
  2. crowny-ports.sh set one.crowny.org 9421 onecrowny-web (+ api.one.crowny.org 9420).
  3. gateway.yaml에 healthCheck 경로 넣기 전, 백엔드에 /health 라우트 존재 확인
(현재 API는 {"status":"ok",...} 루트 응답, 웹은 / 헬스 JSON — /health 별도 라우트는 미확인). /health가 없으면 healthCheck 줄을 빼거나 백엔드 세션에 라우트 추가 요청.
  1. node bin/cli.js validate → 통과 시 reload.

2. 고수준 컴파일러 인자손상 버그 — 최소재현 시도 + 정직 보고

2-1. 배경 (왜 조사했나)

크라우니앱뷰(/Users/ef/crowny-app/크라우니앱뷰.한선)는 여러 곳에서 전역변수 우회를 쓰며 그 사유를 코드 주석으로 명시:

  • line 85: "다단계 함수 호출 인자 전달 슬롯 충돌(고수준 컴파일러 한계)을 회피"
  • line 95: "다단계 함수 호출 인자 전달 시 값이 손상되는 고수준 컴파일러 한계 회피"
  • line 127: "인자 없이 전역만 사용 — 다수 함수 환경에서 인자 전달 슬롯 충돌 회피"
  • line 356: "스칼라 반환 함수만 사용 (여정현황 행맵은 중첩 호출 시 손상 → 우회)"
→ 가설: 고수준 hanseonc_high에서 스칼라/맵/배열 인자가 다단계 중첩 함수호출을 거치며 변질.

2-2. 재현 케이스

파일: /Users/ef/CrownyOS/crownyc/test_인자손상_재현.한선 컴파일/실행:

bashcd /Users/ef/CrownyOS/crownyc
./hanseonc_high test_인자손상_재현.한선 > /tmp/t.toau 2>/dev/null
./crownyc run /tmp/t.toau

10개 케이스로 의심 경로를 망라:

케이스시나리오기대실측
A순수 3단 스칼라 체인 A→B→C116116 ✓
B중간 프레임 다지역변수 + 인자(슬롯겹침 의심)1313 ✓
C맵을 깊은단계서 수정 후 상위 재읽기4277777742777777 ✓
D배열 다단계 통과 + 중간 설정() 변경1155555511555555 ✓
E다중인자(a,b,c) 3단 — 순서뒤섞임 검사123123 ✓
F인자 자체가 함수호출(중첩 평가 슬롯오염)6060 ✓
G배열-of-맵 원소를 다단계로 전달222222 ✓
H맵 반환 함수→반환맵 재전달(여정현황 패턴)50105010 ✓
I스칼라+맵+스칼라 혼합 다단계74440097444009 ✓
J맵 4단 깊이99999999 ✓
추가로 별도 파일에서:
  • 슬롯압박(함수 6개 + 단계마다 지역변수 누적) 깊은 체인 → 정상(42).
  • 여정현황 행맵 정밀모사(행맵 배열 생성 → 반복문 내 행렌더 다단계) → 정상(6060030).

2-3. 결론 (정직 보고)

현재 바이너리로는 최소케이스에서 인자손상 재현 실패. 조건 불명.

  • hanseonc_high.c 소스 mtime = 2026-05-28, 바이너리 빌드 2026-06-09.
  • 위 10+2 케이스 전부 기대=실측 일치. 스칼라/맵/배열/다중인자/깊이4단/슬롯압박/행맵 모두 정상.
  • 단순 격리 케이스에서는 손상이 나타나지 않음. 가능성:
1. 5/28 이후 컴파일러 수정으로 이미 해결됐을 수 있음(앱뷰 우회 주석은 그 이전 작성). 2. 손상이 특정 대형 환경(라이브러리 가져오기 다수 + 함수 수십 개 + 특정 슬롯 인덱스 충돌) 에서만 나타나는 조건부 버그일 수 있음 — 최소화하면 사라짐. 3. 손상이 인자 전달이 아니라 다른 함정(예: 글로벌배열[i]=값, 포함 pos0, 맵 JSON직렬화) 과 섞여 관찰됐고 원인 귀속이 인자전달로 잘못 기록됐을 수 있음.

추측으로 "버그 있음/없음" 단정하지 않음. 위 사실만 보고한다.

2-4. 컴파일러 세션을 위한 조사 포인트

재현이 안 됐으므로, 컴파일러 세션은 재현 환경 격차부터 좁힐 것:

  1. 앱뷰 우회 제거 역재현: 크라우니앱뷰.한선의 전역우회(여정현황 행맵 부분)를
인자 전달 방식으로 되돌려 컴파일/실행 → 손상이 실제로 나오는지 확인. 나오면 그 함수 집합이 최소재현. 안 나오면 우회는 이미 불필요(주석만 잔존).
  1. 인자 전달 스택/슬롯 인덱싱: hanseonc_high.c의 함수 호출 코드젠에서
파라미터를 로컬 슬롯에 바인딩하는 인덱스 계산 확인. 다수 함수 정의 시 슬롯 인덱스가 전역과 겹치는 off-by 가능성.
  1. 큐브 핸들 수명: 맵/배열은 핸들(정수 id)로 전달됨.
다단계 호출에서 핸들 정수가 산술 슬롯과 공유돼 덮어써지는지(핸들=스칼라 구분 부재) 의심.
  1. 라이브러리 임포트 슬롯 압박: 가져오기로 4900+ 큐브 로드 시 변수/슬롯 테이블이 커짐.
임포트 다수 + 함수 다수 조합에서만 재현될 수 있으니, 앱뷰 임포트 세트를 동봉해 재시도.

2-5. 권장 우회 패턴 (재현 전까지 유지)

/Users/ef/CrownyOS/crownyc/test_인자손상_재현.한선 자체는 우회 불필요(정상 동작 입증용). 실서비스(앱뷰)에서는 현 전역우회 유지가 안전 — 재현이 안 됐다고 우회를 섣불리 제거하지 말 것. 전역 우회 패턴:

; globals 먼저 선언 (함수 정의보다 위)
변수 현재단계 = 0
변수 행상태들 = []
함수 그리기() {        ; 인자 없이 전역 참조
    반환 현재단계 + 길이(행상태들)
}


관련 파일 경로

  • 재현 케이스: /Users/ef/CrownyOS/crownyc/test_인자손상_재현.한선 (10케이스, 전부 PASS)
  • 고수준 컴파일러: /Users/ef/CrownyOS/crownyc/hanseonc_high.c (mtime 2026-05-28), 바이너리 hanseonc_high
  • VM: /Users/ef/CrownyOS/crownyc/crownyc
  • 우회 원인 코드: /Users/ef/crowny-app/크라우니앱뷰.한선 (line 85/95/127/356 주석)
  • API 백엔드: /Users/ef/crowny-app/원크라우니API.한선 (:9420)
  • 웹 백엔드: /Users/ef/crowny-app/원크라우니웹.한선 (:9421)
  • gateway.yaml(SSOT): /Users/ef/crowny-gateway/gateway.yamlgateway 세션만 편집
  • 포트 도구: ~/.claude/scripts/crowny-ports.sh

잔여 이슈

  1. gateway 등록 미실행 — 본 세션은 제안만. gateway 세션이 안 A로 set + validate + reload.
  2. 백엔드 /health 라우트 미확인 — healthCheck URL 넣기 전 백엔드에 /health 존재 확인 필요.
현재는 API=루트 {"status":"ok"}, 웹=/ 헬스 JSON만 확인됨. 별도 /health는 미확인.
  1. 컴파일러 버그 재현 실패 — 조건 불명. 컴파일러 세션이 §2-4 1번(앱뷰 우회 역재현)부터 격차 좁힐 것.
  2. 백엔드 LISTEN 상시화 — 9420/9421을 부팅 시 자동 기동(LaunchAgent/슈퍼바이저)할지 별도 트랙.