2026-08-15
요약 (AI 작성)
두 달 가까이 별도 라인에서 굴리던 모바일 작업을 main 에 합친 날입니다(161커밋). iOS·Android 이식 가능성을 PoC 로 실측하는 데서 출발해 PoC 를 제품 구조로 옮기고(M0), draw-list 를 인스턴스 드로우 한 번으로 모으고(M1), 빌드를 build.zig 가 소유하게 한 뒤(M1.5) Android IME 를 자체 Java shim 으로 받았습니다(M2). 그 위에 셀 속성·합성 글리프·글자 상자 정렬(M4a3·M4a4), 키를 코어 인코더에 태우는 경로(M4a2), 스크롤·선택·복사·보조 키바(M4b1~M4b4), 컬러 아틀라스 이모지(M4a6)를 차례로 얹었습니다. 한글 IME 는 iOS 를 UITextInput 으로 올려 실측한 뒤 보류로 적었고, 프레임 페이싱은 vsync 세기에서 경과 시간 기준으로 바꿨습니다. 합류 뒤에도 코드 리뷰와 적대적 검증이 낸 결함을 재현해 고치는 작업이 하루 종일 이어졌습니다.
Windows 지원도 문서부터 열었습니다. 플랫폼 계약과 구현 계획을 세우고 적대적 검증 12라운드를 반영해 기본 셸을 PowerShell 로, OSC 9;9 authority 를 확정한 뒤, 절대경로 판정을 [0]=='/' 에서 떼어내고(W1.5) main.zig 가 Windows 에서 빌드·실행되게 했습니다(W2). 곁들여 테스트의 POSIX 전제를 경계에서 명시하고 PosixWalker 복제 23개를 정본 하나로 줄였습니다.
소스 컨트롤 도크는 쓰기까지 이었습니다. argv 조립과 안전 술어(P2a), 실행 경로와 교착·EPIPE 방지(P2b), 도크 스테이징 배선(P2c), 멀티라인 TextArea 층(P3a)을 순서대로 올렸고 스테이징을 낙관적으로 반영했습니다. 편집기는 N1.5 d·e 로 비교 본문에 추가·삭제 색을 얹고 세로 스크롤을 붙인 뒤 바뀐 글자만 한 겹 더 진하게 그렸으며, 그 과정에서 강조 배열의 이중 해제 셋과 200 KB 줄 하나에 12.3 MB 를 쓰던 토큰 생성을 잡았습니다. session-host 는 CR2e generation slot 과 재접속 reducer 를 놓고 CR3 세대 교체 브리지·retiring 정산 순서까지 이었습니다.
커밋
ohah/maru
- feat(session-host): add reconnect reducer and sealing substrate
- feat(session-host): add CR2e generation slot substrate
- feat(session-host): add CR2e prepared reconnect owner
- refactor(session-host): centralize CR2e generation access
- feat(terminal-core): OSC 9;9(ConEmu cwd)을 받아 cwd 축에 태운다
- ci(mobile): 계약 판정자를 ubuntu 게이트에 건다
- feat(session-host): reconnect drain coordinator를 설치한다
- docs(windows): 모바일 합류를 반영해 브랜치 선례를 고친다
- docs(windows): 파일 권한 항목의 오류를 고치고 W2를 푼다
- docs(windows): 누락된 미결정 1건과 실측 1건을 채운다
- docs(windows): OSC 9;9 authority를 C로 확정하고 위험 범위를 못박는다
- docs(windows): OSC 9;9 authority 결정을 §3.2a로 전부 기록한다
- docs(windows): Windows 기본 셸을 PowerShell로 확정한다
- docs(windows): 셸 선택과 기본값 결정 규칙을 §3.1a로 세운다
- docs(windows): 적대적 검증 라운드 3~12 결과를 반영한다
- docs(windows): 재검증으로 드러난 정정 6건을 계약에 반영한다
- docs(windows): Windows 플랫폼 계약과 구현 계획을 세운다
- feat(session-host): e3c3 close event receipt를 봉인
- docs(mobile): 적대적 검증 잔여 둘 — 화면과 스키마의 어긋남, 색인 누락
- docs(mobile): 적대적 검증을 더 돌려 여섯을 더 고친다
- docs(mobile): 적대적 검증이 낸 다섯을 고친다
- docs(mobile): 모바일 config 계약을 세운다 — 스키마·자리·읽고 쓰는 길
- feat(session-host): add CR3b R2a detach placeholder
- test(file-panel): 소스 컨트롤 도크에 Chrome Lab 시나리오와 골든 셋을 둔다
- feat(file-panel): 스테이징을 낙관적으로 반영한다 (§7)
- fix(mobile): 리뷰가 낸 여섯을 재현해 고치고 하나를 반증한다
- test(mobile): 키 미러가 "알아본다" 대신 "어디로 가는가" 를 재게 한다
- test(chrome): Session Dock 골든 둘을 갱신한다 — 정렬 토글의 링이 사라졌다
- fix(tests): main 리베이스 뒤 경계 digest 원장을 다시 맞춘다
- fix(file-panel): 오른쪽 자리를 침범하던 폭 예산 셋을 고친다 (적대적 검증)
- fix(file-panel): 일괄 동작 버튼이 개수 배지 위로 올라오던 것을 고친다
- fix(chrome): 색 없는 테두리가 배경을 뚫던 것을 두 층에서 고친다
- fix(file-panel): 행 동작 버튼이 상태 문자와 같은 픽셀에 겹치던 것을 고친다
- feat(file-panel): 도크에서 스테이징을 배선한다 (P2c)
- fix(android): 창이 부서져도 이모지가 남게 컬러 아틀라스 원본을 든다
- test(session-host): reconnect RSS 측정 경계를 고정한다
- feat(session-host): 제품 generation slot 저장소를 활성화한다
- fix(tests): main 리베이스 후 digest 원장을 다시 맞춘다
- test(editor): 분할 pane 라우팅과 메타 안정성을 덮는다
- fix(editor): pane 밖 휠이 조용히 사라졌다 — 활성 편집기가 폴백에서도 소유한다
- fix(editor): 훅이 아무 일도 안 하고 있었다 — init이 아니라 deinit에서 읽고 있었다
- fix(editor): 코드 리뷰 12건을 고치고, 안 덮여 있던 두 경로에 테스트를 붙인다
- fix(chrome): 리베이스로 들어온 새 토큰 픽스처에 비교 밴드 입력을 채운다
- fix(tests): 리베이스 충돌 뒤 digest 원장을 다시 맞춘다
- test(editor): 긴 비교를 스크롤한 캡처를 골든에 넣는다 — 그 과정에서 둘을 고쳤다
- feat(editor): 세로 스크롤 — 긴 비교와 긴 문서를 끝까지 읽는다
- feat(editor): N1.5 d — 비교 본문에 추가·삭제 색을 얹는다
- test(observability): incident 테스트를 OS 이름이 아니라 전제로 skip한다
- refactor(tests): PosixWalker 복제 23개를 정본 1개 + 복제 3개로 줄인다
- docs(layering): non-macOS 호스트 실측을 §4.1로 기록한다
- build: L4 macOS 테스트 배선을 macOS 호스트로 게이트한다
- test(terminal): POSIX 경로·시계 전제를 테스트 경계에서 명시한다
- test(boundary): 소스 스캐너가 보는 walker 경로를 POSIX로 정규화한다
- fix(file-panel): L2가 경로 구분자를 만들 때 항상 POSIX를 쓴다
- fix(tests): 테스트 러너의 Windows 전용 컴파일 실패를 고친다
- feat(session-host): CR3b R2c current 세대 게시 추가
- feat(session-host): retired client 회수 권위를 추가한다
- feat(session-host): CR3b R2b cleanup handle 추가
- feat(windows): main.zig가 Windows에서 빌드·실행되게 한다
- fix(editor): §3.8 문자가 있는 줄에서 열이 두 곳에서 틀렸다 — 강조도, 탭도
- test(editor): 비교 계산 경로 전체에 할당 실패를 주입한다 — 단계 사이는 아직 안 봤었다
- perf(editor): 접을 줄의 토큰을 끝까지 만들고 있었다 — 200 KB 줄 하나에 12.3 MB
- fix(editor): 열 계산의 두 계약이 말로만 있었다 — 하나는 스스로를 뒤집고 있었다
- test(editor): 세 번째 이중 해제에도 이제 그것을 지키는 테스트가 있다
- fix(editor): 파일 열기에도 같은 이중 해제가 있었다 — 세 번째, 그래서 규칙으로 적는다
- fix(editor): 같은 이중 해제가 한 층 위에도 있었다 — materialize
- fix(editor): 강조 배열의 주인이 둘이었다 — 할당 실패 주입이 이중 해제를 잡았다
- test(editor): 표시 글자가 같으면 강조가 없다 — 끝 개행만 사라진 줄
- test(editor): 강조가 스크롤을 따라가는지 고정한다
- test(editor): 밴드가 그릴 경로를 이음매로 꺼낸다 — 렌더 안에 있으면 되돌려도 안 깨진다
- refactor(editor): breadcrumb 루트 선택을 순수 함수로 옮긴다 — 그 규칙이 안 덮여 있었다
- feat(editor): 헤더 breadcrumb를 저장소 루트 기준으로 보인다
- fix(editor): 편집기 본문이 헤더 밴드를 덮고 있었다 + 문서 안 구조(심볼) 축 계약
- refactor(editor): 열 계산 규칙을 한 곳으로 모으고, 구조 판단을 기록한다
- perf(editor): 강조 열 계산에 화면 상한을 둔다
- fix(editor): 가로 클리핑을 되돌린다 — 뮤턴트가 커밋에 섞여 있었다
- test(editor): 강조의 두 경계를 고정한다 — 저장소 부족·가로 스크롤
- perf(editor): 문자 강조 열 계산을 줄당 한 번 훑기로 바꾼다
- feat(editor): N1.5 e — 바뀐 글자만 한 겹 더 진하게
- feat(editor): N1.5 e — 짝이 된 줄 안의 문자 차이를 L2에 만든다
- feat(session-host): CR3c 세대 교체 브리지를 추가한다
- fix(file-panel): ↑↓를 바이트가 아니라 표시 열로 움직인다
- fix(file-panel): 개수 배지는 원래대로 둥글게 두고 fmt를 맞춘다
- feat(file-panel): 멀티라인 TextArea 층과 목록 각진 모서리 (P3a)
- refactor(chrome): visual_map을 chrome/ui로 승격한다 (커밋 상자가 두 번째 소비자)
- fix(windows): 적대적 검증이 W2에서 찾은 것을 닫는다 — macOS error set 수정
- fix(windows): 적대적 검증이 W2에서 찾은 것을 닫는다
- feat(session-host): order retiring generation reclaim
- test(session-host): reconnect resident base를 고정한다
- docs(mobile): host 와 코어 사이의 글자 경계 계약을 적는다
- fix(mobile): 클립보드 경로에서 실패할 수 있는 변환을 없앤다
- fix(mobile): 코드 리뷰가 낸 상위 셋을 재현하고 고친다
- fix(mobile): main 이 늘린 테마 입력 셋을 모바일도 채운다
- fix(mobile): 설정 화면 뒤에서 키바 관성이 돌던 것을 막는다
- fix(mobile): 안 보내는 키가 조합을 지우고, 관성이 뒤에서 돌던 것을 막는다
- fix(mobile): 설정 화면에서 친 글자가 뒤의 셸로 새던 것을 막는다
- fix(mobile): 팝업이 조용히 잘리던 것을 막는다
- refactor(mobile): 아이콘 순서를 검사 대신 구조로 못박는다
- refactor(mobile): 아이콘 슬롯 번호를 개수에서 파생시킨다
- fix(mobile): chrome 이모지도 본문과 같은 폭 규칙을 따르게 테스트를 고친다
- test(mobile): 설정 화면 형태를 확정하고 포인터 소유를 계약으로 못박는다
- fix(mobile): 아이콘 줄이 20px 왼쪽으로 치우친 것을 고친다
- feat(mobile): 하단 아이콘을 24 로 키운다
- feat(mobile): 하단 바를 44 로 올리고 빈 자리 채우개를 지운다
- docs(mobile): 리뷰 수정이 드러낸 셋을 사실대로 적는다
- fix(mobile): 코드 리뷰가 낸 일곱을 고친다
- fix(mobile): 하단에 잘린 행이 삐져나오던 것과 스크롤바 부재를 고친다
- feat(mobile): 설정 목록을 55줄로 채우고 섹션 헤더를 붙인다
- feat(mobile): 설정 화면 PoC — 라우터로 밀고 44 로 세운다
- docs(mobile): 계약이 시계까지 같으라고 읽히던 것을 표본으로 좁힌다
- fix(mobile): 페이싱 표본을 헤더로 모으고 iOS 에도 워밍업을 준다
- docs(mobile): 주석에 남은 옛 PASS 창 숫자를 헤더 참조로 바꾼다
- fix(mobile): 주기 정책을 헤더로 모으고 45Hz 패널의 페이싱 소멸을 막는다
- fix(mobile): 페이싱 교체가 남긴 죽은 필드를 걷고 계약에 판정자를 붙인다
- fix(ios): 주기 상한 해제를 번들에 미리 박는다
- fix(mobile): Android 프레임 주기를 vsync 세기에서 경과 시간으로 바꾼다
- fix(mobile): copy 를 상시로 바꾸며 죽은 판정 둘을 걷어낸다
- docs(mobile): U 축이 어디서 막혔는지와 판정자를 적는다
- docs(mobile): 키바 계약을 만져 본 결과대로 고친다
- fix(mobile): 키바를 만져 보며 드러난 여섯을 고친다
- feat(mobile): 키바 방향키를 SVG 합성 아이콘으로 바꾼다
- fix(mobile):
<>를 다시 신호로 되돌린다 — 누르는 것이 아니다 - fix(mobile):
<>를 누를 수 있게 하고 끝에 남던 빈 자리를 없앤다 - fix(mobile): 키바 적대적 검증 5회에서 나온 셋을 고친다
- feat(mobile): 보조 키바를 손가락 크기로 키우고 가로로 스크롤한다
- fix(mobile): 키보드가 덮는 만큼 레이아웃을 줄여 보조 키바를 살린다
- docs(mobile): 앱으로서의 UX 를 화면·전환·비목표로 정한다
- fix(mobile): 이모지 폭을 데스크톱 기본과 맞춰 반쪽 하트를 없앤다
- feat(mobile): host 가 클러스터를 문자열 하나로 이어 굽는다
- feat(mobile): 브리지가 클러스터를 열째로 host 에 넘긴다
- fix(mobile): 아틀라스가 차면 가장 안 쓰인 자리를 내준다
- test(mobile): 아틀라스가 차면 글자가 조용히 사라지는 것을 재현한다
- fix(mobile): 보이지 않는 글자를 굽느라 아틀라스 슬롯을 먹지 않는다
- fix(mobile): Android 도 BMP 밖 글자를 서러게이트 쌍으로 굽는다
- docs(mobile): 이모지에 남은 구멍 셋을 문서에 남긴다
- fix(mobile): 번들 폰트에 없는 기호가 영구 공백이던 것을 채운다
- docs(mobile): 문서 안의 모순 하나와 빠진 ABI 두 줄을 메운다
- docs(mobile): 계약 문서가 구현보다 뒤처진 두 자리를 맞춘다
- fix(mobile): 컬러 아틀라스 디스크립터를 실제로 쓴다(Android 화면이 안 나오던 원인)
- docs(mobile): M4a6 이모지를 완료로 옮긴다
- feat(mobile): 이모지를 두 host 가 컬러로 굽고 그린다 (M4a6 슬라이스 2)
- feat(mobile): 이모지를 컬러 아틀라스로 보내는 배관 (M4a6 슬라이스 1)
- fix(mobile): 조합 중 문자열이 통째로 사라지던 절단을 고친다
- test(mobile): ABI 타입 판정자 + 복사 경계 + 스크롤백 어긋남을 좁힌다
- fix(mobile): copy 가 나타날 때 다른 키가 밀리던 것 + 테스트 구멍 셋
- feat(mobile): 복사 — 키바 옆 copy 로 잡은 것을 꺼낸다 (M4b3)
- fix(mobile): 배경으로 나갈 때 누르고 있던 손가락을 정리한다
- test(mobile): 새 판정이 맞는 이유로 통과하는지 확인하고 구멍 셋을 메운다
- fix(mobile): 가만히 누르면 영영 안 잡히던 것 + iOS 미검증 판정이 틀렸다
- feat(mobile): iOS 도 원시 터치를 코어에 넘긴다
- fix(mobile): 선택하는 내내 화면이 흐르고 있었다
- test(mobile): 보낸 값이 아니라 코어가 답하는 값을 본다
- fix(mobile): 길게 누름 지연을 두 플랫폼 다 OS 값으로 받는다
- fix(mobile): 길게 누름 지연을 OS 값으로 받는다 + 개행 계약을 문서에 올린다
- docs(mobile): 포인터·선택 규율을 계약에 적는다
- fix(mobile): 길게 눌러 잡은 단어가 한 칸씩 줄고 있었다
- feat(mobile): 선택 — 길게 누르면 잡고 끌면 스크롤이다 (M4a 포인터 ABI + M4b2)
- fix(mobile): 키바 자리 플래그가 거짓말할 수 있었다
- fix(mobile): 글자가 이웃 칸의 잉크를 딸고 오던 것을 막는다
- feat(mobile): 보조 키바 — 소프트 키보드에 없는 키를 만든다 (M4b4)
- test(mobile): 스크롤 영상을 하네스가 찍는다 + 설치 실패를 잡는다
- test(mobile): 스크롤 캡쳐 파일명을 플랫폼별로 가른다
- feat(mobile): 스크롤 — 화면 밖으로 나간 출력을 볼 수 있게 한다 (M4b1)
- docs(mobile): 이모지를 백로그로 두고 M4b 를 먼저 한다
- fix(mobile): 파이프라인 실패 뒤에도 렌더 루프를 걸고 있었다
- test(mobile): IME 끄기 선언을 판정자가 지킨다
- fix(mobile): iOS 에서 셸 따옴표도 -- 플래그도 못 치고 있었다
- docs(mobile): 재쌓기가 만든 M4a5 중복 행을 없앤다
- test(mobile): 이름이 주장하는 것을 안 보던 커서 테스트를 바로잡는다
- docs(mobile): 계약 문서가 자기 자신과 모순되고 있었다
- test(mobile): 커서 확인을 하네스로 옮긴다 — 스크래치에 있으면 재현이 아니다
- fix(mobile): 적대적 검증 — 내부 필드를 읽고 있었고 2셀 글자를 반만 덮었다
- docs(mobile): Android 하드웨어 키보드가 미검증인 이유를 적는다
- test(mobile): 커서 세 모양을 화면으로 확인하고, 문서 대조를 스크립트로 남긴다
- feat(mobile): 커서를 그린다 — 이후 슬라이스 전부의 검증 선행 조건
- docs(mobile): 한글 IME 를 보류로 적고 이유를 남긴다(사용자 결정)
- feat(mobile): iOS 를 UITextInput 으로 올리고, 한글이 왜 그래도 안 되는지 실측한다
- test(mobile): 조합 경로 중 우리가 소유한 절반을 계약으로 고정한다
- fix(mobile): 적대적 검증 — 소비처 없는 ABI 와 갈리는 Enter
- feat(mobile): M4a2 (2/2) — iOS 도 키를 코어의 인코더에 태운다
- feat(mobile): M4a2 (1/2) — 키를 코어의 인코더에 태운다 (Android)
- fix(mobile): 아이콘을 codepoint 리터럴이 아니라 이름으로 부른다
- feat(mobile): M4a3 (2/2) — 합성 글리프를 폰트보다 먼저 태운다
- fix(mobile): 윗줄을 어센더 위로 붙인다 — 밑줄과 기준이 달랐다
- fix(mobile): 단일 밑줄을 베이스라인 바로 아래로 올린다
- feat(mobile): M4a3 (1/2) — 글자 상자를 격자 칸에 맞춘다
- style(mobile): zig fmt 적용
- fix(mobile): 밑줄이 글자에서 떨어져 줄 사이에 떠 있었다
- test(mobile): 만들고 안 봤던 것들을 화면과 기기에서 확인한다
- fix(mobile): 용량 0 이 에뮬레이터를 죽이고 있었다 — "환경 문제" 진단이 틀렸다
- feat(mobile): M4a4 — 셀 속성을 화면까지 가져온다(배경·반전·밑줄·굵기)
- docs(mobile): 문서가 코드와 맞는지 주장 단위로 대조하고 어긋난 넷을 고친다
- fix(mobile): 캡처를 리포에서 빼고, 셀 속성이 전경색 하나뿐인 것을 찾았다
- docs(mobile): 모바일 config 는 데스크톱과 따로 둔다(사용자 확정)
- fix(mobile): chrome/renderer·config 전수 대조 — 합성 글리프를 아예 안 타고 있었다
- fix(mobile): 코어 API 109개를 전수 대조했다 — 셸 이벤트가 굳고 키는 인코더를 안 탄다
- fix(mobile): 코어가 만든 답을 아무도 안 치웠다 — 반환값도 거짓말을 했다
- fix(mobile): 꽉 찼을 때를 겨눴다 — 상한을 host 가 아니라 코어가 답한다
- fix(mobile): 오래 사는 상태를 겨눴더니 앱을 죽이는 결함 셋이 나왔다
- fix(mobile): 크기가 바뀌면 코어를 resize 한다 — 다시 만들지 않는다
- perf(mobile): 글리프 굽기를 배치당 한 번으로 모은다
- fix(mobile): Android inset 을 재생성 때 다시 읽고, 실패하면 이전 값을 지킨다
- fix(mobile): iOS 도 자기 프레임 주기를 확인한다
- fix(mobile): 아틀라스 덤프를 요청할 때만 쓴다
- fix(mobile): 오류를 실제로 관측한다 — 계약 §5 가 약속만 하고 있었다
- fix(mobile): iOS 가 배경에서 그리기를 멈춘다 + 생명주기를 계약으로 세운다
- fix(mobile): 새 네이티브 스레드가 항상 vsync 체인을 다시 건다
- fix(mobile): 페이싱 계측 앱이 끝나면 물러난다
- fix(mobile): choreographer 체인이 왕복마다 늘어나던 것을 막는다
- fix(mobile): 30Hz 를 처음부터 적용한다 — 계측이 제품 동작을 바꾸던 것을 끊는다
- docs(mobile): 앱 수준 공백 넷을 계획에 넣는다 (M13~M16)
- docs(mobile): 포인터를 누가 해석하는지 계약과 계획에 적는다
- docs(mobile): 기획 공백을 계획에 넣는다 — 이행 누락 셋 포함
- fix(mobile): 온디맨드 글리프 래스터도 asset 폰트를 쓴다
- docs(mobile): '조용히 실패하지 않는다' 를 계약 절로 세운다
- fix(mobile): 코어 write 실패를 삼키지 않는다
- fix(mobile): 조용한 실패 둘을 없앤다 — 코어 init 실패와 preedit UTF-8 절단
- fix(mobile): quad 버퍼 넘침 알림을 한곳으로 모은다
- fix(mobile): 아틀라스 용량을 코어가 소유한다 — 등록부 256 vs 슬롯 512 불일치
- refactor(mobile): 미스 목록을 역순으로 훑는다 — 스냅샷이 만든 중복을 없앤다
- docs(mobile): 리뷰 수정으로 바뀐 사실을 계약·ABI·하네스에 싣는다
- docs(mobile): 검증 매트릭스에 모바일 행을 넣는다
- fix(mobile): 코드 리뷰가 낸 제품 경로 결함 열셋을 고친다
- docs: 라벨을 mobile·ios·android 로 가르고 기능 축 규칙을 적는다
- docs(mobile): 라벨 목록에 mobile 영역을 넣는다
- docs(mobile): 계획 표의 빈 번호(M7)가 무엇이었는지 남긴다 (9라운드)
- docs(mobile): 커밋된 그림마다 무엇의 증거인지 적는다 (8라운드)
- fix(mobile): iOS 에서 소프트 키보드를 막던 것을 되돌린다 (7라운드)
- docs(mobile): 잘못된 절 참조를 고친다 (6라운드)
- docs(mobile): 제품 코드가 자신을 PoC 라 부르던 것과 멈추는 모드를 바로잡는다 (5라운드)
- refactor(mobile): 아틀라스 셀 기하를 헤더 하나로 모은다 (5라운드 검증)
- docs: 모바일 계약을 인덱스와 이식성 문서에 잇는다 (4라운드 검증)
- chore(mobile): 3라운드 검증 — 규칙 위반 산출물과 재현 불가 그림을 고친다
- refactor(mobile): 2라운드 검증 — 조사용 잔재와 도달 불가 폴백을 걷어낸다
- docs(mobile): 적대적 검증으로 나온 문서↔코드 어긋남 일곱 건을 고친다
- docs(mobile): 두 플랫폼 다 원격 전용으로 확정하고 컨트롤 플레인 충돌을 적는다
- feat(mobile): Android IME 를 자체 Java shim 으로 받는다 (M2)
- build(mobile): 모바일 타깃을 build.zig 가 소유한다 (M1.5)
- perf(mobile): draw-list 를 인스턴스 드로우 한 번으로 그린다 (M1)
- refactor(mobile): PoC 를 제품 구조로 옮기고 계약을 문서로 세운다 (M0)
- feat(mobile): Android 도 아틀라스를 그때그때 키운다
- feat(mobile): Android 터치를 붙이고 두 플랫폼의 셀 판정을 대조한다
- feat(mobile): idb 로 iOS 입력·터치를 확인하고 아틀라스를 자라게 한다
- feat(mobile): 동봉 폰트(Jetendard)로 통일하고 남는 픽셀 차이를 잰다
- feat(mobile): 본문을 진짜 터미널 코어로 바꾸고 남은 미확인을 실측한다
- feat(mobile): present 페이싱을 두 플랫폼 모두 실측으로 판정한다
- feat(mobile): Android 도 에뮬레이터 화면에 띄운다 (NativeActivity + swapchain)
- ci: draft PR 에서 실행 job 을 건너뛴다
- fix(mobile): 자간·종횡비를 폰트 metric 으로 맞추고 레이아웃을 반응형으로
- feat(mobile): 한글·영어 글리프와 SVG 아이콘을 양쪽에서 그린다
- feat(mobile): 실제 chrome 컴포넌트를 iOS·Android 양쪽에서 그린다
- feat(mobile): 여섯 기능을 Metal·Vulkan 양쪽에서 실측하고 ReleaseSafe 를 살린다
- feat(mobile): iOS·Android 이식 가능성을 PoC 로 실측한다
- fix(tests): 경계 digest 원장을 갱신한다 — P2b 쓰기 실행 경로가 git_backend를 건드렸다
- fix(file-panel): 쓰기 실행 경로의 교착·EPIPE·stdin 상속을 막는다 (적대적 검증)
- feat(file-panel): 소스 컨트롤 쓰기 실행 경로 (P2b)
- feat(file-panel): 소스 컨트롤 쓰기 argv 조립과 안전 술어 (P2a)
- feat(session-host): reconnect generation executor를 결속한다
- feat(session-host): reconnect admission을 stable runtime에 결속한다
- feat(session-host): reconnect admission 예산 정책을 고정한다
- fix(tests): main 리베이스 뒤 ThemeColors에 diff 색 둘을 채운다
- docs(file-panel): 커밋 메시지 상자의 텍스트 모델을 정한다 (P3 첫 결정)
- fix(file-panel): 탭 칸을 카드가 아니라 컨테이너로 둬 탭 줄 divider를 살린다
- fix(file-panel): draw 버퍼 예산을 방출하는 쪽이 문자열로 직접 세게 한다
- fix(file-panel): 소스 컨트롤 도크 draw 예산이 모자라 화면이 통째로 비던 것을 고친다
- refactor(file-panel): 탭 칸 나누기를 view에서 tree로 옮긴다
- fix(file-panel): 탭 줄을 3등분해 좌우로 꽉 채운다
- feat(file-panel): 소스 컨트롤 도크에 탭 줄을 붙인다 (P1 마무리)
- feat(session-host): e3c2 direct release receipt 경계를 봉인
- fix(windows): 적대적 검증이 내 수정에서 찾은 3건을 닫는다
- fix(windows): 코드 리뷰가 잡은 회귀와 미변환 가드를 닫는다
- feat(windows): 절대경로 판정을
[0]=='/'에서 떼어낸다
ohah/ohah.github.io
- fix(docs): 빌드를 깨뜨리는 CRD 플레이스홀더 2건 제거
- docs(today-commit): 2026-07-07~08-14 누락일 백필 + 요약 작성
- docs: 오늘의 커밋 목차 누락분 보강 + 월간 오픈소스 사이드바 기본 접힘
- fix: HEARTBEAT.md 에 새어 들어간 태그 제거
- chore: 루트 크론 산출물 75개 제거 + 깨진 워크플로·설정 정리
- fix(ci): 배포를 막던 lint 실패 해소 — .gitignore 복원 + 깨진 스크립트 제거
- chore: blog-crd-write 크론 산출물 제거 + node_modules 추적 해제