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