2026-07-13
날짜는 UTC 기준으로 나눴습니다(9월 22일부터는 한국 시간 기준). 커밋은 커미터 시각(committer date), PR은 생성·병합 시각으로 분류했습니다. 목록은 2026-10-06 KST에 GitHub에서 다시 조회해 보강했습니다. 공개 저장소의 기본 브랜치 활동만 포함합니다.
요약 (AI 작성)
maru는 에이전트가 인앱 브라우저를 CLI로 다룰 수 있게 했습니다. §9.6 설계(#1361) 뒤 maru browser 클라이언트의 파서·wire·렌더(#1362)와 소켓 배선(#1363)이 들어갔고, 화면 캡처는 chunk-streaming 설계(#1365), 서버 측 스트리밍(#1366), CLI 재조립과 PNG 출력(#1367), 영역·배율 옵션(#1376) 순으로 완성됐습니다. 에이전트가 web surface를 찾는 browser.list(#1368)와 그 url이 빈칸으로 나오던 문제 수정(#1369), CSS 셀렉터 기반 click·type·scroll(#1375), 셀렉터 표시와 로드 완료를 기다리는 browser.wait(#1380)도 병합됐습니다.
저장소 쪽은 쿠키 쓰기·삭제(#1371)와 localStorage·clearStorage(#1374)로 §9.4 D4를 채웠습니다. 권한 UX는 확인 모달을 대상 창에 띄우고 중복을 막도록 다듬었고(#1372), "Revoke Browser Grants" 메뉴와 개별 grant 취소 서브메뉴로 부여한 권한을 되돌릴 수 있게 했습니다(#1373, #1377). 22·23차 리뷰에서 나온 쓰기 경로의 cross-origin 격리 누락과 screenshot 자원 상한 문제를 고치고 문서를 맞췄으며(#1370, #1378, #1379), 브라우저 성능 측정은 backend별 후속 결정으로 미뤘습니다(#1381). paste 큐 라우팅 테스트가 해제된 surface를 참조해 간헐적으로 죽던 문제도 고쳤습니다(#1364).
zntc는 "빌드는 성공하는데 산출물이 돌지 않는" 결함을 집중적으로 걷어냈습니다. 산출물을 다시 파싱하는 게이트와 for-await 다운레벨이 generator 안에 raw await를 남기던 문제 수정(#4489), 모듈 평가와 렌더 픽셀을 기준 번들러와 대조하는 렌더 패리티 게이트(#4506)를 새로 두었고, 결함이 고쳐지자 test.fail 마커를 걷어냈습니다(#4516). 수정된 결함은 minify의 if 폴딩 우선순위 괄호(#4484)와 단항 토큰 병합(#4486), ** 좌변 괄호 계약(#4490), 클로저 읽기와 재진입을 놓쳐 살아 있는 대입을 지우던 dead-store 제거(#4513), 구조 분해 할당의 shorthand와 기본값 리네임 누락(#4512), CJS 래퍼 파라미터를 mangler 예약어로 둔 수정(#4497)입니다.
코드 스플리팅 쪽에서는 같은 청크 소비자에 크로스-청크 공개명을 쓰던 문제(#4496, #4507), DCE된 심볼이 청크 export에 남던 문제(#4508), 크로스-청크 CJS import가 provider 청크의 require 썽크를 참조하던 문제(#4509)를 고쳤습니다. 파서는 중첩 new의 member 체인과 tagged template 흡수(#4504), argless new의 ZNTC0623 중복 진단(#4501), 깊은 타입 중첩의 스택 오버플로를 진단으로 바꾸는 수정(#4499)이 들어갔고, ./ 없는 상대 지정자를 쓰는 CSS url(logo.png)와 new URL("x.js", import.meta.url)의 재작성(#4498, #4487), seed에 따라 죽던 tsconfig_cache 테스트의 해제 후 참조 수정(#4511)도 병합됐습니다. 렌더 패리티 게이트에 monaco 케이스와 의미 대조 축을 더하는 PR #4517이 이날 열렸습니다.
공개 커밋 49개, 해당일 생성 또는 병합된 PR 41개를 정리했습니다. PR 생성 39개·병합 40개는 같은 PR이 양쪽에 포함될 수 있습니다.
커밋
ohah/maru
- docs(control-plane): 브라우저 성능 측정을 backend별로 보류
- feat(browser): wait selector/load 동기화 (5f-2)
- docs(control-plane): §9.4 D4·§9.5.7 산문을 23차 리뷰 격리·클램프에 동기화
- fix(browser): 23차 /code-review max 결함 (cross-origin 격리·screenshot 자원상한)
- feat(browser): per-grant revoke UI — 개별 grant 취소 서브메뉴 (§9.2)
- feat(browser): screenshot rect/scale (§9.5.7)
- feat(browser): act 5f-2 — click/type/scroll (CSS-selector, eval)
- feat(browser): localStorage + clearStorage (§9.4 D4 storage 완성)
- feat(browser): grant revoke — "Revoke Browser Grants" 메뉴 (§9.2 Model B)
- feat(browser): grant UX 경화 — target 창 모달 + dedup (§9.2 Model B)
- feat(browser): 쿠키 쓰기 — browser.setCookie/deleteCookie (§9.4 D4)
- fix(browser): 22차 /code-review max 결함 4건 (screenshot·browser.list slice)
- fix(macos): browser.list·session.get의 web url 빈칸 — collector가 nav 상태서 채움
- feat(browser): browser.list — 에이전트 web surface 발견 (§9.6.1)
- feat(cli): 5f-1-2 — maru browser screenshot (chunk 재조립 + PNG 출력, §9.5.7)
- feat(browser): 5f-1-1 — browser.screenshot 서버측 chunk-streaming (§9.5.7)
- docs(control-plane): 5f-1-0 — browser.screenshot chunk-streaming 구현 배선 설계 (§9.5.7)
- fix(macos): paste-큐 라우팅 테스트 간헐 crash 제거 (reap→dangling surface UAF)
- feat(cli): CLI-2 — maru browser 소켓 배선 (에이전트가 브라우저 제어)
- feat(cli): CLI-1 — maru browser 클라이언트 L2 순수 (파서·wire·렌더)
- docs(control): CLI-0 — maru browser CLI 설계 (§9.6 doc-first)
ohah/zntc
- test(e2e): 렌더 패리티 게이트의 test.fail 마커 제거 — #4493·#4503 수정 반영
- fix(bundler): #4494 크로스-청크 CJS import 가 provider 청크의 require 썽크를 참조
- chore(lint): #4503 stmtBreaksFlow 를 재귀-walker 감사 ALLOWLIST 에 등록
- fix(minify): #4503 dead-store 제거가 클로저 읽기·재진입을 놓쳐 살아 있는 대입문을 삭제
- chore(e2e): 렌더 패리티 게이트 devDependency(vite·pixelmatch·pngjs) lock 반영
- test(e2e): 렌더 패리티 게이트 — 3층(모듈평가)·4층(렌더+기준 대조) 신설
- fix(codegen): #4493 구조분해 할당의 shorthand+기본값에서 리네임이 누락되던 문제
- fix(test): tsconfig_cache 테스트의 use-after-free — seed 의존 SIGSEGV
- fix(parser): #4500 new callee 의 member/tagged-template 체인 흡수
- fix(bundler): #4495 const-inline/미사용 import 로 DCE 된 심볼이 청크 export 에 남던 문제
- fix(bundler): #4502 ns 객체 getter 가 같은 청크 소비자에게도 크로스-청크 공개명을 쓰던 문제
- fix(bundler): #4492 ns 멤버 재작성에도 같은 게이트 적용
- fix(bundler): #4492 같은 청크 소비자에게 크로스-청크 공개명을 적용하던 문제
- fix(parser): #4048 code-review max 반영 — 중첩 new 의 별개 위반을 삼키던 회귀 제거
- fix(parser): #4048 argless new 의 optional callee + trailing
?.에서 ZNTC0623 중복 발행 - fix(css): #4485
url(logo.png)—./없는 bare 상대 지정자가 재작성되지 않던 문제 - fix(parser): #4146 깊게 중첩된 타입 구문의 파서 스택 오버플로우를 진단으로 전환
- fix(codegen): #4491 CJS 래퍼 파라미터($e/$m)를 mangler 예약어로
- test(codegen): #4482 후속 —
**좌변 괄호 계약을 사후조건으로 강제 - chore(changeset): #4488 for-await generator await
- test(codegen): 산출물 재파싱 게이트 — "빌드 green + 파싱 불가" 계열 차단
- fix(transformer): #4488 for-await 다운레벨이 generator 안에 raw await 를 남김
- fix(resolve): #4483 code-review max 반영 — 정규화는 폴백으로, 회귀 3건 제거
- fix(resolve): #4483
new URL("x.js", import.meta.url)의./없는 worker 지정자 재작성 - fix(codegen): #4482 code-review max 반영 — 토큰 병합 판정을 출력 바이트 기준으로
- fix(codegen): #4482 단항 토큰 병합 + prefix-단항 리터럴의 load-bearing 괄호
- fix(codegen): #4481 code-review max 지적 반영 — ASI 주석 앵커 / let[ / 낭비 바이트
- fix(codegen): #4481 if → &&/?: 폴딩 시 precedence 괄호 재유도
PR (해당일 생성/머지)
상태는 조회 시점 기준입니다. merged는 아래 대상 브랜치에 병합됐다는 뜻이며, 기능 브랜치 병합과 main 반영을 구분합니다. 같은 PR이 생성일과 병합일 양쪽 기록에 나타날 수 있습니다.