수정 2026-08-29
v1.36.175
2026-08-29
핵심 변경
T-0095 false-claim 감사를 199개 회귀 프로브로 고정했습니다. round-history와 release cadence는 CLI·프로젝트 하네스·저장소 태그 버전 및 하네스 판독 상태의 출처를 분리하고 기존 currentVersion 별칭에 leerness_cli 범위를 명시합니다. observation-only로 명시 분류한 about·identity·status·commands·install-safety·capabilities·round-history·milestones·pulse·release cadence와 MCP 서버 시작은 레거시 .harness/를 마이그레이션하거나 사용량 텔레메트리를 쓰지 않습니다. 읽기 전용 MCP 도구도 서버의 우연한 cwd와 명시 대상을 보존합니다. 이 계약은 상위 프로세스의 LEERNESS_INTERNAL까지 명시적으로 제거한 격리 환경에서 canonical 대상의 실제 usage 파일로 검증하며, 쓰기 MCP 호출은 대상 프로젝트에만 계속 귀속됩니다. status는 선택된 .harness/ 또는 .leerness/를 한 번만 해석해 실제 버전·누락 경로·workspaceDir을 보고합니다. .harness/·.leerness/ 충돌이나 잘못된 workspace override는 unreadable 성공으로 삼키지 않고 정확한 workspace_dir_* 오류로 종료하며, pulse/handoff 집계는 workspace 출처 오류를 구조화해 노출하면서 독립적으로 측정한 Git 라운드 수를 보존합니다. Git 누락·spawn 예외·timeout·signal·nonzero exit이면 round-history·milestones·release cadence는 git_history_unavailable로 실패하고 pulse/handoff/health/session-close는 roundCount:null, milestone의 totalRounds/reachedCount/reached/avgRoundsPerDay:null, recentChanges:null과 recentChangesState/recentChangesError를 보존해 R0/빈 이력으로 위장하지 않습니다. Git 측정 성공 시에는 기존 recentChanges 배열 계약을 그대로 유지하고, latestTags[].date의 전체 타임스탬프 계약도 보존하면서 별도 dateOnly를 제공합니다. 예외·timeout·signal·nonzero 네 시나리오는 일곱 공개 표면 전부에서 각각 실행합니다. cadence는 --path > positional > cwd 단일 우선순위를 검증과 실행에 함께 쓰고, 태그 간격이 없으면 healthy가 아니라 insufficient-data로 판정을 보류합니다. E2E/적대 프로브의 Git 픽스처도 공용 gitSpawn을 사용해 상위 셸의 외부 저장소·index·일회성 config 주입을 제거하며, persistent global/system Git config도 빈 임시 파일로 격리해 외부 hooksPath가 픽스처에서 실행되지 않게 합니다.
Git tag와 recentChanges 레코드는 full refs/tags/vX.Y.Z와 ref 이름에 금지된 NUL로 구분하고 실제 달력·시간·ISO 시간대 한계(±14:00)를 만족할 때만 반영합니다. lookalike/prerelease/짧은 ref는 최근 변경에도 들어가지 않습니다. HARNESS_VERSION도 canonical/legacy 전체 문자열만 허용하며 leerness@X+plus@Y는 round-history/status/handoff 모두 설치 버전 X를 보고합니다. 잘못된 버전 표식과 사람용·기계용 진단값은 CR/LF뿐 아니라 C0/C1·ESC·DEL·Unicode U+2028/U+2029를 한 줄로 안전화합니다. memory는 빠진 하위명령과 잘못된 직접·중첩 하위명령을 구분하고 실제 토큰 및 실행 가능한 선택지를 보고합니다. preview list/show/serve는 손상 JSON·무효 형상·판독 실패를 각각 store_corrupt/store_invalid/store_unreadable로 보고하고 원본을 보존합니다. preview 스키마는 중첩 history·features·contract, 상태 enum, reserved output key, ID 고유성까지 쓰기 전에 검증합니다. preview add --mockup도 읽기/승인/서빙과 동일한 realpath 검사를 사용해 바깥 junction/symlink를 저장 전에 거부하고 절대 in-root 입력은 이식 가능한 상대경로로 정규화합니다. ..mockup.html 같은 정상 파일명과 안쪽을 가리키는 입력 링크는 허용하지만, 생성·임시·정리 출력은 경로 조상 어느 곳의 링크도 허용하지 않아 .leerness/previews junction을 통한 프로젝트 밖 쓰기/재귀 삭제를 막습니다. 비정규 preview ID와 저장된 절대·상위·바깥 링크·누락 mockupPath는 원본 바이트를 보존한 채 거부하며, 저장 직전 outgoing 형상도 다시 검증합니다. 저장된 title/design/features/history와 오류 토큰의 모든 터미널 제어문자를 중립화합니다. update/self check의 오프라인 unknown 판정과 plan init positional 경로 수정은 기존 회귀로 재확인했습니다.
preview의 생략된 동작은 읽기 전용 list 별칭으로만 처리하고, 승인 저장소의 누락·알 수 없는 status는 더 이상 "대기 0건"으로 축소하지 않습니다. 단일·MCP·--include·--all-apps handoff의 JSON/compact/full 출력, session close, dashboard JSON/HTML이 모두 known/count/code 출처를 보존합니다. 다중 프로젝트에서는 집계와 각 프로젝트를 따로 보고하며, dashboard도 상태 확인 실패를 "미리보기 없음"으로 표시하지 않습니다. 손상·정상 빈 목록·대기 1건 계약은 실제 _apps 워크스페이스 양쪽 수집 모드에서 검증했고, 최종 외부 Codex 검토는 P0/P1/P2 모두 0이었습니다.