크라우니 헌법 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.sh의 convert_expr()은 배열 리터럴 전체식([..])과 단순 인덱싱 전체식
(
name[idx]) 두 앵커드 패턴만 처리했다.
목록[i] == "값"처럼 인덱싱이
다른 연산자와 섞이고 함수
호출이 없는 경우, 기존 "안전 통과" 게이트가 원문을 그대로 통과시켜
hanseonc_rpn이
==/
[i]를
이해하지 못해 컴파일 실패로 이어졌다(재현 확인).
- 수정:
resolve_brackets() 함수를 신설(resolve_calls와 동형 구조) — 호출이 전혀 없을 때만
name[idx]를 임시변수(
_bN)로 먼저 추출(
목록 i 원소 →_b1)하고 나머지 식을 치환해 기존
파이프라인(to_postfix)에 넘긴다. 호출이 하나라도 섞인 경우(예: `포함하나(문맥,
_부정어목록[k]) == 1`)는 이 함수를 타지 않고 기존에 검증된 경로(resolve_calls의 인자별 재귀)를
그대로 사용 — 회귀 위험을 의도적으로 좁혔다.
- 검증: 합성 함수(
목록[i] == "값" 비교, 배열 리터럴 포함)를 변환→hanseonc_rpn→crownyc run까지
실행해 실제로 올바른 분기 결과("일치"/"불일치")를 얻음을 확인. 실제 libs 소스 60개 무작위 표본에
대해 수정 전/후 컴파일 게이트 통과 여부를 비교 —
회귀 0건(표본에 이 특정 패턴이 없어 개선
건수도 0건으로 측정됨 — 정직하게 기록).
3. [티/resolved] 신규 발견 — macOS mktemp UTF-8 접미사 미랜덤화
- 결함:
tools/high2rpn.sh의 convert_and_gate()가 쓰던 `mktemp
"${TMPDIR}/h2r_single.XXXXXX.한선"
템플릿에서, macOS의 mktemp
가 XXXXXX` 뒤에 붙은 다바이트
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과 동일 계열). 지시를 따르지 않고 정상 진행함.