B.Nye Design Approval System
Two-Phase Creative Workflow with SLA Tracking
Amazon's largest line of business told us our creative approval process was too slow and too hard to manage. Instead of pushing back, I took action — I built a two-phase approval system from scratch to streamline the process, sequencing static and animated reviews with business-hours-aware SLA tracking. This wasn't in my job description. I built it because every day a creative sat in approval limbo was a day of lost revenue from the flight. The system was rolled out company-wide and became a core part of the white-glove service that retains enterprise clients.
2
Workflow Phases
4
Platform Adapters
48/24h
SLA Engine
3
Environments
Problem
Amazon's largest line of business flagged creative approvals as a bottleneck — too slow, too hard to manage. Static and animated reviews ran in parallel with no dependency chain. Designers were building animated demos for creatives that hadn't even passed static review. SLA deadlines ignored business hours. Every day a creative sat in approval limbo was a day of lost revenue from the campaign flight. This wasn't a technology problem — it was a process problem that no one in my role was expected to solve.
Solution
I took action anyway. I built a two-phase approval system from scratch: static review first (48h SLA), animated review only after static approval (24h SLA per revision). SLA calculations respect business hours (M-F, 9am-6pm EST). Priority grouping by business impact ensures the team works on revenue-critical creatives first. The system turned a client complaint into a competitive advantage — it was rolled out company-wide and became a core part of the white-glove service model that retains enterprise accounts.
Architecture
┌─────────────┐ ┌──────────────┐ ┌─────────────┐
│ Content │────▶│ Approval │────▶│ Integration │
│ Director │ │ Workflow │ │ Manager │
│ (Sonnet) │ │ (8 states) │ │ (Sonnet) │
└─────────────┘ └──────┬───────┘ └──────┬──────┘
│ │
┌──────▼───────┐ ┌──────▼──────┐
│ Compliance │ │ Platform │
│ Agent │ │ Adapters │
│ (Haiku) │ │ A │ B │ C │
└──────────────┘ └─────────────┘
│ │
┌──────▼───────┐ ┌──────▼──────┐
│ Protocol │ │ Pipeline │
│ Engine │ │ Analyst │
│ (XML gen) │ │ (Haiku) │
└──────────────┘ └─────────────┘System Components
Approval Workflow
8-state machine: Draft → Review → Approved → Integrated → Active
Content Director
Claude Sonnet — generates optimized content from briefs
Compliance Agent
Claude Haiku — validates against platform specs and brand safety
Integration Manager
Claude Sonnet — orchestrates multi-platform uploads and audit lifecycle
Pipeline Analyst
Claude Haiku — fee stack analysis and path optimization
Platform Adapters
A/B/C/D — abstract base class with per-platform spec validation
XML Protocol Engine
Generates spec-compliant XML with compliance wrapping and measurement tags
PostgreSQL + RLS
6 tables with row-level security, audit trail on every state transition
Key Engineering
8-State Approval Workflow
Every transition creates an audit event with reviewer, timestamp, and notes. Invalid transitions are rejected at the state machine level.
class ApprovalWorkflow:
TRANSITIONS = {
"DRAFT": ["PENDING_REVIEW"],
"PENDING_REVIEW": ["APPROVED", "REVISION_REQUESTED"],
"REVISION_REQUESTED": ["PENDING_REVIEW"],
"APPROVED": ["INTEGRATED"],
"INTEGRATED": ["ACTIVE", "PAUSED"],
"ACTIVE": ["PAUSED", "ARCHIVED"],
"PAUSED": ["ACTIVE", "ARCHIVED"],
}
async def transition(self, item_id, to_status, reviewer, notes):
current = await self.get_status(item_id)
if to_status not in self.TRANSITIONS.get(current, []):
raise InvalidTransition(f"{current} → {to_status}")
await self.db.insert_event(item_id, current, to_status, reviewer, notes)
return await self.db.update_status(item_id, to_status)Platform Adapter Pattern
Abstract base class with per-platform implementations. Each adapter validates specs, formats payloads, and handles audit status polling independently.
class PlatformAdapter:
name: str
async def upload(self, asset_url, protocol_url, metadata) -> UploadResult:
"""Validate specs, format payload, submit to platform."""
...
async def check_audit(self, item_id: str) -> AuditStatus:
"""Poll platform for review status."""
...
# Platform A — strict specs, certified supply chain
class PlatformA(PlatformAdapter):
name = "Platform A"
MAX_DURATION = 30
MIN_RESOLUTION = (1920, 1080)22 MCP Tools
Each agent accesses the system through a structured MCP tool server — approval actions, content database queries, protocol generation, and pipeline analysis all exposed as typed tools.
Compliance Automation
The Compliance Agent validates every submission against platform-specific requirements, measurement vendor configuration, and brand safety rules before allowing state transitions.