Develop API for managing budget pacing and alerts. Implementation contract: - Outcome: Budget Pacing API - Requirement sources: - src-68a13c13148c674b - src-e27502008950d2a3 - src-27d78ac7d44d60f9 - src-0f5ab94e340fac11 - src-47a0d73f83d0b638 - Owned behavior: - Develop API for managing budget pacing and alerts. - Manage budget pacing - Set budget targets - Configure alerts - Manage budget pacing, target setting, and alert configuration. - Interfaces: - REST API endpoints - Provide dashboard.budget.pacing: Manage budget pacing, target setting, and alert configuration. - State transitions: - Budget and alert configurations updated - Failure and safety behavior: - API errors - Data validation failures Acceptance criteria: - The task-owned behavior is implemented and verified without undeclared mocks or downstream assumptions. - The declared task-owned behavior is implemented and verified without relying on undeclared mocks or downstream behavior. - Capability dashboard.budget.pacing implements Manage budget pacing, target setting, and alert configuration. and is verified through its declared interfaces.
Implement API to fetch and manage user identity. Implementation contract: - Outcome: User Identity API - Requirement sources: - src-5c666b02e76288e6 - Owned behavior: - Implement API to fetch and manage user identity. - Fetch user identity - Manage user session - Fetch and manage current user identity for display. - Interfaces: - REST API endpoints - Provide dashboard.user.identity: Fetch and manage current user identity for display. - State transitions: - User identity fetched - Failure and safety behavior: - API errors - Session management failures - Use authoritative session/current-user state, enforce access server-side, and fail closed without exposing prototype identity data. Acceptance criteria: - The task-owned behavior is implemented and verified without undeclared mocks or downstream assumptions. - The declared task-owned behavior is implemented and verified without relying on undeclared mocks or downstream behavior. - Capability dashboard.user.identity implements Fetch and manage current user identity for display. and is verified through its declared interfaces.
As a Frontend Developer, implement the approved Dashboard page design and the task-owned sections below. Implementation contract: - Outcome: Implement Dashboard page - Requirement sources: - src-5c666b02e76288e6 - src-68a13c13148c674b - src-e27502008950d2a3 - src-27d78ac7d44d60f9 - src-0f5ab94e340fac11 - src-47a0d73f83d0b638 - src-fecb8e2e06c7dd8a - src-9af449172826d283 - src-74e958fb756e52fd - src-8dc6f6ce67b33bbd - src-5688ebc2a9975a25 - src-ad01fca7cf0f50c0 - 4 additional source record(s) are retained in the structured implementation contract. - Owned behavior: - Display product branding and authentication state - Configure budgets, set targets, manage alert preferences - sort_by_column - filter_by_date_range - view_trend - view_alert_history - acknowledge_alert - Interfaces: - User Identity API - Budget Pacing API - Consume dashboard.user.identity through CURRENT_USER. - Consume dashboard.budget.pacing: Manage budget pacing, target setting, and alert configuration. - Consume dashboard.user.identity: Fetch and manage current user identity for display. - State transitions: - Toggle account menu - Save budget configuration - Fetch and display current user identity dynamically. - Use neutral loading, empty, anonymous, and error states instead of restoring prototype data. - Failure and safety behavior: - Display error on invalid budget target - Never retain or restore hardcoded prototype data as the runtime fallback when live integration fails. - Prototype-to-live replacements: - Replace '[design.Dashboard.DashboardHeader.implementation[1]] import \'../styles/DashboardHeader.css\';\nimport React, { useState, useRef, useEffect } from \'react\';\nimport { motion } from \'motion/react\';\n\nconst CURRENT_USER = {\n name: \'Jordan Reyes\',\n agency: \'Northbound Media Group\',\n initials: \'JR\',\n};\n\nfunction DashboardHeader() {\n const [menuOpen, setMenuOpen] = useState(false);\n const menuRef = useRef(null);\n\n useEffect(() => {\n function handleClickOutside(e) {\n if (menuRef.current && !menuRef.current.contains(e.target)) {\n setMenuOpen(false);\n }\n }\n function handleKeyDown(e) {\n if (e.key === \'Escape\') setMenuOpen(false);\n }\n document.addEventListener(\'mousedown\', handleClickOutside);\n document.addEventListener(\'keydown\', handleKeyDown);\n return () => {\n document.removeEventListener(\'mousedown\', handleClickOutside);\n document.removeEventListener(\'keydown\', handleKeyDown);\n };\n }, []);\n\n return (\n <motion.header\n className="dh-header"\n initial={{ opacity: 0, y: -6 }}\n animate={{ opacity: 1, y: 0 }}\n transition={{ duration: 0.18, ease: \'easeOut\' }}\n >\n <div className="dh-inner">\n <div className="dh-brand">\n <span className="dh-mark" aria-hidden="true">\n <span className="dh-mark-dot dh-mark-dot--primary" />\n <span className="dh-mark-dot dh-mark-dot--accent" />\n </span>\n <span className="dh-wordmark">lunar-google</span>\n <span className="dh-tagline">Budget Pacing</span>\n </div>\n\n <div className="dh-session" ref={menuRef}>\n <div className="dh-session-text">\n <span className="dh-session-name">{CURRENT_USER.name}</span>\n <span className="dh-session-agency">{CURRENT_USER.agency}</span>\n </div>\n\n <button\n type="button"\n className={`dh-menu-trigger ${menuOpen ? \'dh-menu-trigger--open\' : \'\'}`}\n onClick={() => setMenuOpen((open) => !open)}\n aria-haspopup="true"\n aria-expanded={menuOpen}\n aria-label="Account menu"\n >\n <span className="dh-avatar">{CURRENT_USER.initials}</span>\n <svg\n className="dh-chevron"\n width="12"\n height="12"\n viewBox="0 0 12 12"\n fill="none"\n aria-hidden="true"\n >\n <path\n d="M2.5 4.5L6 8L9.5 4.5"\n stroke="currentColor"\n strokeWidth="1.5"\n strokeLinecap="round"\n strokeLinejoin="round"\n />\n </svg>\n </button>\n\n {menuOpen && (\n <motion.div\n className="dh-dropdown"\n role="menu"\n initial={{ opacity: 0, y: -4, scale: 0.98 }}\n animate={{ opacity: 1, y: 0, scale: 1 }}\n transition={{ duration: 0.14, ease: \'easeOut\' }}\n >\n <div className="dh-dropdown-header">\n <span className="dh-dropdown-name">{CURRENT_USER.name}</span>\n <span className="dh-dropdown-agency">{CURRENT_USER.agency}</span>\n </div>\n <div className="dh-dropdown-divider" />\n <button type="button" className="dh-dropdown-item" role="menuitem">\n Account settings\n </button>\n <button type="button" className="dh-dropdown-item dh-dropdown-item--danger" role="menuitem">\n Log out\n </button>\n </motion.div>\n )}\n </div>\n </div>\n </motion.header>\n );\n}\n\nexport default DashboardHeader;' with CURRENT_USER. Fetch and display current user identity dynamically. Acceptance criteria: - The task-owned behavior is implemented and verified without undeclared mocks or downstream assumptions. - Dashboard page renders with DashboardHeader and DashboardBudgetPacingPanel exactly once. - DashboardHeader displays product branding and authenticated user context with dynamic user identity. - DashboardBudgetPacingPanel displays a real-time budget pacing graph, spend-vs-target summary, and configuration controls. - User can toggle account menu and save budget configurations with feedback. - Design structure and theme are preserved as per the design system. - Access is shared with Marketing Agency User persona. - Dashboard page renders with DashboardHistoricalDataTable and DashboardAlertStatus sections. - DashboardHistoricalDataTable supports sorting and filtering with pagination. - DashboardAlertStatus displays alerts with correct status indicators and empty state when no alerts exist. - Design structure and theme match provided CSS. - Fetch and display current user identity dynamically. - The prototype value is absent from successful runtime rendering and from error fallbacks. - Capability dashboard.budget.pacing implements Manage budget pacing, target setting, and alert configuration. and is verified through its declared interfaces. - Capability dashboard.user.identity implements Fetch and manage current user identity for display. and is verified through its declared interfaces.
As a Frontend Developer, implement the approved Dashboard page design and the task-owned sections below. Implementation contract: - Outcome: Implement DashboardExportAction section - Requirement sources: - src-0134c345943f93d4 - src-686390702894eb9e - src-448268ea7c7e256a - src-6b149d1500840349 - Owned behavior: - select_export_format - trigger_export - download_report - State transitions: - menuOpen toggle - status change from idle to generating to ready - Failure and safety behavior: - Handle export failure gracefully with user feedback Acceptance criteria: - The task-owned behavior is implemented and verified without undeclared mocks or downstream assumptions. - DashboardExportAction renders once - Export format selection works - Report generation triggers with feedback - Design matches SRD

Alerts fire once per threshold crossing, per campaign, per day.
Read-only record of monthly spend across campaigns for trend analysis and reporting.
| Retargeting Campaign | Feb 2026Feb 1, 2026 | $2,687.50 | Approaching Limit |
| Summer Product Launch | Jan 2026Jan 20, 2026 | $6,718.75 | On Pace |
| Q3 Brand Awareness Campaign | Jan 2026Jan 15, 2026 | $4,031.25 | On Pace |
Triggered at 85% of monthly target ($2,550 of $3,000)
Summarize 3 campaigns, $13,437.50 total spend, for Aug 1 – Aug 22, 2026.

Alerts fire once per threshold crossing, per campaign, per day.
Read-only record of monthly spend across campaigns for trend analysis and reporting.
| Retargeting Campaign | Feb 2026Feb 1, 2026 | $2,687.50 | Approaching Limit |
| Summer Product Launch | Jan 2026Jan 20, 2026 | $6,718.75 | On Pace |
| Q3 Brand Awareness Campaign | Jan 2026Jan 15, 2026 | $4,031.25 | On Pace |
Triggered at 85% of monthly target ($2,550 of $3,000)
Summarize 3 campaigns, $13,437.50 total spend, for Aug 1 – Aug 22, 2026.
No comments yet. Be the first!