자생율 측정기 (자생 로드맵 1단계)
개요
크라우니 생태계가 외부언어(.sh/.js/.py/.c/.h/.html/.css/.rs)를 전폐하고 한선씨로
자생하는 여정을 "감"이 아니라 숫자로 측정하는 도구. 판정 코어 자체도 한선씨로 작성해
측정기가 외부언어인 모순을 피했다.
- 자생율 정의: 분자=한선씨(.한선/.han) 로직줄수, 분모=분자+외부언어 로직줄수(주석·빈줄 제외).
- 셸 스텁 면제: .sh가 비주석·비공백 로직 ≤3줄이고 내용이
crownyc run/hanseonc 호출
위주면 외부언어 로직 0으로 계산(자생 인정).
- 4상 판정: 티≥90% / 옴 70~89% / 타 40~69% / 음<40%.
무엇을 했는지
자생율.한선 — 4상 판정 코어. stdin 3값(한선씨줄/외부줄/스텁면제줄, VM 규약대로 첫 입력()은
프라이밍 리드값이라 버림) → 자생율%/판정/권고 3줄 출력.
hanseonc_high +
CROWNY_STRICT=1
컴파일 경고 0 확인, 높음(90%)/중간(75%)/타(50%)/낮음(20%)/분모0 5케이스 판정 정확 검증.
자생율.sh — 스캔 표면. 파일 수집은 find, 줄수 집계는 lib/자생율집계.awk(단일 awk
프로세스에 파일 전체를 넘겨 벌크 처리 — 파일마다 awk를 새로 띄우면 수만 파일에서 수십분
걸리는 문제 회피,
LC_ALL=C로 멀티바이트 변환 에러도 회피)에 위임하고, 4상 판정은 반드시
자생율.한선 코어를 호출한다. 서브커맨드:
<디렉토리> /
scan-tools /
services /
python-debt.
lib/자생율집계.awk — 언어별 라인/블록 주석 규칙(한선 //, sh/py #, js/c/h/css/rs //
/* */, html
<!-- -->)으로 로직 줄수 산출 + .sh crownyc/hanseonc 마커 + html/css
generated 마커를 한 패스로 계산.
자생율기록.sh — Stop 훅용. 자생율.sh scan-tools+services 결과를 리포트 텍스트에서
grep으로 파싱해
~/.crownycode/자생율로그.psv(ts|영역|한선씨|외부|스텁면제|자생율%|판정)에
append. 5초 중복가드(직전 실행 타임스탬프 대비) 확인, 항상 exit 0.
settings.json 배선은
하지 않음(오케스트레이터 담당, 스펙 지시대로).
실측 결과 (baseline, 2026-07-26)
- scan-tools (
~/.claude/scripts): 한선씨 6293줄(50파일) vs 외부 11040줄(121파일, 스텁면제 0)
→
자생율 36% (판정: 음). 상위 전환 대상: 디자인이식.sh(604줄) > crownycode-brain-server.js(424줄)
> crownycode-learn.sh(287줄) > crownycode-brain.sh(259줄) > 도구연결검증.sh(238줄).
- services (
/Users/ef/crowny-*, .venv/site-packages/dist/vendor 등 제외 후):
한선씨 944,902줄(4969파일) vs 외부 1,798,990줄(4262파일, 스텁면제 4줄) →
자생율 34% (판정: 음).
server.js 파일 126개. 상위 전환 대상: crowny-project/public/js/app.js(23404줄) >
crowny-project/server.js(18053줄) > crowny-genesis a2ui.bundle.js(15820줄) 등.
- python-debt (
~/.claude/scripts): python3 낀 .sh 41개 (grep \bpython3?\b, 주석/echo 텍스트
언급도 잡히는 단순 매칭이라 소폭 과다포함 가능 — 예: 자생율.sh 자신도 "python3" 문자열을
usage 문구에 담고 있어 후보로 잡힘. 수동 검토 전제).
관련 파일
/Users/ef/.claude/scripts/자생율.한선 (판정 코어, 53줄)
/Users/ef/.claude/scripts/자생율.sh (스캔 표면, 159줄)
/Users/ef/.claude/scripts/lib/자생율집계.awk (집계 엔진, 30줄)
/Users/ef/.claude/scripts/자생율기록.sh (Stop 훅용 기록기, 55줄)
~/.crownycode/자생율로그.psv (누적 로그)
- 학습DB 등록:
crownycode-brain.sh learn "자생율측정" 자생율.한선 완료(학습완료 확인)
잔여 이슈
services 스캔 시간 ~20~25초(30만+ 파일 트리) — Stop 훅에서 매번 돌리면 세션 종료가 그만큼
느려짐. 오케스트레이터가 배선 시 빈도 조절(예: N번째 Stop마다 1회) 고려 필요.
python-debt의 grep -E '\bpython3?\b'는 주석·echo 문자열도 매칭하는 단순 판별이라 소폭
과다포함(자기 자신도 후보로 잡힘). 정밀화하려면 셔뱅/
exec python3/
python3 -c 같은 실행
컨텍스트만 매칭하도록 좁혀야 함.
- html/css "생성됨/generated/산출" 마커 판별은 v1 단순 규칙(파일 상단 5줄 +
.gen. 경로)이라
실제 산출물이 마커 없이 섞여있으면 카운트됨(스펙이 명시한 "판별 불가는 카운트(정직)" 원칙대로
의도된 동작).
crownycode-brain.sh learn이 --분해 미지정 시 내부 [ cond ] && ... 관용구 때문에 학습 자체는
성공해도 프로세스 exit code가 1로 나오는 기존 버그 발견(이 작업과 무관, 별도 수리 대상으로 보고만).