2026-09-13
날짜는 UTC 기준으로 나눴습니다(9월 22일부터는 한국 시간 기준). 커밋은 커미터 시각(committer date), PR은 생성·병합 시각으로 분류했습니다. 목록은 2026-10-06 KST에 GitHub에서 다시 조회해 보강했습니다. 공개 저장소의 기본 브랜치 활동만 포함합니다.
요약 (AI 작성)
hwpjs가 읽기에서 쓰기로 넘어간 날입니다(74커밋). 차트 series label과 point, 제목·목록·창 꼬리 섹션까지 조립한 뒤, 원본 차트 내용을 보존·복사하고 bounded patch를 적용하며 문자열·글꼴·text block·format code·값 참조를 fork해 편집하게 했습니다. grid 숫자·문자열 셀 편집과 null 셀 구체화, 모든 non-inline 차트 텍스트 편집, 여러 차트에 걸친 typed edit 일괄 적용까지 갔고, 저장을 위해 raw deflate stored block 인코딩, BinData·OLE 스트림의 원자적 교체, DocInfo와 묶인 BinData 쓰기를 넣었습니다. WMF는 HWP placeable 헤더와 레코드 framing, 객체 테이블 수명, 그리기·텍스트 레코드, 내장 EMF payload 재조립을, EMF는 헤더와 레코드 framing을 검증합니다.
maru 소스 컨트롤은 원격 히스토리를 열었습니다. 벽은 배선이 아니라 우리가 만든 토큰이었다고 정리하고(#3652), 원격 목록을 보는 동안 히스토리가 로컬 git을 부르던 것을 막은 뒤(RS7-0), 원격으로 나가는 토큰의 제어문자를 없애고(RS7a), 히스토리와 펼친 커밋 파일 목록을 그 기계에서 읽으며(#3658, #3663), 실패를 이름으로 말하고 사유 규칙을 한 자리로 모았습니다(RS7d, #3664). 연결 탓 실패가 새로고침 전까지 갇혀 있던 것은 사유가 재시도를 정하게 했고(#3676), 히스토리 탭이 어느 기계의 커밋인지 말하게 했습니다. 편집기는 전날 열린 인라인 위젯 행 #3641을 병합하고 충돌 마커를 인식하고 고르게 했습니다(S2, #3668).
에이전트는 orphan이 과거 값을 이번 목록과 나란히 찍어 며칠을 헤매게 한 착시를 고치고(#3656), 이벤트를 본 횟수를 세어 「비교가 안 일어난다」와 「안 맞는다」를 갈랐으며(#3642), 아이콘이 옛 provider 색으로 굳던 것(#3662)과 Term 탭의 ●를 그 Term의 색으로 칠하는 것(#3686)을 고쳤습니다. 같은 문제를 다르게 풀던 #3660·#3680·#3682는 닫혔습니다. workspace는 복원이 실패한 실행이 저장 파일을 덮던 것(#3645)과 복원이 성공해도 .bak이 안 풀려 오래된 사본이 눌러앉던 것을 고치고, 접어 둔 목록을 기억하게 했습니다(#3666).
session-host는 알림 저널이 자기가 쓴 것을 못 읽어 업그레이드가 세션을 전멸시키던 것을 잡고(#3670), 원격 pane의 셀 메트릭이 host 코어에 안 닿아 화면이 너무 크게 그려지던 것을 고쳤으며, 알림 릴리스 runtime과 signed tombstone 증거를 결속했습니다. 터미널은 전날 열린 U=1 애니메이션 placeholder #3638과 delta 전송 #3640을 병합하고, U=1 격자를 화면에 귀속시켜 alt가 primary를 덮던 것을 고쳤으며, kitty 전송 매체(t=f/t=t/t=s) 백로그를 실측과 결정으로 남기고 보류했습니다(#3688). kitty delete 타깃 여섯을 더하는 #3693은 이날 열렸습니다. CI는 성능 예산 게이트가 디버그 빌드를 재던 것과 perf 모드 판정자가 주석에 속던 것을 고치고(#3659, #3672), 누적 적대적 검증이 찾은 합류 자리 둘을 메웠습니다(#3674). 모바일은 로컬 echo가 출력 스트림의 중간 상태를 밟던 것을 고쳤습니다(#3673).
공개 커밋 145개, 해당일 생성 또는 병합된 PR 60개를 정리했습니다. PR 생성 55개·병합 50개는 같은 PR이 양쪽에 포함될 수 있습니다.
커밋
ohah/hwpjs
- feat(emf): validate header and record framing
- feat(wmf): scan embedded emf sequences
- feat(wmf): reassemble embedded emf chunks
- feat(wmf): validate embedded emf payloads
- feat(wmf): parse text and escape records
- feat(wmf): parse basic drawing records
- feat(wmf): parse fixed state records
- feat(wmf): parse observed create payloads
- feat(wmf): validate object table lifetimes
- feat(wmf): validate metafile record framing
- feat(wmf): parse observed HWP placeable headers
- feat(hwp5): relocate chart grid type declarations
- feat(hwp5): retain chart type reference spans
- feat(hwp5): nullify chart grid cells
- feat(hwp5): materialize null chart grid numbers
- feat(hwp5): materialize null chart grid strings
- feat(hwp5): edit chart grid string cells
- feat(hwp5): edit chart grid number cells
- feat(hwp5): edit observed chart number values
- feat(hwp5): combine all observed chart string edits
- feat(hwp5): edit inline chart strings through files
- feat(hwp5): isolate inline chart strings
- feat(hwp5): materialize axis scale formats
- feat(hwp5): materialize nullable chart format codes
- feat(hwp5): edit all observed non-inline chart text
- feat(hwp5): edit all observed chart font aliases
- feat(hwp5): materialize null chart point labels
- feat(hwp5): batch typed edits across charts
- feat(hwp5): batch typed chart string edits
- docs(hwp5): record point label fixture limits
- feat(hwp5): edit chart series labels through files
- feat(hwp5): edit chart fonts through file sessions
- feat(hwp5): compose file-level OLE edits
- feat(hwp5): replace OLE streams atomically
- feat(hwp5): replace BinData streams atomically
- feat(cfb): replace streams atomically
- feat(hwp5): validate resources before BinData writes
- feat(hwp5): bind BinData writes to DocInfo
- test(hwp5): verify chart save through outer CFB
- feat(hwp5): replace outer BinData streams
- feat(hwp5): encode BinData streams
- feat(compression): encode raw deflate stored blocks
- feat(hwp5): replace inner OLE streams
- feat(hwp5): allocate chart object ids
- feat(hwp5): fork chart format code strings
- feat(hwp5): retain chart format code spans
- feat(hwp5): fork chart text block strings
- feat(hwp5): retain chart text reference spans
- feat(hwp5): fork string value references
- feat(hwp5): generalize chart string reference forks
- feat(hwp5): fork chart font string references
- feat(hwp5): retain chart string reference spans
- feat(hwp5): edit chart string objects
- feat(hwp5): apply bounded chart content patches
- feat(hwp5): copy original chart contents
- feat(hwp5): retain original chart contents
- test(hwp5): guard chart result field coverage
- test(hwp5): compare chart reference boundaries
- test(hwp5): verify assembled chart return fields
- feat(hwp5): assemble explicitly selected chart contents
- refactor(hwp5): share grid collection and retain transition bytes
- feat(hwp5): extract observed plot and surface prefixes
- feat(hwp5): parse observed list and window tail sections
- test(hwp5): verify list and window type tail boundaries
- feat(hwp5): share chart text and parse observed titles
- test(hwp5): verify title text and section boundaries
- feat(hwp5): assemble observed series collections
- test(hwp5): verify series collection and title boundaries
- feat(hwp5): share empty picture body and series parsing
- test(hwp5): verify empty picture boundary in series
- feat(hwp5): support nullable text format codes
- test(hwp5): verify series suffix nullable format codes
- feat(hwp5): parse observed series labels and points
- test(hwp5): verify series label bodies and point repetition
ohah/maru
- fix(scm): 히스토리 탭이 «어느 기계의 커밋인가»를 말하지 않았다 (적대적 검증)
- docs(agent): 「열 중 둘만 뜬다」의 결착과 진단이 거짓말한 구간을 남긴다
- fix(remote-scm): 골든이 낡은 그림과 토스트에 흔들리고 있었다 (적대적 검증)
- docs: remove workspace restore status labels
- docs(terminal-core): kitty 전송 매체(t=f/t=t/t=s) 백로그 — 실측과 결정을 남기고 보류
- diag(workspace): 호스트 어댑터 확보가 아홉 곳에서 «이름 없이» 포기하던 것
- fix(agent): Term 탭의 ● 를 탭마다 그 Term 의 색으로 칠한다 — 한 색으로 통일하고 있었다
- test(remote-scm): 원격 히스토리 화면을 골든으로 잰다 — 값 셋을 박아 결정론으로
- test(scm): 감시 경로 기대값을 손으로 조립하던 것 — 워크트리에서만 빨갰다
- test(editor): 적대적 검증 6~10회차 — 상태 기계 셋과 «접으면 조용해지는» 알림을 붙들었다
- test(editor): 적대적 검증 4·5회차 — 근거 없는 관용 하나를 지우고 규칙 둘을 중립으로 옮겼다
- feat(editor): 충돌 마커를 «인식하고 고른다» — S2
- tools(remote-scm): 원격 SCM 화면을 제품 Metal 경로로 찍는다
- fix(mobile): 기다리던 키가 «옛 자리»의 것이면 버린다 (적대적 검증 2회차)
- fix(mobile): 합성이 host 버퍼를 넘겨 쓸 수 있던 것 — 용량을 묻는다
- fix(mobile): CI 를 태운 것은 flake 가 아니라 «리터럴보다 긴 길이» 였다
- fix(mobile): 로컬 echo 가 출력 스트림의 중간 상태를 밟고 있었다
- docs(scm): RS7 이력에서 «지금 없는 것»을 그렇게 말한다
- fix(terminal-core): U=1 격자도 화면에 귀속시킨다 — alt 가 primary 를 덮고 있었다
- docs: finish session host status synchronization
- docs: reconcile implementation status after hostile audit
- fix(scm): 연결 탓 실패가 새로고침 전까지 갇혀 있었다 — 사유가 재시도를 정한다 (누적 적대적 검증)
- fix(scm): 히스토리가 실패한 읽기를 매 tick 다시 묻고 있었다 — 그리고 unborn 을 «실패»로 말했다
- perf(ci): core_command_queue 예산을 올린다 — 같은 코드가 116ms/269ms 로 흔들렸다
- fix(ci): perf 하네스가 스스로 모드를 지킨다 — CR6e 가 쓰던 더 나은 방법
- fix(ci): perf 모드 판정자가 주석에 속고 있었다 — 그리고 게이트의 감지 한계를 실측해 적는다
- fix(workspace): 복원이 성공해도 .bak 이 안 풀려 7주 된 사본이 눌러앉던 것
- fix(session-host): 알림 저널이 자기가 쓴 것을 못 읽어 업그레이드가 세션을 전멸시키던 것
- fix(session-host): 원격 pane 의 셀 메트릭이 host 코어에 안 닿던 것 — 화면이 너무 크게 그려졌다
- diag(observation): 자리별 다이제스트 진단이 5시간마다 말하던 것 — 단위가 거짓이었다
- fix(scm,file-explorer): 누적 적대적 검증 — 합류 자리 둘이 깨져 있었다
- fix(file-explorer): .gitignore 흐림이 «도크가 기억하는 저장소»에 묻고 있었다
- docs(session-host): retire stale C3-3b status
- docs(session-host): reconcile reconnect completion status
- feat(scm): 히스토리 실패를 이름으로 말한다 — 그리고 사유 규칙을 한 자리로 (RS7d)
- fix(session-host): isolate oversized attach failures
- perf(ci): CI 실측으로 예산 셋을 올린다 — 로컬 외삽이 또 어긋났다
- perf(ci): 예산을 릴리스 실측으로 다시 잡고, 모드가 다시 어긋나지 않게 잠근다
- feat(workspace): 접어 둔 목록을 기억한다 — 키 없는 옛 줄은 접힘으로 읽는다
- feat(scm): 펼친 커밋의 파일 목록도 그 기계에서 읽는다 (RS7c)
- feat(scm): 히스토리를 그 기계에서 읽는다 (RS7b)
- fix(agent): 아이콘이 옛 provider 색으로 굳었다 — 「채널이 열렸나」로 멈추고 있었다
- test(session-host): prove forced checkpoint restore
- feat(scm): 원격으로 나가는 토큰에서 제어문자를 없앤다 (RS7a)
- fix(ci): 성능 예산 게이트가 디버그 빌드를 재고 있었다
- fix(scm): 원격 목록을 보는 동안 히스토리가 로컬 git 을 부르던 것 (RS7-0)
- docs(scm): 원격 히스토리를 연다 — 벽은 배선이 아니라 «우리가 만든 토큰»이었다
- ci(session-host): verify signed tombstone evidence
- test(session-host): bind tombstone workflow authority
- ci(session-host): run signed tombstone product
- test(session-host): run signed tombstone candidate
- test(session-host): define signed tombstone evidence
- fix(agent): orphan 이 과거 값을 이번 목록과 나란히 찍었다 — 그 착시로 며칠을 돌았다
- test(session-host): align provenance status boundary
- test(session-host): require normal tombstone quit
- test(session-host): delta 축 전수 판정자 — 빠진 축이 조용히 생기지 않게
- docs(session-host): align release gate status
- test(release): count notification workflow actions
- feat(session-host): bind notification product workflow
- fix(session-host): U=1 격자를 delta 로도 나른다 — placeholder 이미지가 안 뜨던 원인
- fix(workspace): 복원이 실패한 실행이 저장 파일을 덮던 것 — 그리고 실패 원인에 이름을 붙인다
- fix(terminal-core): U=1 애니메이션도 화면에 placeholder 가 있을 때만 돈다
- chore(repo): 셸 오타가 떨군 산물 둘을 지운다 — 소스 사본과 남의 pid
- fix(ci): CSP 위반은 비동기로 도착한다 — editor 스모크가 즉시 읽고 있었다
- test(editor): 적대적 검증 4·5회차 — 판정자 넷을 더 세우고 등가 변이 하나를 실측했다
- feat(editor): «문서 줄이 아닌 행»을 세운다 — S1.5 인라인 위젯 행
- fix(activity): 세우는 자리가 없는 조건이 화면 문구를 붙들고 있었다
- feat(agent): 이벤트를 본 횟수를 센다 — 「비교가 안 일어난다」와 「안 맞는다」를 가른다
- feat(session-host): prepare notification release runtime
- feat(session-host): own notification runtime preparation
- diag(session-host): 재동기화 sweep 이 무엇에 막혔는지 남기지 않던 것
PR (해당일 생성/머지)
상태는 조회 시점 기준입니다. merged는 아래 대상 브랜치에 병합됐다는 뜻이며, 기능 브랜치 병합과 main 반영을 구분합니다. 같은 PR이 생성일과 병합일 양쪽 기록에 나타날 수 있습니다.