2026-09-23
날짜별 분류는 기존 기록과 같은 UTC 기준입니다. 커밋은 커미터 시각(committer date), PR은 생성·병합 시각으로 분류했습니다. 집계 마감: 2026-09-26 17:05:20 KST (08:05:20 UTC). 공개 저장소에서 조회한 활동만 포함합니다.
요약 (AI 작성)
maru는 재부팅 뒤 저장된 작업 디렉터리에서 새 셸을 띄우고, 에이전트 대화를 원래 칸에서 이어가는 경로를 추가했습니다. 편집기는 같은 낱말 강조, 구조 기반 선택 확장과 축소, 스코프 머리줄을 고정하는 sticky scroll을 얻었습니다. 낱말 끝 커서의 강조와 비교 화면에서 남아 있던 고정 머리줄이 클릭을 가로채는 문제를 고쳤습니다.
조용한 세션을 반복해서 확인하던 작업과 같은 프레임 안의 hostname 조회를 줄이고, 셰이핑 중 폰트를 프레임마다 다시 만들지 않도록 했습니다. 관련 커밋의 CPU 수치는 활성 32세션 실험 조건의 개별 결과이며 합산하지 않습니다. ReleaseFast에서만 드러난 픽스처 수명과 스레드 완료 확인 문제를 수정하고, 빠져 있던 세션 호스트 검증을 CI에 연결했습니다.
hwpjs는 HWPX의 ZIP 항목·패키지 관계·글꼴·서식·차트 참조를 검사하고, 헤더와 섹션의 XML 구조 및 텍스트 이벤트를 읽는 경로를 확장했습니다. zntc는 for-await와 for-of의 반복별 바인딩·iterator 종료, 객체 메서드의 super, using과 computed key 변환을 보강했습니다. Chromium 웹 패널의 제어 채널과 sidecar PR은 기능 브랜치를 대상으로 준비 중인 작업입니다.
공개 커밋 87개, 해당일 생성 또는 병합된 PR 42개를 정리했습니다. PR 생성 40개·병합 38개는 같은 PR이 양쪽에 포함될 수 있습니다.
커밋
ohah/hwpjs
- feat(hwpx): inspect header begin numbers
- feat(hwpx): validate paragraph scalar metadata
- feat(hwpx): assemble owned document XML trees
- feat(hwpx): index header XML with shared part tree
- feat(hwpx): replay ordered section XML events
- fix(hwpx): reject unsupported namespace profiles explicitly
- feat(hwpx): visit section content by parent element
- feat(hwpx): resolve section tree attributes
- feat(hwpx): index owned section XML trees
- feat(hwpx): expose paragraph and run boundaries
- feat(hwpx): stream section text and inline tokens
- 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
ohah/maru
- fix(workspace): 재부팅 부활 코드 리뷰 반영 — 두 번 부활·대화 파일 못 찾음·신원 수명·spawn 실패·알림 (RB)
- fix(workspace): keep-alive 를 끈 칸도 재부팅 뒤 에이전트 대화를 이어간다 — 계약의 「한 규칙」대로 (RB2)
- ci(session-host): ReleaseFast 잡 상한을 45분으로 올린다 — 20분으로는 콜드가 끝나지 못해 캐시가 영영 안 선다
- test(editor): sticky 판정자 보강 — 보이는 줄 이분 탐색(값 없는 칸·접힘, STK10) · 접힘 스코프의 끝 경계(닫는 줄까지 선다, STK8) (§4.1i)
- fix(editor): sticky 경계선을 2px quad 로 — pane lowering 은 rule 을 안 그리고 1px quad 는 셰이더 SDF AA 에 지워졌다(캡처 픽셀로 쟀다); 캡처 훅 MARU_FORCE_EDITOR_TOP (§4.1i)
- docs(editor): §4.1i sticky scroll 계약 — 스코프 출처(심볼 2층 → 1층 → 접힘), 행 격자의 칸 규칙, 최대 5줄·높이 25%, caret 을 덮지 않고 클릭한 줄을 부모 아래에 둔다; 설정 두 키
- feat(editor): sticky scroll 순수 층 — 칸 규칙(머리줄 행 < d ≤ 마지막 본문 줄의 마지막 행)·세 줄 이상·같은 머리줄 한 번·숨은 줄·줄바꿈·상한 25%; 설정 두 키 (§4.1i, STK1~5)
- fix(editor): 비교 뷰·병합 판으로 바꾸면 옛 sticky 머리줄이 클릭·호버·⌘클릭을 가로채던 결함(rowAt 가드, STK11) · 적대적 1회차 판정자 보강·등가 넷 주석 (§4.1i)
- fix(editor): 같은 낱말 강조가 서면 막대가 잘리던 결함(op 합계에서 occ_ops 누락, OCH5) · feat: 프레임이 sticky 머리줄로 본문 위쪽 행을 덮는다(STK6) (§5.1a · §4.1i)
- feat(editor): sticky scroll 제품 층 — 출처(심볼 2층 → 1층 → 접힘), 줄→화면 행(접힘·줄바꿈), caret 을 덮을 칸부터 걷기, 머리줄 구문 색, 고정 행 클릭(그 줄로 가서 자기 칸에)·호버·⌘클릭 억제 (§4.1i, STK7~9)
- docs(editor): §4.1i 되먹임(경계선 2px · 걷어내기 · 헛초록 판정자 · 캡처 · 비교 뷰 결함)·적대적 기록(1~2회차 변이 47 · 등가 넷 · 결함 하나); §8.2p 되먹임(강조가 막대를 자르던 결함, OCH5)
- docs(mobile): sticky scroll 설정 두 키는 모바일에 안 싣는다(편집기 화면이 없다) — check-mobile-contract
- ci(session-host): ReleaseFast 잡이 수동 실행에서도 빌드 캐시를 저장한다 — 저장하는 쪽이 없어 매번 콜드였다
- fix(session-host): partial_timeout 판정자의 픽스처가 사라진 스택을 가리켜 ReleaseFast 에서 SEGV 로 죽던 것
- perf(session-host): 할 일이 없다고 증명된 조용한 owner 는 펌프하지 않는다 — 활성 32 세션 앱 CPU 약 −10 %
- test(syntax): SYN42 에 부모·자식 같은 범위 쌍 — 조상 거름 변이(T1b)가 살았다; 공백 줄 단계 등가 주석(A9b) (§8.2q 적대적 2회차)
- docs(editor): §8.2q 구조 기반 선택 확장 계약 — selectionRange + tree-sitter 1층 + 낱말·줄·문서 단계, ⌃⇧⌘→/←; 조상 범위 함수를 먼저 반증
- docs(editor): §8.2q 되먹임·관측점·적대적 기록(1~3회차 · 변이 45 · 판정자 구멍 셋을 메웠다 · 등가 여섯)
- 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)
- test(editor): 선택 확장 적대적 1회차 — 생존 둘을 판정자로 죽이고(D20 상태 없는 축소가 묻는다 · D21 시간 초과를 상수가 아니라 계약 값으로) 등가 다섯을 주석에 (§8.2q)
- 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): split 으로 함께 보이는 비활성 pane 의 kitty 이미지도 그린다 — id 는 창 전체로 갈리고, 뷰포트 밖은 잘린다 (K2e)
- fix(renderer): kitty id 매핑 키를 surface 포인터에서 비재사용 Surface.id 로 (K2e 적대적 1회차)
- 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 로
- fix(editor): 같은 낱말 강조 — 낱말 밖으로 나갔다 돌아오면 영영 안 뜨던 결함(적대적 B9)을 고치고, 판정자 보강(정렬 기준·상한·편집 비움·그려진 quad·비교 뷰·utf-16), 판정자 이름을 OCH 로(DHL 은 비교 뷰가 쓴다) (§8.2p)
- docs(editor): §8.2p 되먹임·적대적 기록(변이 38 · 결함 하나 · 등가 둘), 등가 주석
- fix(editor): caret 이 낱말 끝 바로 뒤여도 그 낱말로 본다 — 타이핑 뒤의 보통 자리에서 강조가 안 떴다(실서버 캡처)
- feat(editor): LSP 2단 ⑮ — 같은 낱말 강조 documentHighlight: caret 아래 심볼의 다른 자리가 가장 약한 배경으로 선다(선택·검색이 이긴다); 편집·낱말 이동에 버린다 (§8.2p·§5.1a)
- refactor(naming): CR3b 판정자 다섯을 주제 이름으로 — 원장이 68 에서 63 으로
- perf(font): 셰이핑이 프레임마다 폰트를 다시 만들지 않는다 — 활성 32 세션 앱 CPU −22.5 %
ohah/zntc
- fix(transformer): #4743 es5 루프 본문 선언 캡처 시 반복별 바인딩 + 추출 본문의 var 끌어올리기
- fix(transformer): #4712 es5 상태 기계에서 catch 파라미터·블록 바인딩의 스코프를 지킨다
- fix(lint): object_super 서브트리 순회를 walkPreorderIterative 로 — recursive-ast-walker 감사 통과
- 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 를 추출한다
PR (해당일 생성/머지)
상태는 조회 시점 기준입니다. merged는 아래 대상 브랜치에 병합됐다는 뜻이며, 기능 브랜치 병합과 main 반영을 구분합니다. 같은 PR이 생성일과 병합일 양쪽 기록에 나타날 수 있습니다.