크라우니 칸반 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 실패=0 → KANBAN_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행 시드 정리는 사용자/담당 세션 판단 필요(이번 임무에서 임의 삭제 안 함).