Release checklist
- Correct boundary and enum registration.
- Manifest identity/version/compatibility accurate.
- Complete package tree including route file and valid migration down.
- Every declared seeder class exists with tenant strategy.
- Rules/normalization cover every setting.
- Pages, slots, dashboards, priorities collision-free.
- Dashboard management path does not collide with
/plugins/{slug}settings. - Sidebar contributions are top-level destinations; create/edit/detail stay contextual.
- Dashboard widgets are tenant-scoped, bounded, and link to a full package surface.
- Super Admin pages use
/admin/plugins/{slug}/manage,plugin.{slug}.admin.*,super.admin, and installed-mode availability. - Super Admin widgets/pages disappear after global deactivation and never depend on tenant enablement or theme compatibility.
- Tenant models/scopes/constraints correct.
- Dashboard/public routes independently guarded.
- Sensitive uploads use a private disk and policy-protected streaming download.
- Workflow decisions persist actor, timestamp, and notes where required.
- Cross-tenant Super Admin rows identify their organization; global tools are read-only unless an audited mutation workflow is explicitly designed.
- Escaping/CSS/cache/secrets reviewed.
- Install, enable, disable, deactivate, reinstall, purge tested separately.
- Disable preserves data; preview/published rules verified.
- Both themes and compatibility switches tested.
- Cache invalidation and cross-tenant guessed IDs tested.
composer validate --no-check-publish
composer dump-autoload
php artisan awn:extensions:validate
php artisan route:list -v --name=plugin
php artisan test --compact
./vendor/bin/pint --test
php artisan view:cache
npm run build
Deployment: backup/rollback package migrations, complete core migrations before install, install required slugs, rebuild caches, restart workers, smoke-test published and signed preview tenants, and never use purge as an upgrade mechanism.