# Discovery Report: Feature 056 — Remove Legacy BulkOperationRun ## Purpose This report records the repo-wide sweep of legacy BulkOperationRun usage and any bulk-like actions that must be classified and migrated to canonical `OperationRun`. ## Legacy History Decision - Default path: legacy BulkOperationRun history is **not** migrated into `OperationRun`. - After cutover, legacy tables are removed; historical investigation relies on database backups/exports if needed. ## Sweep Checklist - [x] app/ (Models, Services, Jobs, Notifications, Support) - [x] app/Filament/ (Resources, Pages, Actions) - [x] database/ (migrations, factories, seeders) - [ ] resources/ (views) - [ ] routes/ (web, console) - [ ] tests/ (Feature, Unit) ## Findings ### A) Legacy artifacts (to remove) | Kind | Path | Notes | |------|------|-------| | Model | app/Models/BulkOperationRun.php | Legacy run model; referenced across jobs and UI. | | Service | app/Services/BulkOperationService.php | Legacy run lifecycle + failure recording; widely referenced. | | Filament Resource | app/Filament/Resources/BulkOperationRunResource.php | Legacy Monitoring surface; must be removed (Monitoring uses OperationRun). | | Filament Pages | app/Filament/Resources/BulkOperationRunResource/Pages/ListBulkOperationRuns.php | Legacy list page. | | Filament Pages | app/Filament/Resources/BulkOperationRunResource/Pages/ViewBulkOperationRun.php | Legacy detail page. | | Policy | app/Policies/BulkOperationRunPolicy.php | Legacy authorization policy. | | Policy Registration | app/Providers/AppServiceProvider.php | Registers BulkOperationRun policy/gate mapping. | | Helper | app/Support/RunIdempotency.php | `findActiveBulkOperationRun(...)` helper for legacy dedupe. | | Command | app/Console/Commands/TenantpilotPurgeNonPersistentData.php | Still references BulkOperationRun and legacy table counts. | | DB Migrations | database/migrations/*bulk_operation_runs* | Legacy table creation + follow-up schema changes. | | Factory | database/factories/BulkOperationRunFactory.php | Test factory to remove after cutover. | | Seeder | database/seeders/BulkOperationsTestSeeder.php | Test seed data to remove after cutover. | | Table | bulk_operation_runs | Legacy DB table; drop via forward migration after cutover. | ### B) Bulk-like start surfaces (to migrate) | Surface | Path | Operation type | Target scope? | Notes | |---------|------|----------------|---------------|-------| | Policy bulk delete | app/Filament/Resources/PolicyResource.php | `policy.delete` | Yes (tenant + directory scope) | Migrates to OperationRun-backed enqueue + orchestrator/worker. | | Backup set bulk delete | app/Filament/Resources/BackupSetResource.php | `backup_set.delete` | Yes | Migrates to OperationRun-backed enqueue + orchestrator/worker. | | Policy version prune | app/Filament/Resources/PolicyVersionResource.php | `policy_version.prune` | Yes | Migrates to OperationRun-backed enqueue + orchestrator/worker. | | Policy version force delete | app/Filament/Resources/PolicyVersionResource.php | `policy_version.force_delete` | Yes | Migrates to OperationRun-backed enqueue + orchestrator/worker. | | Restore run bulk delete | app/Filament/Resources/RestoreRunResource.php | `restore_run.delete` | Yes | Migrates to OperationRun-backed enqueue + orchestrator/worker. | | Tenant bulk sync | app/Filament/Resources/TenantResource.php | `tenant.sync` | Yes | Migrates to OperationRun-backed enqueue + orchestrator/worker. | | Policy snapshot capture | app/Filament/Resources/PolicyResource/Pages/ViewPolicy.php | `policy.capture_snapshot` | Yes | Migrates to OperationRun-backed enqueue + orchestrator/worker. | | Drift generation | app/Filament/Pages/DriftLanding.php | `drift.generate` | Yes | Mixed legacy + OperationRun today; needs full canonicalization. | | Backup set add policies (picker) | app/Livewire/BackupSetPolicyPickerTable.php | `backup_set.add_policies` | Yes | Mixed legacy + OperationRun today; remove legacy dedupe + legacy links. | ### C) Bulk-like jobs/workers (to migrate) | Job | Path | Remote calls? | Notes | |-----|------|--------------|------| | Policy bulk delete | app/Jobs/BulkPolicyDeleteJob.php | Likely (Graph) | Legacy bulk job; replaced by orchestrator/worker pattern. | | Backup set bulk delete | app/Jobs/BulkBackupSetDeleteJob.php | Likely (Graph) | Legacy bulk job; replaced by orchestrator/worker pattern. | | Policy version prune | app/Jobs/BulkPolicyVersionPruneJob.php | Likely (Graph) | Legacy bulk job; replaced by orchestrator/worker pattern. | | Policy version force delete | app/Jobs/BulkPolicyVersionForceDeleteJob.php | Likely (Graph) | Legacy bulk job; replaced by orchestrator/worker pattern. | | Restore run bulk delete | app/Jobs/BulkRestoreRunDeleteJob.php | Likely (Graph) | Legacy bulk job; replaced by orchestrator/worker pattern. | | Tenant bulk sync | app/Jobs/BulkTenantSyncJob.php | Likely (Graph) | Legacy bulk job; replaced by orchestrator/worker pattern. | | Policy snapshot capture | app/Jobs/CapturePolicySnapshotJob.php | Likely (Graph) | Legacy-ish job; migrate to orchestrator/worker and canonical run updates. | | Drift generator | app/Jobs/GenerateDriftFindingsJob.php | Likely (Graph) | Already carries OperationRun; remove remaining legacy coupling. | | Backup set add policies | app/Jobs/AddPoliciesToBackupSetJob.php | Likely (Graph) | Contains a legacy “fallback link” to BulkOperationRunResource; canonicalize. | | Policy bulk sync (legacy) | app/Jobs/BulkPolicySyncJob.php | Likely (Graph) | Legacy bulk job; migrate/remove as part of full cutover. | ### D) “View run” links (to canonicalize) | Location | Path | Current link target | Fix | |----------|------|---------------------|-----| | Run-status notification | app/Notifications/RunStatusChangedNotification.php | `BulkOperationRunResource::getUrl('view', ...)` | Route via `OperationRunLinks::view(...)` (OperationRun is canonical). | | Add policies job notification links | app/Jobs/AddPoliciesToBackupSetJob.php | Conditional: OperationRun OR legacy BulkOperationRunResource view | Remove legacy fallback; always use OperationRun-backed links. | | Legacy resource itself | app/Filament/Resources/BulkOperationRunResource.php | Legacy list/detail routes exist | Remove resource; rely on Monitoring → Operations. |