# Architectural Request **Date:** 2026-04-12 **Topic:** Deploy Phase 11D to Dev Panel — Blueprint license integration ## 1. Current State Phase 11D code pushed (8872f67). Blueprint extension has license activation UI, phone-home cron, and tier gating. Ready for testing on Dev Panel. ## 2. Deploy Target **Dev Panel (64.50.188.128)** — NOT live Panel VPS. ## 3. Files Changed **New files:** - `blueprint-extension/app/Services/LicenseService.php` - `blueprint-extension/app/Console/Commands/ValidateLicense.php` **Modified files:** - `blueprint-extension/admin/controller.php` — added LicenseService DI, license activation/deactivation handling - `blueprint-extension/admin/view.blade.php` — license UI, status banners, dynamic tier gating ## 4. Dependencies - No new Composer packages — uses Laravel's built-in `Http` facade (already available) - No database migrations needed (license state stored in Blueprint's dbGet/dbSet) ## 5. Deployment Steps 1. Rebuild the .blueprint package: ```bash cd /opt/mod-builds/firefrost-services/services/modpack-version-checker/blueprint-extension bash build.sh ``` 2. Install on Dev Panel: ```bash blueprint -install modpackchecker ``` 3. Register the daily cron (add to Panel's crontab): ``` 0 4 * * * cd /var/www/pterodactyl && php artisan mvc:validate >> /dev/null 2>&1 ``` 4. For immediate testing, run manually: ```bash cd /var/www/pterodactyl && php artisan mvc:validate ``` ## 6. What "Working" Looks Like 1. **Admin page loads** — visit `/admin/extensions/modpackchecker`, no errors 2. **License section visible** — "BuiltByBit Order ID" text input + gray "Not Activated" badge 3. **Activate test** — enter a test order ID, click Save. Should show error "License not found" (expected — no real license exists yet). Confirms Arbiter connectivity. 4. **Pro fields locked** — Check Interval dropdown and Discord Webhook URL should be disabled (grayed out) 5. **Artisan command runs** — `php artisan mvc:validate` outputs "No license configured" (expected for fresh install) 6. **No PHP errors in logs** — `tail -f /var/www/pterodactyl/storage/logs/laravel.log` ## 7. Smoke Test with Real License To fully test the flow, Chronicler can provision a test license directly in the DB: ```sql INSERT INTO mvc_licenses (order_id, buyer_id, tier, max_activations) VALUES ('TEST-001', 'chronicler', 'professional', 5); ``` Then enter `TEST-001` in the admin UI — should activate, show green badge, unlock pro fields.