# XL Vask Selvvask surface — inventory & simplification plan ## Scope The XLVask surface that powers the **Superuser → Fakturaer → Periode → Selvvask** view. Goal: remove the AI / MiniMax / autopilot pipeline, leaving only the operator-facing review and order-creation flow. Out of scope: any other XLVask, plate scanner, customer, or vehicle surface. ## Files removed | Path | Reason | | --- | --- | | `services/nginx/app/classes/xlvask_autopilot_service.php` | AI autopilot pipeline | | `services/nginx/app/classes/xlvask_automation_service.php` | AI automation pipeline | | `services/nginx/app/classes/xlvask_automation_policy_service.php` | AI policy service | | `services/nginx/app/classes/minimax.php` | MiniMax integration | | `services/nginx/app/modules/miniMax/` | MiniMax module (config + class) | | `services/nginx/app/modules/xlvask/AUTOMATION_RUNBOOK.md` | Runbook for removed pipeline | | `services/nginx/app/modules/xlvask/cron/tasks.php` | Module-owned cron registry (replaced by empty `cron_task_registry` discovery) | | `services/nginx/app/modules/xlvask/migrations/20260804_xlvask_ai_auto_policy_v2.php` | Migration for removed AI schema | | `services/nginx/app/modules/xlvask/config/xlvask_automatic_order_attachment_enabled_c.php` | Legacy autopilot gate | | `services/nginx/app/modules/xlvask/config/xlvask_automatic_order_creation_enabled_c.php` | Legacy autopilot gate | | `services/nginx/app/modules/xlvask/config/xlvask_minimax_integration_enabled_c.php` | MiniMax gate | | `services/nginx/app/modules/xlvask/config/xlvask_openai_integration_enabled_c.php` | OpenAI gate | | `services/nginx/app/cron/EnsureXLVaskAutomationSchema.php` | Migration helper | | `scripts/xlvask-automation-migrate.php` | CLI wrapper for migration | | `services/nginx/app/tests/Unit/XLVask/XLVaskAutomationMigrateScriptTest.php` | Removed migration test | | `services/nginx/app/tests/Unit/XLVask/XLVaskAutomationServiceTest.php` | Removed automation test | | `services/nginx/app/tests/Api/XLVaskReviewApiTest.php` | Replaced by Selvvask route contract test | ## Code changes (kept & simplified) | Path | Change | | --- | --- | | `services/nginx/app/cron/Cron.php` | Drop `ProcessXLVaskAutopilotQueueCron` registration + function | | `services/nginx/app/cli.php` | Drop `xlvask-automation-migrate` case | | `services/nginx/app/routes/moduleConfigRoute.php` | Drop `/minimax/config` GET/POST endpoints | | `services/nginx/app/routes/moduleXLVaskRoute.php` | Drop `/modules/xlvask/tasks/import-usage` 410 stub and `/tasks/debug` route | | `services/nginx/app/routes/xlvaskUsageLogsRoute.php` | Slim to operator-only: list, summary, ignore/unignore, accept, reject, fast-link | | `services/nginx/app/modules/xlvask/helpers/xlvask_tasks.php` | Drop `runScheduledAutomationIfReady`, `processAutopilotQueue`, autopilot cleanup, legacy auto-creation branch | | `services/nginx/app/modules/xlvask/xlvask_c.php` | Drop `minimax_integration_enabled`, `automatic_order_attachment_enabled`, `automatic_order_creation_enabled`, `openai_integration_enabled` | | `services/nginx/app/objects/xlvask_usage_logs_o.php` | Add `summarizeUsageOrdersReadOnly` (replaces autopilot summary) | | `services/nginx/app/openapi.yaml` | Replace autopilot/automation openapi block with operator-flow endpoints | | `services/nginx/app/tests/Unit/Cron/CronTaskRegistryTest.php` | Update count: 24 → 22, drop `xlvask.autopilot_queue` assertion | | `services/nginx/app/tests/Unit/XLVask/XLVaskUsageRouteContractTest.php` | Replaced with end-to-end contract assertions for the new operator surface | ## New operator-facing endpoints All under `routes/xlvaskUsageLogsRoute.php` and scoped to the operator's `allowedHallIds` (all-scope users see every configured scanner hall; own-scope users see only their group's halls). | Method | Path | Permission | Purpose | | --- | --- | --- | --- | | `GET` | `/modules/xlvask/services/usage/orders` | `list_xlvask_usage_orders_own/all` | List usage logs with direct linked order id, amount summary, ignored metadata | | `GET` | `/modules/xlvask/services/usage/orders/summary` | `list_xlvask_usage_orders_own/all` | Read-only per-period summary (counts + net amount) | | `PATCH` | `/modules/xlvask/services/usage/orders/{id}/ignore` | `review_xlvask_usage_order` | Mark ignored with reason | | `POST` | `/modules/xlvask/services/usage/orders/{id}/unignore` | `review_xlvask_usage_order` | Clear ignored metadata | | `POST` | `/modules/xlvask/services/usage/orders/{id}/accept` | `review_xlvask_usage_order` | Convert to order via `createOrderFromWash` | | `POST` | `/modules/xlvask/services/usage/orders/{id}/reject` | `review_xlvask_usage_order` | Mark ignored with reject reason | | `GET` | `/modules/xlvask/services/usage/orders/fast-link` | `list_xlvask_usage_orders_own` | Cached fast-link redeem (existing) | ## Permissions The Selvvask surface uses these permissions only: - `list_xlvask_usage_orders_own` - `list_xlvask_usage_orders_all` - `review_xlvask_usage_order` `manage_xlvask_usage_automation`, `ignore_xlvask_usage_order`, `superuser_xlvask_automation_activate` are not referenced anywhere in the slimmed surface. ## Persistence model `xlvask_usage_logs_o` already exposes `ignored_at`, `ignored_by`, `ignored_reason` columns — no migration required for the simplified flow. `orders_o::selectByWashId(int|string $WashId)` and `orders_o::addXLVaskOrder(users_o $user, xlvask_usage_log $xlvask_usage_log)` are the only integration points with the order pipeline. ## Tests - `vendor/bin/pest --testsuite=Unit --colors=never` passes 1266 tests. - One pre-existing failure (`BirdControlPlaneActivationTest`) requires `PLENO_REPO_ROOT_FOR_TESTS` (coolify repo) and is unrelated to this change. ## Repo scope This inventory covers `api`. The `pleno-vue` side has not yet been updated in this session and will be handled in a follow-up PR.