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