# Contracts: Internal UI Actions (046)

This feature does not introduce a public HTTP API. It adds an internal Filament UI action that dispatches a queued job.

## Action: Start Inventory Sync

**Surface**: Filament Page action (Inventory area)

**Inputs**
- `tenant_id`: from `Tenant::current()` (required)
- `selection_payload` (required; default “full inventory”):
  - `policy_types`: `PolicyTypeResolver::supportedPolicyTypes()`
  - `categories`: `[]`
  - `include_foundations`: `true`
  - `include_dependencies`: `true`
- `user_id`: `auth()->id()` (required)

**Side effects**
- Creates `BulkOperationRun` (resource `inventory`, action `sync`, total_items `1`) so the bottom-right progress widget displays the operation.
- Dispatches `RunInventorySyncJob` with the needed identifiers.
- Creates an `InventorySyncRun` with status `running` once the job begins execution.
- Writes audit log entries:
  - `inventory.sync.dispatched`
  - terminal: `inventory.sync.completed|inventory.sync.failed|inventory.sync.skipped`
- Sends Filament database notifications to the initiating user:
  - started
  - completed/failed/skipped

**Failure modes**
- Tenant not selected: action should be unavailable or no-op.
- Unauthorized user: action hidden/denied.
- Concurrency/lock gating: no overlapping run; user receives an informational message; run may be marked `skipped` with an error code.
- Queue not running: operation remains queued; user can observe this via progress widget + run list.
