2026-07-12
날짜는 UTC 기준으로 나눴습니다(9월 22일부터는 한국 시간 기준). 커밋은 커미터 시각(committer date), PR은 생성·병합 시각으로 분류했습니다. 목록은 2026-10-06 KST에 GitHub에서 다시 조회해 보강했습니다. 공개 저장소의 기본 브랜치 활동만 포함합니다.
요약 (AI 작성)
maru 컨트롤 플레인은 에이전트 브라우저 제어 프로토콜(5f)을 문서로 먼저 정리한 뒤 곧바로 구현했습니다. §9.4 프로토콜 리뷰와 §9.5 구현 설계, 3차 전수조사 정정, D3·D4·D5 결정 확정(#1326, #1327, #1328) 위에, 이벤트 구독·매칭 코어 EventBroker(#1329)와 응답·이벤트 통합 큐 OutboundQueue(#1330)를 만들었습니다. 서버는 직렬 accept를 연결당 스레드로 바꾸고(#1331), auth 한 번 뒤 같은 연결로 요청을 이어 받는 지속 세션(#1332), 스레드 안전한 OutboundChannel과 연결당 reader·writer 두 스레드 구조(#1334, #1335)로 재구성됐습니다.
이벤트는 메인 스레드 전용 SubscriberRegistry와 연결 수명 배선(#1337, #1338), browser.subscribe 배선(#1339), WKWebView url KVO로 browser.navigated를 보내는 처리(#1342)를 거쳐 실제로 흐르게 됐고, loadState·dialog·crashed·closed 이벤트와 서버 SIGPIPE 방어가 더해졌습니다(#1345). 권한 쪽은 세션 cap 누적(#1348, #1349), 쿠키·스토리지 열람을 분리한 browser_storage scope(#1350), browser.getCookies(#1351)로 이어졌습니다. 이어 capability 발급 UX를 pane 단위 확인 grant(Model B)로 개정하고(#1353), grant 저장소와 인가 합성, 확인 대기 요청 흐름, 실제 사용자 확인 모달까지 1e-confirm 단계를 모두 병합했습니다(#1354부터 #1360). 18차부터 22차까지 매 단계 리뷰 결함 수정도 함께 들어갔습니다.
앱 쪽에서는 파일·이미지·텍스트를 어느 pane에 떨어뜨려도 활성 pane에만 들어가던 회귀를 고치고, 붙여 넣기 대상을 큐에 넣는 시점에 고정했습니다(#1344). ESC로 에이전트를 끊으면 사이드바 스피너가 계속 진행 중으로 남던 버그는 인터럽트 감지를 넣고 리뷰 두 차례로 오탐을 줄여 고쳤습니다(#1347). theme.min-contrast는 다크 배경 위 어두운 전경도 보정하도록 양방향으로 넓히되, 기본 설정에서 밝히는 방향은 좁게 제한했습니다(#1343). read_error 종료를 trace에 기록하는 관측 PR #1289도 병합됐고, 코드 에디터·git diff 뷰어·LSP surface 설계 문서 PR #1340이 이날 열렸습니다.
zntc는 Vite식 query-suffix import(?raw, ?url, ?inline, ?worker)를 문서와 함께 추가하고 리뷰 지적 4건을 반영했습니다(#4478). CSS url()이 가리키는 자산을 실제로 방출하고 경로를 재작성하는 수정(#4469), class static block과 --jsx=preserve를 원문 복사 대신 AST로 출력하는 수정(#4473, #4477), minify의 쉼표 시퀀스 접기에서 문장 시작 괄호가 빠져 런타임 SyntaxError가 나던 버그 수정(#4474), 동명 basename 자산의 래퍼 이름 충돌 수정(#4476)이 병합됐습니다. e2e browser-smoke 패키지 버전 고정(#4471), v0.1.3 릴리스(#4479), 버전 lockstep과 bun.lock 동기화 자동화(#4480)도 들어갔고, if 폴딩 시 우선순위 괄호와 단항 토큰 병합을 고치는 PR #4484, #4486이 열렸습니다. ohah.github.io에는 오래된 오늘의 커밋 항목 정리 커밋이 있었습니다.
공개 커밋 60개, 해당일 생성 또는 병합된 PR 47개를 정리했습니다. PR 생성 46개·병합 44개는 같은 PR이 양쪽에 포함될 수 있습니다.
커밋
ohah/maru
- docs(control): 1e-confirm 완료 상태 동기화 (stale "남음" 마커 정정)
- feat(control): 1e-confirm-2b — 실 확인 모달 (env 스텁 → 사용자 grant 모달)
- feat(control): 1e-confirm-2a — held-across-ticks grant 확인 인프라 (모달 전 async hold)
- feat(control): 1e-confirm-1c-2 — held-request grant 흐름 (needs_grant→승인 시 grant+재구동)
- feat(control): 1e-confirm-1c-1 — needs_grant 결과 방출 (미grant valid=확인 대기 후보)
- fix(app): 오삽입 폴백 제거 + 클릭 규율·큐 회수·락 범위 (2차 code-review 반영)
- fix(app): 드롭 라우팅 거부/폴백 분리 + 큐·테스트 결함 수정(code-review 반영)
- fix(app): paste 대상을 enqueue 시점에 고정 — surface별 큐 + 비동기 업로드/확인 모달
- fix(app): 드롭 라우팅 가드 — "포커스 이동=라우팅"이 새던 구멍 차단(code-review 반영)
- fix(app): 드래그앤드롭이 떨어뜨린 pane으로 들어가게 (활성 pane 고정 회귀)
- fix(agent): 인터럽트 판별 오탐 제거 + codex tail 절단/latch 구멍 (2차 code-review 반영)
- fix(agent): 인터럽트 감지 실효성 확보 — 실측 형태 누락·소비처 구멍 수정(code-review 반영)
- fix(agent): ESC 인터럽트를 감지 — 스피너가 "진행 중"에 영구 고착되던 버그
- feat(control): 1e-confirm-1b — browser authz에 pane confirm-grant 합성 (세션 cap OR grant)
- feat(control): 1e-confirm-1a — PaneGrantStore L2 순수 코어 (Model B grant 저장소)
- docs(control): 1e-confirm-0 — §9.2 개정 Model B pane-bound confirm-grant (doc-first)
- fix: 22차 /code-review max 결함 수정 (cap 누적 → cookies 보안)
- feat(control): 5f-4c — browser.getCookies (WKHTTPCookieStore, D5 browser_storage 게이트 실동작)
- feat(control): 5f-4b — browser_storage ScopeClass (D5 쿠키 분리 게이트)
- feat(control): 5f-4a-2 — auth.grant로 세션 cap 누적 (cap 누적 완성)
- feat(control): 5f-4a-1 — dispatchAuthenticated가 cap 집합 수용 (누적 토대)
- fix: 21차 /code-review max 결함 수정 (closed 종료 마커 correctness)
- fix(theme): 밝히는 방향을 좁게 — 기본 설정 회귀 차단(code-review 반영)
- fix(theme): min-contrast 양방향 보정 — 다크 배경의 어두운 전경이 안 보이던 갭
- feat(control): 5f-3 — 이벤트 확장 (loadState/dialog/crashed/closed) + 서버 SIGPIPE 방어
- feat(control): 5f-0b-3c — WKWebView url KVO → browser.navigated 이벤트 주입
- fix: 20차 /code-review max 결함 수정 (이벤트 구독 인프라)
- feat(control): 5f-0b-3b — browser.subscribe dispatch 배선 (동기 registry 등록)
- docs(observability): 종료 트리거 판독 워크플로 + surface-runtime-api read_error 정정
- feat(observability): read_error를 trace에 read-error kind로 기록 (종료 트리거 진단)
- feat(control): 5f-0b-3a-2 — SubscriberRegistry 연결 수명 배선 (leaf-mutex pivot)
- feat(control): 5f-0b-3a — SubscriberRegistry (메인 전용 이벤트 라우팅, 순수 로직)
- fix: 19차 /code-review max 결함 수정 (2b-2 동시성 재아키텍처)
- feat(control): 5f-0b-2b-2-β — 연결당 reader+writer 2-스레드 (응답을 outbound 경유)
- feat(control): 5f-0b-2b-2-α — OutboundChannel (스레드-안전 per-connection outbound)
- fix: 18차 /code-review max 결함 수정 (지속 세션 null-close 버그 외)
- feat(control): 5f-0b-2b-1 — 지속 세션 (auth 1회 + 순차 요청 루프)
- feat(control): 5f-0b-2a — 연결당 스레드 (직렬 accept 폐기·head-of-line 블로킹 제거)
- feat(control): 5f-0b-1 — OutboundQueue 순수 구조 (응답+이벤트 통합 큐·coalesce·purge)
- feat(control): 5f-0a — EventBroker L2 순수 코어 (browser 이벤트 구독·매칭·직렬화)
- docs(control-plane): §9.4/§9.5 3차 전수조사 정정 (모순·gap·stale 해소)
- docs(control-plane): §9.5 5f-0 구현 설계 (§9.4 감사 후속 A1~A5 해소, doc-first)
- docs(control-plane): §9.4 D3/D4/D5 확정 (사용자 결정)
- docs(control-plane): §9.4 에이전트 제어 프로토콜 리뷰 (5f 선행, doc-first)
ohah/ohah.github.io
ohah/zntc
- chore(release): publish 직후 bun.lock 자동 동기화 + main CI 복구
- chore(release): root/platform/optionalDeps 버전 lockstep 자동화
- chore(release): v0.1.3
- fix(resolve): #4467 code-review max 지적 4건 반영
- fix(resolve): #4467 ?worker 합성 소스의 basename JS escape
- docs: #4467 Vite query-suffix import 문서화 (Astro en + 루트 docs)
- feat(resolve): #4467 Vite query-suffix import (?raw / ?url / ?inline / ?worker)
- fix(codegen): #4470 --jsx=preserve 를 소스 원문 복사가 아니라 AST 로 출력
- fix(linker): #4475 semantic 없는 모듈(asset/disabled)의 래퍼 이름 deconflict
- docs(errors): ZNTC0415 (static block 데코레이터) 에러 문서 생성
- fix(codegen): #4468 class static block 을 소스 원문 복사가 아니라 AST 로 출력
- test(css): #4466 CSS Modules url() 기대치를 자산 파이프라인 계약으로 갱신
- fix(css): #4466 CSS url() 자산 방출 + url 재작성
- fix(codegen): #4472 minify comma-sequence 접기 시 statement-start 괄호 소실
- fix(test): e2e browser-smoke 패키지 버전 고정 — 상위 메이저 릴리스가 CI 를 깨뜨리지 않도록
PR (해당일 생성/머지)
상태는 조회 시점 기준입니다. merged는 아래 대상 브랜치에 병합됐다는 뜻이며, 기능 브랜치 병합과 main 반영을 구분합니다. 같은 PR이 생성일과 병합일 양쪽 기록에 나타날 수 있습니다.