diff --git a/AGENTS.md b/AGENTS.md index fb8f31b3b..75d1a8177 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -125,6 +125,9 @@ - When reviews find inert navigation/dead-space controls, either wire them to an implemented workspace route/API or remove the control; do not leave high-traffic drawer/sidebar entries as permanent `준비 중` copy. +- Icon-only workspace controls must carry localized `aria-label` text matching + the visible app language; do not rely on the SVG icon alone for Calendar, + Tasks, drawer, modal, or toolbar actions. - Execution steps resulting in `Timeout`, `Fatal`, `Warn`, or `Denied` outputs are considered hard failures. Tests must run without these warnings to be considered passing. - DB-affecting API slices need both mocked fast tests and a real PostgreSQL bootstrap/smoke path before PR merge evidence is considered complete. diff --git a/frontend/src/app/calendar/page.test.tsx b/frontend/src/app/calendar/page.test.tsx index 310f914c0..2e76cba6f 100644 --- a/frontend/src/app/calendar/page.test.tsx +++ b/frontend/src/app/calendar/page.test.tsx @@ -88,6 +88,10 @@ describe("CalendarPage", () => { expect(container.textContent).toContain("새 일정"); expect(container.textContent).toContain("CalDAV/CardDAV/WebDAV writeback intent"); expect(container.textContent).not.toContain("뷰는 아직 구현 중입니다"); + expect(container.querySelector('button[aria-label="이전 달"]')).not.toBeNull(); + expect(container.querySelector('button[aria-label="다음 달"]')).not.toBeNull(); + expect(container.querySelector('button[aria-label="설정"]')).not.toBeNull(); + expect(container.querySelector('button[aria-label="닫기"]')).not.toBeNull(); }); it("creates a signed customer-owned calendar writeback intent", async () => { diff --git a/frontend/src/app/tasks/page.test.tsx b/frontend/src/app/tasks/page.test.tsx index b2b4d91a9..8ba50eab3 100644 --- a/frontend/src/app/tasks/page.test.tsx +++ b/frontend/src/app/tasks/page.test.tsx @@ -69,6 +69,7 @@ describe("TasksPage", () => { expect(container.textContent).toContain("위임한 작업"); expect(container.textContent).toContain("실제 티켓 큐"); expect(container.textContent).toContain("연결된 티켓 없음"); + expect(container.querySelector('button[aria-label="더보기"]')).not.toBeNull(); }); it("loads source-linked tickets from the signed task API", async () => { diff --git a/frontend/src/components/CalendarLayout.tsx b/frontend/src/components/CalendarLayout.tsx index 334321110..fc4692c10 100644 --- a/frontend/src/components/CalendarLayout.tsx +++ b/frontend/src/components/CalendarLayout.tsx @@ -157,8 +157,8 @@ export function CalendarLayout() {