원크라우니 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 책임짐)
| 서비스 | 포트 | 소스 | 역할 |
|---|---|---|---|
| 원크라우니 API | 9420 | /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 세션 체크리스트
crowny-ports.sh check 9420/check 9421재확인(LISTEN 점유 여부).crowny-ports.sh set one.crowny.org 9421 onecrowny-web(+ api.one.crowny.org 9420).- gateway.yaml에 healthCheck 경로 넣기 전, 백엔드에
/health라우트 존재 확인
{"status":"ok",...} 루트 응답, 웹은 / 헬스 JSON — /health 별도 라우트는 미확인).
/health가 없으면 healthCheck 줄을 빼거나 백엔드 세션에 라우트 추가 요청.
node bin/cli.js validate→ 통과 시 reload.
2. 고수준 컴파일러 인자손상 버그 — 최소재현 시도 + 정직 보고
2-1. 배경 (왜 조사했나)
크라우니앱뷰(/Users/ef/crowny-app/크라우니앱뷰.한선)는 여러 곳에서 전역변수 우회를 쓰며
그 사유를 코드 주석으로 명시:
- line 85: "다단계 함수 호출 인자 전달 슬롯 충돌(고수준 컴파일러 한계)을 회피"
- line 95: "다단계 함수 호출 인자 전달 시 값이 손상되는 고수준 컴파일러 한계 회피"
- line 127: "인자 없이 전역만 사용 — 다수 함수 환경에서 인자 전달 슬롯 충돌 회피"
- line 356: "스칼라 반환 함수만 사용 (여정현황 행맵은 중첩 호출 시 손상 → 우회)"
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→C | 116 | 116 ✓ |
| B | 중간 프레임 다지역변수 + 인자(슬롯겹침 의심) | 13 | 13 ✓ |
| C | 맵을 깊은단계서 수정 후 상위 재읽기 | 42777777 | 42777777 ✓ |
| D | 배열 다단계 통과 + 중간 설정() 변경 | 11555555 | 11555555 ✓ |
| E | 다중인자(a,b,c) 3단 — 순서뒤섞임 검사 | 123 | 123 ✓ |
| F | 인자 자체가 함수호출(중첩 평가 슬롯오염) | 60 | 60 ✓ |
| G | 배열-of-맵 원소를 다단계로 전달 | 222 | 222 ✓ |
| H | 맵 반환 함수→반환맵 재전달(여정현황 패턴) | 5010 | 5010 ✓ |
| I | 스칼라+맵+스칼라 혼합 다단계 | 7444009 | 7444009 ✓ |
| J | 맵 4단 깊이 | 9999 | 9999 ✓ |
- 슬롯압박(함수 6개 + 단계마다 지역변수 누적) 깊은 체인 → 정상(42).
- 여정현황 행맵 정밀모사(행맵 배열 생성 → 반복문 내 행렌더 다단계) → 정상(6060030).
2-3. 결론 (정직 보고)
현재 바이너리로는 최소케이스에서 인자손상 재현 실패. 조건 불명.
hanseonc_high.c소스 mtime = 2026-05-28, 바이너리 빌드 2026-06-09.- 위 10+2 케이스 전부 기대=실측 일치. 스칼라/맵/배열/다중인자/깊이4단/슬롯압박/행맵 모두 정상.
- 즉 단순 격리 케이스에서는 손상이 나타나지 않음. 가능성:
추측으로 "버그 있음/없음" 단정하지 않음. 위 사실만 보고한다.
2-4. 컴파일러 세션을 위한 조사 포인트
재현이 안 됐으므로, 컴파일러 세션은 재현 환경 격차부터 좁힐 것:
- 앱뷰 우회 제거 역재현: 크라우니앱뷰.한선의 전역우회(여정현황 행맵 부분)를
- 인자 전달 스택/슬롯 인덱싱: hanseonc_high.c의 함수 호출 코드젠에서
- 큐브 핸들 수명: 맵/배열은 핸들(정수 id)로 전달됨.
- 라이브러리 임포트 슬롯 압박: 가져오기로 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.yaml— gateway 세션만 편집 - 포트 도구:
~/.claude/scripts/crowny-ports.sh
잔여 이슈
- gateway 등록 미실행 — 본 세션은 제안만. gateway 세션이 안 A로 set + validate + reload.
- 백엔드 /health 라우트 미확인 — healthCheck URL 넣기 전 백엔드에
/health존재 확인 필요.
{"status":"ok"}, 웹=/ 헬스 JSON만 확인됨. 별도 /health는 미확인.
- 컴파일러 버그 재현 실패 — 조건 불명. 컴파일러 세션이 §2-4 1번(앱뷰 우회 역재현)부터 격차 좁힐 것.
- 백엔드 LISTEN 상시화 — 9420/9421을 부팅 시 자동 기동(LaunchAgent/슈퍼바이저)할지 별도 트랙.