workspace_id) ? (int) $tenant->workspace_id : null; $metadata = is_array($context['metadata'] ?? null) ? $context['metadata'] : []; if ($actorType instanceof AuditActorType) { $metadata['_actor_type'] = $actorType->value; } $context['metadata'] = $metadata; if ($workspaceId === null) { throw new InvalidArgumentException('Tenant-scoped audit events require tenant workspace_id.'); } return $this->auditRecorder->record( action: $action, context: $context, workspace: $tenant->workspace, tenant: $tenant, actor: AuditActorSnapshot::fromLegacy( type: $actorType ?? AuditActorType::infer($action instanceof AuditActionId ? $action->value : $action, $actorId, $actorEmail, $actorName, $context), id: $actorId, email: $actorEmail, label: $actorName, ), target: new AuditTargetSnapshot( type: $resourceType, id: $resourceId, label: $targetLabel, ), outcome: $status, recordedAt: CarbonImmutable::now(), summary: $summary ?? AuditActionId::summaryFor( action: $action, targetLabel: $targetLabel, targetType: $resourceType, context: $metadata, ), operationRunId: $operationRunId, ); } }