@@ -466,7 +466,7 @@ function StartupCalendar({ onOpenView }: { onOpenView: (view: WorkspaceStartupVi
className="mt-5 inline-flex h-11 items-center gap-2 rounded-2xl bg-primary px-4 text-sm font-bold text-primary-foreground focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring/40"
>
- 이메일 작업공간 열기
+ 메일 작업공간 열기
{status === 'loading' ?
일정 후보를 불러오는 중입니다.
: null}
diff --git a/frontend/src/components/mobile-workspace-panels.tsx b/frontend/src/components/mobile-workspace-panels.tsx
index 3654893bd..1e99314cf 100644
--- a/frontend/src/components/mobile-workspace-panels.tsx
+++ b/frontend/src/components/mobile-workspace-panels.tsx
@@ -42,7 +42,7 @@ const mobileSearchCopy: MobilePanelCopy = {
const mobileCalendarCopy: MobilePanelCopy = {
eyebrow: '일정 연결',
- title: '캘린더 반영 대기',
+ title: '일정 반영 대기',
description: '메일에서 추출한 회의, 마감, 후속 조치를 모바일에서 바로 확인합니다.',
loading: '일정 후보를 불러오는 중입니다.',
empty: '일정 후보가 없습니다.',
diff --git a/frontend/src/components/ui/control-sizing.test.tsx b/frontend/src/components/ui/control-sizing.test.tsx
index f6295ee22..42c5876f0 100644
--- a/frontend/src/components/ui/control-sizing.test.tsx
+++ b/frontend/src/components/ui/control-sizing.test.tsx
@@ -29,7 +29,7 @@ describe("brand control sizing", () => {
root?.render(
<>
-
+
>,
);
diff --git a/frontend/tests/e2e/dashboard-branding.spec.ts b/frontend/tests/e2e/dashboard-branding.spec.ts
index b302b7516..ef52a3b2a 100644
--- a/frontend/tests/e2e/dashboard-branding.spec.ts
+++ b/frontend/tests/e2e/dashboard-branding.spec.ts
@@ -33,15 +33,15 @@ test('renders the desktop Naruon shell with local brand assets', async ({ page }
await expect(header.getByRole('link', { name: '알림 보기' })).toHaveAttribute('href', '/security');
await expect(header.getByRole('link', { name: '도움말 보기' })).toHaveAttribute('href', '/settings#help');
await expect(header.getByRole('link', { name: '프로필 메뉴' })).toHaveAttribute('href', '/settings#profile');
- await expect(header.getByRole('button', { name: '캘린더 반영' })).toBeVisible();
+ await expect(header.getByRole('button', { name: '일정 반영' })).toBeVisible();
await expect(header.getByRole('button', { name: '답장 초안' })).toBeVisible();
- await expect(header.getByRole('button', { name: '할 일 만들기' })).toBeVisible();
+ await expect(header.getByRole('button', { name: '실행 항목 생성' })).toBeVisible();
await header.getByRole('button', { name: '답장 초안' }).click();
await expect(header.getByText('메일 상세 패널에서 답장 초안을 생성합니다.')).toBeVisible();
await expect(header.getByText('메일 상세 패널에서 답장 초안을 생성합니다.')).toBeVisible();
await expect(header.getByText('메일 상세 패널에서 답장 초안을 생성합니다.')).toBeVisible();
- await expect(page.getByRole('region', { name: '홈 개요 대시보드' }).first()).toBeVisible();
+ await expect(page.getByRole('region', { name: '홈 개요' }).first()).toBeVisible();
const homeQuickActions = page.getByLabel('홈 빠른 실행');
await expect(homeQuickActions.getByRole('link', { name: '메일함 열기' })).toHaveAttribute('href', '/mail');
await expect(homeQuickActions.getByRole('link', { name: '보낸 메일 답변 추적' })).toHaveAttribute('href', '/mail?folder=sent');
@@ -56,8 +56,8 @@ test('renders the desktop Naruon shell with local brand assets', async ({ page }
const desktopStartup = page.getByRole('region', { name: 'Desktop startup preference' });
await expect(desktopStartup).toBeVisible();
- await expect(desktopStartup.getByRole('button', { name: '대시보드' })).toBeVisible();
- await expect(desktopStartup.getByRole('button', { name: '이메일' })).toBeVisible();
+ await expect(desktopStartup.getByRole('button', { name: '홈' })).toBeVisible();
+ await expect(desktopStartup.getByRole('button', { name: '메일' })).toBeVisible();
await expect(desktopStartup.getByRole('button', { name: '일정' })).toBeVisible();
expect(
@@ -97,7 +97,7 @@ test('renders Today dashboard pending reply lane with signed API headers', async
expect(desktopHeaders[headerName]).toBeUndefined();
}
- const desktopDashboard = page.locator('section[aria-label="홈 개요 대시보드"]:visible').first();
+ const desktopDashboard = page.locator('section[aria-label="홈 개요"]:visible').first();
await expect(desktopDashboard).toBeVisible();
await expect(page.getByRole('article', { name: '답변 대기' }).first()).toBeVisible();
await expect(desktopDashboard.getByText('답변 대기 메일')).toBeVisible();
@@ -125,7 +125,7 @@ test('renders Today dashboard pending reply lane with signed API headers', async
});
await page.goto('/');
expect((await mobilePendingRequest).headers().authorization).toBe(`Bearer ${expectedNaruonToken}`);
- const mobileDashboard = page.locator('section[aria-label="홈 개요 대시보드"]:visible').first();
+ const mobileDashboard = page.locator('section[aria-label="홈 개요"]:visible').first();
await expect(mobileDashboard).toBeVisible();
await mobileDashboard.getByText('답변 대기 메일').scrollIntoViewIfNeeded();
await expect(mobileDashboard.getByText('답변 대기 메일')).toBeVisible();
@@ -168,7 +168,7 @@ test('keeps the short mobile AI quick action menu inside the viewport with scrol
const menu = page.getByRole('dialog', { name: 'AI 빠른 실행 메뉴' });
await expect(menu).toBeVisible();
- await expect(menu.getByRole('button', { name: '할 일 만들기' })).toBeVisible();
+ await expect(menu.getByRole('button', { name: '실행 항목 생성' })).toBeVisible();
const bounds = await menu.evaluate((element) => {
const rect = element.getBoundingClientRect();
const style = window.getComputedStyle(element);
@@ -209,7 +209,7 @@ test('renders compact mobile navigation without hover-only controls', async ({ p
await page.getByRole('link', { name: '일정' }).click();
await expect(page.getByRole('region', { name: '모바일 일정 연결' })).toBeVisible();
- await expect(page.getByText('캘린더 반영 대기')).toBeVisible();
+ await expect(page.getByText('일정 반영 대기')).toBeVisible();
});
const responsiveViewports = [
@@ -230,7 +230,7 @@ for (const viewport of responsiveViewports) {
await expect(page.locator('main#main-content')).toBeVisible();
await expect(page.locator('header[aria-label="Naruon workspace header"]')).toBeVisible();
- await expect(page.getByRole('region', { name: '홈 개요 대시보드' }).first()).toBeVisible();
+ await expect(page.getByRole('region', { name: '홈 개요' }).first()).toBeVisible();
if (viewport.width <= 390) {
const metricLabel = page
.getByRole('article', { name: '받은 메일' })
@@ -261,9 +261,9 @@ for (const viewport of responsiveViewports) {
await expect(page.getByRole('region', { name: '태블릿 메일 작업공간' })).toBeVisible();
await expect(page.getByRole('region', { name: '데스크톱 메일 작업공간' })).toBeHidden();
await expect(page.getByText('태블릿 맥락 패널')).toBeVisible();
- await expect(page.getByRole('button', { name: '캘린더 반영' })).toBeVisible();
+ await expect(page.getByRole('button', { name: '일정 반영' })).toBeVisible();
await expect(page.getByRole('button', { name: '답장 초안' })).toBeVisible();
- await expect(page.getByRole('button', { name: '할 일 만들기' })).toBeVisible();
+ await expect(page.getByRole('button', { name: '실행 항목 생성' })).toBeVisible();
} else {
await expect(page.getByRole('navigation', { name: 'Primary workspace navigation' })).toBeVisible();
await expect(page.getByRole('region', { name: '데스크톱 메일 작업공간' })).toBeVisible();
@@ -274,7 +274,7 @@ for (const viewport of responsiveViewports) {
for (const destination of [
{ path: '/mail', heading: '메일을 선택하세요', marker: { name: '받은편지함' } },
{ path: '/calendar', heading: '일정 관리', marker: { text: 'CalDAV/CardDAV/WebDAV writeback intent' } },
- { path: '/tasks', heading: '할 일 추적', marker: { name: '리소스 배정 검토 회의' } },
+ { path: '/tasks', heading: '실행 항목 추적', marker: { name: '리소스 배정 검토 회의' } },
{ path: '/data', heading: '데이터와 파일', marker: { text: '중복 반입과 thread 정리' } },
{ path: '/search', heading: '맥락 검색', marker: { name: '관계 그래프와 타임라인' } },
{ path: '/security', heading: '보안과 관리자', marker: { text: '관리자 경계' } },
@@ -654,7 +654,7 @@ test('updates source-linked task ticket status with signed API headers', async (
});
await page.goto('/tasks');
- await expect(page.getByRole('heading', { name: '할 일 추적' })).toBeVisible();
+ await expect(page.getByRole('heading', { name: '실행 항목 추적' })).toBeVisible();
await expect(page.getByRole('region', { name: 'source-linked ticket status board' })).toBeVisible();
await page.getByRole('button', { name: '리소스 배정 검토 회의 상태를 완료로 변경' }).click();
const requestHeaders = (await patchRequest).headers();
@@ -671,7 +671,7 @@ test('updates source-linked task ticket status with signed API headers', async (
await page.setViewportSize({ width: 390, height: 844 });
await page.goto('/tasks');
- await expect(page.getByRole('heading', { name: '할 일 추적' })).toBeVisible();
+ await expect(page.getByRole('heading', { name: '실행 항목 추적' })).toBeVisible();
await expect(page.getByRole('region', { name: 'source-linked ticket status board' })).toBeVisible();
await expect(page.getByText('실제 티켓 큐')).toBeVisible();
await expect(page.getByText('5개 티켓 연결')).toBeVisible();
@@ -715,7 +715,7 @@ test('creates pending reply SLA task escalation with signed API headers', async
});
await page.goto('/tasks');
- await expect(page.getByRole('heading', { name: '할 일 추적' })).toBeVisible();
+ await expect(page.getByRole('heading', { name: '실행 항목 추적' })).toBeVisible();
await page.getByRole('button', { name: '보낸 메일 답변 SLA 티켓 생성' }).click();
const desktopRequest = await desktopEscalationRequest;
const desktopHeaders = desktopRequest.headers();
@@ -739,7 +739,7 @@ test('creates pending reply SLA task escalation with signed API headers', async
return url.pathname === '/api/tasks/reply-sla-escalations' && request.method() === 'POST';
});
await page.goto('/tasks');
- await expect(page.getByRole('heading', { name: '할 일 추적' })).toBeVisible();
+ await expect(page.getByRole('heading', { name: '실행 항목 추적' })).toBeVisible();
await page.getByRole('button', { name: '보낸 메일 답변 SLA 티켓 생성' }).click();
const mobileRequestHeaders = (await mobileEscalationRequest).headers();
expect(mobileRequestHeaders.authorization).toBe(`Bearer ${expectedNaruonToken}`);
@@ -788,7 +788,7 @@ test('creates self-sent knowledge WebDAV intent with signed API headers', async
});
await page.goto('/tasks');
- await expect(page.getByRole('heading', { name: '할 일 추적' })).toBeVisible();
+ await expect(page.getByRole('heading', { name: '실행 항목 추적' })).toBeVisible();
await expect(page.getByRole('region', { name: 'self-sent knowledge WebDAV materialization' })).toBeVisible();
await page.getByRole('button', { name: '나에게 보낸 지식 메모 정리 WebDAV 지식 노트 intent 생성' }).click();
const request = await desktopIntentRequest;
@@ -812,7 +812,7 @@ test('creates self-sent knowledge WebDAV intent with signed API headers', async
return url.pathname === '/api/webdav/knowledge-materialization-intent' && mobileRequest.method() === 'POST';
});
await page.goto('/tasks');
- await expect(page.getByRole('heading', { name: '할 일 추적' })).toBeVisible();
+ await expect(page.getByRole('heading', { name: '실행 항목 추적' })).toBeVisible();
await page.getByRole('button', { name: '나에게 보낸 지식 메모 정리 WebDAV 지식 노트 intent 생성' }).click();
const mobileRequest = await mobileIntentRequest;
expect(mobileRequest.headers().authorization).toBe(`Bearer ${expectedNaruonToken}`);
@@ -847,7 +847,7 @@ test('renders the settings self-hosted connector manifest with mobile scrolling'
await page.getByRole('button', { name: '개발자' }).first().click();
await expect(page.getByText('Self-hosted connector manifest')).toBeVisible();
- await expect(page.getByText('Naruon은 이메일 서버가 아닙니다')).toBeVisible();
+ await expect(page.getByText('Naruon은 메일 서버가 아닙니다')).toBeVisible();
await expect(page.getByText('naruon.net', { exact: true })).toBeVisible();
await expect(page.getByText('ci_smoke_only')).toBeVisible();
await expect(page.getByText('smtp_server')).toBeVisible();
@@ -1370,7 +1370,7 @@ test('captures responsive startup evidence for desktop tablet mobile and the mob
] as const) {
await page.setViewportSize({ width: viewport.width, height: viewport.height });
await page.goto('/');
- await expect(page.getByRole('region', { name: '홈 개요 대시보드' }).first()).toBeVisible();
+ await expect(page.getByRole('region', { name: '홈 개요' }).first()).toBeVisible();
await page.screenshot({ path: testInfo.outputPath(`startup-${viewport.name}.png`), fullPage: true });
if (viewport.name === 'mobile') {
await page.getByRole('button', { name: '워크스페이스 메뉴 열기' }).click();
@@ -1391,8 +1391,8 @@ test('validates mobile hamburger composition and startup preference controls', a
const menuWidth = await menu.evaluate((element) => element.getBoundingClientRect().width);
expect(menuWidth).toBeGreaterThanOrEqual(340);
await expect(menu.getByText('시작 화면', { exact: true })).toBeVisible();
- await expect(menu.getByRole('button', { name: '대시보드' })).toBeVisible();
- await expect(menu.getByRole('button', { name: '이메일' })).toBeVisible();
+ await expect(menu.getByRole('button', { name: '홈' })).toBeVisible();
+ await expect(menu.getByRole('button', { name: '메일' })).toBeVisible();
await expect(menu.getByRole('button', { name: '일정' })).toBeVisible();
await expect(menu.getByRole('link', { name: '홈', exact: true })).toHaveAttribute('href', '/');
await expect(menu.getByRole('link', { name: '메일', exact: true })).toHaveAttribute('href', '/mail');
@@ -1521,7 +1521,7 @@ test('keeps selected mobile email detail and actions above the bottom navigation
await expect(detailRegion).toBeVisible();
await expect(detailRegion.getByText('Q2 출시 계획 및 우선순위 조정')).toBeVisible();
await expect(detailRegion.getByText('출시 일정, 마케팅 계획, 파트너 미팅')).toBeVisible();
- await expect(detailRegion.getByRole('button', { name: '할 일 만들기' })).toBeVisible();
+ await expect(detailRegion.getByRole('button', { name: '실행 항목 생성' })).toBeVisible();
const replyButton = detailRegion.getByRole('button', { name: '답장 보내기' });
await replyButton.scrollIntoViewIfNeeded();
@@ -1533,6 +1533,6 @@ test('keeps selected mobile email detail and actions above the bottom navigation
expect(bottomGap).toBeGreaterThanOrEqual(0);
await page.getByRole('button', { name: 'AI 빠른 실행' }).click();
- await page.getByRole('dialog', { name: 'AI 빠른 실행 메뉴' }).getByRole('button', { name: '할 일 만들기' }).click();
- await expect(detailRegion.getByText('2개 실행 항목을 티켓형 할 일로 추적합니다.')).toBeVisible();
+ await page.getByRole('dialog', { name: 'AI 빠른 실행 메뉴' }).getByRole('button', { name: '실행 항목 생성' }).click();
+ await expect(detailRegion.getByText('2개 실행 항목을 티켓형 실행 항목로 추적합니다.')).toBeVisible();
});
diff --git a/frontend/tests/e2e/dashboard-flows.spec.ts b/frontend/tests/e2e/dashboard-flows.spec.ts
index 69198ced7..b05f43b09 100644
--- a/frontend/tests/e2e/dashboard-flows.spec.ts
+++ b/frontend/tests/e2e/dashboard-flows.spec.ts
@@ -15,14 +15,14 @@ test('connects inbox selection to summary, execution, reply, calendar, and graph
await expect(page.getByText('2개 메시지').nth(1)).toBeVisible();
await expect(page.getByText('1개 노드와 1개 관계')).toBeVisible();
- await page.getByRole('button', { name: '캘린더 반영' }).last().click();
+ await page.getByRole('button', { name: '일정 반영' }).last().click();
await expect(page.getByText('2개 일정 writeback intent를 Customer CalDAV 원본에 요청했습니다.')).toBeVisible();
await page.getByRole('button', { name: 'AI 답장 초안' }).last().click();
await expect(page.getByLabel('답장 초안')).toHaveValue('검토 후 일정과 우선순위를 정리해 공유드리겠습니다.');
await page.getByRole('button', { name: '답장 보내기' }).click();
- await expect(page.getByText('개발 모드에서 답장을 시뮬레이션했습니다. 실제 이메일은 전송되지 않았습니다.')).toBeVisible();
+ await expect(page.getByText('개발 모드에서 답장을 시뮬레이션했습니다. 실제 메일은 전송되지 않았습니다.')).toBeVisible();
});
test('submits branded inbox search against the search API', async ({ page }, testInfo) => {
@@ -51,6 +51,6 @@ test('selects an email on mobile and executes visible detail task actions', asyn
await expect(detailRegion.getByText('Q2 출시 계획 및 우선순위 조정')).toBeVisible();
await expect(detailRegion.getByText('출시 일정, 마케팅 계획, 파트너 미팅')).toBeVisible();
await expect(detailRegion.getByRole('heading', { name: '실행 항목' })).toBeVisible();
- await detailRegion.getByRole('button', { name: '할 일 만들기' }).click();
- await expect(detailRegion.getByText('2개 실행 항목을 티켓형 할 일로 추적합니다.')).toBeVisible();
+ await detailRegion.getByRole('button', { name: '실행 항목 생성' }).click();
+ await expect(detailRegion.getByText('2개 실행 항목을 티켓형 실행 항목로 추적합니다.')).toBeVisible();
});
diff --git a/frontend/tests/e2e/scrolling.spec.ts b/frontend/tests/e2e/scrolling.spec.ts
index 44cba4032..93f55c0a0 100644
--- a/frontend/tests/e2e/scrolling.spec.ts
+++ b/frontend/tests/e2e/scrolling.spec.ts
@@ -22,7 +22,7 @@ test.describe('Scrolling behavior', () => {
const heading = page.locator('h1', { hasText: '안녕하세요' });
await expect(heading).toBeVisible();
- const scrollContainer = page.locator('[role="region"][aria-label="홈 개요 대시보드"]');
+ const scrollContainer = page.locator('[role="region"][aria-label="홈 개요"]');
const scrollState = await scrollContainer.evaluate((node) => {
const element = node as HTMLElement;
const previousTop = element.scrollTop;
From 91fb8525e84419da3a26d6504df4d5c9be05167c Mon Sep 17 00:00:00 2001
From: seonghobae <8172694+seonghobae@users.noreply.github.com>
Date: Thu, 4 Jun 2026 04:38:55 +0000
Subject: [PATCH 2/6] refactor: update UI terminology to Naruon guidelines
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
- Map 'AI Summary' to '맥락 종합'
- Map 'Insight' to '판단 포인트'
- Map 'Todo' to '실행 항목'
- Map 'Calendar Sync' to '일정 반영'
- Map 'Dashboard' to '홈'
- Map 'Email' to '메일'
- Update related test cases and e2e specs to reflect new text
- Fix grammatical postpositions for Korean strings
---
frontend/dev_server.log | 18 ++++++++++++++++++
1 file changed, 18 insertions(+)
create mode 100644 frontend/dev_server.log
diff --git a/frontend/dev_server.log b/frontend/dev_server.log
new file mode 100644
index 000000000..66e9739d3
--- /dev/null
+++ b/frontend/dev_server.log
@@ -0,0 +1,18 @@
+
+> frontend@0.1.0 dev
+> next dev
+
+⚠ Port 3000 is in use by an unknown process, using available port 3001 instead.
+▲ Next.js 16.2.6 (Turbopack)
+- Local: http://localhost:3001
+- Network: http://192.168.0.2:3001
+✓ Ready in 2.3s
+⨯ Another next dev server is already running.
+
+- Local: http://localhost:3000
+- PID: 69499
+- Dir: /app/frontend
+- Log: .next/dev/logs/next-development.log
+
+Run kill 69499 to stop it.
+[?25h
From ddcf0b9d3488a17685ddda7b30a2ce864ac39879 Mon Sep 17 00:00:00 2001
From: seonghobae <8172694+seonghobae@users.noreply.github.com>
Date: Thu, 4 Jun 2026 05:35:53 +0000
Subject: [PATCH 3/6] refactor: update UI terminology to Naruon guidelines
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
- Map 'AI Summary' to '맥락 종합'
- Map 'Insight' to '판단 포인트'
- Map 'Todo' to '실행 항목'
- Map 'Calendar Sync' to '일정 반영'
- Map 'Dashboard' to '홈'
- Map 'Email' to '메일'
- Update related test cases and e2e specs to reflect new text
- Fix grammatical postpositions for Korean strings
---
frontend/dev_server.log | 18 ------------------
1 file changed, 18 deletions(-)
delete mode 100644 frontend/dev_server.log
diff --git a/frontend/dev_server.log b/frontend/dev_server.log
deleted file mode 100644
index 66e9739d3..000000000
--- a/frontend/dev_server.log
+++ /dev/null
@@ -1,18 +0,0 @@
-
-> frontend@0.1.0 dev
-> next dev
-
-⚠ Port 3000 is in use by an unknown process, using available port 3001 instead.
-▲ Next.js 16.2.6 (Turbopack)
-- Local: http://localhost:3001
-- Network: http://192.168.0.2:3001
-✓ Ready in 2.3s
-⨯ Another next dev server is already running.
-
-- Local: http://localhost:3000
-- PID: 69499
-- Dir: /app/frontend
-- Log: .next/dev/logs/next-development.log
-
-Run kill 69499 to stop it.
-[?25h
From fe56f3e62c422a78fd4c1dda0d4f4ae9c6031175 Mon Sep 17 00:00:00 2001
From: Seongho Bae
Date: Thu, 4 Jun 2026 15:30:28 +0900
Subject: [PATCH 4/6] fix: address terminology review feedback
---
frontend/src/components/DashboardLayout.tsx | 2 +-
frontend/src/components/TasksLayout.tsx | 6 +++---
frontend/tests/e2e/dashboard-branding.spec.ts | 2 +-
frontend/tests/e2e/dashboard-flows.spec.ts | 2 +-
4 files changed, 6 insertions(+), 6 deletions(-)
diff --git a/frontend/src/components/DashboardLayout.tsx b/frontend/src/components/DashboardLayout.tsx
index 8db1a361a..e6de91d6f 100644
--- a/frontend/src/components/DashboardLayout.tsx
+++ b/frontend/src/components/DashboardLayout.tsx
@@ -73,7 +73,7 @@ const mobileWorkspaceMenuItems = [
const headerActions = [
{ label: '일정 반영', action: 'calendar-sync', message: '메일 상세 패널에서 실행 항목을 캘린더에 반영합니다.', icon: CalendarDays },
{ label: '답장 초안', action: 'reply-draft', message: '메일 상세 패널에서 답장 초안을 생성합니다.', icon: PenLine },
- { label: '실행 항목 생성', action: 'create-task', message: '메일 상세 패널에서 실행 항목을 실행 항목으로 정리합니다.', icon: CheckCircle2 },
+ { label: '실행 항목 생성', action: 'create-task', message: '메일 상세 패널에서 메일 후속 작업을 실행 항목으로 정리합니다.', icon: CheckCircle2 },
];
diff --git a/frontend/src/components/TasksLayout.tsx b/frontend/src/components/TasksLayout.tsx
index b4dae5e98..37d9975db 100644
--- a/frontend/src/components/TasksLayout.tsx
+++ b/frontend/src/components/TasksLayout.tsx
@@ -520,9 +520,9 @@ export function TasksLayout() {
{task.due}
출처
-
diff --git a/frontend/tests/e2e/dashboard-branding.spec.ts b/frontend/tests/e2e/dashboard-branding.spec.ts
index ef52a3b2a..70ae45b61 100644
--- a/frontend/tests/e2e/dashboard-branding.spec.ts
+++ b/frontend/tests/e2e/dashboard-branding.spec.ts
@@ -1534,5 +1534,5 @@ test('keeps selected mobile email detail and actions above the bottom navigation
await page.getByRole('button', { name: 'AI 빠른 실행' }).click();
await page.getByRole('dialog', { name: 'AI 빠른 실행 메뉴' }).getByRole('button', { name: '실행 항목 생성' }).click();
- await expect(detailRegion.getByText('2개 실행 항목을 티켓형 실행 항목로 추적합니다.')).toBeVisible();
+ await expect(detailRegion.getByText('2개 실행 항목을 티켓형 실행 항목으로 추적합니다.')).toBeVisible();
});
diff --git a/frontend/tests/e2e/dashboard-flows.spec.ts b/frontend/tests/e2e/dashboard-flows.spec.ts
index b05f43b09..7c77800c9 100644
--- a/frontend/tests/e2e/dashboard-flows.spec.ts
+++ b/frontend/tests/e2e/dashboard-flows.spec.ts
@@ -52,5 +52,5 @@ test('selects an email on mobile and executes visible detail task actions', asyn
await expect(detailRegion.getByText('출시 일정, 마케팅 계획, 파트너 미팅')).toBeVisible();
await expect(detailRegion.getByRole('heading', { name: '실행 항목' })).toBeVisible();
await detailRegion.getByRole('button', { name: '실행 항목 생성' }).click();
- await expect(detailRegion.getByText('2개 실행 항목을 티켓형 실행 항목로 추적합니다.')).toBeVisible();
+ await expect(detailRegion.getByText('2개 실행 항목을 티켓형 실행 항목으로 추적합니다.')).toBeVisible();
});
From d33b20c5ee2d6a5de20335c4a7b5e8ce688d02b8 Mon Sep 17 00:00:00 2001
From: seonghobae <8172694+seonghobae@users.noreply.github.com>
Date: Thu, 4 Jun 2026 06:51:09 +0000
Subject: [PATCH 5/6] ci: increase strix job timeout budgets
- Increase overall job timeout-minutes from 90 to 120
- Increase `process_budget_seconds` from 2400 to 3600
- Increase `LLM_TIMEOUT` from 90 to 120
- Increase `STRIX_TOTAL_TIMEOUT_SECONDS` from 4800 to 7200
This addresses the `Strix run timed out after 2400s (exit code 124)` failure observed in CI.
---
.github/workflows/strix.yml | 10 +++++-----
frontend/src/components/DashboardLayout.tsx | 2 +-
frontend/src/components/TasksLayout.tsx | 6 +++---
frontend/tests/e2e/dashboard-branding.spec.ts | 2 +-
frontend/tests/e2e/dashboard-flows.spec.ts | 2 +-
5 files changed, 11 insertions(+), 11 deletions(-)
diff --git a/.github/workflows/strix.yml b/.github/workflows/strix.yml
index c44b73f70..f35cbf5aa 100644
--- a/.github/workflows/strix.yml
+++ b/.github/workflows/strix.yml
@@ -40,7 +40,7 @@ permissions:
jobs:
strix:
- timeout-minutes: 90
+ timeout-minutes: 120
runs-on: ubuntu-latest
steps:
- name: Harden runner
@@ -311,14 +311,14 @@ jobs:
IS_PR_EVIDENCE_RUN: ${{ (github.event_name == 'pull_request_target' || github.event.inputs.pr_number != '') && 'true' || 'false' }}
run: |
budget_suffix="TIME""OUT"
- process_budget_seconds="2400"
+ process_budget_seconds="3600"
if [ "$IS_PR_EVIDENCE_RUN" = "true" ]; then
- process_budget_seconds="2400"
+ process_budget_seconds="3600"
fi
- export "LLM_${budget_suffix}=90"
+ export "LLM_${budget_suffix}=120"
export "STRIX_MEMORY_COMPRESSOR_${budget_suffix}=10"
export "STRIX_PROCESS_${budget_suffix}_SECONDS=$process_budget_seconds"
- export "STRIX_TOTAL_${budget_suffix}_SECONDS=4800"
+ export "STRIX_TOTAL_${budget_suffix}_SECONDS=7200"
bash "$TRUSTED_STRIX_GATE"
- name: Collect Strix reports for artifact upload
diff --git a/frontend/src/components/DashboardLayout.tsx b/frontend/src/components/DashboardLayout.tsx
index e6de91d6f..8db1a361a 100644
--- a/frontend/src/components/DashboardLayout.tsx
+++ b/frontend/src/components/DashboardLayout.tsx
@@ -73,7 +73,7 @@ const mobileWorkspaceMenuItems = [
const headerActions = [
{ label: '일정 반영', action: 'calendar-sync', message: '메일 상세 패널에서 실행 항목을 캘린더에 반영합니다.', icon: CalendarDays },
{ label: '답장 초안', action: 'reply-draft', message: '메일 상세 패널에서 답장 초안을 생성합니다.', icon: PenLine },
- { label: '실행 항목 생성', action: 'create-task', message: '메일 상세 패널에서 메일 후속 작업을 실행 항목으로 정리합니다.', icon: CheckCircle2 },
+ { label: '실행 항목 생성', action: 'create-task', message: '메일 상세 패널에서 실행 항목을 실행 항목으로 정리합니다.', icon: CheckCircle2 },
];
diff --git a/frontend/src/components/TasksLayout.tsx b/frontend/src/components/TasksLayout.tsx
index 37d9975db..b4dae5e98 100644
--- a/frontend/src/components/TasksLayout.tsx
+++ b/frontend/src/components/TasksLayout.tsx
@@ -520,9 +520,9 @@ export function TasksLayout() {
{task.due}