2026-09-07
날짜는 UTC 기준으로 나눴습니다(9월 22일부터는 한국 시간 기준). 커밋은 커미터 시각(committer date), PR은 생성·병합 시각으로 분류했습니다. 목록은 2026-10-06 KST에 GitHub에서 다시 조회해 보강했습니다. 공개 저장소의 기본 브랜치 활동만 포함합니다.
요약 (AI 작성)
maru의 에이전트 활동 뷰가 모양을 갖춘 날입니다. 전날 열린 #3341이 병합돼 캡처와 적대적 검증으로 드러난 결함들(명령을 「장」으로 세던 단위 오류, 첫 Tab이 빈 화면이던 것, 상한에 걸리면 최신을 버리던 것 등)을 고쳤고, 그 명령이 어떻게 끝났는지와 시각을 줄에 보이며(AV2, #3359), 줄을 누르면 그때 받은 전문이 열리고(AV3, #3373), 종류를 눌러서 고르게 했습니다(AV4, #3372). 원격 파일을 열어도 트리가 원격에 남게 했고(RF7, #3351), 한쪽이 움직이면 영영 어긋나던 pane nonce를 굳히지 않게 했습니다(#3350). 원격 감시는 exit 3이 왜 났는지 남깁니다(#3358).
입력과 상태바도 손봤습니다. 터미널 전용 선-가로채기를 Term 종류로 게이트하고(#3354), 접기 다섯에 ⌥⌘0·⌥⌘J·⌥⌘1·⌥⌘2·⌥⌘3을 주었으며(#3360), 바뀐 키 정책을 §9.1·입력 설정·계획 문서에 반영했습니다(#3355). 상태바에는 Grammar 기준 언어 항목을 더했습니다(#3364). 비교 뷰에 caret을 세우는 #3370과 메모리가 잠깐 모자랐다고 목적지를 영영 죽이지 않게 하는 #3374는 이날 PR이 열렸습니다.
session-host는 candidate pair를 한 stage로 attest하고(#3347), live action checkpoint와 workflow checkpoint를 잇고 candidate 입력을 고정한 뒤, live validator 명령 실행과 live release workflow 배선(#3357)까지 갔습니다. 이어 upgrade-B 증거 leaf 순서를 하나로 닫고(#3361), signed upgrade production runner 조합, protected upgrade profile 결속, endorsed predecessor 권위 결속과 인증, 보호된 profile에서의 signed upgrade 실행(#3368), upgrade-B durable preparation 보존을 쌓았습니다. upgrade stage3 preparation을 조합하는 #3371은 이날 열렸습니다. 보낼 것을 든 채 끊긴 연결도 로그에 남기게 했습니다(#3348).
hwpjs는 59커밋으로 파일 포맷 층을 넓혔습니다. XML은 bounded UTF 입력과 문자 검증, 선언과 인코딩 조정, 이름·문자 참조, 태그와 속성 정규화, 문서 구조와 namespace 범위를 검증하고, zlib 스트림과 window 한도를 검증했습니다. PNG는 청크 구조와 체크섬, 스캔라인 필터 복원, IDAT 픽셀과 Adam7 배치, 투명도·배경·히스토그램·물리 크기·타임스탬프·텍스트·international text·suggested palette·gamma·chromaticity·sRGB intent를 검증했고, BCP47 언어 태그와 ISO 639도 확인합니다. ICC는 구조와 헤더, XYZ 배열, identity gamma·sampled·parametric curve(정확한 분수 보간과 역변환), localized string을 다루며 필수 태그 검증의 빈틈은 문서에 남겼습니다. HWP5는 revision source 경계, form control 조립과 진단, DocHistory·XMLTemplate 스트림, XML payload 검증을 더했습니다. @ohah/pdf는 /BaseFont를 실어 Times를 세리프로 그리게 했습니다.
공개 커밋 188개, 해당일 생성 또는 병합된 PR 29개를 정리했습니다. PR 생성 28개·병합 26개는 같은 PR이 양쪽에 포함될 수 있습니다.
커밋
ohah/hwpjs
- feat(text): inspect pinned ISO 639 alpha2 membership
- feat(image): select ICC localized strings by ordered preferences
- feat(text): validate ICC strings with shared Unicode decoding
- feat(image): parse ICC localized string structures
- feat(image): inspect ICC v4 required tag presence
- feat(image): unify ICC TRC forward evaluation
- feat(image): evaluate ICC gamma and parametric curves
- feat(image): interpolate sampled ICC curves with exact fractions
- feat(image): invert sampled ICC curves with exact fractions
- feat(image): validate edition-specific ICC TRC tag types
- feat(image): parse ICC parametric curve functions and parameters
- feat(image): parse ICC identity gamma and sampled curves
- feat(image): validate ICC XYZ tag cardinality and display white point
- feat(image): parse ICC XYZ arrays and validate v2 values
- docs(image): record ICC required-tag validation gaps
- feat(image): add snapshot-backed ICC registry lookup
- feat(image): inspect ICC header identifiers and numeric fields
- feat(image): add bounded ICC structure and profile envelope APIs
- feat(image): validate PNG sRGB intent and companion consistency
- feat(image): validate PNG gamma and chromaticity wire fields
- feat(image): validate PNG suggested palettes and unique names
- feat(image): validate PNG international text and aggregate limits
- feat(text): validate BCP47 registration against pinned IANA data
- feat(text): validate BCP47 syntax and duplicate subtags
- feat(image): validate PNG compressed text with aggregate output limits
- feat(image): validate PNG uncompressed text and shared keywords
- feat(image): validate PNG modification timestamp metadata
- feat(image): validate PNG physical dimensions and significant bits
- feat(image): validate PNG background and histogram metadata
- feat(image): validate PNG transparency metadata and ordering
- feat(image): validate PNG IDAT pixels and Adam7 scanline layout
- feat(image): reconstruct PNG scanline filters with bounded contracts
- feat(compression): validate bounded zlib streams and window limits
- feat(image): validate PNG chunk structure and checksums
- docs(hwp5): record unresolved bibliography storage evidence
- feat(hwp5): validate selected XML payloads with shared budgets
- feat(xml): validate namespace scopes and expanded attributes
- feat(xml): validate bounded whole-document structure
- feat(xml): parse tags and normalize attribute value tokens
- feat(xml): parse bounded names and character references
- feat(xml): parse declarations and reconcile input encodings
- feat(xml): add bounded UTF input and XML character validation
- test(hwp5): inspect history XML with bounded external evidence
- feat(hwp5): validate observed HistoryLastDoc records
- feat(hwp5): validate selected XMLTemplate container streams
- feat(hwp5): connect explicitly selected DocHistory streams
- feat(hwp5): inspect observed history dates without timezone assumptions
- feat(hwp5): preserve and inspect form MaxLength values
- feat(hwp5): diagnose form context and tristate semantics
- docs(docs): keep README focused on usage
- feat(hwp5): integrate form diagnostics into document validation
- feat(hwp5): validate observed form property paths and references
- feat(hwp5): link observed forms to paragraph control tokens
- feat(hwp5): assemble observed form controls with shared budgets
- docs(docs): simplify README usage instructions
- feat(hwp5): parse scoped UTF16 form properties
- feat(hwp5): read observed form object envelopes
- test(hwp5): verify line cache presence and coordinate hypotheses
- feat(hwp5): map observed revision source boundaries
ohah/maru
- fix(agent-activity): 칩 줄은 안 그릴 때 자리도 돌려준다 — 펼침이 클릭을 잃지 않게
- docs(agent-activity): 필터 UI 자리를 남은 결정에서 뺀다 — AV4 가 정했다
- feat(agent-activity): 종류를 눌러서 고른다 — 활동 뷰 AV4
- feat(agent-activity): 줄을 누르면 그때 받은 전문이 열린다 — 활동 뷰 AV3
- docs(agent-activity-view): 펼침이 무엇을 하고 무엇을 안 하는지 적는다 — AV3
- feat(session-host): reopen profile preparation by schema
- test(session-host): require upgrade preparation reopen
- feat(session-host): preserve upgrade durable preparation
- test(session-host): require upgrade durable preparation
- docs(session-host): generalize durable preparation profiles
- feat(session-host): execute protected signed upgrade profile
- test(session-host): require protected profile upgrade execution
- docs(session-host): connect profile authority to signed execution
- feat(session-host): authenticate endorsed predecessor authority
- test(session-host): require authenticated predecessor authority
- feat(session-host): make profile manifest authority nominal
- test(session-host): require nominal profile manifest authority
- docs(session-host): authenticate endorsed predecessor assets
- feat(session-host): authenticate endorsed predecessor manifest
- test(session-host): specify profile manifest bootstrap
- docs(session-host): bootstrap endorsed predecessor manifest
- feat(session-host): bind endorsed predecessor authority
- test(session-host): specify predecessor profile binding
- docs(session-host): bind endorsed predecessor identity
- docs(status-bar): 상한 검사가 등가임을 기록한다
- test(status-bar): 언어 항목의 제품 조립을 빠른 스위트에서 잰다
- feat(status-bar): 상태바에 언어 항목을 더한다 (Grammar 기준)
- docs(status-bar): 언어 값의 출처가 Grammar 임을 세 문서에 맞춘다 (11~14회차)
- docs(status-bar): 언어 항목은 표시 전용이고 비교 뷰에서도 선다 (7~10회차)
- docs(status-bar): 언어 항목의 프레이밍·한계·보관 자리 (3~6회차)
- docs(status-bar): 상태바 언어 항목을 정한다 (Grammar 기준)
- fix(session-host): preflight profile authority reads
- feat(session-host): bind protected upgrade profile
- test(session-host): specify release profile endorsement
- docs(session-host): define upgrade profile endorsement
- test(session-host): aggregate upgrade runner gate
- fix(session-host): retain upgrade cleanup retry
- test(session-host): exhaust upgrade copy faults
- feat(session-host): compose upgrade production runner
- test(session-host): specify upgrade production runner
- feat(session-host): expose held predecessor asset fd
- test(session-host): specify held predecessor asset fd
- docs(session-host): define upgrade production runner
- fix(session-host): keep only predecessor execution copy
- fix(session-host): use executable current candidate directly
- docs(session-host): define upgrade production runner
- feat(session-host): order upgrade execution copies
- test(session-host): specify upgrade copy ordering
- docs(session-host): order upgrade execution copies
- feat(session-host): materialize both upgrade executables
- test(session-host): specify both execution source modes
- feat(session-host): reserve current execution copy
- test(session-host): specify current execution copy
- docs(session-host): require both upgrade execution copies
- feat(session-host): bound signed upgrade children
- test(session-host): specify signed upgrade child
- feat(session-host): isolate signed upgrade harness
- test(session-host): specify signed harness isolation
- feat(session-host): materialize predecessor executable
- test(session-host): specify predecessor execution copy
- feat(session-host): isolate upgrade evidence workspace
- test(session-host): specify upgrade workspace isolation
- docs(session-host): define upgrade child authority
- fix(agent): 적대적 검증 — 거르는 자리가 틀렸고, 판별기가 가장 흔한 모양을 놓쳤다
- fix(agent): pane nonce 를 굳히지 않는다 — 한쪽이 움직이면 영영 어긋났다
- docs(agent-activity-view): 리베이스가 바꾼 것을 문서에 맞춘다 — AV2·AV2b
- feat(agent-activity): 줄 오른쪽 넷째 칸에 시각이 뜬다 — 활동 뷰 AV2b
- feat(agent-activity): 그 명령이 어떻게 끝났는지 보인다 — 활동 뷰 AV2
- docs(agent-activity-view): 결과 요약 칸이 무엇을 말하는지 정한다 — AV2
- fix(agent-activity): 상한에 걸리면 최신을 버리고 있었다 — 적대적 검증 O
- docs(agent-activity): 재지 않은 것을 마저 쟀다 — 적대적 검증 M·N
- fix(test): 워커 재우기를 아홉 판정자 전부에 넣는다 — 「절반만 고치기」 네 번째
- fix(agent-activity): 「한 곳으로 모았다」고 적고 절반만 옮겼다 — 적대적 검증 I·J·K
- fix(agent-activity): 첫 Tab 이 거의 항상 빈 화면이었다 — 적대적 검증 H1~H5
- docs(agent-activity): 「전체」가 계약보다 앞서 나갔다 — 적대적 검증 G1~G3
- fix(agent-activity): 「좁아서」가 틀린 원인이었다 — 적대적 검증 F1·F2
- fix(test): 내 판정자가 워커를 재우지 않아 남의 판정자가 죽었다
- docs(agent-activity): 계약이 보안 판단을 틀리게 만들고 있었다 — 적대적 검증 E1~E3
- docs(agent-activity): Tab 이 터미널 자동완성을 뺏는 것은 고른 트레이드오프다
- fix(agent-activity): 실측에 «의존»하고 있었다 — 적대적 검증 D1~D4
- fix(agent-activity): 목록이 통째로 비어도 「개수」만 적고 있었다 — 적대적 검증 C1~C3
- fix(agent-activity): 줄 목록이 격자의 클릭·호버·스크롤을 물려받고 있었다 — 적대적 검증 B2·B3
- fix(agent-activity): 명령을 「장」으로 세고 있었다 — 캡처가 잡은 단위 오류
- test(input): 접기 chord 캡처 훅을 더한다
- test(input): 팔레트 판정자가 접기 chord 를 고정하도록 뒤집는다
- feat(input): 접기 다섯에 ⌥⌘0·J·1~3 을 준다
- docs(configuration-input): 접기 chord 의 설정 왕복과 발견성 경로 (11~15회차)
- docs(configuration-input): 접기 chord 의 거절 경로와 사용자 설정 파급 (5~10회차)
- docs(configuration-input): 접기 다섯의 chord 를 정한다 (⌥⌘0·J·1~3)
- feat(session-host): order upgrade evidence leaves
- test(session-host): specify upgrade leaf transaction
- docs(session-host): define upgrade leaf transaction
- feat(remote-watch): exit 3 이 왜 났는지 남긴다 — 한 코드가 실패 아홉을 뭉갰다
- feat(session-host): wire live release workflow
- test(session-host): specify live release workflow
- docs(session-host): define live release workflow
- feat(session-host): run live validator commands
- test(session-host): specify live command bridge
- docs(session-host): define live command bridge
- docs(plans): copy_editor_selection 의 이유가 어느 문서 것인지 바로잡는다
- docs(key-input): 바뀐 정책을 §9.1·입력 설정·계획 문서에 반영한다
- docs(key-input): 고친 뒤의 뜻과 안 바뀌는 자리를 적는다 (D~F회차)
- docs(key-input): contains 수정이 터미널을 안 바꾼다 — 층만 바뀐다
- fix(build): 전역 sed 가 망가뜨린 expect-tests 값을 되돌린다
- test(input): 게이트 질의가 활성 탭 축도 보는지 잰다
- test(input): 게이트가 활성 pane 을 보고 Page 키만 먹는지 잰다
- test(input): 선-가로채기 게이트의 ABI 배선과 fail-open 방향을 잰다
- fix(input): 터미널 전용 선-가로채기를 Term 종류로 게이트한다
- docs(key-input): 무조건성·설정 대조군·판정 계획 (16~20회차)
- docs(key-input): 층이 넷이고 피해는 여섯이다 (4~15회차)
- docs(key-input): 게이트의 비교 뷰·누수·단일 출처를 적는다 (1~3회차)
- docs(key-input): 터미널 전용 선-가로채기의 게이트를 정한다
- docs(key-input): 충돌 전수 대조 — 가로채는 층이 셋이고 남은 충돌은 넷이다
- feat(session-host): pin live candidate inputs
- test(session-host): specify candidate input pinning
- docs(session-host): define candidate input pinning
- fix(file-tree): 원격 파일을 열어도 트리가 원격에 남는다 — RF7
- docs(file-tree): RF7 — 「모른다」와 「로컬이다」를 가른다
- feat(session-host): bootstrap workflow checkpoints
- test(session-host): specify workflow checkpoint bootstrap
- docs(session-host): define workflow checkpoint bootstrap
- feat(session-host): bridge action checkpoints
- test(session-host): specify action checkpoint bridge
- docs(session-host): define action checkpoint bridge
- feat(session-host): 보낼 것을 든 채 끊긴 연결을 남긴다 — 진단이 필요한 자리에서 스스로 침묵했다
- feat(session-host): attest candidate pair as one stage
- test(session-host): specify candidate pair attestation
- docs(session-host): define candidate pair attestation
ohah/pdf
PR (해당일 생성/머지)
상태는 조회 시점 기준입니다. merged는 아래 대상 브랜치에 병합됐다는 뜻이며, 기능 브랜치 병합과 main 반영을 구분합니다. 같은 PR이 생성일과 병합일 양쪽 기록에 나타날 수 있습니다.