{
 "format": "ac-certificate/1",
 "tool": {
  "name": "architecture-cleaner",
  "version": "0.1.0"
 },
 "repo": "/home/paseo/ac-targets/immich",
 "base": "02063972e82b1bfd17b6fc2e3b3ff39936229ea5",
 "head": "ff429b0d24e8218a44ddb3383378af3fc7cf68d3",
 "packageRoot": "server",
 "environment": {
  "checkout": "/home/paseo/ac-targets/immich",
  "node": "v22.23.3",
  "linkedNodeModules": [
   "",
   "packages/plugin-core",
   "packages/plugin-sdk",
   "packages/sdk",
   "server"
  ]
 },
 "pathMap": {
  "moves": 292,
  "unchanged": 3020,
  "editedInPlace": 152,
  "deleted": [],
  "added": [],
  "ambiguousGroups": 0,
  "entries": {
   "server/src/controllers/activity.controller.spec.ts": "server/src/modules/activity/activity.controller.spec.ts",
   "server/src/controllers/activity.controller.ts": "server/src/modules/activity/activity.controller.ts",
   "server/src/controllers/album.controller.spec.ts": "server/src/modules/album/album.controller.spec.ts",
   "server/src/controllers/album.controller.ts": "server/src/modules/album/album.controller.ts",
   "server/src/controllers/api-key.controller.spec.ts": "server/src/modules/api-key/api-key.controller.spec.ts",
   "server/src/controllers/api-key.controller.ts": "server/src/modules/api-key/api-key.controller.ts",
   "server/src/controllers/app.controller.spec.ts": "server/src/modules/app/app.controller.spec.ts",
   "server/src/controllers/app.controller.ts": "server/src/modules/app/app.controller.ts",
   "server/src/controllers/asset-file.controller.ts": "server/src/modules/asset-file/asset-file.controller.ts",
   "server/src/controllers/asset-media.controller.spec.ts": "server/src/modules/asset-media/asset-media.controller.spec.ts",
   "server/src/controllers/asset-media.controller.ts": "server/src/modules/asset-media/asset-media.controller.ts",
   "server/src/controllers/asset.controller.spec.ts": "server/src/modules/asset/asset.controller.spec.ts",
   "server/src/controllers/asset.controller.ts": "server/src/modules/asset/asset.controller.ts",
   "server/src/controllers/auth-admin.controller.ts": "server/src/modules/auth-admin/auth-admin.controller.ts",
   "server/src/controllers/auth.controller.spec.ts": "server/src/modules/auth/auth.controller.spec.ts",
   "server/src/controllers/auth.controller.ts": "server/src/modules/auth/auth.controller.ts",
   "server/src/controllers/cluster-group.controller.ts": "server/src/modules/cluster-group/cluster-group.controller.ts",
   "server/src/controllers/config-admin.controller.ts": "server/src/modules/config-admin/config-admin.controller.ts",
   "server/src/controllers/config-public.controller.ts": "server/src/modules/config-public/config-public.controller.ts",
   "server/src/controllers/config-user.controller.ts": "server/src/modules/config-user/config-user.controller.ts",
   "server/src/controllers/config.controller.spec.ts": "server/src/modules/config/config.controller.spec.ts",
   "server/src/controllers/database-backup.controller.spec.ts": "server/src/modules/database-backup/database-backup.controller.spec.ts",
   "server/src/controllers/database-backup.controller.ts": "server/src/modules/database-backup/database-backup.controller.ts",
   "server/src/controllers/download.controller.spec.ts": "server/src/modules/download/download.controller.spec.ts",
   "server/src/controllers/download.controller.ts": "server/src/modules/download/download.controller.ts",
   "server/src/controllers/duplicate.controller.spec.ts": "server/src/modules/duplicate/duplicate.controller.spec.ts",
   "server/src/controllers/duplicate.controller.ts": "server/src/modules/duplicate/duplicate.controller.ts",
   "server/src/controllers/face.controller.ts": "server/src/modules/face/face.controller.ts",
   "server/src/controllers/integrity-admin.controller.ts": "server/src/modules/integrity-admin/integrity-admin.controller.ts",
   "server/src/controllers/job.controller.spec.ts": "server/src/modules/job/job.controller.spec.ts",
   "server/src/controllers/job.controller.ts": "server/src/modules/job/job.controller.ts",
   "server/src/controllers/library.controller.spec.ts": "server/src/modules/library/library.controller.spec.ts",
   "server/src/controllers/library.controller.ts": "server/src/modules/library/library.controller.ts",
   "server/src/controllers/maintenance.controller.spec.ts": "server/src/modules/maintenance/maintenance.controller.spec.ts",
   "server/src/controllers/maintenance.controller.ts": "server/src/modules/maintenance/maintenance.controller.ts",
   "server/src/controllers/map.controller.spec.ts": "server/src/modules/map/map.controller.spec.ts",
   "server/src/controllers/map.controller.ts": "server/src/modules/map/map.controller.ts",
   "server/src/controllers/memory.controller.spec.ts": "server/src/modules/memory/memory.controller.spec.ts",
   "server/src/controllers/memory.controller.ts": "server/src/modules/memory/memory.controller.ts",
   "server/src/controllers/notification-admin.controller.spec.ts": "server/src/modules/notification-admin/notification-admin.controller.spec.ts",
   "server/src/controllers/notification-admin.controller.ts": "server/src/modules/notification-admin/notification-admin.controller.ts",
   "server/src/controllers/notification.controller.spec.ts": "server/src/modules/notification/notification.controller.spec.ts",
   "server/src/controllers/notification.controller.ts": "server/src/modules/notification/notification.controller.ts",
   "server/src/controllers/oauth.controller.spec.ts": "server/src/modules/oauth/oauth.controller.spec.ts",
   "server/src/controllers/oauth.controller.ts": "server/src/modules/oauth/oauth.controller.ts",
   "server/src/controllers/partner.controller.spec.ts": "server/src/modules/partner/partner.controller.spec.ts",
   "server/src/controllers/partner.controller.ts": "server/src/modules/partner/partner.controller.ts",
   "server/src/controllers/person.controller.spec.ts": "server/src/modules/person/person.controller.spec.ts",
   "server/src/controllers/person.controller.ts": "server/src/modules/person/person.controller.ts",
   "server/src/controllers/plugin.controller.spec.ts": "server/src/modules/plugin/plugin.controller.spec.ts",
   "server/src/controllers/plugin.controller.ts": "server/src/modules/plugin/plugin.controller.ts",
   "server/src/controllers/queue.controller.ts": "server/src/modules/queue/queue.controller.ts",
   "server/src/controllers/search.controller.spec.ts": "server/src/modules/search/search.controller.spec.ts",
   "server/src/controllers/search.controller.ts": "server/src/modules/search/search.controller.ts",
   "server/src/controllers/server.controller.ts": "server/src/modules/server/server.controller.ts",
   "server/src/controllers/session.controller.ts": "server/src/modules/session/session.controller.ts",
   "server/src/controllers/shared-link.controller.spec.ts": "server/src/modules/shared-link/shared-link.controller.spec.ts",
   "server/src/controllers/shared-link.controller.ts": "server/src/modules/shared-link/shared-link.controller.ts",
   "server/src/controllers/stack.controller.spec.ts": "server/src/modules/stack/stack.controller.spec.ts",
   "server/src/controllers/stack.controller.ts": "server/src/modules/stack/stack.controller.ts",
   "server/src/controllers/sync.controller.spec.ts": "server/src/modules/sync/sync.controller.spec.ts",
   "server/src/controllers/sync.controller.ts": "server/src/modules/sync/sync.controller.ts",
   "server/src/controllers/system-config.controller.spec.ts": "server/src/modules/system-config/system-config.controller.spec.ts",
   "server/src/controllers/system-config.controller.ts": "server/src/modules/system-config/system-config.controller.ts",
   "server/src/controllers/system-metadata.controller.spec.ts": "server/src/modules/system-metadata/system-metadata.controller.spec.ts",
   "server/src/controllers/system-metadata.controller.ts": "server/src/modules/system-metadata/system-metadata.controller.ts",
   "server/src/controllers/tag.controller.spec.ts": "server/src/modules/tag/tag.controller.spec.ts",
   "server/src/controllers/tag.controller.ts": "server/src/modules/tag/tag.controller.ts",
   "server/src/controllers/timeline.controller.spec.ts": "server/src/modules/timeline/timeline.controller.spec.ts",
   "server/src/controllers/timeline.controller.ts": "server/src/modules/timeline/timeline.controller.ts",
   "server/src/controllers/trash.controller.spec.ts": "server/src/modules/trash/trash.controller.spec.ts",
   "server/src/controllers/trash.controller.ts": "server/src/modules/trash/trash.controller.ts",
   "server/src/controllers/user-admin.controller.spec.ts": "server/src/modules/user-admin/user-admin.controller.spec.ts",
   "server/src/controllers/user-admin.controller.ts": "server/src/modules/user-admin/user-admin.controller.ts",
   "server/src/controllers/user.controller.spec.ts": "server/src/modules/user/user.controller.spec.ts",
   "server/src/controllers/user.controller.ts": "server/src/modules/user/user.controller.ts",
   "server/src/controllers/video-stream.controller.ts": "server/src/modules/video-stream/video-stream.controller.ts",
   "server/src/controllers/view.controller.ts": "server/src/modules/view/view.controller.ts",
   "server/src/controllers/workflow.controller.spec.ts": "server/src/modules/workflow/workflow.controller.spec.ts",
   "server/src/controllers/workflow.controller.ts": "server/src/modules/workflow/workflow.controller.ts",
   "server/src/dtos/activity.dto.ts": "server/src/modules/activity/activity.dto.ts",
   "server/src/dtos/album-response.dto.spec.ts": "server/src/modules/album-response/album-response.dto.spec.ts",
   "server/src/dtos/album.dto.ts": "server/src/modules/album/album.dto.ts",
   "server/src/dtos/api-key.dto.ts": "server/src/modules/api-key/api-key.dto.ts",
   "server/src/dtos/asset-file.dto.ts": "server/src/modules/asset-file/asset-file.dto.ts",
   "server/src/dtos/asset-ids.response.dto.ts": "server/src/modules/asset-ids/asset-ids.response.dto.ts",
   "server/src/dtos/asset-media-response.dto.ts": "server/src/modules/asset-media-response/asset-media-response.dto.ts",
   "server/src/dtos/asset-media.dto.ts": "server/src/modules/asset-media/asset-media.dto.ts",
   "server/src/dtos/asset-response.dto.ts": "server/src/modules/asset-response/asset-response.dto.ts",
   "server/src/dtos/asset.dto.ts": "server/src/modules/asset/asset.dto.ts",
   "server/src/dtos/auth.dto.ts": "server/src/modules/auth/auth.dto.ts",
   "server/src/dtos/bbox.dto.ts": "server/src/modules/bbox/bbox.dto.ts",
   "server/src/dtos/calendar-heatmap.dto.ts": "server/src/modules/calendar-heatmap/calendar-heatmap.dto.ts",
   "server/src/dtos/cluster-group.dto.ts": "server/src/modules/cluster-group/cluster-group.dto.ts",
   "server/src/dtos/config.dto.spec.ts": "server/src/modules/config/config.dto.spec.ts",
   "server/src/dtos/config.dto.ts": "server/src/modules/config/config.dto.ts",
   "server/src/dtos/database-backup.dto.ts": "server/src/modules/database-backup/database-backup.dto.ts",
   "server/src/dtos/download.dto.ts": "server/src/modules/download/download.dto.ts",
   "server/src/dtos/duplicate.dto.ts": "server/src/modules/duplicate/duplicate.dto.ts",
   "server/src/dtos/editing.dto.ts": "server/src/modules/editing/editing.dto.ts",
   "server/src/dtos/env.dto.ts": "server/src/modules/env/env.dto.ts",
   "server/src/dtos/exif.dto.ts": "server/src/modules/exif/exif.dto.ts",
   "server/src/dtos/integrity.dto.ts": "server/src/modules/integrity/integrity.dto.ts",
   "server/src/dtos/job.dto.ts": "server/src/modules/job/job.dto.ts",
   "server/src/dtos/json-schema.dto.ts": "server/src/modules/json-schema/json-schema.dto.ts",
   "server/src/dtos/library.dto.ts": "server/src/modules/library/library.dto.ts",
   "server/src/dtos/license.dto.ts": "server/src/modules/license/license.dto.ts",
   "server/src/dtos/maintenance.dto.ts": "server/src/modules/maintenance/maintenance.dto.ts",
   "server/src/dtos/map.dto.ts": "server/src/modules/map/map.dto.ts",
   "server/src/dtos/memory.dto.ts": "server/src/modules/memory/memory.dto.ts",
   "server/src/dtos/notification.dto.ts": "server/src/modules/notification/notification.dto.ts",
   "server/src/dtos/ocr.dto.ts": "server/src/modules/ocr/ocr.dto.ts",
   "server/src/dtos/onboarding.dto.ts": "server/src/modules/onboarding/onboarding.dto.ts",
   "server/src/dtos/partner.dto.ts": "server/src/modules/partner/partner.dto.ts",
   "server/src/dtos/person.dto.ts": "server/src/modules/person/person.dto.ts",
   "server/src/dtos/plugin-manifest.dto.ts": "server/src/modules/plugin-manifest/plugin-manifest.dto.ts",
   "server/src/dtos/plugin.dto.ts": "server/src/modules/plugin/plugin.dto.ts",
   "server/src/dtos/queue-legacy.dto.ts": "server/src/modules/queue-legacy/queue-legacy.dto.ts",
   "server/src/dtos/queue.dto.ts": "server/src/modules/queue/queue.dto.ts",
   "server/src/dtos/search.dto.ts": "server/src/modules/search/search.dto.ts",
   "server/src/dtos/server.dto.ts": "server/src/modules/server/server.dto.ts",
   "server/src/dtos/session.dto.ts": "server/src/modules/session/session.dto.ts",
   "server/src/dtos/shared-link.dto.ts": "server/src/modules/shared-link/shared-link.dto.ts",
   "server/src/dtos/stack.dto.ts": "server/src/modules/stack/stack.dto.ts",
   "server/src/dtos/streaming.dto.ts": "server/src/modules/streaming/streaming.dto.ts",
   "server/src/dtos/sync.dto.ts": "server/src/modules/sync/sync.dto.ts",
   "server/src/dtos/system-metadata.dto.ts": "server/src/modules/system-metadata/system-metadata.dto.ts",
   "server/src/dtos/tag.dto.ts": "server/src/modules/tag/tag.dto.ts",
   "server/src/dtos/time-bucket.dto.ts": "server/src/modules/time-bucket/time-bucket.dto.ts",
   "server/src/dtos/trash.dto.ts": "server/src/modules/trash/trash.dto.ts",
   "server/src/dtos/user-preferences.dto.ts": "server/src/modules/user-preferences/user-preferences.dto.ts",
   "server/src/dtos/user-profile.dto.ts": "server/src/modules/user-profile/user-profile.dto.ts",
   "server/src/dtos/user.dto.spec.ts": "server/src/modules/user/user.dto.spec.ts",
   "server/src/dtos/user.dto.ts": "server/src/modules/user/user.dto.ts",
   "server/src/dtos/workflow.dto.ts": "server/src/modules/workflow/workflow.dto.ts",
   "server/src/repositories/access.repository.ts": "server/src/modules/access/access.repository.ts",
   "server/src/repositories/activity.repository.ts": "server/src/modules/activity/activity.repository.ts",
   "server/src/repositories/album-user.repository.ts": "server/src/modules/album-user/album-user.repository.ts",
   "server/src/repositories/album.repository.ts": "server/src/modules/album/album.repository.ts",
   "server/src/repositories/api-key.repository.ts": "server/src/modules/api-key/api-key.repository.ts",
   "server/src/repositories/app.repository.ts": "server/src/modules/app/app.repository.ts",
   "server/src/repositories/asset-edit.repository.ts": "server/src/modules/asset-edit/asset-edit.repository.ts",
   "server/src/repositories/asset-file.repository.ts": "server/src/modules/asset-file/asset-file.repository.ts",
   "server/src/repositories/asset-job.repository.ts": "server/src/modules/asset-job/asset-job.repository.ts",
   "server/src/repositories/asset.repository.ts": "server/src/modules/asset/asset.repository.ts",
   "server/src/repositories/cluster-group.repository.ts": "server/src/modules/cluster-group/cluster-group.repository.ts",
   "server/src/repositories/config.repository.spec.ts": "server/src/modules/config/config.repository.spec.ts",
   "server/src/repositories/cron.repository.ts": "server/src/modules/cron/cron.repository.ts",
   "server/src/repositories/crypto.repository.ts": "server/src/modules/crypto/crypto.repository.ts",
   "server/src/repositories/download.repository.ts": "server/src/modules/download/download.repository.ts",
   "server/src/repositories/duplicate.repository.ts": "server/src/modules/duplicate/duplicate.repository.ts",
   "server/src/repositories/email.repository.spec.ts": "server/src/modules/email/email.repository.spec.ts",
   "server/src/repositories/email.repository.ts": "server/src/modules/email/email.repository.ts",
   "server/src/repositories/event.repository.ts": "server/src/modules/event/event.repository.ts",
   "server/src/repositories/integrity.repository.ts": "server/src/modules/integrity/integrity.repository.ts",
   "server/src/repositories/job.repository.ts": "server/src/modules/job/job.repository.ts",
   "server/src/repositories/library.repository.ts": "server/src/modules/library/library.repository.ts",
   "server/src/repositories/logging.repository.spec.ts": "server/src/modules/logging/logging.repository.spec.ts",
   "server/src/repositories/logging.repository.ts": "server/src/modules/logging/logging.repository.ts",
   "server/src/repositories/machine-learning.repository.ts": "server/src/modules/machine-learning/machine-learning.repository.ts",
   "server/src/repositories/map.repository.ts": "server/src/modules/map/map.repository.ts",
   "server/src/repositories/media.repository.spec.ts": "server/src/modules/media/media.repository.spec.ts",
   "server/src/repositories/media.repository.ts": "server/src/modules/media/media.repository.ts",
   "server/src/repositories/memory.repository.ts": "server/src/modules/memory/memory.repository.ts",
   "server/src/repositories/metadata.repository.ts": "server/src/modules/metadata/metadata.repository.ts",
   "server/src/repositories/move.repository.ts": "server/src/modules/move/move.repository.ts",
   "server/src/repositories/notification.repository.ts": "server/src/modules/notification/notification.repository.ts",
   "server/src/repositories/oauth.repository.ts": "server/src/modules/oauth/oauth.repository.ts",
   "server/src/repositories/ocr.repository.ts": "server/src/modules/ocr/ocr.repository.ts",
   "server/src/repositories/partner.repository.ts": "server/src/modules/partner/partner.repository.ts",
   "server/src/repositories/person-user.repository.ts": "server/src/modules/person-user/person-user.repository.ts",
   "server/src/repositories/person.repository.ts": "server/src/modules/person/person.repository.ts",
   "server/src/repositories/plugin.repository.ts": "server/src/modules/plugin/plugin.repository.ts",
   "server/src/repositories/process.repository.spec.ts": "server/src/modules/process/process.repository.spec.ts",
   "server/src/repositories/process.repository.ts": "server/src/modules/process/process.repository.ts",
   "server/src/repositories/search.repository.ts": "server/src/modules/search/search.repository.ts",
   "server/src/repositories/server-info.repository.ts": "server/src/modules/server-info/server-info.repository.ts",
   "server/src/repositories/session.repository.ts": "server/src/modules/session/session.repository.ts",
   "server/src/repositories/shared-link-asset.repository.ts": "server/src/modules/shared-link-asset/shared-link-asset.repository.ts",
   "server/src/repositories/shared-link.repository.ts": "server/src/modules/shared-link/shared-link.repository.ts",
   "server/src/repositories/stack.repository.ts": "server/src/modules/stack/stack.repository.ts",
   "server/src/repositories/storage.repository.ts": "server/src/modules/storage/storage.repository.ts",
   "server/src/repositories/sync-checkpoint.repository.ts": "server/src/modules/sync-checkpoint/sync-checkpoint.repository.ts",
   "server/src/repositories/sync.repository.ts": "server/src/modules/sync/sync.repository.ts",
   "server/src/repositories/system-metadata.repository.ts": "server/src/modules/system-metadata/system-metadata.repository.ts",
   "server/src/repositories/tag.repository.ts": "server/src/modules/tag/tag.repository.ts",
   "server/src/repositories/telemetry.repository.ts": "server/src/modules/telemetry/telemetry.repository.ts",
   "server/src/repositories/trash.repository.ts": "server/src/modules/trash/trash.repository.ts",
   "server/src/repositories/user.repository.ts": "server/src/modules/user/user.repository.ts",
   "server/src/repositories/version-history.repository.ts": "server/src/modules/version-history/version-history.repository.ts",
   "server/src/repositories/video-stream.repository.ts": "server/src/modules/video-stream/video-stream.repository.ts",
   "server/src/repositories/view-repository.ts": "server/src/modules/view-repository/view-repository.ts",
   "server/src/repositories/websocket.repository.ts": "server/src/modules/websocket/websocket.repository.ts",
   "server/src/repositories/workflow.repository.ts": "server/src/modules/workflow/workflow.repository.ts",
   "server/src/services/activity.service.spec.ts": "server/src/modules/activity/activity.service.spec.ts",
   "server/src/services/activity.service.ts": "server/src/modules/activity/activity.service.ts",
   "server/src/services/album.service.spec.ts": "server/src/modules/album/album.service.spec.ts",
   "server/src/services/album.service.ts": "server/src/modules/album/album.service.ts",
   "server/src/services/api-key.service.spec.ts": "server/src/modules/api-key/api-key.service.spec.ts",
   "server/src/services/api-key.service.ts": "server/src/modules/api-key/api-key.service.ts",
   "server/src/services/api.service.spec.ts": "server/src/modules/api/api.service.spec.ts",
   "server/src/services/api.service.ts": "server/src/modules/api/api.service.ts",
   "server/src/services/asset-file.service.ts": "server/src/modules/asset-file/asset-file.service.ts",
   "server/src/services/asset-media.service.spec.ts": "server/src/modules/asset-media/asset-media.service.spec.ts",
   "server/src/services/asset-media.service.ts": "server/src/modules/asset-media/asset-media.service.ts",
   "server/src/services/asset.service.spec.ts": "server/src/modules/asset/asset.service.spec.ts",
   "server/src/services/asset.service.ts": "server/src/modules/asset/asset.service.ts",
   "server/src/services/auth-admin.service.ts": "server/src/modules/auth-admin/auth-admin.service.ts",
   "server/src/services/auth.service.spec.ts": "server/src/modules/auth/auth.service.spec.ts",
   "server/src/services/auth.service.ts": "server/src/modules/auth/auth.service.ts",
   "server/src/services/base.service.ts": "server/src/modules/base/base.service.ts",
   "server/src/services/cli.service.spec.ts": "server/src/modules/cli/cli.service.spec.ts",
   "server/src/services/cluster-group.service.ts": "server/src/modules/cluster-group/cluster-group.service.ts",
   "server/src/services/database-backup.service.spec.ts": "server/src/modules/database-backup/database-backup.service.spec.ts",
   "server/src/services/database-backup.service.ts": "server/src/modules/database-backup/database-backup.service.ts",
   "server/src/services/database.service.spec.ts": "server/src/modules/database/database.service.spec.ts",
   "server/src/services/database.service.ts": "server/src/modules/database/database.service.ts",
   "server/src/services/download.service.spec.ts": "server/src/modules/download/download.service.spec.ts",
   "server/src/services/download.service.ts": "server/src/modules/download/download.service.ts",
   "server/src/services/duplicate.service.spec.ts": "server/src/modules/duplicate/duplicate.service.spec.ts",
   "server/src/services/duplicate.service.ts": "server/src/modules/duplicate/duplicate.service.ts",
   "server/src/services/hls.service.spec.ts": "server/src/modules/hls/hls.service.spec.ts",
   "server/src/services/hls.service.ts": "server/src/modules/hls/hls.service.ts",
   "server/src/services/integrity.service.spec.ts": "server/src/modules/integrity/integrity.service.spec.ts",
   "server/src/services/integrity.service.ts": "server/src/modules/integrity/integrity.service.ts",
   "server/src/services/job.service.spec.ts": "server/src/modules/job/job.service.spec.ts",
   "server/src/services/job.service.ts": "server/src/modules/job/job.service.ts",
   "server/src/services/library.service.ts": "server/src/modules/library/library.service.ts",
   "server/src/services/maintenance.service.spec.ts": "server/src/modules/maintenance/maintenance.service.spec.ts",
   "server/src/services/maintenance.service.ts": "server/src/modules/maintenance/maintenance.service.ts",
   "server/src/services/map.service.spec.ts": "server/src/modules/map/map.service.spec.ts",
   "server/src/services/map.service.ts": "server/src/modules/map/map.service.ts",
   "server/src/services/media.service.spec.ts": "server/src/modules/media/media.service.spec.ts",
   "server/src/services/media.service.ts": "server/src/modules/media/media.service.ts",
   "server/src/services/memory.service.spec.ts": "server/src/modules/memory/memory.service.spec.ts",
   "server/src/services/memory.service.ts": "server/src/modules/memory/memory.service.ts",
   "server/src/services/metadata.service.spec.ts": "server/src/modules/metadata/metadata.service.spec.ts",
   "server/src/services/metadata.service.ts": "server/src/modules/metadata/metadata.service.ts",
   "server/src/services/notification-admin.service.spec.ts": "server/src/modules/notification-admin/notification-admin.service.spec.ts",
   "server/src/services/notification-admin.service.ts": "server/src/modules/notification-admin/notification-admin.service.ts",
   "server/src/services/notification.service.spec.ts": "server/src/modules/notification/notification.service.spec.ts",
   "server/src/services/notification.service.ts": "server/src/modules/notification/notification.service.ts",
   "server/src/services/ocr.service.spec.ts": "server/src/modules/ocr/ocr.service.spec.ts",
   "server/src/services/ocr.service.ts": "server/src/modules/ocr/ocr.service.ts",
   "server/src/services/partner.service.spec.ts": "server/src/modules/partner/partner.service.spec.ts",
   "server/src/services/partner.service.ts": "server/src/modules/partner/partner.service.ts",
   "server/src/services/person.service.spec.ts": "server/src/modules/person/person.service.spec.ts",
   "server/src/services/person.service.ts": "server/src/modules/person/person.service.ts",
   "server/src/services/plugin.service.ts": "server/src/modules/plugin/plugin.service.ts",
   "server/src/services/queue.service.spec.ts": "server/src/modules/queue/queue.service.spec.ts",
   "server/src/services/queue.service.ts": "server/src/modules/queue/queue.service.ts",
   "server/src/services/search.service.spec.ts": "server/src/modules/search/search.service.spec.ts",
   "server/src/services/search.service.ts": "server/src/modules/search/search.service.ts",
   "server/src/services/server.service.spec.ts": "server/src/modules/server/server.service.spec.ts",
   "server/src/services/server.service.ts": "server/src/modules/server/server.service.ts",
   "server/src/services/session.service.spec.ts": "server/src/modules/session/session.service.spec.ts",
   "server/src/services/session.service.ts": "server/src/modules/session/session.service.ts",
   "server/src/services/shared-link.service.spec.ts": "server/src/modules/shared-link/shared-link.service.spec.ts",
   "server/src/services/shared-link.service.ts": "server/src/modules/shared-link/shared-link.service.ts",
   "server/src/services/smart-info.service.spec.ts": "server/src/modules/smart-info/smart-info.service.spec.ts",
   "server/src/services/smart-info.service.ts": "server/src/modules/smart-info/smart-info.service.ts",
   "server/src/services/stack.service.spec.ts": "server/src/modules/stack/stack.service.spec.ts",
   "server/src/services/stack.service.ts": "server/src/modules/stack/stack.service.ts",
   "server/src/services/storage-template.service.spec.ts": "server/src/modules/storage-template/storage-template.service.spec.ts",
   "server/src/services/storage-template.service.ts": "server/src/modules/storage-template/storage-template.service.ts",
   "server/src/services/storage.service.spec.ts": "server/src/modules/storage/storage.service.spec.ts",
   "server/src/services/storage.service.ts": "server/src/modules/storage/storage.service.ts",
   "server/src/services/sync.service.spec.ts": "server/src/modules/sync/sync.service.spec.ts",
   "server/src/services/sync.service.ts": "server/src/modules/sync/sync.service.ts",
   "server/src/services/system-config.service.spec.ts": "server/src/modules/system-config/system-config.service.spec.ts",
   "server/src/services/system-config.service.ts": "server/src/modules/system-config/system-config.service.ts",
   "server/src/services/system-metadata.service.spec.ts": "server/src/modules/system-metadata/system-metadata.service.spec.ts",
   "server/src/services/system-metadata.service.ts": "server/src/modules/system-metadata/system-metadata.service.ts",
   "server/src/services/tag.service.spec.ts": "server/src/modules/tag/tag.service.spec.ts",
   "server/src/services/tag.service.ts": "server/src/modules/tag/tag.service.ts",
   "server/src/services/telemetry.service.ts": "server/src/modules/telemetry/telemetry.service.ts",
   "server/src/services/timeline.service.spec.ts": "server/src/modules/timeline/timeline.service.spec.ts",
   "server/src/services/timeline.service.ts": "server/src/modules/timeline/timeline.service.ts",
   "server/src/services/transcoding.service.spec.ts": "server/src/modules/transcoding/transcoding.service.spec.ts",
   "server/src/services/transcoding.service.ts": "server/src/modules/transcoding/transcoding.service.ts",
   "server/src/services/trash.service.spec.ts": "server/src/modules/trash/trash.service.spec.ts",
   "server/src/services/trash.service.ts": "server/src/modules/trash/trash.service.ts",
   "server/src/services/user-admin.service.spec.ts": "server/src/modules/user-admin/user-admin.service.spec.ts",
   "server/src/services/user-admin.service.ts": "server/src/modules/user-admin/user-admin.service.ts",
   "server/src/services/user.service.spec.ts": "server/src/modules/user/user.service.spec.ts",
   "server/src/services/user.service.ts": "server/src/modules/user/user.service.ts",
   "server/src/services/version.service.spec.ts": "server/src/modules/version/version.service.spec.ts",
   "server/src/services/version.service.ts": "server/src/modules/version/version.service.ts",
   "server/src/services/view.service.spec.ts": "server/src/modules/view/view.service.spec.ts",
   "server/src/services/view.service.ts": "server/src/modules/view/view.service.ts",
   "server/src/services/workflow-execution.service.ts": "server/src/modules/workflow-execution/workflow-execution.service.ts",
   "server/src/services/workflow.service.ts": "server/src/modules/workflow/workflow.service.ts"
  }
 },
 "checks": [
  {
   "id": "K0",
   "title": "Envelope",
   "status": "pass",
   "summary": "inside the envelope: 678 TypeScript vs 3 JavaScript sources under server; no automock, nested package scope, symlink, same-stem pair or unreadable runner config around 292 moved files",
   "metrics": {
    "moves": 292,
    "baseTypeScriptFiles": 678,
    "baseJavaScriptFiles": 3,
    "headTypeScriptFiles": 678,
    "headJavaScriptFiles": 3
   },
   "violations": [],
   "findings": [],
   "durationMs": 8544
  },
  {
   "id": "K1",
   "title": "Move-set integrity",
   "status": "pass",
   "summary": "292 moves, 152 files edited in place, nothing added or deleted",
   "metrics": {
    "moves": 292,
    "unchanged": 3020,
    "editedInPlace": 152,
    "deleted": 0,
    "added": 0,
    "copies": 0
   },
   "violations": [],
   "findings": [],
   "durationMs": 1483
  },
  {
   "id": "K2",
   "title": "Byte-span confinement",
   "status": "pass",
   "summary": "1445 specifier spans changed in 386 files; every other byte identical",
   "metrics": {
    "comparedFiles": 386,
    "editedFiles": 386,
    "changedSpans": 1445
   },
   "violations": [],
   "findings": [],
   "durationMs": 2904
  },
  {
   "id": "K3a",
   "title": "Resolution identity under TypeScript",
   "status": "pass",
   "summary": "6647 sites in 1100 files resolve to map(base) under every program (458 files in several); 1445 rewritten specifiers keep their form",
   "metrics": {
    "files": 1100,
    "sites": 6647,
    "resolutions": 9636,
    "multiProgramFiles": 458,
    "rewrittenSpecifiers": 1445,
    "typeDirectives": 13,
    "implicitImports": 0,
    "unextractedSites": 0,
    "addedFiles": 0,
    "deletedFiles": 0,
    "resolutionMismatches": 0,
    "formChanges": 0,
    "contextChanges": 0,
    "typeDirectiveMismatches": 0,
    "workspaceLinks": 0,
    "virtualModuleSplits": 0,
    "unresolvedMoves": 0,
    "unmodeledResolutions": 0
   },
   "violations": [],
   "findings": [],
   "durationMs": 1476
  },
  {
   "id": "K3b",
   "title": "Resolution identity under the test runner",
   "status": "pass",
   "summary": "vitest 4.1.11: 4837 sites in 672 files resolve to map(base)",
   "metrics": {
    "runner": "vitest",
    "runnerVersion": "4.1.11",
    "projects": "server:unit",
    "sites": 4837,
    "files": 672,
    "dangling": 0,
    "retargeted": 0,
    "newlyResolved": 0,
    "unresolvedTextChanged": 0,
    "mockChanged": 0,
    "addedDangling": 0,
    "outsideRoots": 0,
    "addedFiles": 0
   },
   "violations": [],
   "findings": [],
   "durationMs": 5768
  },
  {
   "id": "K3c",
   "title": "Resolution identity under the runtime",
   "status": "pass",
   "summary": "6192 runtime sites resolve to map(base) under nest-cli/emit (3442 rewritten by the build)",
   "metrics": {
    "runtimes": "nest-cli/emit",
    "runtimeEvidence": "nest-cli/emit: package.json scripts.start:dev: nest start --watch --; package.json scripts.start:debug: nest start --debug 0.0.0.0:9230 --watch --; server/bin/start.sh: exec node --no-warnings \"${SERVER_HOME}/dist/main.js\" \"$@\"",
    "modeled": "nest-cli/emit",
    "notModeled": "",
    "subpathImports": false,
    "emitModel": "in place: each source at its own path with the runtime extension (.ts->.js, .mts->.mjs, .cts->.cjs), as with a fixed rootDir; outDir links to rootDir",
    "node": "v24.21.0",
    "nestCli": "12.0.6",
    "files": 1099,
    "addedFiles": 0,
    "unresolvedInAdded": 0,
    "comparedSites": 6192,
    "rewrittenByBuild": 3442,
    "unresolvedInBase": 1453,
    "deferredSites": 0,
    "aliasSitesBase": 1920,
    "aliasSitesHead": 1920,
    "disagreements": 0,
    "violations": 0,
    "skeletonMs": 1153,
    "probeMs": 4304
   },
   "violations": [],
   "findings": [],
   "durationMs": 7191
  },
  {
   "id": "K4",
   "title": "Location scan",
   "status": "pass",
   "summary": "292 moved files expose no location; no computed path reaches a change; no old path in code, config or CI (9 findings in docs, comments or ungated coverage settings)",
   "metrics": {
    "movedFilesScanned": 292,
    "movedFileHazards": 0,
    "copiedFileHazards": 0,
    "filesScannedForComputedPaths": 808,
    "computedPathViolations": 0,
    "textFilesScanned": 3128,
    "oldPathViolations": 0,
    "coverageViolations": 0,
    "coverageFindings": 3,
    "oldPathFindings": 9,
    "globsChecked": 2913
   },
   "violations": [],
   "findings": [
    {
     "kind": "stack-text",
     "file": "server/src/repositories/metadata.repository.ts",
     "detail": "moved to server/src/modules/metadata/metadata.repository.ts; 1 stack-trace reads passed along as text (line 133); their frames now name the new path"
    },
    {
     "kind": "stack-text",
     "file": "server/src/repositories/websocket.repository.ts",
     "detail": "moved to server/src/modules/websocket/websocket.repository.ts; 1 stack-trace reads passed along as text (line 95); their frames now name the new path"
    },
    {
     "kind": "stack-text",
     "file": "server/src/services/asset-media.service.ts",
     "detail": "moved to server/src/modules/asset-media/asset-media.service.ts; 1 stack-trace reads passed along as text (line 224); their frames now name the new path"
    },
    {
     "kind": "stack-text",
     "file": "server/src/services/auth.service.ts",
     "detail": "moved to server/src/modules/auth/auth.service.ts; 1 stack-trace reads passed along as text (line 403); their frames now name the new path"
    },
    {
     "kind": "stack-text",
     "file": "server/src/services/duplicate.service.ts",
     "detail": "moved to server/src/modules/duplicate/duplicate.service.ts; 1 stack-trace reads passed along as text (line 104); their frames now name the new path"
    },
    {
     "kind": "stack-text",
     "file": "server/src/services/metadata.service.ts",
     "detail": "moved to server/src/modules/metadata/metadata.service.ts; 2 stack-trace reads passed along as text (line 170); their frames now name the new path"
    },
    {
     "kind": "stack-text",
     "file": "server/src/services/notification.service.ts",
     "detail": "moved to server/src/modules/notification/notification.service.ts; 2 stack-trace reads passed along as text (line 88); their frames now name the new path"
    },
    {
     "kind": "stack-text",
     "file": "server/src/services/person.service.ts",
     "detail": "moved to server/src/modules/person/person.service.ts; 2 stack-trace reads passed along as text (line 321); their frames now name the new path"
    },
    {
     "kind": "stack-text",
     "file": "server/src/services/storage-template.service.ts",
     "detail": "moved to server/src/modules/storage-template/storage-template.service.ts; 1 stack-trace reads passed along as text (line 263); their frames now name the new path"
    },
    {
     "kind": "stack-text",
     "file": "server/src/services/version.service.ts",
     "detail": "moved to server/src/modules/version/version.service.ts; 1 stack-trace reads passed along as text (line 140); their frames now name the new path"
    },
    {
     "kind": "stack-text",
     "file": "server/src/services/workflow-execution.service.ts",
     "detail": "moved to server/src/modules/workflow-execution/workflow-execution.service.ts; 1 stack-trace reads passed along as text (line 197); their frames now name the new path"
    },
    {
     "kind": "opaque-dynamic-load",
     "file": "server/src/repositories/database.repository.ts",
     "detail": "line 510: import(filePath) loads a module by a path K4 can't evaluate"
    },
    {
     "kind": "old-path-in-docs",
     "file": ".github/pull_request_template.md",
     "detail": "line 36: 'src/services/' is the directory server/src/services, whose contents change with the move of server/src/services/activity.service.spec.ts (moved to server/src/modules/activity/activity.service.spec.ts)"
    },
    {
     "kind": "old-path-in-docs",
     "file": ".github/pull_request_template.md",
     "detail": "line 37: 'src/repositories/' is the directory server/src/repositories, whose contents change with the move of server/src/repositories/access.repository.ts (moved to server/src/modules/access/access.repository.ts)"
    },
    {
     "kind": "old-path-in-docs",
     "file": ".github/pull_request_template.md",
     "detail": "line 37: 'src/services/' is the directory server/src/services, whose contents change with the move of server/src/services/activity.service.spec.ts (moved to server/src/modules/activity/activity.service.spec.ts)"
    },
    {
     "kind": "old-path-in-docs",
     "file": "docs/docs/developer/architecture.mdx",
     "detail": "line 60: 'src/repositories' is the directory server/src/repositories, whose contents change with the move of server/src/repositories/access.repository.ts (moved to server/src/modules/access/access.repository.ts)"
    },
    {
     "kind": "old-path-in-docs",
     "file": "docs/docs/developer/architecture.mdx",
     "detail": "line 60: 'src/services' is the directory server/src/services, whose contents change with the move of server/src/services/activity.service.spec.ts (moved to server/src/modules/activity/activity.service.spec.ts)"
    },
    {
     "kind": "old-path-in-docs",
     "file": "docs/docs/developer/architecture.mdx",
     "detail": "line 64: 'src/controllers' is the directory server/src/controllers, whose contents change with the move of server/src/controllers/activity.controller.spec.ts (moved to server/src/modules/activity/activity.controller.spec.ts)"
    },
    {
     "kind": "coverage-scope",
     "file": "server/test/vitest.config.mjs",
     "detail": "line 19: 'src/services/**' is the glob server/src/services/** whose matches change (98 moved files, e.g. server/src/services/activity.service.spec.ts -> server/src/modules/activity/activity.service.spec.ts) of server/src/services/activity.service.spec.ts (moved to server/src/modules/activity/activity.service.spec.ts) [config at test.coverage.include]; coverage now measures a different file set (no coverage threshold in this file, so no gate changes)"
    },
    {
     "kind": "coverage-scope",
     "file": "server/test/vitest.config.mjs",
     "detail": "line 21: 'src/services/*.spec.ts' is the glob server/src/services/*.spec.ts whose matches change (45 moved files, e.g. server/src/services/activity.service.spec.ts -> server/src/modules/activity/activity.service.spec.ts) of server/src/services/activity.service.spec.ts (moved to server/src/modules/activity/activity.service.spec.ts) [config at test.coverage.exclude]; coverage now measures a different file set (no coverage threshold in this file, so no gate changes)"
    },
    {
     "kind": "coverage-scope",
     "file": "server/test/vitest.config.mjs",
     "detail": "line 22: 'src/services/api.service.ts' is the old path of server/src/services/api.service.ts (moved to server/src/modules/api/api.service.ts) [config at test.coverage.exclude]; coverage now measures a different file set (no coverage threshold in this file, so no gate changes)"
    }
   ],
   "durationMs": 5519
  },
  {
   "id": "K6",
   "title": "Test inventory",
   "status": "pass",
   "summary": "vitest 4.1.11: 105 test files, 2337 tests, per-file load status and case names equal",
   "metrics": {
    "runner": "vitest",
    "runnerVersion": "4.1.11",
    "baseFiles": 105,
    "headFiles": 105,
    "baseTests": 2337,
    "headTests": 2337,
    "baseUnloadable": 0,
    "headUnloadable": 0,
    "loadRegressions": 0,
    "droppedFiles": 0,
    "newFiles": 0,
    "caseChanges": 0,
    "lostTests": 0,
    "uncollected": 0,
    "snapshotFileChanges": 0,
    "snapshots": "snapshot files co-move with their tests (K1); snapshot.added == 0 under --ci needs a real run (K8)"
   },
   "violations": [],
   "findings": [],
   "durationMs": 91168
  },
  {
   "id": "K8",
   "title": "Oracles on the commit",
   "status": "pass",
   "summary": "tsc exit 0; unit 105/105 files and 2,337/2,337 cases equal to base (head: 105/105 files load, 2,337 passed, 0 failed, 0 skipped); openapi byte-identical to the base's open-api/immich-openapi-specs.json (947,932 bytes)",
   "metrics": {
    "node": "v24.21.0",
    "offline": true,
    "hooksBypassed": "core.hooksPath=/dev/null (worktree add and resets); HUSKY=0",
    "worktree": "/tmp/ac-s4-certify/immich-r1.full/worktree-head",
    "logs": "/tmp/ac-s4-certify/immich-r1.full/oracles",
    "cache": "/home/paseo/ac-work/s4/oracle-cache",
    "prerequisitesReachable": "server/node_modules/.bin/tsc, server/node_modules/.bin/vitest, server/node_modules/@immich/plugin-sdk/dist/index.js, packages/plugin-sdk/node_modules/@immich/sdk/build/index.js, server/node_modules/.bin/nest",
    "leftoversRemoved": 1,
    "tsc.head.exit": 0,
    "tsc.head.seconds": 9,
    "tsc.head.logs": "/tmp/ac-s4-certify/immich-r1.full/oracles/head/tsc",
    "tsc.head.networkAttempts": 0,
    "tsc.head.diagnostics": 0,
    "unit.head.exit": 0,
    "unit.head.seconds": 54,
    "unit.head.logs": "/tmp/ac-s4-certify/immich-r1.full/oracles/head/unit",
    "unit.head.networkAttempts": 0,
    "unit.base.exit": 0,
    "unit.base.seconds": 107,
    "unit.base.logs": "/home/paseo/ac-work/s4/oracle-cache/immich-02063972e82b-unit-04bca861fb398067",
    "unit.base.networkAttempts": 0,
    "unit.base.cached": true,
    "unit.head.files": 105,
    "unit.head.loaded": 105,
    "unit.head.cases": 2337,
    "unit.head.passed": 2337,
    "unit.head.failed": 0,
    "unit.head.skipped": 0,
    "unit.base.files": 105,
    "unit.base.loaded": 105,
    "unit.base.cases": 2337,
    "unit.base.passed": 2337,
    "unit.base.failed": 0,
    "unit.base.skipped": 0,
    "unit.filesEqual": 105,
    "unit.casesEqual": 2337,
    "openapi.head.exit": 0,
    "openapi.head.seconds": 47,
    "openapi.head.logs": "/tmp/ac-s4-certify/immich-r1.full/oracles/head/openapi",
    "openapi.head.networkAttempts": 0,
    "openapi.head.bytes": 947932,
    "openapi.head.sha256": "d4f4d34b9b8ac57a8e26aac8b479155842430ea40c731ac1351f30fde4cdbbfa",
    "openapi.comparedWith": "base tree blob open-api/immich-openapi-specs.json"
   },
   "violations": [],
   "findings": [],
   "durationMs": 110705
  }
 ],
 "verdict": "pass",
 "scope": "full",
 "residualRisk": [
  "consumers outside the repository (deep imports, handler strings in infrastructure, other services)",
  "runtime file-system contents (assets, templates, SQL read at runtime)",
  "environment-dependent resolution (NODE_PATH, untracked or generated files)",
  "stack-trace and source-map text",
  "CI triggers and review routing keyed by path (workflow `paths`, CODEOWNERS)"
 ],
 "digest": "sha256:2e9e00c96572e7347cf00084cacd7e371c3004c261092888575bb32d99138820"
}
