2026-09-09
날짜는 UTC 기준으로 나눴습니다(9월 22일부터는 한국 시간 기준). 커밋은 커미터 시각(committer date), PR은 생성·병합 시각으로 분류했습니다. 목록은 2026-10-06 KST에 GitHub에서 다시 조회해 보강했습니다. 공개 저장소의 기본 브랜치 활동만 포함합니다.
요약 (AI 작성)
maru에 앱 아이콘이 생긴 날입니다. 앰버 커서 모티프로 세 플랫폼 아이콘을 넣고(M11b, #3445), 두 덩이의 자리를 맞바꿔 「마」는 느낌으로만 남겼으며(#3460), 켤 때 번쩍이지 않는 런치 스크린을 붙였습니다(M11d, #3462). 모바일은 배포 준비 중 개발 쪽에서 미리 할 수 있는 셋을 했고(M11a, #3441), 첫 실행에 키가 안 서던 것을 Android(여는 자리를 Java로, #3419)와 iOS(파일을 세운다, #3423) 양쪽에서 고치고 알림 권한을 붙을 때 묻게 해 M16을 닫았습니다. 폰에서 실패가 아무 데도 안 남던 것에 진단 복사(M15a, #3433)와 죽은 자리 기록(M15b, #3435)을 붙이고, 하네스가 조용히 빗나가던 것을 재서 알게 했습니다(M8, #3439).
터미널은 kitty 프로토콜을 넓혔습니다. 번호로 보내는 I= 이미지(#3418), key release/repeat를 보고하는 report_events(#3421), 부모 기준 relative placement(#3427), 번호·커서 자리로 지우는 delete 타깃(#3442), keyboard flag 4·8·16(#3450), OSC 99 데스크톱 알림(#3459)을 얻었습니다. placeholder가 셋째 diacritic을 안 읽어 I= 이미지가 안 뜨던 것, 키를 뗄 때 글자가 한 번 더 나가던 자모 이중 입력(#3449, #3463), 누르고 있어도 반복이 안 먹던 것, alt 화면의 kitty flag가 셸로 새 앱이 죽으면 Ctrl+C가 먹통이던 것(#3464)도 고쳤습니다. 편집기는 줄 끝 너머로 미는 editor.scroll-beyond-last-column을 더하고(#3420), 구문 접힘 승격도 가로 상한·위치를 버리지 않게 했습니다.
활동 뷰는 전날 열린 #3415로 Enter가 본문까지 넓히게 됐고, Codex 결과 배열을 이어 읽으며(#3436) JS 껍데기를 벗겨 안쪽 도구와 명령을 보이게 했습니다(§2.2, #3461). 원격 채널은 hello를 놓친 채널을 죽은 것으로 보게 해 열 세션 중 둘만 서던 문제를 고쳤고(#3466), 침묵으로 죽은 채널을 되살리는 #3470은 이날 PR이 열렸습니다. 소스 컨트롤 원격 감시자는 git이 왜 실패했는지까지 남깁니다(v8, #3457). session-host는 원격 실측 입력과 timing artifact 출처를 검증·결속하고, 원격 Release metadata와 변경 전후 봉인, asset 다운로드, semantic 파일, 관측과 verdict 결속, verifier 배선, 통과 기록 보존(#3451)까지 이었으며, 양쪽 로그를 이어붙일 손잡이(#3403)와 선행 검사가 거부한 이유(#3469)를 남기게 했습니다.
hwpjs는 JPEG 디코더를 세웠습니다. 엔트로피 비트와 Huffman 심볼, 순차 계수 블록과 스캔·restart 구간, 양자화와 IDCT·샘플 복원, 프로그레시브 스캔과 계수 조립, JFIF·JFXX 썸네일·Adobe 메타데이터·내장 ICC 재조립까지 다루고 HWP5의 내장 JPEG 검사에 연결했습니다. BMP는 비압축과 RLE를 명시적 부분 인덱스 평면으로 풀고 V5 프로파일과 내장 ICC를 검사했으며, GIF 인덱스 프레임 디코드도 시작했습니다.
공개 커밋 119개, 해당일 생성 또는 병합된 PR 57개를 정리했습니다. PR 생성 55개·병합 54개는 같은 PR이 양쪽에 포함될 수 있습니다.
커밋
ohah/hwpjs
- feat(image): decode bounded GIF indexed frames
- test(hwp5): audit preview image corpus and validation gaps
- feat(hwp5): validate embedded BMP profiles with independent budgets
- feat(image): inspect BMP V5 profile transport and embedded ICC
- feat(hwp5): render RLE BMPs with explicit unwritten pixel policies
- feat(image): decode BMP RLE into explicit partial index planes
- feat(hwp5): inspect embedded BMPs with isolated RGBA budgets
- feat(image): decode uncompressed Windows BMP with bounded layouts
- feat(hwp5): inspect embedded JFIF JPEGs with isolated RGB budgets
- feat(image): assemble progressive JFIF RGB with precision history
- feat(image): restore progressive JPEG samples with exact rational ties
- feat(image): assemble owned progressive JPEG coefficient frames
- feat(image): decode progressive JPEG scans with shared restart handling
- feat(image): decode progressive JPEG block coefficients atomically
- feat(image): assemble unmanaged JFIF RGB rasters with metadata checks
- feat(image): preserve JPEG Adobe metadata and separate print encoding rules
- feat(image): reassemble JPEG ICC profiles and validate structure
- feat(image): reconstruct centered JPEG component samples
- feat(image): add exact JFIF sample colour conversion
- feat(image): validate JFIF and JFXX marker placement
- feat(image): decode JFXX thumbnails with shared JPEG validation
- feat(image): parse JFIF metadata and validate frame constraints
- feat(image): assemble cropped JPEG component sample planes
- feat(image): reconstruct JPEG blocks with IDCT and sample restoration
- feat(image): preserve JPEG quantizers and dequantize coefficient blocks
- feat(image): decode JPEG sequential frames with component coverage
- feat(image): decode JPEG sequential scans and restart intervals
- feat(image): decode JPEG sequential coefficient blocks
- feat(image): decode JPEG entropy bits and Huffman symbols
- feat(image): validate JPEG structure and restart markers
- feat(image): validate progressive JPEG scan history
ohah/maru
- test(terminal): 적대적 검증 그물 둘 — 실제 앱 바이트와 할당 실패
- feat(session-host): 선행 검사가 «왜» 거부했는지 남긴다
- fix(agent): hello 를 놓친 채널은 죽는다 — 열 세션 중 둘만 서던 자리
- fix(terminal): alt 화면의 kitty flag 가 셸로 샜다 — 앱이 죽으면 Ctrl+C 가 먹통
- fix(chrome): 키를 뗀 것이 chrome 입력으로 새서 글자가 두 번 들어가던 것
- docs(native-editor): 매핑 레이어 재평가 트리거에 «접힘 토글의 재계산 비용» 을 더한다
- fix(agent-activity): 안쪽 도구 벗기기 — 적대적 3회가 찾은 셋을 고친다
- feat(agent-activity): Codex 는 JS 껍데기를 벗겨 안쪽 도구와 명령을 보인다 (§2.2)
- feat(mobile): 런치 스크린 — 켤 때 번쩍이지 않는다 (M11d)
- fix(mobile): 아이콘 판정자가 CI 를 세웠다 — 근거 없는 전제와 삼킨 출력 (M11c)
- fix(mobile): 글자를 또박또박 쓰지 않는다 — 자리만 바꾼다 (M11c)
- feat(mobile): 아이콘 모티프를 「마」로 — 두 덩이를 좌우만 바꿨다 (M11c)
- feat(terminal): OSC 99 — kitty 데스크톱 알림
- feat(scm): 원격 감시자가 git 이 «왜» 실패했는지까지 남긴다 (v8)
- fix(terminal): 누르고 있어도 반복이 안 먹던 것 — repeat 은 press 와 같다
- fix(editor): 구문 접힘 승격도 가로 상한·위치를 안 버린다 — 세 번째 자리
- docs(session-host): align upgrade activation status
- test(session-host): exercise restore postcommit failures
- test(session-host): exercise restore precommit failures
- docs: specify restore activation failure matrix
- feat(session-host): audit remote release pass artifact
- docs: specify remote release pass audit
- feat(terminal): kitty keyboard flag 4·8·16 — 대체 키·모든 키·연관 텍스트
- feat(session-host): publish remote release pass record
- docs: specify remote release pass record
- fix(terminal): 키를 뗄 때 글자가 한 번 더 나가던 것 (자모 이중 입력)
- feat(session-host): 양쪽 로그를 이어붙일 손잡이와 시각을 남긴다
- feat(session-host): wire remote release verifier
- docs: specify remote release verifier wiring
- fix(terminal): placeholder 가 셋째 diacritic 을 안 읽어 I= 이미지가 안 떴다
- feat(session-host): bind remote release verdict
- docs: specify remote release verdict binding
- feat: 앱 아이콘 — 앰버 커서 모티프, 세 플랫폼 (M11b)
- test(editor): 빠른 고리가 이름이 아니라 «모듈 경로» 로 고른다 — 224개가 0번 돌고 있었다
- feat(session-host): bind remote release observation
- docs: specify remote release observation ownership
- chore(wasm): kitty delete 타깃을 wasm 코어에 반영한다
- feat(terminal): kitty delete 타깃 d=n·d=c — 번호로, 커서 자리로 지운다
- fix(editor): 밴드가 어느 Term 의 것인지 두 곳에서 말하지 않는다 — 변이 9~11회차
- test(editor): 길이만 같은 남의 경로를 루트 자신으로 보지 않는다 — 변이 8회차
- test(editor): 루트 선택 판정자 둘도 고리에 넣는다 — 변이 6회차
- docs(editor): breadcrumb 은 이미 저장소 루트 기준이다 — 낡은 문장 넷과 안 돌던 판정자 일곱
- feat(mobile): 배포 준비 — 개발 쪽에서 미리 할 수 있는 셋 (M11a)
- chore(wasm): rebase 후 wasm 코어를 다시 만든다
- fix(session-host): RemoteRuntime 크기를 다시 재서 적는다 — 리베이스로 두 변경이 겹쳤다
- chore(wasm): rebase 후 wasm 코어를 다시 만든다
- fix(terminal): relative placement 의 H/V 오버플로 — 한 줄로 터미널이 죽었다
- feat(terminal): kitty relative placement (P/Q/H/V) — 부모 기준으로 이미지를 놓는다
- fix(agent-activity): Codex 결과는 배열이다 — 원소를 이어 읽는다 (§2.4·§2.1.1)
- feat(session-host): bind held release semantic files
- docs: specify remote release semantic file binding
- fix(mobile): 자가 검사 건너뛰기 조건이 틀렸다 — macOS 인가로 가른다 (M8)
- fix(mobile): 하네스가 조용히 빗나가고 있었다 — 재서 알고, 안 되면 말한다 (M8)
- chore(wasm): rebase 후 wasm 코어를 다시 만든다
- fix(terminal): report_events 의 repeat 을 침묵시키던 것을 고친다 — 길게 눌러도 한 글자만 들어갔다
- feat(terminal): kitty report_events — key release/repeat 를 보고한다 (flag 2)
- feat(session-host): bind remote release semantics
- docs: specify remote release observation transaction
- feat(terminal): kitty
I=image number — 번호로 보내는 클라이언트의 이미지가 뜬다 - feat(mobile): 죽으면 그 자리를 남긴다 — 다음 실행이 보여 준다 (M15b)
- fix: keep cleanup failure ownership deterministic
- feat: download remote release assets by exact id
- docs: specify remote release asset downloads
- fix(agent-activity): 적대적 6~10회 — 펼침이 남의 줄을 가리키고, 0 건이 「못 봤다」를 덮었다
- fix(agent-activity): 적대적 4·5회 — 겹치면 재질문이 묻히고, 계약이 코드보다 많이 약속했다
- fix(agent-activity): 적대적 3회 — 본문 검색이 잃지 않고, 「이하 생략」이 되살아난다
- feat(agent-activity): 본문 검색을 헤드리스로 찍는다 + 계약·정지 축을 맞춘다 (BS1)
- feat(agent-activity): Enter 가 본문까지 넓힌다 — 라벨은 세션의 2.9% 다 (BS1)
- feat(mobile): 폰에서 실패가 아무 데도 안 남았다 — 진단을 복사할 수 있게 한다 (M15a)
- feat(session-host): 원격 Release 변경을 전후 봉인한다
- docs(session-host): 원격 Release fence를 정의한다
- test(editor): 가로 축의 안 재던 자리 다섯을 잰다 — 변이 6회차가 연 구멍
- feat(session-host): 원격 Release metadata를 결속한다
- docs(session-host): 원격 Release metadata gate를 정의한다
- docs(mobile): M16 을 닫는다 — 첫 실행 경험 네 조각이 다 섰다
- fix(android): 알림이 떠 있으면서 안 보였다 — 붙을 때 권한을 묻는다 (M16c)
- feat(session-host): live timing 검증기를 배선한다
- docs(session-host): live timing 원격 gate를 정의한다
- feat(session-host): 원격 timing artifact를 안전하게 가져온다
- docs(session-host): 원격 timing transport 계약을 정의한다
- docs(mobile): M16b 를 닫는다 — 두 기기 다 첫 실행에 키가 선다
- feat(ios): 키를 «만드는» 자리가 없었다 — 첫 실행에 파일을 세운다 (M16b-2)
- fix(android): 첫 실행에 키가 안 섰다 — 여는 자리를 Java 로 옮긴다 (M16b-1)
- feat(session-host): 원격 timing artifact 출처를 결속한다
- docs(session-host): timing artifact 출처 계약을 정의한다
- feat(editor): 줄 끝 너머로 민다 — editor.scroll-beyond-last-column (기본 5)
- feat(session-host): 원격 실측 입력을 검증한다
- docs(session-host): 원격 실측 증거 계약을 정의한다
PR (해당일 생성/머지)
상태는 조회 시점 기준입니다. merged는 아래 대상 브랜치에 병합됐다는 뜻이며, 기능 브랜치 병합과 main 반영을 구분합니다. 같은 PR이 생성일과 병합일 양쪽 기록에 나타날 수 있습니다.