2026-07-14
요약 (AI 작성)
브라우저 제어의 눈과 손을 붙인 날입니다. 접근성 스파이크를 대체하는 §9.5.4 설계를 먼저 쓰고(ref = data-maru-ref 확정, 엔진 중립 note, Safari 선례 없음 정정), snapshot-1 로 ARIA 트리를 read-only eval 하는 서버측 스냅샷을, snapshot-2 로 그 ref 를 locator 삼아 click/type/scroll 하는 ref 기반 act 를 얹었습니다. 스냅샷 결과가 scriptResultString 을 거치며 JSON 이 이중 인코딩되던 문제도 우회로 정리했습니다.
executeScript 는 결과 전송 계약을 처음부터 다시 세웠습니다. JSON-RPC bulk 전송 경계와 결과 전송 상한을 문서로 못박은 뒤, chunk wire 계약·실행 예약 수명주기·결과 pull ABI·progressive 결과 pump 를 차례로 깔고, page 결과를 bounded 로 직렬화해 구조화된 형태로 돌려주도록 했습니다. outbound wire byte 회계와 결과 바이트 회계를 함께 넣어 전송량을 계측 가능하게 만들었고, async expression 지원과 result pump 활성화로 실제 사용 경로를 열었습니다. 그 밖에 browser op 수명주기 경합을 보강하고, /code-review max 가 짚은 macOS exec/screenshot 회귀와 getLocalStorage 손상·dead code 를 정리했으며, New Browser Tab 에 ⌘⌥T 기본 단축키를 부여했습니다. coalesce 바이트 admission 의 stale 프레임 한계는 미수정 상태로 문서에 남겼습니다.
zntc 는 번들러의 심볼 충돌·순환 계열을 하루 종일 파고들었습니다. #4522 code-split 된 동적 CJS import 가 named 멤버를 잃던 무성 오컴파일에서 시작해, #4524 --preserve-modules × CJS 가 통째로 깨지던 것, #4526 forwarding holder 변수가 사용자 top-level 심볼과 충돌해 CJS↔CJS 순환이 로드 시 TypeError 를 내던 것, #4528 wrap 된 모듈의 잔여 결함 3건, #4530 래퍼 심볼이 deconflict 되지 않아 파싱조차 안 되던 것까지 이어졌습니다. 특히 매 수정마다 리뷰가 회귀를 잡아내(첫 수정이 만든 하드 회귀 4건, exports_X 도 lazy 여야 한다는 지적, 두 개의 독립 $N 할당기가 근본이라는 결론) 고쳐-깨짐-다시-고침을 반복한 하루였습니다. 함께 '빌드 green + 실행 실패' 잔여 7건(#4505 #4510 #4514 #4515 #4518 #4519 #4520)을 일괄 정리하고, 렌더 패리티 게이트에 monaco 케이스와 의미(semantic) 대조 축을 추가했습니다.
커밋
ohah/maru
- feat(browser): ref 기반 act — click/type/scroll에 snapshot ref locator (snapshot-2, §9.5.4)
- fix(browser): snapshot 결과를 scriptResultString 우회 — JSON 이중 인코딩 방지
- feat(browser): snapshot 서버측 — ARIA 트리 read-only eval (snapshot-1, §9.5.4)
- docs(control-plane): §9.5.4 정정 — Safari snapshot 선례 없음·ref=data-maru-ref 확정·엔진 중립 note
- docs(control-plane): snapshot + ref 기반 act 설계 (§9.5.4 — a11y 스파이크 supersede)
- docs(control-plane): coalesce 바이트 admission stale 프레임 한계 문서화 (#4 미수정)
- fix(browser): /code-review max 결함 — macOS exec/screenshot 회귀·getLocalStorage 손상·dead code 정리
- feat(keybind): New Browser Tab 기본 단축키 ⌘⌥T
- fix(control): browser op 수명주기 경합 보강
- feat(control): executeScript async expression 지원
- feat(control): browser result pump 활성화
- feat(control): executeScript page 결과 bounded 직렬화
- feat(control): progressive 결과 pump 기반 추가
- feat(control): executeScript 결과 pull ABI
- feat(control): executeScript 실행 예약 수명주기
- docs(control-plane): JSON-RPC bulk 전송 경계 명시
- feat(control): account outbound wire bytes
- feat(browser): define executeScript chunk wire
- feat(control): add executeScript result byte accounting
- style(browser): format executeScript control code
- feat(browser): return bounded structured executeScript results
- docs(control-plane): bound executeScript result transfer
ohah/zntc
- fix(review): #4530 래퍼 이름을 바꾸지 말고 예약하라 — 두 개의 독립 $N 할당기가 근본
- fix(bundler): #4530 래퍼 심볼이 사용자 top-level 심볼과 deconflict 되지 않아 파싱 불가
- style: zig fmt
- fix(review): #4528 소비자 forwarding 이 init 전에 갱신해 여전히 undefined 였다
- docs(test): #4523 module_test 에 박제돼 있던 낡은 전제 수정
- fix(review): #4528 첫 수정이 만든 회귀 4건 — entry 호출 / cjs 값 스냅샷 / 무력한 가드
- fix(bundler): #4528 preserve-modules × wrap 된 모듈의 남은 결함 3건
- fix(review): #4526 exports_X 도 lazy 여야 한다 — 절반만 고쳤던 순환 freeze
- fix(bundler): #4526 forwarding holder 변수가 사용자 top-level 심볼과 충돌
- fix(bundler): #4526 preserve-modules + --format=cjs 의 CJS↔CJS 순환이 로드 시 TypeError
- fix(review): #4524 래퍼 심볼 전반으로 일반화 + eager 호출 제거 + 헬퍼 게이트 회귀
- fix(bundler): #4524 provider/consumer 술어가 format 에서 어긋나던 것 (--format=cjs)
- fix(bundler): #4524 --preserve-modules × CJS 가 통째로 깨지던 것
- fix(review): #4522 첫 수정이 만든 하드 회귀 4건 — 재작성기 취약화 / 술어 복붙 / MF·plugin 청크
- fix(bundler): #4522 code-split 된 동적 CJS import 가 named 멤버를 잃던 무성 오컴파일
- docs(errors): ZNTC0920(expr_too_deeply_nested) 에러 문서 생성
- fix(review): /code-review max 가 잡은 확정 결함 6건 — 새 회귀 3건 포함
- test(integration): #4514 #4515 스스로 틀린 기대를 갖고 있던 신규 테스트 2건 교정
- chore(changeset): #4505 #4510 #4515 #4518 #4519 #4520 changeset 추가
- test(tsc): #4505 오컴파일을 박제하고 있던 TSC 스냅샷 갱신
- fix(bundler): #4510 CJS interop 잔여 3건 — 크로스-청크 ns / 비-식별자 멤버명 / 동적 import default
- fix(bundler): #4520 인라인된 dynamic import 의 모듈 방출 순서가 의존성 역순 → TDZ
- fix(minify): #4514 dead-store purity 가 member access 를 pure 로 봐서 부수효과를 삭제
- fix(codegen): #4515 구조분해 shorthand 의 값 치환 우회 + undefined peephole 섀도잉 오적용
- fix(parser): #4505 TS 접미사(
!/<T>)가 new 의 callee 밖으로 새던 silent miscompile - fix(parser): #4518 #4519 Flow 타입 / 깊은 식 중첩의 재귀-하강 스택 오버플로우
- test(e2e): 렌더 패리티 게이트에 monaco 케이스 + 의미(semantic) 대조 축 추가