Filed by the SaaS launch review. Priority P3.4 — severity low, category duplication.
Problem
STATUS_BADGE_VARIANT and STATUS_LABEL are duplicated verbatim across TaskCard, TaskDetailModal and TaskColumn, so adding or renaming a status requires editing three files no test links together and the board and detail modal will drift. Four independent USD formatters exist across the costs components plus raw toFixed(4) in two session components, so the Costs page, task cards and session cards can disagree on the same figure — a credibility problem for a billing surface. useNotifications hardcodes 'codeframe_workspace_path', duplicating the unexported STORAGE_KEY, so notification workspace-scoping breaks silently the moment that key changes. eventDetailIcons is exported with no importer and msw is a declared dev dependency no test imports.
Evidence
web-ui/src/components/tasks/TaskCard.tsx:45
web-ui/src/components/costs/TopTasksTable.tsx:15
web-ui/src/lib/eventStyles.ts:120
web-ui/src/hooks/useNotifications.ts:116
web-ui/package.json:57
Acceptance criteria
Atomic by construction: one developer, one focused session.
Problem
STATUS_BADGE_VARIANT and STATUS_LABEL are duplicated verbatim across TaskCard, TaskDetailModal and TaskColumn, so adding or renaming a status requires editing three files no test links together and the board and detail modal will drift. Four independent USD formatters exist across the costs components plus raw toFixed(4) in two session components, so the Costs page, task cards and session cards can disagree on the same figure — a credibility problem for a billing surface. useNotifications hardcodes 'codeframe_workspace_path', duplicating the unexported STORAGE_KEY, so notification workspace-scoping breaks silently the moment that key changes. eventDetailIcons is exported with no importer and msw is a declared dev dependency no test imports.
Evidence
web-ui/src/components/tasks/TaskCard.tsx:45web-ui/src/components/costs/TopTasksTable.tsx:15web-ui/src/lib/eventStyles.ts:120web-ui/src/hooks/useNotifications.ts:116web-ui/package.json:57Acceptance criteria
cd web-ui && npm test && npm run buildpassesAtomic by construction: one developer, one focused session.