2026-09-10
요약 (AI 작성)
zntc v0.1.7 이 나간 날입니다. maru 활동 뷰는 옛 형식의 JSON 껍데기를 벗겨 라벨의 74.4% 가 명령이 되고(§2.2), chunk 껍데기를 벗겨 갇힌 출력 191.5MB 를 되찾았으며(§2.4), 「구조는 벗기고 글자는 안 알아본다」를 계약으로 뒀습니다(§2.3). 편집기는 줄별 폭 캐시(L2)로 접힘 토글이 문서를 다시 안 훑고(30.3ms→1.29ms), caret 이 가장자리에 붙기 전에 굴립니다(세로 5·가로 0).
모바일은 누름이 표를 지나게 하고(서버 목록 M12a·원격 세션 목록 M12b — 뜻은 «그 세션의 id»), 남은 화면을 옮기고 옛 자리를 없애 M12 를 닫았습니다(M12c). 서버 목록 줄이 머리를 덮던 것과 추천 단어가 통째로 들어가던 것도 고쳤습니다. 터미널은 kitty 를 켠 앱에서 키를 누르고 있어도 한 번만 먹던 것(repeat 은 press 다), DECRQM 이 ?1048 을 «모른다» 고 답하던 것(목록을 소스에서 뽑는다), 애니메이션이 메모리 예산을 우회하고 LRU 를 뒤집던 것을 고쳤습니다. session-host 는 target_invalid 의 진짜 이유를 남기고(자식이 자기 파일에 적는다), 새 빌드를 깔 때마다 host 가 하나씩 늘던 것을 잡았습니다 — 늦게 추가한 tag 가 필수였습니다.
커밋
ohah/maru
- fix(terminal): 애니메이션이 메모리 예산을 우회하고 LRU 를 뒤집었다
- fix(mobile): 추천 단어가 통째로 들어갔다 — 확정도 «맞춘다» (M2-f1)
- feat(app): 앱이 어느 바이너리인지 스스로 말한다
- test:
undefined세션 선언 88개를 걷어낸다 — 읽히는 축이 결정적이 된다 - test(i18n): handoff 코덱의 컴파일 진단 두 조각을 원장에 올린다
- test(session-host): preflight 판정자가 «접힌 이름까지 싣는가» 를 함께 잰다
- fix(session-host): 새 빌드를 깔 때마다 host 가 하나씩 늘던 것 — 늦게 추가한 tag 가 필수였다
- docs(agent-activity): 「구조는 벗기고 글자는 안 알아본다」를 계약이 든다 (§2.3)
- style(mobile): zig fmt — 머리 블록을 옮기며 남은 자리
- test(mobile): 머리 배경이 «실제로 나갔는지» 도 센다 — 변이 M2 (U1-f1)
- fix(mobile): 서버 목록 줄이 머리를 덮었다 — 머리를 본문 뒤로 (U1-f1)
- test(syntax): 접힘 범위의 «가장 긴 것 하나» 를 잰다 — 적대적 3회
- fix(test): 실 프로세스 스모크를 샤드 밖으로 — 테스트 하나가 늘면 터지던 자리
- test(mobile): 게이트 패턴이 접두어로 새고 있었다 (M12c)
- feat(mobile): 남은 화면을 옮기고 옛 자리를 없앤다 — M12 를 닫는다 (M12c 4/4)
- feat(mobile): 설정 화면의 누름 자리도 표를 지난다 (M12c 3/4)
- feat(mobile): 서버 편집 화면도 표를 지난다 (M12c 2/3)
- feat(mobile): 진단·호스트키·비밀번호도 표를 지난다 (M12c 1/3)
- fix(agent-activity): 벗겨서 아무것도 안 남으면 벗기지 않는다 — 적대적 3회
- feat(agent-activity): chunk 껍데기를 벗긴다 — 갇힌 출력 191.5 MB 를 되찾는다 (§2.4)
- docs(editor): 폭 캐시의 방어 둘은 판정할 수 없다 — 근거를 적는다 (적대적 3회차)
- perf(editor): 줄별 폭 캐시(L2) — 접힘 토글이 문서를 다시 안 훑는다 (30.3ms → 1.29ms)
- test(session-host): exhaust handoff logical state
- docs(session-host): define exhaustive handoff equality gate
- style(mobile): zig fmt — 함수를 지우며 남은 빈 줄
- docs(mobile): 누름을 나르는 규칙을 계약에 올린다 — 뜻은 누를 때 잡는다 (M12b)
- test(mobile): 세대가 갈려도 신원은 살아남는다 — 변이 M2 가 낸 구멍 (M12b)
- feat(mobile): 원격 세션 목록도 표를 지난다 — 뜻은 «그 세션의 id» (M12b)
- fix(mobile): 붙어 달라는 요청을 누른 그때 집는다 — iOS 만 갈려 있었다 (M12-f1)
- fix(docs): 적대적 검증 1회차가 내가 방금 넣은 M12 문장을 깼다
- docs(mobile): M11 을 여기까지로 닫고, 문서가 «없는 파일» 을 가리키던 것을 고친다
- fix(agent-activity): 갈래 근거가 세 자리에서 낡았다 — 적대적 3회
- fix(agent-activity): 갈래표가 Codex 어휘를 안다 — 28.9% 가 잘못된 칸에 있었다 (§2.1)
- fix(docs): 새 판정자가 내 이력 문장을 물었다 — 인용 말고 풀어 쓴다
- test(mobile): 계약과 코드를 짝으로 묶는다 — UiActionId (적대적 검증 9회차)
- fix(mobile): 「옛 판은 무시한다」가 아니라 «아예 안 받는다» — 구운 APK 가 말했다
- fix(docs): 계약 §3.1 이 모바일도 UiActionId 를 쓴다고 적었다 — 안 쓴다
- fix(terminal): DECRQM 이 ?1048 을 «모른다» 고 답했다 — 목록을 소스에서 뽑는다
- docs(agent): 「귀속의 유일한 잣대」가 낡았다 — 그 함수는 제품에서 안 쓰인다
- fix(agent): host 세대가 바뀌면 그 pane 을 영영 못 받았다 — pane 칸으로 귀속한다
- test(terminal): 문서가 약속했는데 판정자가 없던 갈래 셋에 그물을 단다
- fix(mobile): 취소선 행은 인용할 수 없었다 — 계획 인용 검사기
- docs(mobile): U1 의 ②는 없어진 일이었다 — 탭 줄을 U3 이 걷어냈다
- test(mobile): 히트 44 를 «잰다» — M12c 가 잴 자리를 만들었다 (U1)
- docs(native-editor): 접힘 토글 비용을 «직접 재서» 고친다 — 트리거가 울렸다
- fix(terminal): kitty 를 켠 앱에서 키를 누르고 있어도 한 번만 먹던 것 — repeat 은 press 다
- fix(editor): 접힘 범위를 «못 센 것» 은 「접을 것이 없다」가 아니다 — 실패를 보고한다
- test(mobile): 규칙의 «주인» 에게도 판정자를 준다 — 적대적 4·5회차
- test(mobile): 설정 화면 손잡이도 센다 — 적대적 3회차
- fix(mobile): 튕기는 동안 스크롤바 손잡이가 트랙 밖으로 나갔다 — 적대적 1·2회차
- docs(mobile): 실기 확인이 U1 밖에서 결함을 하나 냈다 — 첫 줄이 머리를 덮는다
- test(mobile): 되미는 쪽에는 저항이 없다 — 변이 M6 (U1 bounce)
- fix(mobile): 넘어간 «뒤» 에도 저항을 건다 — 변이 M2 가 낸 결함 (U1 bounce)
- feat(mobile): 끝에서 튕긴다 — 유계 좌표는 그대로 둔다 (U1 bounce)
- docs(mobile): 끝에서 튕기는 규칙을 먼저 적는다 — UX §5.7 (U1)
- feat(terminal): ANSI 모드 질의와 DSR-DEC 에 답한다 — 침묵이 앱을 멈추게 했다
- test(editor): 구문 접힘 승격의 «실패 갈래» 를 잰다 — 할당 실패 주입
- test(terminal): 공허하게 통과하던 kitty 판정자 둘을 훑어 고친다
- fix(input): 키를 뗄 때 매크로·앱 액션이 다시 나가 동작이 두 번 일어나던 것
- feat(editor): caret 여백 — 가장자리에 붙기 전에 굴린다 (세로 5 · 가로 0)
- test(session-host): 원격 parity 가 가상 placement 를 헛통과하고 있었다
- feat(agent): orphan 은 «가장 가까운 짝» 을 남긴다 — 엉뚱한 Term 이 덮던 자리
- fix(docs): M12-f1 의 원인을 틀리게 적었다 — 펌프가 아니라 «부르는 자리» 다
- docs(mobile): 실기 확인이 M12a 밖에서 결함을 하나 냈다 — host 가 요청을 안 집는다
- test(mobile): 손가락을 놓으면 강조도 놓는다 — 변이 M6 이 낸 구멍 (M12a)
- feat(mobile): 누름이 표를 지난다 — 서버 목록 (M12a)
- test(editor): caret 여백 판정자가 «절반 clamp 의 기준» 까지 잰다 — 적대적 3회
- fix(session-host): target_invalid 의 진짜 이유를 남긴다 — 자식이 자기 파일에 적는다
- style(agent-activity): zig fmt — 판정자 픽스처 줄바꿈
- perf(agent-activity): 입력이 명령 프로브를 삼킨다 — 중복 56.8 MB 를 안 읽는다 (적대적 3회)
- feat(agent-activity): 검색이 입력 전부를 본다 — 사각 26.2% 를 없앤다 (§2.1.1)
- fix(agent): 침묵으로 죽은 채널을 되살린다 — 스트리머는 멀쩡한데 배지만 죽던 자리
- fix(agent): 침묵으로 죽은 채널을 되살린다 — 스트리머는 멀쩡한데 배지만 죽던 자리
- fix(agent): 조용하면 스트리머를 다시 띄운다 — 좀비는 EOF 를 안 준다
- test(terminal): 부모 검증이 고아 정리 비용의 상한임을 고정한다
- fix(agent-activity): 중첩 객체의 첫 키를 값으로 집었다 — 적대적 3회
- feat(agent-activity): 옛 형식의 JSON 껍데기를 벗긴다 — 라벨의 74.4% 가 명령이 된다 (§2.2)
- feat(terminal): kitty 애니메이션 — a=f 프레임 전송·a=a 재생 제어·a=c 합성
- fix(test):
undefined세션을 걷어낸다 — 출하 체제(ReleaseFast)에서 UB 였다
ohah/zntc
- chore: changeset oxfmt 정렬
- fix(resolver): 형제 파일이 동명 디렉토리 index 를 이기도록 해석 순서 수정
- fix(wasm): VFS 번들러가 entry 의 import 를 해석하도록 listDir 구현
- chore: release v0.1.7