← 목록
기타 2026-07-29 5KB 읽기 5분

크라우니 칸반 M3 — correctness 하드닝 + 자가시험 신설

개요

임무 M3: 크라우니 칸반(/Users/ef/crowny-monitoring/칸반.한선)의 OOM은 M2(인메모리 캐시)로 이미 해결됨(부하시험 PASS). M3는 남은 correctness 결함(읽기() 대용량 절단, 파편행 배열범위초과, 자가시험 부재)을 근본 수리하고 20+ assert 자가시험을 신설.

무엇을 했는지

1) 안전 필드 접근자 신설 — 칸반필드(조각, n)

파일 맨 앞(첫 사용보다 먼저)에 순수함수로 추가:
함수 칸반필드(조각, n) {
  만약 (n >= 0 그리고 n < 길이(조각)) { 반환 원소(조각, n) }
  반환 ""
}
원소(조각,N) 고정인덱스 직접접근 전수(9곳: 칸반병합구축의 조각2/f조각/o조각/s조각, 칸반캐시재구축, 칸반이동처리 안전망, 칸반아카이브)를 이걸로 교체. 미봉책이던 길이(조각)>=9면 전체 스킵(유효 데이터도 버림) 대신, id만 있으면(파편행이어도) 존재하는 필드는 살려서 캐시에 반영 — 데이터 손실 없이 크래시 0.

2) 읽기() 65535B 하드캡 절단 방어 — 칸반상태자동아카이브체크()

crownyc 읽기()는 STR_MAX_LEN(65536B) 캡으로 큰 파일을 조용히 잘라 반환(실측: 96893B→ 47933자, 마지막 행 파편화) — 이미 잘린 문자열은 사후 복원 불가하므로 근본 방어는 "상태파일을 상한 아래로 계속 유지"뿐이다. 칸반동기화()가 실제 파싱(줄분리)을 하는 드문 경로(피드 실제 변경 시)에서만 상태파일 글자수를 점검, 45000자 임계 근접 시 /tmp/칸반경고.log에 로그 남기고 칸반아카이브(3)를 강제 호출(그래도 크면 칸반아카이브(0) 재시도). fast-path(피드 불변)에서는 호출하지 않아 M2가 없앤 "요청마다 읽기+파싱" 패턴이 되돌아오지 않는다. 칸반아카이브()는 hanseonc_high 전방참조 회피를 위해 칸반캐시재구축() 직후·칸반동기화() 정의보다 앞으로 재배치.

3) 자가시험 신설 — KANBAN_SELFTEST=1 게이트, 25개 assert

파일 맨 끝(top-level, 프로덕션 부팅엔 0오버헤드)에 추가. 칸반상태경로/칸반피드경로/ 칸반아카이브경로는 순수 전역 변수라 시험 동안 /tmp 격리경로로 바꿔치기하고 끝에 원래 실경로로 복원 + 캐시 재구축 — 실운영 데이터는 자가시험 중 1바이트도 안 건드림. 커버: 안전접근자(파편행 크래시0), 센티널 왕복(|/개행), 상태전이 합법/불법, 등급판정 4상, upsert 중복없음, 파편 상태행 재구축 데이터보존(항목2 재현), sync/move 캐시=파일 일관성, 아카이브 행수감소.

검증 결과 (전부 실측)

항목결과
모니터링.한선 전체 컴파일0에러, 68186 큐브 생성
자가시험통과=25 실패=0KANBAN_SELFTEST_ALL_PASS
부하시험(칸반부하시험.sh, 격리:24504)1500/1500 200, [ARRAY] OOM 0건, RSS 282256KB→276416KB(97%) → PASS
기능시험(격리:28993, 100행+파편행2 시드)서버로그 런타임에러 0(범위 매칭 없음), raw소켓 list=153항목(fragment 2건 포함, 데이터 무손실), move 반영 확인, /kanban 200

부수 발견(범위 밖, 수정 안 함)

  • 동시편집: 작업 중 다른 세션/훅이 칸반빠른줄분리()(버퍼기반 O(n) 줄분리, 문자열.한선
줄분리()의 O(n²) 회피)를 동시에 추가함 — 충돌 없이 병존, 컴파일/시험 전부 정상.
  • 호스트 Content-Length 버그(모니터링.한선, 미수정 — 소유범위 밖·수정금지 대상):
JSON응답()/HTML응답()Content-Length: 글자수(본문)(문자수)를 쓰는데 본문에 한글이 있으면 실제 UTF-8 바이트보다 작아 curl 등 Content-Length를 신뢰하는 클라이언트가 body를 잘라 받는다(raw 소켓으로 우회 확인 시 본문 자체는 온전함 — 서버 송신은 정상, 헤더 값만 오류). 가드레일에 이미 기록된 기지 함정과 동일 계열. 모니터링.한선은 이번 임무 소유범위 밖(수정금지).
  • data/칸반상태.psv 잔존 이슈: 작업 시작 시점에 이미 이전 부하시험의 1000행 시드
잔존(96893B)이 남아있었음(복원 누락 추정, 이번 임무 유발 아님) — 원상복구 규칙에 따라 손대지 않고 그대로 유지. 이 파일은 전부 미확인 상태라 완료-기반 아카이브 정책으로는 줄어들지 않는 구조적 한계가 있음(참고용 기록).

관련 파일

  • /Users/ef/crowny-monitoring/칸반.한선 (568줄→772줄)
  • 백업: /Users/ef/crowny-monitoring/.bak-m3-1785289176-칸반.한선,
/Users/ef/crowny-monitoring/data/.bak-m3-1785289176-칸반상태.psv
  • 학습: crownycode-learn.sh add 안전필드접근자, 읽기절단방어_자동아카이브

잔여 이슈

  • 모니터링.한선 JSON/HTML 응답의 Content-Length 한글 바이트 불일치(별도 임무 필요, 소유자 아님).
  • data/칸반상태.psv의 잔존 1000행 시드 정리는 사용자/담당 세션 판단 필요(이번 임무에서 임의 삭제 안 함).