2026-07-13
요약 (AI 작성)
에이전트가 브라우저를 실제로 몰 수 있게 만든 날입니다. §9.6 을 doc-first 로 쓴 뒤 CLI-1 클라이언트 L2 순수(파서·wire·렌더)와 CLI-2 소켓 배선으로 maru browser 를 세웠고, 화면 캡처는 5f-1-0 설계 → 5f-1-1 서버측 chunk-streaming → 5f-1-2 CLI 재조립 + PNG 출력으로 한 축을 끝낸 뒤 rect/scale 옵션까지 붙였습니다. browser.list 로 에이전트가 web surface 를 발견하게 하고, act 5f-2 로 CSS 셀렉터 기반 click/type/scroll 을, 저장소 쪽은 쿠키 쓰기(setCookie/deleteCookie)와 localStorage·clearStorage 로 §9.4 D4 를 완성했습니다. 권한 UX 는 target 창 모달과 dedup 으로 경화하고, "Revoke Browser Grants" 메뉴와 개별 grant 취소 서브메뉴를 더해 회수 경로를 열었습니다. 22·23차 /code-review max 결함(screenshot·browser.list slice, cross-origin 격리와 screenshot 자원 상한)을 반영하고 §9.4·§9.5 산문을 그 결과에 동기화했으며, paste-큐 라우팅 테스트의 간헐 crash(reap→dangling surface UAF)와 browser.list·session.get 의 web url 빈칸도 잡았습니다.
zntc 는 "빌드는 green 인데 산출물이 안 돌아가는" 계열을 집중적으로 걷어냈습니다. 렌더 패리티 게이트를 3층(모듈 평가)·4층(렌더 + 기준 번들러 픽셀 대조)으로 신설하고 산출물 재파싱 게이트를 추가해, 이후 #4493·#4503 수정이 들어오자 test.fail 마커를 걷어냈습니다. 실제 결함으로는 #4503 dead-store 제거가 클로저 읽기·재진입을 놓쳐 살아 있는 대입을 지우던 문제, #4493 구조분해 할당의 shorthand+기본값에서 리네임이 누락되던 문제, #4494·#4495·#4502·#4492 로 이어진 크로스-청크 계열(require 썽크 참조, DCE 된 심볼의 export 잔류, ns getter 의 공개명 오적용)을 정리했습니다. 파서·코드젠 쪽은 #4500 new callee 의 member/tagged-template 체인 흡수, #4048 argless new 의 optional callee 중복 진단, #4146 깊은 타입 중첩의 스택 오버플로우를 진단으로 전환, #4482 토큰 병합 판정을 출력 바이트 기준으로 바꾸는 작업이 있었고, #4485 url(logo.png) 와 #4483 new URL("x.js", import.meta.url) 의 ./ 없는 상대 지정자 재작성, #4491 CJS 래퍼 파라미터의 mangler 예약, #4488 for-await 다운레벨의 raw await 잔류도 함께 해결했습니다.
커밋
ohah/maru
- docs(control-plane): 5f-1-0 — browser.screenshot chunk-streaming 구현 배선 설계 (§9.5.7)
- docs(control): CLI-0 — maru browser CLI 설계 (§9.6 doc-first)
- feat(cli): CLI-2 — maru browser 소켓 배선 (에이전트가 브라우저 제어)
- fix(macos): paste-큐 라우팅 테스트 간헐 crash 제거 (reap→dangling surface UAF)
- feat(browser): 5f-1-1 — browser.screenshot 서버측 chunk-streaming (§9.5.7)
- feat(cli): 5f-1-2 — maru browser screenshot (chunk 재조립 + PNG 출력, §9.5.7)
- fix(macos): browser.list·session.get의 web url 빈칸 — collector가 nav 상태서 채움
- feat(browser): browser.list — 에이전트 web surface 발견 (§9.6.1)
- fix(browser): 22차 /code-review max 결함 4건 (screenshot·browser.list slice)
- feat(cli): CLI-1 — maru browser 클라이언트 L2 순수 (파서·wire·렌더)
- 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)
- feat(browser): localStorage + clearStorage (§9.4 D4 storage 완성)
- feat(browser): act 5f-2 — click/type/scroll (CSS-selector, eval)
- docs(control-plane): §9.4 D4·§9.5.7 산문을 23차 리뷰 격리·클램프에 동기화
- fix(browser): 23차 /code-review max 결함 (cross-origin 격리·screenshot 자원상한)
- feat(browser): screenshot rect/scale (§9.5.7)
- feat(browser): per-grant revoke UI — 개별 grant 취소 서브메뉴 (§9.2)
ohah/zntc
- [fix(codegen): #4481 code-review max 지적 반영 — ASI 주석 앵커 / let / 낭비 바이트
- fix(codegen): #4481 if → &&/?: 폴딩 시 precedence 괄호 재유도
- fix(css): #4485
url(logo.png)—./없는 bare 상대 지정자가 재작성되지 않던 문제 - fix(parser): #4048 code-review max 반영 — 중첩 new 의 별개 위반을 삼키던 회귀 제거
- fix(parser): #4048 argless new 의 optional callee + trailing
?.에서 ZNTC0623 중복 발행 - fix(bundler): #4492 ns 멤버 재작성에도 같은 게이트 적용
- fix(bundler): #4492 같은 청크 소비자에게 크로스-청크 공개명을 적용하던 문제
- chore(changeset): #4488 for-await generator await
- test(codegen): 산출물 재파싱 게이트 — "빌드 green + 파싱 불가" 계열 차단
- fix(transformer): #4488 for-await 다운레벨이 generator 안에 raw await 를 남김
- test(codegen): #4482 후속 —
**좌변 괄호 계약을 사후조건으로 강제 - fix(codegen): #4482 code-review max 반영 — 토큰 병합 판정을 출력 바이트 기준으로
- fix(codegen): #4482 단항 토큰 병합 + prefix-단항 리터럴의 load-bearing 괄호
- fix(parser): #4146 깊게 중첩된 타입 구문의 파서 스택 오버플로우를 진단으로 전환
- fix(codegen): #4491 CJS 래퍼 파라미터($e/$m)를 mangler 예약어로
- fix(resolve): #4483 code-review max 반영 — 정규화는 폴백으로, 회귀 3건 제거
- fix(resolve): #4483
new URL("x.js", import.meta.url)의./없는 worker 지정자 재작성 - fix(bundler): #4502 ns 객체 getter 가 같은 청크 소비자에게도 크로스-청크 공개명을 쓰던 문제
- fix(bundler): #4495 const-inline/미사용 import 로 DCE 된 심볼이 청크 export 에 남던 문제
- test(e2e): 렌더 패리티 게이트의 test.fail 마커 제거 — #4493·#4503 수정 반영
- fix(bundler): #4494 크로스-청크 CJS import 가 provider 청크의 require 썽크를 참조
- chore(e2e): 렌더 패리티 게이트 devDependency(vite·pixelmatch·pngjs) lock 반영
- test(e2e): 렌더 패리티 게이트 — 3층(모듈평가)·4층(렌더+기준 대조) 신설
- chore(lint): #4503 stmtBreaksFlow 를 재귀-walker 감사 ALLOWLIST 에 등록
- fix(minify): #4503 dead-store 제거가 클로저 읽기·재진입을 놓쳐 살아 있는 대입문을 삭제
- fix(codegen): #4493 구조분해 할당의 shorthand+기본값에서 리네임이 누락되던 문제
- fix(test): tsconfig_cache 테스트의 use-after-free — seed 의존 SIGSEGV
- fix(parser): #4500 new callee 의 member/tagged-template 체인 흡수