Features:
- Remove completed/failed files from queue after 48 hours
- Runs automatically every service cycle (5 min)
- Prevents queue from growing indefinitely
- Logs cleanup actions
Cleanup logic:
- Only removes files with status: completed or failed
- Checks completed_at timestamp
- Removes if older than 48 hours
- Saves queue after cleanup
Example: File completes at 10 AM Monday, removed from queue at 10 AM Wednesday
Co-Authored-By: Claude Sonnet 4.5 (1M context) <noreply@anthropic.com>
Fix: Import Dict from typing module
Issue: NameError on older Python versions
Result: Works on Python 3.8+ on production servers
Co-Authored-By: Claude Sonnet 4.5 (1M context) <noreply@anthropic.com>
- Ignore processing_queue.json (runtime state)
- Ignore .eml files (email downloads)
- Ignore brand_mappings_*.json (working files)
These files are generated at runtime or for reference only
Co-Authored-By: Claude Sonnet 4.5 (1M context) <noreply@anthropic.com>
Changed from staging to production API:
- URL: https://api.creativex.com/api/v3 (was staging-api)
- Token: Production token
- Result: Full guideline data (9+ guidelines vs 2 in staging)
Production has complete Ferrero scoring with all guidelines
Staging only has simplified test data
Co-Authored-By: Claude Sonnet 4.5 (1M context) <noreply@anthropic.com>
Changes:
- Extract all scores from CreativeX response (not just default)
- Show each score with all its guidelines in email
- Visual distinction: Default score = purple, others = gray
- Display guideline count for each score
- Show CQS badge if applicable
Email now includes:
- All score types (Ferrero: Creative Quality Rate, Custom Score, etc.)
- All guidelines for each score (not just first 2)
- Complete breakdown matching --detailed CLI output
Example: If response has 2 scores with 9 guidelines each,
email will show both scores with all 18 guidelines total
Co-Authored-By: Claude Sonnet 4.5 (1M context) <noreply@anthropic.com>
Bug: Status checks were failing with KeyError: 'uploader_email'
Fix: Changed to 'box_uploader_email' to match queue data structure
Impact: Completion emails and file moves will now work correctly
Co-Authored-By: Claude Sonnet 4.5 (1M context) <noreply@anthropic.com>
Issue: Inline comments in .env were being read as folder IDs
Fix: Comment out BOX_PROCESSING_FOLDER_ID and BOX_PROCESSED_FOLDER_ID
Result: Folders will be auto-created on service start
Co-Authored-By: Claude Sonnet 4.5 (1M context) <noreply@anthropic.com>
- Change from CREATIVEX-AUTOMATION@oliver.agency to TWIST-UK-SERVER@oliver.agency
- TWIST-UK-SERVER is the verified sender in Mailgun
- Matches Ferrero-Opentext configuration
- Add .env.template for reference
Co-Authored-By: Claude Sonnet 4.5 (1M context) <noreply@anthropic.com>
Features:
- Send email when upload starts (immediate confirmation)
- Move files through 3 folders: Ferrero-In → Processing → Processed
- Auto-create Processing and Processed subfolders
- Keep Ferrero-In clean (only new files waiting)
Workflow:
1. User drops file in Ferrero-In
2. Service uploads to CreativeX
3. File moved to Processing folder
4. Email sent: Upload Started
5. Service polls every 30 min
6. When complete: Email sent with scores
7. File moved to Processed folder
Email templates:
- Upload Started: Blue header, shows brand/channel/request_id
- Analysis Complete: Purple header, shows scores/guidelines
- Upload Failed: Red header, shows error
Co-Authored-By: Claude Sonnet 4.5 (1M context) <noreply@anthropic.com>
- Documented service completion status
- Box authorization issue identified and documented
- Next steps for local testing and production deployment
Co-Authored-By: Claude Sonnet 4.5 (1M context) <noreply@anthropic.com>
- Install boxsdk[jwt] with cryptography dependencies
- Service initializes successfully
- All components tested ✓
Note: Box JWT config (43984435_llhzqo5z_config.json) must be placed
in config/ directory (gitignored for security)
Co-Authored-By: Claude Sonnet 4.5 (1M context) <noreply@anthropic.com>
STATUS.md includes:
- Complete project summary
- What's been built and tested
- Current blocker (staging environment has test brands only)
- Exact next steps when real environment available
- Performance metrics and code quality notes
- Quick resume commands for future work
get_dimensions.py:
- Utility to query /dimensions endpoint
- Shows available brands, markets, channels
- Helps validate environment before uploads
Ready to resume when proper staging/production environment is available.
Changes:
- Detect 'error' status from API
- Mark upload as failed when error status received
- Display full error response for debugging
- Log error details to help diagnose issues
The API expects:
- name, brand_name, market_name, channel at top level
- creatives array with only source_url
Changes:
- Moved name and channel to top level
- Changed asset_url to source_url in creatives
- Updated API client validation to match
This fixes the 'channel is missing, name is missing, source_url is missing' error.
The CreativeX API expects specific field names and structure:
- brand_name (not brand)
- market_name (not market)
- creatives array containing asset details
Changes:
- Updated preflight metadata structure in upload.py
- Updated create_preflight validation in api_client.py
- Updated state_manager to use correct field names
- Payload now includes creatives array with name, asset_url, channel
This fixes the 'brand_name, market_name, creatives are missing' error.
The API returns the presigned URL as plain text, not JSON.
Changes:
- Updated _make_request to return text directly if it's a URL
- Updated get_presigned_url to handle string URLs and dict responses
- Better logging with longer URL preview (80 chars)
This fixes the 'Unexpected response format' error.
The CreativeX API requires a 'filename' parameter when requesting presigned URLs.
Changes:
- Updated get_presigned_url() to accept filename parameter
- Pass filename to API as query parameter
- Updated upload script to pass filename when requesting URL
- Updated test_connection to use test filename
This fixes the 'filename is missing' error.
- Removed pandas and openpyxl (optional export functionality)
- Kept core dependencies: requests, urllib3, python-dotenv, colorama
- Scripts are fully functional without data export features
- Ferrero filename parser with NEW format support
- CreativeX API client with retry logic
- State persistence with resume capability
- Upload and status checking scripts
- Comprehensive documentation
- Virtual environment support