2026-07-12
요약 (AI 작성)
에이전트 제어 프로토콜(5f)을 doc-first 로 설계하고 그대로 구현까지 내린 날입니다. §9.4 프로토콜 리뷰와 §9.5 구현 설계를 쓰고, 감사에서 나온 A1~A5 와 3차 전수조사의 모순·gap·stale 을 정정한 뒤 D3/D4/D5 를 사용자 결정으로 확정했습니다. 구현은 5f-0a EventBroker(구독·매칭·직렬화 L2 순수 코어)에서 출발해, 5f-0b-1 OutboundQueue(응답+이벤트 통합 큐·coalesce·purge)로 출구를 하나로 모으고, 서버 동시성을 직렬 accept 에서 5f-0b-2a 연결당 스레드로 바꿔 head-of-line 블로킹을 없앴습니다. 이어 2b-1 지속 세션(auth 1회 + 순차 요청 루프), 2b-2-α OutboundChannel(스레드-안전 per-connection outbound), 2b-2-β 연결당 reader+writer 2-스레드로 응답을 outbound 경유로 정리했습니다.
이벤트 경로는 5f-0b-3a SubscriberRegistry(메인 전용 라우팅)와 3a-2 연결 수명 배선(leaf-mutex pivot), 3b browser.subscribe dispatch 배선, 3c WKWebView url KVO → browser.navigated 주입으로 실제로 흐르게 했고, 5f-3 에서 loadState/dialog/crashed/closed 로 이벤트를 넓히면서 서버 SIGPIPE 방어를 함께 넣었습니다. 권한 쪽은 5f-4a-1·4a-2 로 dispatchAuthenticated 가 cap 집합을 수용하고 auth.grant 로 세션 cap 을 누적하도록 완성한 뒤, 4b browser_storage ScopeClass(D5 쿠키 분리 게이트)와 4c browser.getCookies(WKHTTPCookieStore)로 게이트를 실동작시켰습니다. PR 로는 Model B pane-bound confirm-grant(1e-confirm-0/1a/1b)가 이어졌고, 18~22차 /code-review max 결함을 매 단계 흡수했습니다. 관측성에서는 read_error 를 trace 에 read-error kind 로 남겨 종료 트리거를 판독하는 워크플로를 정리했고, 테마는 다크 배경의 어두운 전경이 안 보이던 갭을 min-contrast 양방향 보정으로 메우되 기본 설정이 회귀하지 않도록 밝히는 방향을 좁혔습니다.
zntc 쪽도 같은 날 여러 건이 나갔습니다. #4467 Vite query-suffix import(?raw/?url/?inline/?worker)를 문서와 함께 넣고 리뷰 지적 4건을 반영했으며, #4466 은 CSS url() 로 참조된 자산을 실제로 방출하고 url 을 재작성하도록 고쳤습니다. #4468 class static block 과 --jsx=preserve 를 소스 원문 복사가 아닌 AST 출력으로 바꾸고, #4472 minify 의 comma-sequence 접기에서 statement-start 괄호가 사라져 런타임 SyntaxError 가 나던 버그를 잡았습니다. 그 밖에 동명 basename 자산의 require 래퍼 이름 충돌, e2e browser-smoke 패키지 버전 고정, ZNTC0415 에러 문서 생성과 v0.1.3 릴리스가 있었습니다.
커밋
ohah/maru
- docs(observability): 종료 트리거 판독 워크플로 + surface-runtime-api read_error 정정
- feat(observability): read_error를 trace에 read-error kind로 기록 (종료 트리거 진단)
- fix: 20차 /code-review max 결함 수정 (이벤트 구독 인프라)
- feat(control): 5f-0b-2b-2-β — 연결당 reader+writer 2-스레드 (응답을 outbound 경유)
- fix: 19차 /code-review max 결함 수정 (2b-2 동시성 재아키텍처)
- feat(control): 5f-0b-2a — 연결당 스레드 (직렬 accept 폐기·head-of-line 블로킹 제거)
- feat(control): 5f-0a — EventBroker L2 순수 코어 (browser 이벤트 구독·매칭·직렬화)
- docs(control-plane): §9.4 D3/D4/D5 확정 (사용자 결정)
- docs(control-plane): §9.4 에이전트 제어 프로토콜 리뷰 (5f 선행, doc-first)
- docs(control-plane): §9.5 5f-0 구현 설계 (§9.4 감사 후속 A1~A5 해소, doc-first)
- fix: 18차 /code-review max 결함 수정 (지속 세션 null-close 버그 외)
- feat(control): 5f-0b-3b — browser.subscribe dispatch 배선 (동기 registry 등록)
- feat(control): 5f-0b-2b-1 — 지속 세션 (auth 1회 + 순차 요청 루프)
- docs(control-plane): §9.4/§9.5 3차 전수조사 정정 (모순·gap·stale 해소)
- feat(control): 5f-0b-1 — OutboundQueue 순수 구조 (응답+이벤트 통합 큐·coalesce·purge)
- feat(control): 5f-0b-2b-2-α — OutboundChannel (스레드-안전 per-connection outbound)
- feat(control): 5f-0b-3a-2 — SubscriberRegistry 연결 수명 배선 (leaf-mutex pivot)
- feat(control): 5f-0b-3a — SubscriberRegistry (메인 전용 이벤트 라우팅, 순수 로직)
- feat(control): 5f-4a-2 — auth.grant로 세션 cap 누적 (cap 누적 완성)
- feat(control): 5f-4b — browser_storage ScopeClass (D5 쿠키 분리 게이트)
- feat(control): 5f-4c — browser.getCookies (WKHTTPCookieStore, D5 browser_storage 게이트 실동작)
- feat(control): 5f-4a-1 — dispatchAuthenticated가 cap 집합 수용 (누적 토대)
- feat(control): 5f-0b-3c — WKWebView url KVO → browser.navigated 이벤트 주입
- fix(theme): 밝히는 방향을 좁게 — 기본 설정 회귀 차단(code-review 반영)
- fix(theme): min-contrast 양방향 보정 — 다크 배경의 어두운 전경이 안 보이던 갭
- fix: 21차 /code-review max 결함 수정 (closed 종료 마커 correctness)
- feat(control): 5f-3 — 이벤트 확장 (loadState/dialog/crashed/closed) + 서버 SIGPIPE 방어
ohah/zntc
- fix(codegen): #4472 minify comma-sequence 접기 시 statement-start 괄호 소실
- test(css): #4466 CSS Modules url() 기대치를 자산 파이프라인 계약으로 갱신
- fix(css): #4466 CSS url() 자산 방출 + url 재작성
- fix(test): e2e browser-smoke 패키지 버전 고정 — 상위 메이저 릴리스가 CI 를 깨뜨리지 않도록
- 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)
- chore(release): v0.1.3
- docs(errors): ZNTC0415 (static block 데코레이터) 에러 문서 생성
- fix(codegen): #4468 class static block 을 소스 원문 복사가 아니라 AST 로 출력