feat(#197-B4): renderer 웹모드 배선 + Electron 표면 게이팅 + 웹 스모크#202
Conversation
…ibeError + update 스텁 shape 핀
…onBanner(스냅숏 권위 통지)
…nectionBanner·재접속 세션 재조회
…tale busy 정리)·reject 마감
…t audit·describeError
…ocess.on→동기 throw 부재+큐 전진)
…veDuringLoad 리셋 스코핑·describeError 일관성
|
Warning Review limit reached
Next review available in: 56 minutes Enable usage-based reviews in Billing to review now. Otherwise, wait until the next included review is available. How can I continue?After more reviews become available, a review can be triggered using the To avoid repeated limits, reduce automatic review volume by pausing incremental auto-reviews earlier, using label-based review opt-in, excluding WIP or generated PR titles, or requesting reviews manually when the PR is ready. If your team needs uninterrupted high-volume reviews, an organization admin can enable usage-based reviews. How do review limits work?CodeRabbit enforces per-developer PR review limits for each organization. Most developers receive the normal plan review availability. For paid Pro and Pro+ PR reviews, CodeRabbit uses adaptive limits for sustained high-volume activity. When a developer's recent PR review activity reaches the 95th percentile or higher among CodeRabbit users, additional reviews become available more gradually as earlier reviews age out of the rolling window. Please refer docs for additional details. 📝 WalkthroughWalkthrough웹 모드에서 워크스페이스 경로 설정, 브라우저 브리지, 재하이드레이션, 런타임 게이팅이 추가됐다. 재접속 시 스냅샷 복원 로직이 패널들에 반영됐고, 결정론적 완주 e2e 러너와 web/electron Playwright 분리, 웹 스모크 테스트, CI chromium 설치, brain.md 재생성도 포함된다. Changes
Estimated code review effort: 5 (Critical) | ~120 minutes Sequence Diagram(s)sequenceDiagram
participant Browser
participant initWebBridge
participant WsBridge
participant HydrationProvider
participant fleetServer
Browser->>initWebBridge: 페이지 로드 (window.fleet 없음)
initWebBridge->>WsBridge: createWsBridge(browserSocket)
WsBridge->>fleetServer: WebSocket 연결(wss://host/ws)
fleetServer-->>WsBridge: hello + 이벤트 커서
WsBridge->>HydrationProvider: onConnectionState/onEventCursor
HydrationProvider->>HydrationProvider: nonce 증가 (재접속 감지)
HydrationProvider->>Browser: 패널 스냅샷 재조회 트리거
sequenceDiagram
participant ProjectPanel
participant WsBridge
participant handlers
participant applyWorkspaceSet
participant engine
ProjectPanel->>WsBridge: setWorkspace(경로)
WsBridge->>handlers: fleet:workspace:set invoke
handlers->>applyWorkspaceSet: applyWorkspaceSet(deps, path)
applyWorkspaceSet->>applyWorkspaceSet: 루트 하위 경로 검증
applyWorkspaceSet->>engine: setWorkspace(resolved)
engine-->>ProjectPanel: 적용된 경로 반환
Estimated code review effort: 5 (Critical) | ~120 minutes Related Issues: Suggested labels: area/renderer, area/server, e2e, docs Suggested reviewers: pdw96 Note 🎁 Summarized by CodeRabbit FreeThe PR author is not assigned a seat. To perform a comprehensive line-by-line review, please assign a seat to the pull request author through the subscription management page by visiting https://app.coderabbit.ai/login. Comment |
|
@codex review |
There was a problem hiding this comment.
💡 Codex Review
Here are some automated review suggestions for this pull request.
Reviewed commit: 6f75fd914e
ℹ️ About Codex in GitHub
Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you
- Open a pull request for review
- Mark a draft as ready
- Comment "@codex review".
If Codex has suggestions, it will comment; otherwise it will react with 👍.
Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".
|
@codex review |
|
Codex Review: Didn't find any major issues. Delightful! Reviewed commit: ℹ️ About Codex in GitHubYour team has set up Codex to review pull requests in this repo. Reviews are triggered when you
If Codex has suggestions, it will comment; otherwise it will react with 👍. Codex can also answer questions or update the PR. Try commenting "@codex address that feedback". |
Part of #197 (Phase B — B4). Closes 아님(멀티-phase 메타). 서브이슈 #201 체크포인트 4 게이트 통과판 계획(
docs/superpowers/plans/2026-07-05-issue197-B4-renderer-web-wiring.md동봉)의 12태스크 TDD 구현.목표
브라우저에서 열린 Fleet UI 가
window.fleet(preload) 부재 시 ws-bridge(B2)로 폴백해 fleet-server(B3)와 대화하고, 재접속 시 스냅샷 권위로 재하이드레이션하며, Electron 전용 표면(자동 업데이트·footer)은AppInfo.runtime으로 게이팅한다. 웹 워크스페이스 경로 채널(fleet:workspace:set)을 신설하고 playwrightweb프로젝트로 브라우저 스모크를 게이트한다. 데스크톱 무회귀가 절대 제약(bridge=null → hydrateNonce 영구 0 → 마운트 1회 시맨틱 유지).태스크 (T0~T11 · 각 TDD RED→GREEN 커밋)
applyWorkspaceSet코어 헬퍼 — 루트 한정(resolveWithin#123-B 워크스페이스 무결성: 프로세스 격리 + adversarial-FS 하드닝 (A 후속) #128 재사용)·존재 디렉터리·런 중 거부·fail-closed (10/10, junction 탈출 포함)fleet:workspace:set채널 6면 원자 스윕(channels·types·fixtures·preload·ws-bridge·main·handlers·boot·ws-bridge-binding) — parity 4면+ipc-parity+직렬화 (152/152)web-bridge(initWebBridge폴백 주입)+describeError+update 스텁 shape 핀 (45/45)HydrationProvider(재접속 hello→nonce·gap 관측)+ConnectionBanner(스냅숏 권위 통지)+main.tsx 배선 (7/7)e2eCompletingRunner(결정론 완주 러너·이중 opt-in)+resolveE2eRunner+boot 배선 (e2e 17/17)web프로젝트 + 브라우저 스모크 3본 + CI chromium 설치라이브 검증 (빌드 번들 실기동)
웹 스모크 3/3 GREEN (
out/server/index.mjsspawn + 실 chromium):데스크톱 electron e2e 9/9 무회귀. verify 7게이트 GREEN: skills:lint·brain:check·format:check·typecheck(3 tsconfig)·lint(max-warnings 0)·test:coverage(93.27/86.39/92.96/94.84 — 전 floor 유지)·build.
적대 리뷰 (whole-branch · 7렌즈 find → 발견별 독립 refute)
15건 후보 → P1/P2 블로커 0. 확정 P3 4건 + 저비용 하드닝 2건 = 6건 반영(커밋
15607f0):getEventCursor()로 시드 — 최초 hello 가 구독보다 먼저 도착하는 초기 로드 레이스에서 첫 재접속이 nonce 미증가하는 gap 차단liveDuringLoadRef리셋을 선택 effect→nonce-scoped effect 로 이동 — 선택 effect 자체 주석 불변식("여기서 비우면 라이브 행 유실") 복원describeError로 라우팅 — 웹 전송 단절을 "연산 실패"와 구분(B4 describeError 계약 일관화)기각 7건(독립 refuter 확인): 서버 root 하위 로밍=채널 존재 이유(Phase C 격리 유예 명시)·데스크톱 workspace:set 조건부=preload 가 이미 엔진 전체 노출(위협모델)·ProjectPanel run()/ChatPanel markBusy 낙관적 잠금 drop=서브ms 클릭 윈도우 요구(orchestrator 가 project.created 후 초 단위 planTasks 를 거쳐 도달 불가·라이브 이벤트 자가복구)·포트 재사용 레이스=exit 핸들러가 재기동 전 포트 해제.
계획 대비 정정 (전부 리뷰/검증 근거)
Promise.resolve(sync-throw)는 rejects 미성립)context.setOffline이 이 chromium 에서 활성 WS 미단절 → 서버 stop/재기동으로 소켓 단절 유발비범위 (defer)
Origin/JWT/nonce/CSP·non-loopback 개방·authenticated presence = B5 / 컨테이너 Dockerfile·compose·자식 격리 = B6 / push 재생·증분 이벤트 API = 전체 재하이드레이션으로 대체 / per-run worktree = Phase C.
🤖 Generated with Claude Code
https://claude.ai/code/session_01E5UbxaveXP8j8kLVWcvXqD
Summary by CodeRabbit