refactor(audit): extract audit domain into self-contained module
Move the entire audit subsystem (system audit, API audit, import audit,
user lifecycle audit, frontend telemetry) from core into modules/audit/.
Core decoupling via interface-based injection:
- AuditRecorderInterface replaces SystemAuditService in 10+ core services
- UserLifecycleAuditInterface / ImportAuditInterface for specialized flows
- NullAuditRecorder fallback when audit module is disabled
- ApiBootstrap/ApiResponse use null-safe callable resolvers
Module structure (modules/audit/):
- Manifest with routes, permissions, scheduler jobs, authorization policy
- 9 services, 8 repositories, 6 domain enums, 4 job handlers
- 33 page files, 4 JS files, 8 test files, migration scripts, i18n
Core cleanup:
- OperationsAuthorizationPolicy, UiCapabilityMap, PermissionService
surgically cleaned of audit-specific constants
- Sidebar template cleared of hardcoded audit navigation
- AuditModuleIsolationContractTest ensures no future core→module coupling
All quality gates pass: 1346 tests (19,276 assertions), PHPStan level 5
clean, architecture contracts verified.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-25 21:12:49 +01:00
{
"Telemetry helps detect recurring UI issues and failed requests in production." : "Telemetry helps detect recurring UI issues and failed requests in production." ,
"perm.user_lifecycle_audit.view" : "View user lifecycle logs" ,
"perm.users.lifecycle_restore" : "Restore users from lifecycle audit" ,
"User lifecycle" : "User lifecycle" ,
"Audit" : "Audit" ,
"API audit" : "API logs" ,
"API audit logs" : "API logs" ,
"Purge API audit logs" : "Purge API logs" ,
"Purge entries older than 90 days?" : "Purge entries older than 90 days?" ,
"%d API audit entries purged" : "%d API log entries purged" ,
"API audit entry not found" : "API log entry not found" ,
"View API audit entry" : "View API log entry" ,
"Import audit logs" : "Import audit logs" ,
"Can view import audit logs" : "Can view import audit logs" ,
"Purge import logs" : "Purge import logs" ,
"%d import audit entries purged" : "%d import audit entries purged" ,
"Import audit entry not found" : "Import audit entry not found" ,
"View import audit entry" : "View import audit entry" ,
"User lifecycle policy" : "User lifecycle policy" ,
"User lifecycle defines when inactive users are deactivated or deleted." : "User lifecycle defines when inactive users are deactivated or deleted." ,
"System audit controls whether security events are logged and how long they are kept." : "System audit controls whether security events are logged and how long they are kept." ,
"Privileged admins are excluded from automatic lifecycle actions" : "Privileged admins are excluded from automatic lifecycle actions" ,
"Run user lifecycle now?" : "Run user lifecycle now?" ,
"Run user lifecycle now" : "Run user lifecycle now" ,
"User lifecycle already running" : "User lifecycle already running" ,
"User lifecycle failed" : "User lifecycle failed" ,
"User lifecycle completed: %d deactivated, %d deleted" : "User lifecycle completed: %d deactivated, %d deleted" ,
"Purge scheduler logs" : "Purge scheduler logs" ,
"Purge run logs older than 90 days?" : "Purge run logs older than 90 days?" ,
"%d scheduler run logs purged" : "%d scheduler run logs purged" ,
"User lifecycle logs" : "User lifecycle logs" ,
"View user lifecycle audit entry" : "View user lifecycle audit entry" ,
"Lifecycle audit entry not found" : "Lifecycle audit entry not found" ,
"Purge user lifecycle logs" : "Purge user lifecycle logs" ,
"Purge entries older than 365 days?" : "Purge entries older than 365 days?" ,
"%d user lifecycle audit entries purged" : "%d user lifecycle audit entries purged" ,
"Lifecycle event" : "Lifecycle event" ,
"Restore this user from lifecycle snapshot?" : "Restore this user from lifecycle snapshot?" ,
"Lifecycle event was already restored" : "Lifecycle event was already restored" ,
"Lifecycle snapshot unavailable" : "Lifecycle snapshot unavailable" ,
"System audit" : "System audit" ,
"System audit logs" : "System audit logs" ,
"View system audit entry" : "View system audit entry" ,
"System audit entry not found" : "System audit entry not found" ,
"Enable system audit log" : "Enable system audit log" ,
"Purge system audit logs" : "Purge system audit logs" ,
"Purge expired system audit entries?" : "Purge expired system audit entries?" ,
"%d system audit entries purged" : "%d system audit entries purged" ,
"Frontend telemetry" : "Frontend telemetry" ,
"Enable frontend telemetry" : "Enable frontend telemetry" ,
"Allowed telemetry events" : "Allowed telemetry events" ,
"Telemetry" : "Telemetry" ,
"Telemetry helps us find UI problems faster." : "Telemetry helps us find UI problems faster." ,
"The percentage of users who will have telemetry enabled." : "The percentage of users who will have telemetry enabled." ,
"Advanced telemetry options" : "Advanced telemetry options" ,
"setting.system_audit_enabled" : "Enable/disable system audit logging" ,
"setting.system_audit_retention_days" : "Retention in days for system audit entries" ,
"setting.frontend_telemetry_enabled" : "Enable/disable secure frontend UX and error telemetry" ,
"setting.frontend_telemetry_sample_rate" : "Sampling rate between 0 and 1 for accepted frontend telemetry events" ,
"setting.frontend_telemetry_allowed_events" : "Allowed frontend telemetry event groups (warn_once, ajax_error)" ,
"System audit events (24h)" : "System audit events (24h)" ,
"System audit risks (24h)" : "System audit risks (24h)" ,
"Top system audit event types (24h)" : "Top system audit event types (24h)" ,
"Recent system audit risks (24h)" : "Recent system audit risks (24h)" ,
"User lifecycle audit" : "User lifecycle audit" ,
"Lifecycle runs (7d)" : "Lifecycle runs (7d)" ,
"Lifecycle risks (7d)" : "Lifecycle risks (7d)" ,
"Top lifecycle reason codes (7d)" : "Top lifecycle reason codes (7d)" ,
2026-03-26 08:22:04 +01:00
"Recent lifecycle risks (7d)" : "Recent lifecycle risks (7d)" ,
"Audit & logs" : "Audit & logs"
refactor(audit): extract audit domain into self-contained module
Move the entire audit subsystem (system audit, API audit, import audit,
user lifecycle audit, frontend telemetry) from core into modules/audit/.
Core decoupling via interface-based injection:
- AuditRecorderInterface replaces SystemAuditService in 10+ core services
- UserLifecycleAuditInterface / ImportAuditInterface for specialized flows
- NullAuditRecorder fallback when audit module is disabled
- ApiBootstrap/ApiResponse use null-safe callable resolvers
Module structure (modules/audit/):
- Manifest with routes, permissions, scheduler jobs, authorization policy
- 9 services, 8 repositories, 6 domain enums, 4 job handlers
- 33 page files, 4 JS files, 8 test files, migration scripts, i18n
Core cleanup:
- OperationsAuthorizationPolicy, UiCapabilityMap, PermissionService
surgically cleaned of audit-specific constants
- Sidebar template cleared of hardcoded audit navigation
- AuditModuleIsolationContractTest ensures no future core→module coupling
All quality gates pass: 1346 tests (19,276 assertions), PHPStan level 5
clean, architecture contracts verified.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-25 21:12:49 +01:00
}