Skip to content

모바일 워크스페이스 액션 탐색 개선 - #202

Merged
seonghobae merged 86 commits into
masterfrom
feature/branding-mobile-action-workspace
May 22, 2026
Merged

모바일 워크스페이스 액션 탐색 개선#202
seonghobae merged 86 commits into
masterfrom
feature/branding-mobile-action-workspace

Conversation

@seonghobae

@seonghobae seonghobae commented May 16, 2026

Copy link
Copy Markdown
Contributor

No linked issue.

목적 (Purpose)

모바일 환경에서 inbox/search/actions/calendar 작업 공간을 빠르게 전환하고, 브랜딩 및 액션 UX 갭을 문서화해 다음 개선 흐름을 명확히 합니다.

주요 변경 사항 (Key Changes)

  • 모바일 하단 워크스페이스 내비게이션 추가
  • mobile-workspace 상태 저장소와 URL hash 동기화 추가
  • 모바일 search/actions/calendar 패널 추가
  • 헤더 주요 액션을 실제 버튼으로 전환하고 popover 피드백 추가
  • 브랜딩/프론트엔드 갭 감사 결과와 후속 로드맵 문서 추가
  • EmailList decision marker 및 E2E helper 업데이트

검증 (Verification)

  • npm run lint
  • npm run typecheck
  • npm test -- src/components/DashboardLayout.test.tsx
  • LIVE_BASE_URL=http://127.0.0.1:18081 npm run test:e2e -- dashboard-branding.spec.ts

변경 사항 표

Component Change Notes
docs/plans/2026-05-16-branding-mobile-action-workspace.md 모바일 액션 워크스페이스 계획 추가 모바일 작업 전환/브랜딩 갭 추적
docs/plans/2026-05-16-branding-roadmap-next-gaps.md 후속 브랜딩 로드맵 추가 다음 갭 우선순위 정리
frontend/src/lib/mobile-workspace.ts 모바일 워크스페이스 상태 및 hash sync 추가 새로고침/공유/뒤로가기 흐름에서 패널 상태 보존
frontend/src/app/page.tsx 모바일 search/actions/calendar 패널 추가 좁은 화면에서 작업을 한 번에 하나씩 분리
frontend/src/components/DashboardLayout.tsx 헤더 액션 버튼 및 모바일 nav 개선 클릭 가능성과 결과 피드백 명확화
sequenceDiagram
  participant User as Mobile User
  participant Nav as Bottom Workspace Nav
  participant Store as mobile-workspace Store
  participant URL as Location Hash
  participant Panel as Workspace Panel

  User->>Nav: tap search/actions/calendar
  Nav->>Store: set active workspace
  Store->>URL: sync hash
  Store->>Panel: render selected panel
  User->>URL: back/forward or reload
  URL->>Store: restore workspace from hash
  Store->>Panel: render restored panel
Loading

Summary by CodeRabbit

  • New Features

    • New workspace pages: Projects, Calendar, Data, Search, Security, Tasks, and a unified Workspace Home.
    • Mobile workspace panels for Search, Actions, Calendar and a mobile AI quick-action sheet.
    • Create tasks from emails (AI-detected execution items) with a tasks inbox and API-backed creation.
  • Improvements

    • Improved mobile navigation, startup-view preference, and responsive desktop/tablet/mobile behavior.
    • Enhanced email actions: reply drafts, calendar sync, and task creation with safer text handling.
    • Stronger session/auth handling and sanitized client-server headers.

Review Change Stack

@github-actions

Copy link
Copy Markdown
Contributor

PR governance metadata gate is not ready for 6a6e87f51a49a2151c1046a39866f880f0e803b5:

  • 3 required check(s) are not successful on 6a6e87f.\n- Missing current-head CodeRabbit/coderabbitai evidence for 6a6e87f.\n

@coderabbitai

coderabbitai Bot commented May 16, 2026

Copy link
Copy Markdown
Contributor

Warning

Rate limit exceeded

@seonghobae has exceeded the limit for the number of commits that can be reviewed per hour. Please wait 12 minutes and 8 seconds before requesting another review.

You’ve run out of usage credits. Purchase more in the billing tab.

⌛ How to resolve this issue?

After the wait time has elapsed, a review can be triggered using the @coderabbitai review command as a PR comment. Alternatively, push new commits to this PR.

We recommend that you space out your commits to avoid hitting the rate limit.

🚦 How do rate limits work?

CodeRabbit enforces hourly rate limits for each developer per organization.

Our paid plans have higher rate limits than the trial, open-source and free plans. In all cases, we re-allow further reviews after a brief timeout.

Please see our FAQ for further information.

ℹ️ Review info
⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: CHILL

Plan: Pro

Run ID: 91fbcecf-d277-42f2-bab0-89c7b46cc9b3

📥 Commits

Reviewing files that changed from the base of the PR and between 3c6960d and a4ecb19.

📒 Files selected for processing (14)
  • AGENTS.md
  • ARCHITECTURE.md
  • README.md
  • backend/services/email_client.py
  • backend/tests/test_email_client_smtp.py
  • docs/plans/2026-05-19-branding-menu-task-tracking-gap-closure.md
  • docs/plans/2026-05-19-north-star-gap-closure.md
  • frontend/src/app/tasks/page.test.tsx
  • frontend/src/app/tasks/page.tsx
  • frontend/src/components/EmailDetail.test.tsx
  • frontend/src/components/EmailDetail.tsx
  • frontend/tests/e2e/dashboard-branding.spec.ts
  • frontend/tests/e2e/dashboard-flows.spec.ts
  • frontend/tests/e2e/helpers.ts

Note

Reviews paused

It looks like this branch is under active development. To avoid overwhelming you with review comments due to an influx of new commits, CodeRabbit has automatically paused this review. You can configure this behavior by changing the reviews.auto_review.auto_pause_after_reviewed_commits setting.

Use the following commands to manage reviews:

  • @coderabbitai resume to resume automatic reviews.
  • @coderabbitai review to trigger a single review.

Use the checkboxes below for quick actions:

  • ▶️ Resume reviews
  • 🔍 Trigger review

Note

.coderabbit.yaml has unrecognized properties

CodeRabbit is using all valid settings from your configuration. Unrecognized properties (listed below) have been ignored and may indicate typos or deprecated fields that can be removed.

⚠️ Parsing warnings (1)
Validation error: Unrecognized key(s) in object: 'version'
⚙️ Configuration instructions
  • Please see the configuration documentation for more information.
  • You can also validate your configuration using the online YAML validator.
  • If your editor has YAML language server enabled, you can add the path at the top of this file to enable auto-completion and validation: # yaml-language-server: $schema=https://coderabbit.ai/integrations/schema.v2.json
📝 Walkthrough

Walkthrough

Large refactor: backend enforces HMAC bearer sessions, owner-scoped queries, new tasks and calendar writeback-intent APIs, SMTP/datasafety hardening; frontend adds WorkspaceHome, mobile hash-based workspace, startup preferences, safe-text, mobile API panels, AI Hub rewrite, DashboardLayout/nav overhaul; CI governance and tests updated.

Changes

Core Auth, Workspace, and Tasks Slice

Layer / File(s) Summary
Bearer auth and scoped queries
backend/api/auth.py, backend/api/emails.py, backend/api/search.py, backend/api/network.py, backend/core/config.py, backend/db/models.py
Switches to HS256 HMAC bearer sessions, validates claims, removes dev headers; scopes email/search/graph queries by user/org; tightens config and encryption requirements.
Tasks and calendar intent APIs
backend/api/tasks.py, backend/api/calendar.py, backend/services/calendar_service.py, backend/services/exceptions.py
Adds ticket-like tasks API and server-authoritative calendar sync and writeback-intent selection with safety validation.
SMTP/ZIP hardening
backend/services/email_client.py, backend/services/archive.py
Enforces SMTP allowlists, DNS/IP safety, pinned sockets, header newline checks; ZIP extraction blocks traversal/symlinks.
Mobile workspace and startup
frontend/src/components/WorkspaceHome.tsx, frontend/src/lib/mobile-workspace.ts, frontend/src/lib/workspace-preferences.ts, frontend/src/app/page.tsx
Implements hash-based mobile views, startup preference store, and unified responsive workspace home.
Dashboard layout and pages
frontend/src/components/DashboardLayout.tsx, frontend/src/app/*/page.tsx
Refactors header actions, primary nav, mobile popovers; adds route pages (mail/search/tasks/calendar/data/security/projects).
Safe text and panels
frontend/src/lib/safe-text.ts, frontend/src/components/mobile-workspace-panels.tsx, frontend/src/components/EmailList.tsx
Adds safe text helper, API-backed mobile panels, inbox request caching, sanitized list rendering.
AI Hub workspace
frontend/src/app/ai-hub/page.tsx
Rewrites AI Hub into cards with loading/empty/error and retry.
Governance and CI
.github/workflows/pr-governance.yml, scripts/ci/*
Materializes trusted gate script, metadata-only governance, Strix PR-scan robustness and retryability checks.
Tests and docs
backend/tests/*, frontend/**/*test*.tsx, docs/*, ARCHITECTURE.md, README.md
Extensive unit/E2E updates covering auth, scoping, UI flows, and plans/ops docs alignment.

Sequence Diagram(s)

Skipped.

Estimated code review effort

🎯 5 (Critical) | ⏱️ ~120 minutes

Possibly related PRs

  • Seongho-Bae/naruon#191: Also modifies backend auth context; related to this PR’s shift to bearer-session derived AuthContext.
  • Seongho-Bae/naruon#176: Touches DashboardLayout mobile navigation; overlaps with this PR’s hash-based mobile workspace and menu refactor.
  • Seongho-Bae/naruon#155: Changes ApiClient usage; related to this PR’s ApiClient header/session-token behavior.

Poem

새벽에 토끼는 코튼 발로 탭탭,
해시가 춤추는 모바일 탭탭탭.
곰손 메일도 안전 글자 변환, 햇살 같아! ✨
베어러 서명, 문지기 단단,
할 일은 줄 서고, 캘린더는 고개 끄덕.
깃발은 푸르고, 게이트는 지켰다. 🥕

✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch feature/branding-mobile-action-workspace

@github-actions

Copy link
Copy Markdown
Contributor

PR governance metadata gate is not ready for 6a6e87f51a49a2151c1046a39866f880f0e803b5:

  • 2 required check(s) are not successful on 6a6e87f.\n- Missing current-head CodeRabbit/coderabbitai evidence for 6a6e87f.\n

1 similar comment
@github-actions

Copy link
Copy Markdown
Contributor

PR governance metadata gate is not ready for 6a6e87f51a49a2151c1046a39866f880f0e803b5:

  • 2 required check(s) are not successful on 6a6e87f.\n- Missing current-head CodeRabbit/coderabbitai evidence for 6a6e87f.\n

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 3

🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Inline comments:
In `@docs/plans/2026-05-16-branding-mobile-action-workspace.md`:
- Around line 31-49: 문서의 모바일 내비게이션 계약이 실제 구현과 다르므로 문서 내용(해당 섹션의 Line 31–49 및
74–79)을 현재 구현으로 맞춰주세요: 모바일 내비게이션은 button 클릭과 직접 이벤트 디스패치가 아니라 hash 기반 앵커(`<a
href="`#mobile-`{view}">`)와 setMobileWorkspaceView() 흐름을 사용하므로, 테스트/설명은 button
텍스트와 커스텀 이벤트 기대 대신 앵커 href 값(예: '`#mobile-actions`') 또는 해시 변경을 확인하거나
setMobileWorkspaceView 호출 흐름을 명시하도록 수정하고 mobile nav 관련 설명에 `<a
href="`#mobile-`{view}">`, setMobileWorkspaceView, 및 "naruon:mobile-workspace" 이벤트
사용 방식의 차이를 분명히 기재하세요.

In `@frontend/src/app/page.tsx`:
- Around line 16-19: handleSelectEmail currently always calls
setMobileWorkspaceView('detail'), overwriting desktop URL/hash; change it to
only call setMobileWorkspaceView('detail') when in a mobile context. Inside
handleSelectEmail (and when you setSelectedEmail), gate the call with an
existing isMobile/isSmallScreen flag or evaluate window.matchMedia('(max-width:
Xpx)') / a mobileWorkspaceVisible boolean and only invoke
setMobileWorkspaceView('detail') when that check is true so desktop interactions
no longer mutate the mobile view/hash.
- Around line 60-65: The mobile detail panel currently hides when mobileView ===
'detail' but selectedEmail === null, which can leave the whole mobile UI blank;
update the rendering logic around the element with id "mobile-detail" (using
mobileView and selectedEmail) to handle the empty-detail case: either render a
safe placeholder inside the detail panel when selectedEmail is null or
programmatically fallback mobileView to 'inbox' (or another visible view) before
computing the className—ensure the condition that produces 'flex' covers the
case mobileView === 'detail' && selectedEmail === null by providing a fallback
UI or view switch so the screen is never completely hidden.
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: CHILL

Plan: Pro

Run ID: a591ab06-fe6a-426b-a8e7-fa825ba881af

📥 Commits

Reviewing files that changed from the base of the PR and between b050bac and 6a6e87f.

📒 Files selected for processing (10)
  • docs/plans/2026-05-16-branding-mobile-action-workspace.md
  • docs/plans/2026-05-16-branding-roadmap-next-gaps.md
  • frontend/src/app/globals.css
  • frontend/src/app/page.tsx
  • frontend/src/components/DashboardLayout.test.tsx
  • frontend/src/components/DashboardLayout.tsx
  • frontend/src/components/EmailList.tsx
  • frontend/src/lib/mobile-workspace.ts
  • frontend/tests/e2e/dashboard-branding.spec.ts
  • frontend/tests/e2e/helpers.ts

Comment thread docs/plans/2026-05-16-branding-mobile-action-workspace.md Outdated
Comment thread frontend/src/app/page.tsx Outdated
Comment thread frontend/src/app/page.tsx Outdated
@github-actions

Copy link
Copy Markdown
Contributor

PR governance metadata gate is not ready for 6a6e87f51a49a2151c1046a39866f880f0e803b5:

  • 3 unresolved current review thread(s) remain.\n- 1 required check(s) are not successful on 6a6e87f.\n- Missing current-head CodeRabbit/coderabbitai evidence for 6a6e87f.\n

@greptile-apps

greptile-apps Bot commented May 16, 2026

Copy link
Copy Markdown

Greptile Summary

이 PR은 모바일 환경에서 inbox/search/actions/calendar 워크스페이스를 빠르게 전환할 수 있는 하단 내비게이션과 URL hash 동기화 상태 저장소를 추가하고, 헤더 액션 버튼을 실제 동작하는 버튼으로 교체하며, 백엔드 인증을 서명된 Bearer JWT 방식으로 전환하는 대규모 풀스택 변경입니다. 이전 리뷰 스레드에서 지적된 여러 사항(AUTH_SESSION_HMAC_SECRET 미설정 시 전체 401, DATABASE_URL 기본값 제거, ALLOWED_SMTP_HOSTS 미설정 시 이메일 전송 차단, openStartupView race condition, StartupDashboard 이중 마운트)이 아직 열려 있습니다.

  • 모바일 워크스페이스: mobile-workspace.ts 상태 저장소 + URL hash pushState 동기화, 하단 5-탭 내비게이션, search/calendar 패널(mobile-workspace-panels.tsx) 신규 추가.
  • 백엔드 인증 전환: X-User-Id 헤더 신뢰에서 HMAC-SHA256 서명 JWT Bearer 토큰 검증으로 교체. AUTH_SESSION_HMAC_SECRET 없이는 모든 요청이 401.
  • 기타: access_policy.py RBAC/ABAC 평가 모듈, email_client.py SMTP SSRF 방어 및 pinned socket 전송, workspace-preferences.ts 시작 화면 localStorage 저장 등 신규 추가.

Confidence Score: 3/5

이전 리뷰에서 지적된 인증 전환(AUTH_SESSION_HMAC_SECRET 미설정 시 전체 API 401), DATABASE_URL 기본값 제거, ALLOWED_SMTP_HOSTS 기본값으로 인한 이메일 차단 등 배포 환경을 즉시 중단시킬 수 있는 브레이킹 체인지가 미해결인 채로 남아 있어 현재 상태로 머지는 권장되지 않습니다.

인증 방식 교체(Bearer JWT)와 여러 config 기본값 제거는 환경 변수가 준비되지 않은 기존 배포를 즉시 중단시키는 브레이킹 체인지이며, 해당 이슈들은 이전 리뷰 스레드에서 이미 지적되었으나 이번 PR HEAD에서도 수정되지 않았습니다.

backend/core/config.py, backend/api/auth.py, backend/services/email_client.py, frontend/src/app/page.tsx

Important Files Changed

Filename Overview
frontend/src/lib/mobile-workspace.ts 모바일 워크스페이스 상태 저장소와 URL hash 동기화 신규 추가. pushState로 히스토리 관리하며 hashchange 이벤트 구독. updateHash:false 옵션 사용 시 hash와 store.view 불일치 가능성은 이미 이전 리뷰에서 지적됨.
frontend/src/app/page.tsx 모바일 워크스페이스 패널 및 StartupDashboard/StartupCalendar 추가. openStartupView('email') 호출 시 mobileWorkspaceOverride가 race condition으로 false로 덮어쓰여 대시보드가 사라지지 않는 문제(이전 리뷰), StartupDashboard 이중 마운트로 /api/search 중복 호출(이전 리뷰), SSR 수화 불일치(이전 리뷰) 등 복수의 이전 지적 사항이 미해결.
frontend/src/components/DashboardLayout.tsx 헤더 액션 버튼 및 모바일 하단 내비게이션 추가. popoverTarget+onClick 이중 발동(이전 리뷰), 하드코딩된 사용자 이름 'Seongho'(이전 리뷰), 모바일 팝오버 이중 hide(이전 리뷰) 등 미해결 지적 사항 다수.
backend/api/auth.py X-User-Id 헤더 기반 인증에서 서명된 Bearer JWT 방식으로 전환. AUTH_SESSION_HMAC_SECRET 미설정 시 모든 요청 401(이전 리뷰 지적 사항 미해결).
backend/services/email_client.py SMTP SSRF 방어 및 pinned socket 전송 방식으로 대규모 재작성. ALLOWED_SMTP_HOSTS 미설정 시 전면 차단(이전 리뷰), SMTPProtocol(loop=loop) aiosmtplib 3.x 호환성 문제(이전 리뷰), send_email/내부 함수 소켓 이중 close(신규 P2) 포함.
backend/services/access_policy.py 신규 RBAC/ABAC 정책 평가 모듈. platform_admin+organization_id=None 조합, data_region=None 리소스 접근, 테스트 누락 등 이전 리뷰 지적 사항 존재.
backend/api/runner_config.py connector_manifest 신규 추가. runner_usage: 'ci_smoke_only' 하드코딩으로 프로덕션 배포 시 CI 전용 모드로만 동작 가능성(이전 리뷰 지적 사항).
backend/core/config.py DATABASE_URL 기본값 제거, AUTH_SESSION_HMAC_SECRET/ALLOWED_SMTP_HOSTS 신규 추가. 기존 배포 환경 기동 불가 브레이킹 체인지(이전 리뷰).
backend/api/calendar.py writeback-intent 엔드포인트 신규 추가 및 sync 엔드포인트 인증 추가. _select_writeback_source 이후 owner_id 재검사 데드코드(이전 리뷰).
frontend/src/components/mobile-workspace-panels.tsx 모바일 검색/캘린더 패널 신규 추가. API 호출, 로딩/에러/빈 상태 처리, safe-text 사용 등 구현 완성도 양호.
frontend/src/lib/workspace-preferences.ts 시작 화면 설정을 localStorage에 저장하고 useSyncExternalStore로 구독하는 유틸리티. 안전하게 구현됨.

Sequence Diagram

sequenceDiagram
  participant User as 모바일 사용자
  participant Nav as 하단 워크스페이스 Nav
  participant Store as mobile-workspace Store
  participant Hash as window.location.hash
  participant Panel as 워크스페이스 패널

  User->>Nav: 탭 클릭 (search/actions/calendar)
  Nav->>Nav: event.preventDefault()
  Nav->>Store: setMobileWorkspaceView(view)
  Store->>Hash: "history.pushState(#mobile-view)"
  Store->>Store: listeners 알림
  Store->>Panel: useMobileWorkspaceView 재렌더

  User->>Hash: 브라우저 뒤로가기
  Hash->>Store: hashchange 이벤트
  Store->>Panel: getHashMobileWorkspaceView() 반환
  Panel-->>User: 이전 패널 복원
Loading

Reviews (46): Last reviewed commit: "fix: extend Strix PR scan budget" | Re-trigger Greptile

Comment thread frontend/tests/e2e/helpers.ts Outdated
@github-actions

Copy link
Copy Markdown
Contributor

PR governance metadata gate is not ready for cd3ede6c3d07f2ac16da6490d8e7682cc166a428:

  • 2 unresolved current review thread(s) remain.\n- 2 required check(s) are not successful on cd3ede6.\n- Missing current-head CodeRabbit/coderabbitai evidence for cd3ede6.\n

@github-actions

Copy link
Copy Markdown
Contributor

PR governance metadata gate is not ready for cd3ede6c3d07f2ac16da6490d8e7682cc166a428:

  • 1 required check(s) are not successful on cd3ede6.\n- Missing current-head CodeRabbit/coderabbitai evidence for cd3ede6.\n

1 similar comment
@github-actions

Copy link
Copy Markdown
Contributor

PR governance metadata gate is not ready for cd3ede6c3d07f2ac16da6490d8e7682cc166a428:

  • 1 required check(s) are not successful on cd3ede6.\n- Missing current-head CodeRabbit/coderabbitai evidence for cd3ede6.\n

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Caution

Some comments are outside the diff and can’t be posted inline due to platform limitations.

⚠️ Outside diff range comments (1)
frontend/tests/e2e/helpers.ts (1)

107-107: ⚠️ Potential issue | 🟡 Minor | ⚡ Quick win

Add CORS headers to the 404 fallback response.

The fallback response for unmocked endpoints lacks CORS headers, which could cause CORS errors in tests instead of clear 404 responses.

🛡️ Proposed fix to add CORS headers
-    await route.fulfill({ status: 404, body: 'Not mocked' });
+    await route.fulfill({
+      status: 404,
+      headers: CORS_HEADERS,
+      body: 'Not mocked',
+    });

Note: This assumes you've extracted CORS_HEADERS as suggested in the earlier comment. If not, inline the headers object here.

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@frontend/tests/e2e/helpers.ts` at line 107, The 404 fallback response uses
route.fulfill({ status: 404, body: 'Not mocked' }) but omits CORS headers
causing CORS failures in tests; update the fallback to include the CORS header
set (use the shared CORS_HEADERS constant if present or inline the headers
object) by passing headers: CORS_HEADERS (or the inline headers) into the
route.fulfill call so the response includes Access-Control-Allow-Origin and
related CORS headers.
🧹 Nitpick comments (1)
frontend/tests/e2e/helpers.ts (1)

29-33: ⚡ Quick win

Extract duplicated CORS headers to a shared constant.

The CORS headers are duplicated between fulfillJson and the OPTIONS handler (lines 47-51). Extracting them to a constant improves maintainability.

♻️ Proposed refactor to eliminate duplication
+const CORS_HEADERS = {
+  'Access-Control-Allow-Origin': '*',
+  'Access-Control-Allow-Headers': 'Content-Type, X-User-Id',
+  'Access-Control-Allow-Methods': 'GET, POST, OPTIONS',
+};
+
 async function fulfillJson(route: Route, body: unknown) {
   await route.fulfill({
     status: 200,
     contentType: 'application/json',
-    headers: {
-      'Access-Control-Allow-Origin': '*',
-      'Access-Control-Allow-Headers': 'Content-Type, X-User-Id',
-      'Access-Control-Allow-Methods': 'GET, POST, OPTIONS',
-    },
+    headers: CORS_HEADERS,
     body: JSON.stringify(body),
   });
 }

Then update the OPTIONS handler to use the same constant:

     if (request.method() === 'OPTIONS') {
       await route.fulfill({
         status: 204,
-        headers: {
-          'Access-Control-Allow-Origin': '*',
-          'Access-Control-Allow-Headers': 'Content-Type, X-User-Id',
-          'Access-Control-Allow-Methods': 'GET, POST, OPTIONS',
-        },
+        headers: CORS_HEADERS,
       });
       return;
     }
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@frontend/tests/e2e/helpers.ts` around lines 29 - 33, Extract the duplicated
CORS header object used in fulfillJson and the OPTIONS handler into a single
shared constant (e.g., CORS_HEADERS) in frontend/tests/e2e/helpers.ts, replace
the literal header objects in the fulfillJson function and the server's OPTIONS
handler with that constant, and ensure any imports/exports are adjusted if
needed so both uses reference the same constant to remove duplication and keep
behavior unchanged.
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Outside diff comments:
In `@frontend/tests/e2e/helpers.ts`:
- Line 107: The 404 fallback response uses route.fulfill({ status: 404, body:
'Not mocked' }) but omits CORS headers causing CORS failures in tests; update
the fallback to include the CORS header set (use the shared CORS_HEADERS
constant if present or inline the headers object) by passing headers:
CORS_HEADERS (or the inline headers) into the route.fulfill call so the response
includes Access-Control-Allow-Origin and related CORS headers.

---

Nitpick comments:
In `@frontend/tests/e2e/helpers.ts`:
- Around line 29-33: Extract the duplicated CORS header object used in
fulfillJson and the OPTIONS handler into a single shared constant (e.g.,
CORS_HEADERS) in frontend/tests/e2e/helpers.ts, replace the literal header
objects in the fulfillJson function and the server's OPTIONS handler with that
constant, and ensure any imports/exports are adjusted if needed so both uses
reference the same constant to remove duplication and keep behavior unchanged.

ℹ️ Review info
⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: CHILL

Plan: Pro

Run ID: d21543e5-989a-487c-9279-732d24fdac52

📥 Commits

Reviewing files that changed from the base of the PR and between 6a6e87f and cd3ede6.

📒 Files selected for processing (5)
  • docs/plans/2026-05-16-branding-mobile-action-workspace.md
  • frontend/src/app/page.tsx
  • frontend/src/components/DashboardLayout.test.tsx
  • frontend/tests/e2e/dashboard-branding.spec.ts
  • frontend/tests/e2e/helpers.ts
✅ Files skipped from review due to trivial changes (1)
  • docs/plans/2026-05-16-branding-mobile-action-workspace.md
🚧 Files skipped from review as they are similar to previous changes (3)
  • frontend/src/components/DashboardLayout.test.tsx
  • frontend/src/app/page.tsx
  • frontend/tests/e2e/dashboard-branding.spec.ts

@github-actions

Copy link
Copy Markdown
Contributor

PR governance metadata gate is not ready for cd3ede6c3d07f2ac16da6490d8e7682cc166a428:

  • Missing current-head CodeRabbit/coderabbitai evidence for cd3ede6.\n

Comment thread frontend/src/app/page.tsx Outdated
@github-actions

Copy link
Copy Markdown
Contributor

PR governance metadata gate is not ready for 6dabce6ce85ac167462255afc492c077961fcd47:

  • 1 unresolved current review thread(s) remain.\n- 2 required check(s) are not successful on 6dabce6.\n- Missing current-head CodeRabbit/coderabbitai evidence for 6dabce6.\n

@github-actions

Copy link
Copy Markdown
Contributor

PR governance metadata gate is not ready for 6dabce6ce85ac167462255afc492c077961fcd47:

  • 1 unresolved current review thread(s) remain.\n- 1 required check(s) are not successful on 6dabce6.\n- Missing current-head CodeRabbit/coderabbitai evidence for 6dabce6.\n

1 similar comment
@github-actions

Copy link
Copy Markdown
Contributor

PR governance metadata gate is not ready for 6dabce6ce85ac167462255afc492c077961fcd47:

  • 1 unresolved current review thread(s) remain.\n- 1 required check(s) are not successful on 6dabce6.\n- Missing current-head CodeRabbit/coderabbitai evidence for 6dabce6.\n

@github-actions

Copy link
Copy Markdown
Contributor

PR governance metadata gate is not ready for 6dabce6ce85ac167462255afc492c077961fcd47:

  • 1 unresolved current review thread(s) remain.\n- Missing current-head CodeRabbit/coderabbitai evidence for 6dabce6.\n

@seonghobae

Copy link
Copy Markdown
Contributor Author

@coderabbitai review

@coderabbitai

coderabbitai Bot commented May 16, 2026

Copy link
Copy Markdown
Contributor
✅ Actions performed

Review triggered.

Note: CodeRabbit is an incremental review system and does not re-review already reviewed commits. This command is applicable only when automatic reviews are paused.

@github-actions

Copy link
Copy Markdown
Contributor

PR governance metadata gate is not ready for 38c905421eda8135eae4e4f24f6d31dda6edae0f:

  • 1 unresolved current review thread(s) remain.\n- 3 required check(s) are not successful on 38c9054.\n- Missing current-head CodeRabbit/coderabbitai evidence for 38c9054.\n

@seonghobae

Copy link
Copy Markdown
Contributor Author

@coderabbitai review

@coderabbitai

coderabbitai Bot commented May 16, 2026

Copy link
Copy Markdown
Contributor
✅ Actions performed

Review triggered.

Note: CodeRabbit is an incremental review system and does not re-review already reviewed commits. This command is applicable only when automatic reviews are paused.

@github-actions

Copy link
Copy Markdown
Contributor

PR governance metadata gate is not ready for 38c905421eda8135eae4e4f24f6d31dda6edae0f:

  • 1 unresolved current review thread(s) remain.\n- 2 required check(s) are not successful on 38c9054.\n- Missing current-head CodeRabbit/coderabbitai evidence for 38c9054.\n

1 similar comment
@github-actions

Copy link
Copy Markdown
Contributor

PR governance metadata gate is not ready for 38c905421eda8135eae4e4f24f6d31dda6edae0f:

  • 1 unresolved current review thread(s) remain.\n- 2 required check(s) are not successful on 38c9054.\n- Missing current-head CodeRabbit/coderabbitai evidence for 38c9054.\n

@github-actions

Copy link
Copy Markdown
Contributor

PR governance metadata gate is not ready for dc1697d7db2cc00c646daecc87024d8a9048411d:

  • 3 required check(s) are not successful on dc1697d.\n- Missing current-head CodeRabbit/coderabbitai evidence for dc1697d.\n

@github-actions

Copy link
Copy Markdown
Contributor

PR governance metadata gate is not ready for dc1697d7db2cc00c646daecc87024d8a9048411d:

  • 1 required check(s) are not successful on dc1697d.\n- Missing current-head CodeRabbit/coderabbitai evidence for dc1697d.\n

@seonghobae

Copy link
Copy Markdown
Contributor Author

@coderabbitai review

@coderabbitai

coderabbitai Bot commented May 21, 2026

Copy link
Copy Markdown
Contributor
✅ Actions performed

Review triggered.

Note: CodeRabbit is an incremental review system and does not re-review already reviewed commits. This command is applicable only when automatic reviews are paused.

@github-actions

Copy link
Copy Markdown
Contributor

PR governance metadata gate is not ready for dc1697d7db2cc00c646daecc87024d8a9048411d:

  • 1 required check(s) are not successful on dc1697d.\n- Missing current-head CodeRabbit/coderabbitai evidence for dc1697d.\n

1 similar comment
@github-actions

Copy link
Copy Markdown
Contributor

PR governance metadata gate is not ready for dc1697d7db2cc00c646daecc87024d8a9048411d:

  • 1 required check(s) are not successful on dc1697d.\n- Missing current-head CodeRabbit/coderabbitai evidence for dc1697d.\n

@github-actions

Copy link
Copy Markdown
Contributor

PR governance metadata gate is not ready for 8a6df8245f7420e7cde47a2854d3ed2c608688a5:

  • 3 required check(s) are not successful on 8a6df82.\n- Missing current-head CodeRabbit/coderabbitai evidence for 8a6df82.\n

@seonghobae

Copy link
Copy Markdown
Contributor Author

@coderabbitai review

@github-actions

Copy link
Copy Markdown
Contributor

PR governance metadata gate is not ready for 8a6df8245f7420e7cde47a2854d3ed2c608688a5:

  • 1 required check(s) are not successful on 8a6df82.\n- Missing current-head CodeRabbit/coderabbitai evidence for 8a6df82.\n

@coderabbitai

coderabbitai Bot commented May 21, 2026

Copy link
Copy Markdown
Contributor
✅ Actions performed

Review triggered.

Note: CodeRabbit is an incremental review system and does not re-review already reviewed commits. This command is applicable only when automatic reviews are paused.

@github-actions

Copy link
Copy Markdown
Contributor

PR governance metadata gate is not ready for 8a6df8245f7420e7cde47a2854d3ed2c608688a5:

  • 1 required check(s) are not successful on 8a6df82.\n- Missing current-head CodeRabbit/coderabbitai evidence for 8a6df82.\n

1 similar comment
@github-actions

Copy link
Copy Markdown
Contributor

PR governance metadata gate is not ready for 8a6df8245f7420e7cde47a2854d3ed2c608688a5:

  • 1 required check(s) are not successful on 8a6df82.\n- Missing current-head CodeRabbit/coderabbitai evidence for 8a6df82.\n

@github-actions

Copy link
Copy Markdown
Contributor

PR governance metadata gate is not ready for a4ecb199b07875c606715a5213e2ff70bbd30509:

  • 1 required check(s) are not successful on a4ecb19.\n- Missing current-head CodeRabbit/coderabbitai evidence for a4ecb19.\n

@github-actions

Copy link
Copy Markdown
Contributor

PR governance metadata gate is not ready for a4ecb199b07875c606715a5213e2ff70bbd30509:

  • Missing current-head CodeRabbit/coderabbitai evidence for a4ecb19.\n

@seonghobae

Copy link
Copy Markdown
Contributor Author

@coderabbitai review

@coderabbitai

coderabbitai Bot commented May 21, 2026

Copy link
Copy Markdown
Contributor
✅ Actions performed

Review triggered.

Note: CodeRabbit is an incremental review system and does not re-review already reviewed commits. This command is applicable only when automatic reviews are paused.

@github-actions

Copy link
Copy Markdown
Contributor

PR governance metadata gate is not ready for a4ecb199b07875c606715a5213e2ff70bbd30509:

  • Missing current-head CodeRabbit/coderabbitai evidence for a4ecb19.\n

@github-actions

Copy link
Copy Markdown
Contributor

PR governance metadata gate is not ready for a4ecb199b07875c606715a5213e2ff70bbd30509:

  • 1 required check(s) are not successful on a4ecb19.\n- Missing current-head CodeRabbit/coderabbitai evidence for a4ecb19.\n

@seonghobae

Copy link
Copy Markdown
Contributor Author

@coderabbitai resolve

@coderabbitai

coderabbitai Bot commented May 22, 2026

Copy link
Copy Markdown
Contributor
✅ Actions performed

Comments resolved and changes approved.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants