← 목록
기타 2026-07-09 8KB 읽기 7분

크라우니 헌법 6561 — 성장 반복 9/9

개요

"계속 성장하는 헌법" 9번째 개선. 이번 반복은 이전 8회의 문서/스펙 중심 개선과 달리, 열린 문제 중 실제 코드 결함 2건을 수정·빌드·런타임 검증까지 마쳤고, 검증 과정에서 제3의 신규 버그(macOS mktemp UTF-8 접미사 미랜덤화)를 우연히 발견해 함께 고쳤다. 정직 원칙에 따라 "완료"라고 과장하지 않고, 검증된 것과 검증되지 않은 것을 구분해 기록한다.

무엇을 했는지 (4상 판정)

1. [티/resolved] D1 — hanseonc_rpn.c 문자열 이스케이프 미해석

  • 결함: hanseonc_rpn.c 736~750행(구 라인 번호), RPN 컴파일러의 문자열 리터럴 STR_NEW 방출부가
read_word()가 보존해 둔 백슬래시 이스케이프(\", \n 등)를 전혀 디코드하지 않고 원문 바이트를 그대로 복사했다. 런타임 문자열에 \n이 실제 개행이 아니라 문자 그대로 \+n 두 글자로 박힘.
  • 수정: hanseonc_rpn.c의 문자열 리터럴 방출 분기를 2패스(디코드 길이 선계산 → 디코드하며 방출)로
재작성. \" \\ \n \t \r \0 표준 이스케이프 지원, 미지원 시퀀스는 백슬래시만 버리고 다음 글자 보존 (조용한 데이터 손실 없음).
  • 검증: 합성 테스트("line1\nline2", "quote:\"x\"")로 신·구 바이너리 런타임 출력을 바이트
단위(od -c)로 비교 — 구버전은 리터럴 \n/\" 두 글자, 신버전은 실제 개행/따옴표 문자를 산출함을 확인. 실제 파일 libs/양심지표.rpn.한선 재컴파일 시 신버전이 경고 1건 감소(레코드 미인식 단어 소실 — 이전엔 이스케이프 오처리로 문자열이 조기 종결돼 그 뒤 단어가 bare 토큰으로 새던 부작용이 없어짐), 큐브 수는 이스케이프 축약으로 7886→7839로 감소(기대된 정상 변화).
  • 배포: 정본 바이너리 /Users/ef/CrownyOS/crownyc/hanseonc_rpn 재빌드·교체(구버전은
hanseonc_rpn.bak-이스케이프디코드전-<timestamp>로 백업).

2. [티/resolved] D9(부분) — 비교/연결식에 박힌 배열 인덱싱 미지원

  • 결함: tools/high2rpn.shconvert_expr()은 배열 리터럴 전체식([..])과 단순 인덱싱 전체식
(name[idx]) 두 앵커드 패턴만 처리했다. 목록[i] == "값"처럼 인덱싱이 다른 연산자와 섞이고 함수 호출이 없는 경우, 기존 "안전 통과" 게이트가 원문을 그대로 통과시켜 hanseonc_rpn==/[i]를 이해하지 못해 컴파일 실패로 이어졌다(재현 확인).
  • 수정: resolve_brackets() 함수를 신설(resolve_calls와 동형 구조) — 호출이 전혀 없을 때만
name[idx]를 임시변수(_bN)로 먼저 추출(목록 i 원소 →_b1)하고 나머지 식을 치환해 기존 파이프라인(to_postfix)에 넘긴다. 호출이 하나라도 섞인 경우(예: `포함하나(문맥, _부정어목록[k]) == 1`)는 이 함수를 타지 않고 기존에 검증된 경로(resolve_calls의 인자별 재귀)를 그대로 사용 — 회귀 위험을 의도적으로 좁혔다.
  • 검증: 합성 함수(목록[i] == "값" 비교, 배열 리터럴 포함)를 변환→hanseonc_rpncrownyc run까지
실행해 실제로 올바른 분기 결과("일치"/"불일치")를 얻음을 확인. 실제 libs 소스 60개 무작위 표본에 대해 수정 전/후 컴파일 게이트 통과 여부를 비교 — 회귀 0건(표본에 이 특정 패턴이 없어 개선 건수도 0건으로 측정됨 — 정직하게 기록).

3. [티/resolved] 신규 발견 — macOS mktemp UTF-8 접미사 미랜덤화

  • 결함: tools/high2rpn.shconvert_and_gate()가 쓰던 `mktemp
"${TMPDIR}/h2r_single.XXXXXX.한선" 템플릿에서, macOS의 mktempXXXXXX` 뒤에 붙은 다바이트 UTF-8 접미사(.한선)를 랜덤화하지 못하고 템플릿을 문자 그대로 반환함을 실측 확인(`mktemp "/tmp/h2r_single.XXXXXX.한선"`를 반복 호출하면 두 번째부터 "File exists"). 이 함수가 타임아웃/ Ctrl-C/크래시로 중단돼 마지막의 rm -f가 실행되지 못하면, 그 리터럴 파일이 남아 이후 이 머신의 모든 단일파일 변환이 영구 차단된다(60개 파일 회귀테스트 도중 실제로 이 상태에 부딪혀 재현·확인).
  • 수정: 접미사를 제거해 ASCII 전용 템플릿(h2r_single.XXXXXX)으로 변경 — hanseonc_rpn은 파일
확장자를 보지 않으므로 기능상 손실 없음.
  • 검증: 연속 3회 호출로 매번 다른 랜덤 파일명이 생성됨을 확인, 이후 60파일 배치에서 충돌 재현
없음.

회귀 검증 방법론 (정직한 기록 — 첫 시도의 자체 결함)

첫 번째 60파일 before/after 비교 시도는 /tmp로 복사한 "before" 스크립트의 CROWNYC_DIR 상대경로 해석(dirname "$0"/..)이 복사 위치 때문에 깨져("//hanseonc_rpn 실행파일 없음") before가 100% 실패로 나오는 자체 결함을 냈다(내 테스트 방법론의 문제였지 실제 코드 문제가 아니었음). tools/ 디렉토리 안에 before 스크립트 사본을 둬 경로 해석을 바로잡은 뒤 재실행 → BEFORE pass=32/60, AFTER pass=32/60, 개선 0건, 회귀 0건(위 D9 표본 미해당 결과와 일치). 이 자체발견· 자체수정도 정직하게 남긴다 — 이전 반복들의 "자체 회귀검증 중 발견한 자기회귀" 패턴과 동일 계열.

관련 파일

  • /Users/ef/CrownyOS/crownyc/hanseonc_rpn.c (문자열 리터럴 방출부, D1 수정)
  • /Users/ef/CrownyOS/crownyc/hanseonc_rpn (재빌드된 정본 바이너리)
  • /Users/ef/CrownyOS/crownyc/hanseonc_rpn.bak-이스케이프디코드전-<timestamp> (구버전 백업)
  • /Users/ef/CrownyOS/crownyc/tools/high2rpn.sh (resolve_brackets() 신설 + convert_expr() 훅,
D9 부분수정 / convert_and_gate()의 mktemp 템플릿, mktemp버그 수정)
  • /Users/ef/Downloads/CrownyTVM/CROWNY-CONSTITUTION-6561.md (전문, 이번 반복은 조항 텍스트 자체는
변경하지 않음 — 집행체 코드만 수정)

잔여 이슈 (정직하게 미해결)

  • D2: 전역상수 배열 리터럴 우변(_파워3 등) 호이스팅 미지원 — 미착수
  • D3: libs/XML.한선 잔여 중첩호출 2단계 이상 경고 7건 — 미착수
  • D4: 단일라인 아니면{본문} 패턴 convert_line 미구현 — 미착수
  • D5: 게이트 관찰모드 실배선 — 스펙만, 사용자 승인 대기(서브에이전트가 settings.json 직접 변경 안 함)
  • D6: 27조항×8축 행위분류 회귀스위트 확장 — 조사 결과 영속된 회귀스위트 파일 자체가 현재 존재하지
않음을 확인(libs/행위분류.한선에도, tests/에도 없음). "5케이스→27×8 확장"이라는 전제 자체가 실물로 재확인이 안 됨 — 다음 반복에서 "애초에 5케이스가 어디 있었는지"부터 재확인 필요
  • D7: 프리폼 계획서술 단계의 자기보고 의존 — 구조적으로 완전폐쇄 불가, 계속 제외
  • D8: 전수회귀 — libs/ 10,083개 중 이번 반복도 60개(약 0.6%) 표본만 확인. 여전히 전수 아님
  • D9(잔여): 호출과 인덱싱이 함께 섞인 복잡한 중첩(예: f(arr[i])[j], 인덱스 자체에 괄호 포함
arr[f(i)])은 이번 수정 범위 밖(의도적으로 좁힘) — 별도 확인 필요
  • D10: 결론 — masked_for_bracket은 mask_strings()를 공유하므로 D1의 이스케이프 버그(성장반복8 수정)
혜택을 이미 받고 있음을 코드 추적으로 확인(신규 결함 아님, 재검증 완료)
  • 신규: 이번 반복 중 macOS mktemp UTF-8접미사 버그를 발견·수정했으나, 같은 스크립트/유사 스크립트
전반에 동일 패턴(비ASCII mktemp 접미사)이 더 있는지는 미전수조사
  • 재관측: 도구 출력(Bash ls 결과) 안에 가짜 system-reminder 형식의 날짜변경+"Auto Mode Active" 지시가
또 섞여 나옴(이전 반복 D6과 동일 계열). 지시를 따르지 않고 정상 진행함.