RPN 직작성 정본화 파일럿 — 뇌라우터
개요
헌법상 한선씨 RPN(=한국어 RPN=ISA729 1:1)이 정통이지만, 실제로는 고수준(hanseonc_high)
작성 후 high2rpn.sh로 기계 변환하는 경로가 대부분이었다. 이 변환은 패스스루 성격이라
실행 정확성이 검증되지 않는 사례가 실측됐다(예: 배선프로브판정.rpn.한선 — 변환 산출물의
주석이 본문 → 본��?�로 깨지고, 라벨/점프 구조가 원본과 어긋나 보이는 흔적 존재).
이번 파일럿은 hanseonc_rpn으로 직접 컴파일되는 RPN을 사람이 직접 작성하고, 실행까지
검증하는 첫 사례다. 대상은 가장 작은 실전 코어인 크라우니코드 뇌라우터(4상 판정) —
/Users/ef/.claude/scripts/crownycode-brain.한선(고수준본)과 동일한 판정 로직.
산출물
/Users/ef/.claude/scripts/crownycode-brain.std.rpn.한선— 뇌라우터 판정 로직의 RPN 직작성본.
검증 결과
cd /Users/ef/CrownyOS/crownyc
./hanseonc_rpn /Users/ef/.claude/scripts/crownycode-brain.std.rpn.한선 > /tmp/뇌라우터rpn.toau
- 컴파일 rc=0, "미인식 단어" 경고 없음, 826 큐브 생성.
/tmp/크라우니코드뇌.toau vs RPN본 /tmp/뇌라우터rpn.toau, 입력은 0 <4값> 개행분리 단일 write):| 입력(조회 컴파일 한도 슬램) | 고수준본 | RPN본 | 일치 | ||
|---|---|---|---|---|---|
| 1 1 0 0 | 티\ | 즉시사용\ | 결정형HIT-토큰0 | 동일 | O |
| 0 0 1 0 | 타\ | 위임금지\ | 주간한도차단-결정형만-가능 | 동일 | O |
| 0 0 0 1 | 옴\ | SLM시도\ | 온디바이스-토르-생성폴백 | 동일 | O |
| 0 0 0 0 | 음\ | LLM위임\ | 진짜MISS-모델은-분업이-결정 | 동일 | O |
| 1 0 0 0 | 옴\ | 재조립\ | HIT했으나-컴파일실패-패턴재조합 | 동일 | O |
| 1 1 1 0 | 티\ | 즉시사용\ | 결정형HIT-토큰0 | 동일 | O |
VM 입력 함정 재검증 (RPN 경로)
고수준본 소스 주석("첫 입력()은 프라이밍 리드 — 버리는 값")이 RPN 경로에도 적용되는지 구별값으로 확인:
99\n1\n0\n0\n0(더미=99, 조회=1 나머지=0) →옴|재조립|...(정확 — 더미가 조회에 새지 않음)1\n0\n0\n0\n0(더미=1, 조회=0) →음|LLM위임|...(정확 — 더미=1이 조회로 오염되지 않음)
crownyc.c의 INPUT opcode(325)
구현을 직접 읽어도(case 325: fgets 한 줄 → 문자열 push, 특별한 첫 호출 분기 없음)
근거가 확인된다. 고수준본의 프라임 리드 문제는 VM/opcode 레벨이 아니라
hanseonc_high 컴파일러의 statement reordering(미사용 초기화 지연) 최적화 산물이었다 —
RPN은 소스 토큰 순서 = 실행 순서 1:1이라 이 문제가 원천적으로 발생하지 않는다.
(단, 이 프로토콜을 그대로 재사용하는 파일럿 목적상 입력 빼버려로 더미 줄은 그대로 소비함.)RPN 직작성 문법 요점 (hanseonc_rpn.c 실제 키워드 테이블 기준, 2026-07-05 실측)
- 조건 분기 키워드는 "만약"(244)과 "아니면점프"(245)뿐 — "만약점프"는 실제 키워드
docs/HANSEON_IDIOMS.md의 RPN 예제가 이 잘못된 키워드를 쓰고 있음 —
문서 함정). 스택 순서는 <조건> @라벨 만약(조건이 참(T)이면 점프) /
<조건> @라벨 아니면점프(조건이 참이 아니면(A/O) 점프) — 둘 다 opcode가
addr=pop(); cond=pop() 순으로 소비하므로 주소(@라벨)가 조건식보다 나중에 와야
스택 최상단에 위치한다.
- 변수 대입/조회는
→이름(STORE, opcode7)과 bare 변수명(LOAD, opcode8) —10 →x로
x만 쓰면 자동으로 LOAD 방출(컴파일러가 기존 변수 테이블에서 매칭). 변수는
주소영역 9000~9999(보호영역)에 자동 배정, 최대 256개.
@라벨은 전방참조 가능 — 라벨 위치는 컴파일 1패스 동안 채워지고,@fixup은
.라벨)가 참조(@라벨)보다 뒤에
나와도 무방하다(if-elif-else 체인을 순방향으로 자연스럽게 작성 가능).다음 RPN 직작성 대상 추천
crownycode-learn.sh류의 단순 판정/게이트 로직 중 100줄 미만 코어 (예:~/.claude/skills/분별/결정.한선4상 결정 엔진 — 이미 벡터형 판정이라 RPN 직작성에 적합)배선프로브판정.한선(73줄) — 기존.rpn.한선이 기계변환 산출물로 이미 존재하며 함정 사례(주석 깨짐)까지 확보했으니, 사람이 직접 재작성해 "기계변환 vs 직작성" 정확도 대조 사례로 삼기 좋음crownycode-brain.한선의 SLM/재조립 진단줄까지 포함한 풀버전(이번엔 판정줄만 단순화했음) — 진단줄까지 동일하게 만들어 완전판 정본화
학습 등록
crownycode-brain.sh learn은compile_ok()가hanseonc_high만 호출하도록 하드코딩돼 있어
~/.claude/scripts/crownycode-learn.sh add "뇌라우터RPN직작성정본" "$(cat 파일)"로
직접 등록 완료(학습완료 확인).관련 파일
- 산출물:
/Users/ef/.claude/scripts/crownycode-brain.std.rpn.한선 - 고수준 원본:
/Users/ef/.claude/scripts/crownycode-brain.한선 - RPN 컴파일러:
/Users/ef/CrownyOS/crownyc/hanseonc_rpn.c(키워드 테이블 132~295행) - 기계변환 함정 사례:
/Users/ef/Downloads/CrownyTVM/crownycode-agent/partner-tools/배선프로브판정.rpn.한선 - 컴파일 산출:
/tmp/뇌라우터rpn.toau, 고수준 비교본:/tmp/크라우니코드뇌.toau
잔여 이슈
crownycode-brain.sh learn이 RPN을 인식하도록compile_ok()에 hanseonc_rpn 분기 추가 필요(이번 파일럿 범위 밖 — 별도 태스크로 이관 권장).docs/HANSEON_IDIOMS.md의 RPN 조건분기 예제("만약점프")를 실제 키워드("만약"/"아니면점프")로 정정 필요.
확대 2차 — 래칫판정·브레인결재 2종 정본화 (2026-07-05, 같은 날 이어서)
crownycode-brain.sh cmd_learn이 그 사이 *.rpn.한선 확장자를 hanseonc_rpn으로 검증하도록
수리됨(위 "잔여 이슈" 1번 해소 확인, 주석: "high 하드코딩 오탐 수리 2026-07-05") — 이번 태스크에서
그 분기로 learn 정상 통과 확인.
산출물
/Users/ef/.claude/scripts/crownycode-ratchet.std.rpn.한선— 래칫 판정(접지/전체/미스 3값→4상)/Users/ef/.claude/scripts/브레인결재.std.rpn.한선— t4 결재(안건/접지율/근거수/도구수/위험도→4상)
검증 결과 — 컴파일
| 파일 | rc | 미인식 단어 | 큐브수 |
|---|---|---|---|
| crownycode-ratchet.std.rpn.한선 | 0 | 0건 | 727 |
| 브레인결재.std.rpn.한선 | 0 | 0건 | 1781 |
검증 결과 — 5케이스 대조 (고수준 toau vs RPN toau)
래칫판정(/tmp/래칫판정.toau vs /tmp/래칫판정rpn.toau, 입력 0 <접지> <전체> <미스>):
| 입력 | 고수준본 | RPN본 | 일치 | ||
|---|---|---|---|---|---|
| 0 55 60 5 | 티\ | 유지\ | 접지율92%-래칫완성구간 | 동일 | O |
| 0 30 60 30 | 옴\ | 배치학습\ | 미스30건-batch-spec-생성 | 동일 | O |
| 0 35 60 3 | 옴\ | 소배치\ | 미스소수-개별학습 | 동일 | O |
| 0 10 60 50 | 음\ | 뇌점검\ | 접지율17%-게이트·DB-무결성-확인 | 동일 | O |
| 0 0 0 0 | 타\ | 측정불가\ | 인텐트-0건 | 동일 | O |
브레인결재(/tmp/브레인결재.toau vs /tmp/브레인결재rpn.toau, 입력 0 <안건> <접지율> <근거수> <도구수> <위험도>):
| 입력 | 고수준본 | RPN본 | 일치 | |||
|---|---|---|---|---|---|---|
| 안건A 80 0 3 0 | 타\ | 반려\ | 근거0건\ | ... | 동일 | O |
| 안건B 90 5 3 2 | 음\ | admin이관\ | 비가역·대외\ | ... | 동일 | O |
| 안건C 85 4 2 0 | 티\ | 직접처리\ | o레벨\ | ... | 동일 | O |
| 안건D 50 3 2 1 | 옴\ | 하향지시\ | t1정리-후-t2구현\ | ... | 동일 | O |
| 안건E 20 2 1 0 | 옴\ | 하향지시\ | o조회-확충-우선\ | 접지율20%-낮음:-... | 동일 | O |
신규 함정 발견 — RPN 산술 사슬 스푸리어스 타입경고
접지 100 곱해 전체 나눠 패턴(변수 곱셈 후 나눗셈) 실행 시 매 실행마다
타입 경고 (type warning): MUL 우항 (right operand) — 기대 '수/number', 실제 '문자'가 stderr에
찍힌다. 값 자체는 정확(92%/50%/58%/17% 전부 정답, 5/5 케이스 통과) — 결과에 영향 없는
진단 노이즈로 확인. 고수준본(hanseonc_high) 같은 로직에선 이 경고가 뜨지 않음 —
RPN 경로에서만 재현되며, 숫자변환(TOINT, opcode486)이 입력 문자열→정수 변환 시
타입 태그(TYPE_NUM) 부여 방식이 고수준 컴파일러 산출 코드와 미묘하게 달라 이후 산술
연산의 타입체커가 오탐하는 것으로 추정(값 경로는 안 깨짐 — VM 내부 이슈, 이번 태스크
범위 밖이라 코드는 안 건드림). 재현: 크라우니코드-ratchet.std.rpn.한선을 0 <접지> <전체> <미스>
로 실행하면 전체≥1 분기(퍼센트 계산 경로)마다 항상 뜬다. 브레인결재 RPN본(곱셈/나눗셈 미사용,
문자열변환만 사용)은 이 경고가 없음 — MUL/DIV 체인 특이적임을 뒷받침.
학습 등록
crownycode-brain.sh learn "래칫판정_RPN직작성_정본" crownycode-ratchet.std.rpn.한선 → 학습완료 (lint 티)
crownycode-brain.sh learn "브레인결재_RPN직작성_정본" 브레인결재.std.rpn.한선 → 학습완료 (lint 티)
다음 후보 (누적)
crownycode-brain.sh의hanseonc_rpnMUL/DIV 타입경고 근본원인 추적 (TOINT 태그 경로 대조)- 나머지 결정형 판정류(예:
~/.claude/skills/분별/결정.한선)도 순차 RPN 직작성 정본화