2026-09-23
한국 시간(KST) 기준으로 하루를 나눴습니다. 커밋은 커미터 시각(committer date), PR은 생성·병합 시각으로 분류했습니다. 조회: 2026-10-06 KST. 공개 저장소에서 조회한 활동만 포함합니다.
요약 (AI 작성)
maru 편집기는 크래시가 삼킨 편집을 조용히 되살리는 U4b(#3866)를 병합하고, 이름 없는 문서를 내용과 함께 복원하는 U4c(#3869)와 파일 신원을 잃은 문서를 이름 없는 문서로 되살리는 U4d(#3871)로 이름 없는 문서 계획을 닫았습니다. LSP 쪽은 서버의 documentSymbol 목록으로 심볼 피커와 밴드를 세우는 심볼 2층(#3872), caret 아래 심볼의 다른 자리를 강조하는 같은 낱말 강조(#3876), selectionRange와 tree-sitter를 쓰는 구조 기반 선택 확장과 축소(#3895)가 들어왔습니다. symbolKind 값이 JSON 문자열로 나가 tsgo가 initialize를 거부하던 문제와, 낱말 끝 바로 뒤 caret에서 강조가 뜨지 않던 문제도 고쳤습니다.
워크스페이스는 재부팅 뒤 부활 계약을 정하고(#3887), 재부팅이 확인되면 터미널을 저장된 작업 디렉터리에서 새 셸로 띄우며(#3891), 에이전트 대화를 기록된 권한 모드와 모델 그대로 원래 칸에서 이어가게 했습니다(#3894). 성능 쪽은 셰이핑 중 폰트를 프레임마다 다시 만들지 않기, 같은 프레임 안 hostname 재사용, 이벤트가 없음을 확인하는 드레인 생략, 할 일이 없는 조용한 owner 펌프 생략이 들어갔습니다. 각 커밋의 CPU 수치는 활성 32세션 실험 조건의 개별 결과이며 합산하지 않습니다.
session-host는 6주간 CI 밖에서 실패하던 fail-stop 판정, 피어 join 전에 완료 여부를 읽던 경쟁, ReleaseFast에서만 SEGV로 드러난 픽스처 수명 문제를 고치고, CI가 돌리지 않던 격리 검증을 test-session-host에 묶었습니다. 이 밖에 split으로 함께 보이는 비활성 pane의 kitty 이미지 그리기(#3883), 끊긴 파싱 뒤 문서가 바뀌면 처음부터 다시 파싱해 백업 복원 때 거짓 구문 오류가 서던 문제 수정(#3886), 저장소가 아닌 폴더의 원격 감시 문구 수정이 있었습니다. 웹 OSR 백엔드의 계획과 첫 구현을 담은 #3867과 IME 후보 창 캡처 PR #3880은 이날 열렸고 아직 병합되지 않았습니다.
hwpjs는 오전까지 EMF 3차 베지어와 Path 도형을 장치 공간에서 평탄화하고 경계 폴리라인·마커·대시 지점과 호·파이 경계를 다듬은 뒤, 오후부터 HWPX로 넘어가 ZIP 항목 읽기, 매니페스트 관계, 보호 문서 구조, 헤더 리소스 ID와 섹션 서식·글꼴·목록 참조, 바이너리 참조, 차트 참조와 수식·값 텍스트 검사를 추가했습니다. zntc는 라벨 붙은 for-await, 라벨이 겹치는 자리의 yield 중복 실행, computed key와 for 헤더의 yield 추출, 클래스 computed 키와 필드 변환, for-await 반복별 바인딩, es5 generator의 for-of 조기 종료 시 iterator 닫기, 객체 리터럴 메서드의 super, using 변환을 고쳤고, 번들러 pre-pass가 헬퍼 정의를 빠뜨리던 문제도 수정했습니다.
공개 커밋 79개, 해당일 생성 또는 병합된 PR 43개를 정리했습니다. PR 생성 41개·병합 40개는 같은 PR이 양쪽에 포함될 수 있습니다.
커밋
ohah/hwpjs
- feat(hwpx): decode chart Xstring values
- feat(hwpx): inspect chart formula and value text
- feat(hwpx): validate chart formula references
- feat(hwpx): validate chart point data structure
- feat(hwpx): validate chart references and XML
- feat(hwpx): link binary references to manifest
- feat(hwpx): validate list definition references
- feat(hwpx): validate language font references
- feat(hwpx): validate header resource links
- feat(hwpx): validate section format references
- feat(hwpx): index header resource IDs
- feat(hwpx): validate protected document structure
- feat(hwpx): inspect version XML fields
- feat(hwpx): validate package manifest relationships
- feat(hwpx): read bounded ZIP package entries
- feat(emf): flatten arc and pie boundaries
- feat(emf): expose path dash flag points
- feat(emf): expose path marker points
- feat(emf): iterate path boundary edges
- feat(emf): close path boundary polylines
- feat(emf): flatten path device figures
- feat(emf): collect path device figures
- feat(emf): map path commands to device space
- feat(emf): flatten connected bezier segments
- feat(emf): flatten cubic bezier segments
- feat(emf): analyze cubic bezier geometry
ohah/maru
- ci(session-host): ReleaseFast 잡이 수동 실행에서도 빌드 캐시를 저장한다 — 저장하는 쪽이 없어 매번 콜드였다
- fix(session-host): partial_timeout 판정자의 픽스처가 사라진 스택을 가리켜 ReleaseFast 에서 SEGV 로 죽던 것
- perf(session-host): 할 일이 없다고 증명된 조용한 owner 는 펌프하지 않는다 — 활성 32 세션 앱 CPU 약 −10 %
- docs(editor): §8.2q 되먹임·관측점·적대적 기록(1~3회차 · 변이 45 · 판정자 구멍 셋을 메웠다 · 등가 여섯)
- test(syntax): SYN42 에 부모·자식 같은 범위 쌍 — 조상 거름 변이(T1b)가 살았다; 공백 줄 단계 등가 주석(A9b) (§8.2q 적대적 2회차)
- test(editor): 선택 확장 적대적 1회차 — 생존 둘을 판정자로 죽이고(D20 상태 없는 축소가 묻는다 · D21 시간 초과를 상수가 아니라 계약 값으로) 등가 다섯을 주석에 (§8.2q)
- test(editor): 선택 확장 판정자 보강 — 낱말 끝 caret 의 물을 자리 · utf-16 비ASCII · undo 묶음 · caret 드러내기 · primary 유지 · 비교 뷰 팔레트 · 사슬/조상 상한 (SSEL16~21 · SYN43, §8.2q)
- feat(editor): 캡처 훅 MARU_FORCE_SMART_SELECT=<N> — 서버가 문서를 연 뒤 선택 확장을 N 번(LSP 를 끄면 1층을 곧바로) (§8.2q)
- feat(editor): 구조 기반 선택 확장 — ⌃⇧⌘→/← 가 selectionRange(한 요청에 커서 전부) + tree-sitter 1층 + 낱말·줄·문서 단계로 한 걸음씩 넓히고 좁힌다 (§8.2q)
- docs(editor): §8.2q 구조 기반 선택 확장 계약 — selectionRange + tree-sitter 1층 + 낱말·줄·문서 단계, ⌃⇧⌘→/←; 조상 범위 함수를 먼저 반증
- fix(remote-watch): 저장소가 아닌 폴더를 「이 호스트는 감시 못 한다」로 말하던 것
- feat(workspace): 재부팅 뒤 에이전트 대화를 원래 칸에서 이어간다 — 기록된 권한 모드·모델 그대로 (RB2)
- feat(workspace): 재부팅이 증명되면 터미널이 묘비 없이 저장된 cwd 에서 새 셸로 뜬다 (RB1)
- docs(perf): 남은 동기 RPC 는 알림 pull 하나 — 앱 busy 11.5 %, 처방 초안과 호환 조건만 기록 (미착수)
- ci(session-host): B3-6·B3-4-5 격리 run 을 test-session-host 가 함께 돌린다 — CI 가 한 번도 안 돌리던 둘
- fix(editor): INL11 이 거절 수를 찍기 전에 모든 가짜 서버의 시작 요청이 끝나기를 기다린다
- perf(session-host): 이벤트가 없다는 걸 확인하는 드레인 의례를 건너뛴다 — 활성 32 세션 앱 CPU −21 %
- fix(syntax): 끊긴 여는 파싱 뒤 문서가 바뀌면 처음부터 다시 판다 — ts_parser_reset 이 없어 백업 복원에서 거짓 구문 오류가 섰다 (§2.1a)
- docs(workspace): 재부팅 뒤 부활 계약 — 껐다 켜면 터미널은 cwd 에서 다시 뜨고 에이전트 대화는 이어진다 (RB0)
- fix(renderer): kitty id 매핑 키를 surface 포인터에서 비재사용 Surface.id 로 (K2e 적대적 1회차)
- fix(renderer): split 으로 함께 보이는 비활성 pane 의 kitty 이미지도 그린다 — id 는 창 전체로 갈리고, 뷰포트 밖은 잘린다 (K2e)
- fix(session-host): upgrade failure matrix 기대값을 14 로 되돌리고, 판정자가 그 수를 목록에서 계산한다
- fix(session-host): B3-6 peer matrix 가 피어를 join 하기 전에
complete를 읽던 경쟁을 고친다 - perf(sidebar): hostname 을 한 프레임 안에서만 재사용한다 — 활성 32 세션 앱 CPU −7.2 %
- fix(mobile): run simulator input selftest without a window
- fix(session-host): B3-6 fail-stop case 4 는 panic 이 아니라 proof_loss(86) 로 죽는다 — 6 주간 CI 밖에서 빨갰다
- refactor(naming): B3 판정자 다섯을 주제 이름으로 — 원장이 63 에서 58 로
- docs(editor): §8.2p 되먹임·적대적 기록(변이 38 · 결함 하나 · 등가 둘), 등가 주석
- fix(editor): 같은 낱말 강조 — 낱말 밖으로 나갔다 돌아오면 영영 안 뜨던 결함(적대적 B9)을 고치고, 판정자 보강(정렬 기준·상한·편집 비움·그려진 quad·비교 뷰·utf-16), 판정자 이름을 OCH 로(DHL 은 비교 뷰가 쓴다) (§8.2p)
- fix(editor): caret 이 낱말 끝 바로 뒤여도 그 낱말로 본다 — 타이핑 뒤의 보통 자리에서 강조가 안 떴다(실서버 캡처)
- feat(editor): LSP 2단 ⑮ — 같은 낱말 강조 documentHighlight: caret 아래 심볼의 다른 자리가 가장 약한 배경으로 선다(선택·검색이 이긴다); 편집·낱말 이동에 버린다 (§8.2p·§5.1a)
- refactor(naming): CR3b 판정자 다섯을 주제 이름으로 — 원장이 68 에서 63 으로
- perf(font): 셰이핑이 프레임마다 폰트를 다시 만들지 않는다 — 활성 32 세션 앱 CPU −22.5 %
- fix(editor): 캡처 훅의 표식 값을 ASCII 로 — 코드의 한국어 리터럴 원장(§7)을 넘겼다
- test(editor): 심볼 2층 적대적 42변이 5회차 — 판정자 일곱 보강(LSJ20 capability 모양·DSY7~DSY10), 등가 셋 기록 (§8.2o)
- fix(editor): symbolKind.valueSet 을 i32 로 — u8 배열이 JSON 문자열이 돼 tsgo 가 initialize 를 거부하고 세션이 통째로 죽었다; 빈 selectionRange 는 심볼 범위에서 이름을 찾아 쓰고, 피커는 1층 provider 를 전제하지 않는다 (§8.2o)
- feat(editor): LSP 2단 ⑭ — 심볼 2층 documentSymbol: 밴드 체인·피커가 서버 목록으로 선다(정렬·포함 깊이·이름 자기 검산); 편집이 나면 버리고 1층으로 (§8.2o·§7.5)
- docs(editor): 이름 없는 문서 계획을 닫는다 — 열 슬라이스가 전부 들어갔다
- feat(editor): 신원을 잃은 문서를 이름 없는 문서로 되살린다 — 두 입구, 한 규칙 (U4d)
- feat(editor): 이름 없는 문서가 내용과 함께 돌아온다 — workspace 는 «번호»만 싣는다 (U4c)
- refactor(naming): CR3a-2c3 판정자 스물넷을 주제 이름으로 — 원장이 92 에서 68 로
- feat(editor): 크래시가 삼킨 편집을 조용히 되살린다 — 묻는 자리는 «저장하는 순간»이다 (U4b)
- refactor(naming): F3 단계 라벨을 주제 접두로 — 게이트가 고르는 테스트 집합은 그대로
ohah/zntc
- fix(transformer): #4730 using 낮추기 — es5 경로·고유 이름·에러 초기화·호이스팅·export·for-of 헤더
- fix(transformer): #4729 후속 — 객체 home 파라미터
_obj가 사용자 식별자를 가리지 않게 한다 - fix(transformer): #4729 객체 리터럴 메서드의 super 가 home object 의 프로토타입을 보게 한다
- fix(bundler): #4727 pre-pass 게이트가 메서드·async generator 를 놓쳐 헬퍼 정의가 빠지던 문제
- fix(transformer): #4714 es5 generator 안 for-of 가 조기 종료 시 iterator 를 닫는다
- fix(transformer): #4722 for-await 반복별 바인딩 + es5 추출 루프의 라벨 처리
- fix(transformer): #4723 클래스 computed 키·필드 lowering — 크래시·파싱불가·재평가·이름추론
- fix(transformer): #4721 computed key·멤버 대입 좌변·for 헤더의 yield 를 추출한다
- fix(transformer): #4718 라벨이 겹치는 자리의 yield 가 두 번 실행되지 않게 한다
- fix(transformer): #4710 라벨 붙은 for-await 를 루프로 인식한다
PR (해당일 생성/머지)
상태는 조회 시점 기준입니다. merged는 아래 대상 브랜치에 병합됐다는 뜻이며, 기능 브랜치 병합과 main 반영을 구분합니다. 같은 PR이 생성일과 병합일 양쪽 기록에 나타날 수 있습니다.