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

crowny-terminald 종단 검증 결함 4건 수리

개요

메인 세션이 curl 종단 실측으로 적발한 crowny-terminald(:9822) 결함 4건 + 우선순위 추가 2건(⑤⑥)을 수리했다. 대상은 /Users/ef/crowny-terminal/앱/한선씨/ 5개 파일(터미널데몬·기계어·감사·계통·파싱). STRICT 컴파일 0경고, 셀프테스트 36/36 → 51/51(신규 15건 추가, 회귀 0건) 유지.

무엇을 했는지

결함① [치명] 물리 제어 확인 경로가 HTTP에 없었다

  • 터미널데몬.한선POST /api/confirm/request, POST /api/confirm/reply 라우트 신설.
  • kind는 물리|쓰기만 허용(400 가드). 확인응답은 기계어.한선이 이미 "주체=사람만" 검증(포함하나(주체,"사람")!=1 → E-권한 → 라우트가 403 매핑).
  • 원격(X-Forwarded-For)에서도 확인요청/확인응답은 허용(문서13 §1 "지시·승인·관전"), 물리 실행 자체 403은 기존 /api/tools/{name}/invoke 라우트에서만 유지.
  • curl 실측: 확인요청 → 기수주체 확인응답 시도(403 거부) → 사람주체 확인응답(승인) → 물리 도구호출(OK:실행됨) 전 과정 확인.

결함② 감사재생에 내부 구분자(ᆭ) 노출

  • 감사.한선감사_보기(s) 추가(전체치환(s,"ᆭ"," · ")). 저장 포맷(append-only 원장)은 불변, 감사재생() 출력 계층에서만 적용.

결함③ 예산 API가 내부 정수 그대로 노출

  • 감사.한선감사_콤마()(천단위 콤마, % 연산자 없이 그룹카운트로 — 균형나머지 함정 회피), 감사_예산JSON블록(), 예산JSON(세션) 추가.
  • /api/budget 응답: {"session_id":..,"session":{limit_raw,limit:"80.00",spent_raw,spent,won:"₩0 / ₩80,000"},"day":{...},"policy":0}.

결함④ 도구호출 등 세션 미태깅

  • 기계어.한선세션컨텍스트설정()/조회() + _현재세션컨텍스트 전역 추가. 명령실행() 공통 꼬리에서 세션로그=="-" && 컨텍스트 있으면 주입.
  • 터미널데몬.한선/execute, /api/tools/{name}/invoke, /api/capacity/expand-*, /api/external-delegate, /api/confirm/* 라우트가 body의 선택적 "session" 필드로 컨텍스트를 걸고 처리 후 해제(단일 TCP 연결 순차 처리라 안전).

결함⑤ 재기동 복원(추가 수리)

  • 계통.한선: 계통_가동설정()이 절대치 스냅샷을 계통가동.psv에 append, 계통_복원()이 재생(텔레스코핑 합으로 중간 스냅샷 개수 무관하게 최종 정확).
  • 기계어.한선: 확인.psv 저널 + 기계어_확인복원()(카운터 최댓값도 복원).
  • 데몬_메인()이 기동 시 두 복원 함수를 호출. curl 실측: 데몬 kill → 저널에 수동 라인 주입(이전 프로세스 흉내) → 재기동 → 로그에 "계통가동 복원 1건, 확인DB 복원 2건" → confirm:1로 재승인 없이 물리 도구 재호출 성공(OK:실행됨)으로 기능 증명.

결함⑥ 일 예산 날짜 키(추가 수리)

  • 감사.한선: 전역 스칼라 _일소비 → 날짜별 DB(_일소비DB)로 교체. 날짜는 날짜.한선오늘()(체계("date +%Y-%m-%d") 경유, 에포크 수동 산술 아님)을 600초 캐시로 감쌌다(감사_오늘날짜()).

검증 결과 요약

  • STRICT 컴파일(전 5파일): 0 경고.
  • 셀프테스트: 계통10·감사10·기계어11·파싱9·데몬11 = 51/51 통과(기존 36건 회귀 0, 신규 15건).
  • curl 종단(포트 9822, 데이터 클린 상태 시작): 422→200 확정 플로우, 물리 확인 다이얼로그 전체 플로우, 기수주체 확인응답 거부(403), 원격 물리 호출 차단(403), 감사재생 세션태깅+구분자 미노출, 예산 CRW+₩ 병기, 재기동 복원 전부 실측 통과. 종료 후 포트 9822 해제 확인.

관련 파일

  • /Users/ef/crowny-terminal/앱/한선씨/터미널데몬.한선
  • /Users/ef/crowny-terminal/앱/한선씨/기계어.한선
  • /Users/ef/crowny-terminal/앱/한선씨/감사.한선
  • /Users/ef/crowny-terminal/앱/한선씨/계통.한선
  • /Users/ef/crowny-terminal/앱/한선씨/파싱.한선 (무변경 — 회귀 확인만)
  • 명세(읽기전용): /Users/ef/Downloads/크라우니터미널 패키지/문서/13,14,16-*.md

잔여 이슈 (정직 목록)

  • SSE 스트림(GET /세션/{id}/스트림) 미구현 — UI는 여전히 폴링 전제.
  • 브라우저뷰(/브라우저뷰/열기), 비저닝프레임(/비저닝/프레임) 라우트 미구현.
  • /계통/배치(계통배치 명령) 자체가 HTTP로 노출돼 있지 않음 — 1차 범위 한계로, 결함⑤ 검증에서 계통가동 저널을 수동 주입해 우회 증명. 실사용 시 이 라우트 신설 필요.
  • 위치 트리(/api/location/tree)는 정적 데모 데이터.
  • 도구별 하한(문서13 §6 "읽기 등급 도구별 하한")은 코드 미구현.
  • 확인 응답 원격 승인 자체는 허용 상태지만, 원격 여부를 감사 레코드에 별도 표시하지 않음.
  • 확인.psv/계통가동.psv 모두 append-only 무한성장 — 대규모 장기가동 시 §"문자열 65535B 캡" 함정 적용 대상(현재 스코프에서 미대응, 운영 전 샤딩 필요).