← 목록
기타 2026-07-05 10KB 읽기 10분

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 직작성본.
진단줄은 생략(과제 지시대로 단순화), 판정줄 1개만 고수준본과 완전히 동일한 문자열로 출력.

검증 결과

cd /Users/ef/CrownyOS/crownyc
./hanseonc_rpn /Users/ef/.claude/scripts/crownycode-brain.std.rpn.한선 > /tmp/뇌라우터rpn.toau
  • 컴파일 rc=0, "미인식 단어" 경고 없음, 826 큐브 생성.
6케이스 대조 (고수준본 /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
6/6 일치 — 파일럿 성공.

VM 입력 함정 재검증 (RPN 경로)

고수준본 소스 주석("첫 입력()은 프라이밍 리드 — 버리는 값")이 RPN 경로에도 적용되는지 구별값으로 확인:

  • 99\n1\n0\n0\n0 (더미=99, 조회=1 나머지=0) → 옴|재조립|... (정확 — 더미가 조회에 새지 않음)
  • 1\n0\n0\n0\n0 (더미=1, 조회=0) → 음|LLM위임|... (정확 — 더미=1이 조회로 오염되지 않음)
결론: RPN 경로에는 "프라이밍 리드" 함정이 없다. 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 실측)

  1. 조건 분기 키워드는 "만약"(244)과 "아니면점프"(245)뿐 — "만약점프"는 실제 키워드
테이블에 없다(docs/HANSEON_IDIOMS.md의 RPN 예제가 이 잘못된 키워드를 쓰고 있음 — 문서 함정). 스택 순서는 <조건> @라벨 만약(조건이 참(T)이면 점프) / <조건> @라벨 아니면점프(조건이 참이 아니면(A/O) 점프) — 둘 다 opcode가 addr=pop(); cond=pop() 순으로 소비하므로 주소(@라벨)가 조건식보다 나중에 와야 스택 최상단에 위치한다.
  1. 변수 대입/조회는 →이름(STORE, opcode7)과 bare 변수명(LOAD, opcode8)10 →x
저장, 이후 x만 쓰면 자동으로 LOAD 방출(컴파일러가 기존 변수 테이블에서 매칭). 변수는 주소영역 9000~9999(보호영역)에 자동 배정, 최대 256개.
  1. @라벨은 전방참조 가능 — 라벨 위치는 컴파일 1패스 동안 채워지고, @ fixup은
컴파일 전체가 끝난 뒤 일괄 해석되므로 라벨 정의(.라벨)가 참조(@라벨)보다 뒤에 나와도 무방하다(if-elif-else 체인을 순방향으로 자연스럽게 작성 가능).

다음 RPN 직작성 대상 추천

  • crownycode-learn.sh류의 단순 판정/게이트 로직 중 100줄 미만 코어 (예: ~/.claude/skills/분별/결정.한선 4상 결정 엔진 — 이미 벡터형 판정이라 RPN 직작성에 적합)
  • 배선프로브판정.한선(73줄) — 기존 .rpn.한선이 기계변환 산출물로 이미 존재하며 함정 사례(주석 깨짐)까지 확보했으니, 사람이 직접 재작성해 "기계변환 vs 직작성" 정확도 대조 사례로 삼기 좋음
  • crownycode-brain.한선의 SLM/재조립 진단줄까지 포함한 풀버전(이번엔 판정줄만 단순화했음) — 진단줄까지 동일하게 만들어 완전판 정본화

학습 등록

  • crownycode-brain.sh learncompile_ok()hanseonc_high만 호출하도록 하드코딩돼 있어
순수 RPN 파일을 넣으면 "거부|컴파일실패"로 오탐한다(발견된 인프라 갭 — RPN 경로 미지원). 대신 ~/.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상)
둘 다 진단줄은 생략(뇌라우터 파일럿과 동일 단순화 — RPN은 프라임 리드 함정 자체가 없으므로 사실 즉시사용 강제도 불필요, 판정/결재줄 일치만 확인). 문자열 입력(안건)은 브레인결재 RPN본에서 읽어서 저장만 하고 결재줄엔 미사용 — 고수준 원본도 결재줄엔 안건을 안 쓰므로 단순화 아님(원본과 동일 동작).

검증 결과 — 컴파일

파일rc미인식 단어큐브수
crownycode-ratchet.std.rpn.한선00건727
브레인결재.std.rpn.한선00건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
5/5 일치.

브레인결재(/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
5/5 일치.

신규 함정 발견 — 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.shhanseonc_rpn MUL/DIV 타입경고 근본원인 추적 (TOINT 태그 경로 대조)
  • 나머지 결정형 판정류(예: ~/.claude/skills/분별/결정.한선)도 순차 RPN 직작성 정본화