2026-09-06

날짜는 UTC 기준으로 나눴습니다(9월 22일부터는 한국 시간 기준). 커밋은 커미터 시각(committer date), PR은 생성·병합 시각으로 분류했습니다. 목록은 2026-10-06 KST에 GitHub에서 다시 조회해 보강했습니다. 공개 저장소의 기본 브랜치 활동만 포함합니다.

요약 (AI 작성)

hwpjs가 하루에 117커밋을 쌓은 날입니다. HWP5 문서 구조를 넓게 파싱하고 검증했습니다. 테두리·채우기와 글자·문단 모양, 문단 헤더와 무손실 텍스트 토큰, 레코드 계층 인덱스와 문단 소유권, 구역·쪽 속성, 단 배치, 겹치지 않는 완전한 표 격자, 머리말·꼬리말과 번호·쪽 번호·책갈피·덧말 같은 컨트롤, 수식과 OLE, 선·사각형·타원·호·다각형·곡선·그림·연결선·묶음 같은 도형 payload와 소유권, 메모 도형과 마커·목록 짝, 금칙 문자 목록, 변경 추적과 ViewText 프레이밍, 소유된 revision text 수집까지 이어졌습니다. 예약 바이트나 관측된 값은 정규화하지 않고 보존하는 원칙을 지켰고, README는 빌드와 API 사용법에 집중하도록 줄였습니다. @ohah/pdf는 터진 시험을 통과로 세거나 견본이 조용히 줄어도 통과하던 시험 하네스를 고치고, 고장 내기로 찾은 빈 곳을 메웠으며, 1형 셰이딩을 띠가 아니라 이어진 색으로 그리게 했습니다.

maru는 원격 파일 트리를 하루에 세웠습니다. 백엔드가 원격 워커·§5 게이트·실물 sshd 왕복으로 원격을 읽고(RF2b, #3274), 트리에 원격이 서는 v1(RF3a, #3276), 임시 미러와 read_only로 원격 파일 열기(RF4, #3281), 채널 하나를 두 뷰가 나눠 쓰는 자동 갱신(RF5a), 저쪽 한 프로세스가 신원을 다시 재고 비대체로 옮기는 원격 변경의 하부(RF6a, #3294), 이름 바꾸기, 되돌릴 수 없다고 말하면서 지우기(RF6c, #3300), 만들기·밴드 진실·미러 정리(#3308)까지 이었습니다. 적대적 검증 5회가 낸 넷을 고치고(#3312) 실서버 캡처로 눈으로 확인했습니다. 원격 이벤트는 ssh에 ServerAlive를 붙여 반개방 TCP가 채널을 몇 시간씩 잡던 것을 감지하게 했고(#3345), 같은 문제를 다른 방식으로 풀려던 #3343은 닫혔습니다.

모바일은 안 바뀐 프레임에 GPU를 쓰지 않게 한 #3267을 병합하고, 접근성 M9를 여섯 슬라이스까지 진행했습니다. 브리지가 접근성 서술자를 내고(#3282) iOS가 스크린 리더에, Android가 TalkBack에 넘기며(#3290, #3299), 세션 목록·나머지 화면·터미널 본문이 줄마다 읽히게 했습니다(#3317). 이름 없는 세션 줄이 통째로 사라지던 것과 보는 글자·읽는 글자가 다르던 것도 고쳤습니다(#3314, #3320). 편집기는 전날 열린 열/블록 선택 #3270을 병합하고, ⌥클릭으로 커서를 추가·제거하며(#3286) ⌥더블/트리플클릭이 마지막 커서를 낱말·줄로 넓히게 했습니다(#3306). 편집기 컨텍스트 chord가 메뉴 keyEquivalent에 가로채이던 것도 고쳤습니다(#3324). 이미지 갤러리를 「에이전트 활동 뷰」로 넓히는 계약을 세우고(#3331) 도구 호출을 인덱스에 담아 화면에 띄웠으며(AV1, #3335), 캡처가 연 결함을 고치는 #3341은 이날 열렸습니다.

테스트 인프라는 러너에 prefix 제외·keep-only 필터를 더해 중복 실행을 건너뛰고(#3280), AppSession 스위트를 같은 바이너리의 인덱스 샤드로 나눠 병렬로 돌렸으며(#3302), 경계 게이트도 샤드로 나눴습니다(#3313). CI는 main의 진행 중인 run을 취소하지 않고 PR ref만 취소하며(#3316), 캐시는 main 그룹마다 최신 1세대만 남깁니다(#3318). session-host는 fd 슬롯 예약을 준비 작업보다 앞으로 옮겨 디렉터리 fd가 자리를 채가던 것을 고쳤고(#3287), stage 3·4·5와 재개 publication, 게시된 aggregate의 안전한 삭제와 crash 뒤 정리 복구, aggregate 명령 결과와 workflow reducer 상태 인계, live workflow 호출과 단계 결속까지 릴리스 경로를 이어 갔습니다.

공개 커밋 271개, 해당일 생성 또는 병합된 PR 78개를 정리했습니다. PR 생성 75개·병합 76개는 같은 PR이 양쪽에 포함될 수 있습니다.

커밋

ohah/hwpjs

ohah/maru

ohah/pdf

PR (해당일 생성/머지)

상태는 조회 시점 기준입니다. merged는 아래 대상 브랜치에 병합됐다는 뜻이며, 기능 브랜치 병합과 main 반영을 구분합니다. 같은 PR이 생성일과 병합일 양쪽 기록에 나타날 수 있습니다.

저장소PR해당일 활동상태대상 브랜치제목
ohah/maru#3346생성 · 병합mergedmainfeat(session-host): bind live workflow steps
ohah/maru#3345생성 · 병합mergedmainfix(agent): ssh 에 ServerAlive 를 붙여 반개방 TCP 를 감지한다 — 원격 배지가 5 시간 36 분 굳은 루트커즈
ohah/maru#3344생성 · 병합mergedmainfeat(session-host): own live workflow invocations
ohah/maru#3343생성closedmainfix(agent): 침묵한 원격 이벤트 전송을 다시 띄운다 — EOF 만 사망으로 본 사각지대
ohah/maru#3342생성 · 병합mergedmainfeat(session-host): hand off fixed workflow checkpoints
ohah/maru#3341생성mergedmainfix(agent-activity): 캡처가 연 결함 여덟 — 적대적 검증 38회로 다듬은 활동 뷰
ohah/maru#3340생성 · 병합mergedmainfeat(session-host): workflow reducer 상태를 안전하게 전달한다
ohah/maru#3339생성 · 병합mergedmainfeat(session-host): aggregate child 관측을 reducer에 직접 적용한다
ohah/maru#3338생성 · 병합mergedmainfeat(session-host): validator 종료를 dual-stream으로 bounded 관측한다
ohah/maru#3337생성 · 병합mergedmainfeat(session-host): aggregate process 결과를 reducer event에 결속한다
ohah/maru#3336생성 · 병합mergedmainfeat(session-host): aggregate command outcome을 닫아 live release 판정을 고정한다
ohah/maru#3335생성 · 병합mergedmainfeat(agent-activity): 도구 호출이 화면에 뜬다 — 활동 뷰 AV1-b
ohah/maru#3334생성 · 병합mergedmainfeat(session-host): published aggregate를 검증해 정리한다
ohah/maru#3333생성 · 병합mergedmainfeat(agent-activity): 인덱스가 도구 호출도 담는다 — 활동 뷰 AV1-a
ohah/maru#3332생성 · 병합mergedmainfeat(agent): 주인 없는 nonce 를 알린다 — 마지막 한 칸이 조용했다
ohah/maru#3331생성 · 병합mergedmaindocs(agent-activity-view): 갤러리를 「에이전트 활동 뷰」로 넓히는 계약과 계획을 세운다
ohah/maru#3330생성 · 병합mergedmainfix(image-gallery): 크게 본 채 도크를 접으면 그림이 사라졌다 — 회수 규율이 그 한 장을 빼먹었다
ohah/maru#3329생성 · 병합mergedmainfeat(session-host): published cleanup 자산 ID를 재인증한다
ohah/maru#3328생성 · 병합mergedmainperf(test): AppSession 스위트 샤드를 4 로 되돌린다 — 반복 횟수 대기는 #3327 이 고쳤다
ohah/maru#3327생성 · 병합mergedmainfix(test): 이미지 갤러리 판정자의 워커 대기를 반복 횟수 대신 벽시계 마감으로 — 부하에서 안 흔들리게
ohah/maru#3326생성 · 병합mergedmainfeat(mobile): 줄이 «전체 중 몇째» 인지 말한다 — 그 길이 아예 없었다
ohah/maru#3325생성 · 병합mergedmainperf(test): AppSession 스위트 샤드를 4 → 3 으로 — 러너의 코어당 프로세스 하나
ohah/maru#3324생성 · 병합mergedmainfix(input): 편집기 컨텍스트 chord 가 메뉴 keyEquivalent 를 이긴다
ohah/maru#3323생성 · 병합mergedmainfeat(session-host): recover aggregate cleanup after crashes
ohah/maru#3322생성 · 병합mergedmaindocs(mobile): 접근성이 닫힌 뒤에도 «없다» 고 적혀 있던 넷을 고친다
ohah/maru#3321생성 · 병합mergedmainfix(test): 파일 열기 훑기의 조기 종료는 성공한 스텝에서만 정한다 — #3296 의 새 실패 모드를 닫는다
ohah/maru#3320생성 · 병합mergedmainfix(mobile): 본문에서 보는 글자와 읽는 글자가 달랐다 — 결합·자리·커서
ohah/maru#3319생성 · 병합mergedmaindocs(remote-watch): 폴링 비용은 결함이 아니라 튜닝이다 — 범위와 착수 조건을 못박는다
ohah/maru#3318생성 · 병합mergedmainci(cache): 캐시 청소가 main 그룹마다 최신 1세대만 남긴다 — 복원은 전부 접두 폴백이라 2세대가 필요 없다
ohah/maru#3317생성 · 병합mergedmainfeat(mobile): 터미널 본문이 줄마다 읽힌다 — M9 여섯째 슬라이스
ohah/maru#3316생성 · 병합mergedmainci: main 의 진행 중인 run 은 취소하지 않는다 — PR ref 만 취소한다
ohah/maru#3315생성 · 병합mergedmainfeat(session-host): delete published aggregate safely
ohah/maru#3314생성 · 병합mergedmainfix(mobile): 이름 없는 세션 줄이 스크린 리더에서 통째로 사라졌다
ohah/maru#3313생성 · 병합mergedmainci(check-boundaries): 경계 게이트를 인덱스 샤드 넷으로 나누고 imports.zig 를 ReleaseSafe 로 돈다
ohah/maru#3312생성 · 병합mergedmainfix(file-tree): 적대적 검증 5 회가 낸 넷을 고친다 — 정리·스탬프·비용·픽스처·목적지
ohah/maru#3311생성 · 병합mergedmainfeat(mobile): 남은 화면 넷이 읽힌다 — 서버 목록·설정·편집·물어보는 화면들
ohah/maru#3310생성 · 병합mergedmaindocs(remote-file-tree): 남은 후속 둘을 조건 대기로 닫고, 슬롯 상한을 실측으로 뒷받침한다
ohah/maru#3309생성 · 병합mergedmainfeat(session-host): 재개 publication 명령을 실행한다
ohah/maru#3308생성 · 병합mergedmainfeat(file-tree): 원격 만들기·밴드 진실·미러 정리 (RF6d·RF6e·RF6f)
ohah/maru#3307생성 · 병합mergedmainperf(test): 샤드 넷을 래퍼 한 스텝 안에서 동시에 돌린다 — zig build 는 inherit run 스텝을 직렬로 돈다
ohah/maru#3306생성 · 병합mergedmainfeat(editor): ⌥더블/트리플클릭이 마지막 커서를 낱말·줄로 넓힌다 (§3.2d)
ohah/maru#3305생성 · 병합mergedmainfeat(mobile): 세션 목록이 읽힌다 — M9 넷째 슬라이스
ohah/maru#3304생성 · 병합mergedmaintest(remote-file-tree): 감시·이름 변경·삭제를 실서버 캡처로 눈으로 확인한다
ohah/maru#3303생성 · 병합mergedmainfeat(session-host): 재개된 publication suffix를 조합한다
ohah/maru#3302생성 · 병합mergedmainperf(test): AppSession 스위트를 같은 바이너리의 인덱스 샤드 4개로 나눠 병렬로 돈다
ohah/maru#3301생성 · 병합mergedmainperf(session-host): ledger 해제 1건의 재계산을 정책 변경 없이 5분의 1로 줄인다
ohah/maru#3300생성 · 병합mergedmainfeat(file-tree): 원격에서 지운다 — 되돌릴 수 없다고 말하면서 (RF6c)
ohah/maru#3299생성 · 병합mergedmainfeat(mobile): Android 가 서술자를 TalkBack 에게 넘긴다 — M9 셋째 슬라이스
ohah/maru#3298생성 · 병합mergedmainfeat(session-host): 재개된 publication asset graph를 투영한다
ohah/maru#3297생성 · 병합mergedmainfeat(file-tree): 원격 트리에서 이름을 바꾼다 — 펜스를 여는 대신 문을 하나 더 낸다 (RF6b)
ohah/maru#3296생성 · 병합mergedmainperf(test): 훑기 셋에 조기 종료를 두고 ledger 상한 판정자의 뒷정리를 drainAll 로 바꾼다
ohah/maru#3295생성 · 병합mergedmainrefactor(mobile): 읽는 순서를 브리지가 정한다 — host 가 다시 세우지 않는다
ohah/maru#3294생성 · 병합mergedmainfeat(file-tree): 원격 변경의 하부를 연다 — 저쪽 한 프로세스가 신원을 다시 재고 비대체로 옮긴다 (RF6a)
ohah/maru#3293생성 · 병합mergedmainperf(test): 러너 keep-only prefix — rx_read_test_support 바이너리의 session_host 중복 실행 1,556개를 끊는다
ohah/maru#3292생성 · 병합mergedmainrefactor(session-host): publication suffix 정책을 단일화한다
ohah/maru#3291생성 · 병합mergedmainfeat(file-tree): 원격 트리가 스스로 갱신된다 — 채널 하나를 두 뷰가 나눠 쓴다 (RF5a)
ohah/maru#3290생성 · 병합mergedmainfeat(mobile): iOS 가 서술자를 스크린 리더에게 넘긴다 — M9 둘째 슬라이스
ohah/maru#3289생성 · 병합mergedmainbuild: test-session-host 는 잡의 -Doptimize 모드 하나만 컴파일한다 — 하위 스텝 스텝째 의존이 두 모드를 물려받았다
ohah/maru#3288생성 · 병합mergedmaintest(remote-file-tree): 실서버 캡처로 원격 트리와 읽기 전용 열기를 눈으로 확인한다
ohah/maru#3287생성 · 병합mergedmainfix(session-host): fd 슬롯 예약을 준비 작업보다 앞으로 옮겨 업그레이드 경합을 없앤다
ohah/maru#3286생성 · 병합mergedmainfeat(editor): ⌥클릭으로 커서 추가·제거 (§3.2c)
ohah/maru#3285생성 · 병합mergedmaintest(session-host): openpty 판정자가 자식을 기다리는 동안 master 를 비운다 — p5c3c-3b TestTimedOut 데드락
ohah/maru#3284생성 · 병합mergedmainfix(session-host): resume manifest와 aggregate bytes를 교차 결속한다
ohah/maru#3283생성 · 병합mergedmainfeat(session-host): 업그레이드 스캔 스킵과 fd 슬롯 점유자를 로그로 남긴다
ohah/maru#3282생성 · 병합mergedmainfeat(mobile): 브리지가 접근성 서술자를 낸다 — M9 첫 슬라이스
ohah/maru#3281생성 · 병합mergedmainfeat(file-tree): 원격 파일이 열린다 — 임시 미러·read_only·안내 3종 (RF4)
ohah/maru#3280생성 · 병합mergedmainperf(test): 러너에 prefix 제외 필터 — app-host-abi 의 session_host 중복 실행 2,594개를 건너뛴다
ohah/maru#3279생성 · 병합mergedmainfeat(agent): 원격 이벤트가 어느 조건에서 안 붙는지 남긴다
ohah/maru#3278생성 · 병합mergedmainfix(file-tree): 원격 탐색기 리메디에이션 — 실패는 비활성으로·펜스 키는 발행 출처로 (적대적 검증 3회)
ohah/maru#3277생성 · 병합mergedmainfeat(session-host): rebuild stage5 resume authority
ohah/maru#3276생성 · 병합mergedmainfeat(file-tree): 트리에 원격이 선다 — 원격 탐색기 v1(따라가기·표시·펜스) (RF3a)
ohah/maru#3275생성 · 병합mergedmainbuild: test-session-host 도 release adapter 판정자를 집계 둘로 묶는다 — 개별 82 바이너리 → 2
ohah/maru#3274생성 · 병합mergedmainfeat(file-tree): 백엔드가 원격을 읽는다 — 원격 워커·§5 게이트·실물 sshd 왕복 (RF2b)
ohah/maru#3273생성 · 병합mergedmainfeat(session-host): attest stage4 authored pair
ohah/maru#3272생성 · 병합mergedmainfeat(session-host): stage 3 preparation 명령을 연다
ohah/maru#3270병합mergedmainfeat(editor): 열/블록 선택 — ⌥드래그·⇧⌥드래그와 ⇧⌥⌘ 방향키 (§3.2a)
ohah/maru#3267병합mergedmainfeat(mobile): 안 바뀐 프레임은 GPU 를 안 쓴다 — 정지 8초에 3,901 tick 을 쉰다
ohah/maru#3259병합mergedmaintest(smoke): 굴린 편집기의 색을 잰다 — 판정이 보고도 안 잡던 자리 (§2m.114)