core-framework 3.1.0__tar.gz → 3.3.0__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (1094) hide show
  1. core_framework-3.3.0/.cursor/rules/alembic-migrations.mdc +61 -0
  2. core_framework-3.3.0/.cursor/rules/domain-imports.mdc +44 -0
  3. core_framework-3.3.0/.cursor/rules/error-boundary.mdc +56 -0
  4. core_framework-3.3.0/.cursor/rules/repository-schema-isolation.mdc +87 -0
  5. core_framework-3.3.0/.cursor/skills/code-review/SKILL.md +35 -0
  6. core_framework-3.3.0/.cursor/skills/sync-host-rules/SKILL.md +60 -0
  7. core_framework-3.3.0/.github/workflows/_deploy.yml +238 -0
  8. core_framework-3.3.0/.github/workflows/dev-ci-cd.yaml +358 -0
  9. core_framework-3.3.0/.github/workflows/test.yaml +310 -0
  10. core_framework-3.3.0/.gitignore +39 -0
  11. core_framework-3.3.0/CHANGELOG.md +638 -0
  12. core_framework-3.3.0/PKG-INFO +145 -0
  13. core_framework-3.3.0/alembic/moderation/alembic/versions/3027828c2c80_align_dead_outbox_keyset_index.py +34 -0
  14. core_framework-3.3.0/alembic/user/alembic/versions/922eece707db_align_dead_outbox_keyset_index.py +34 -0
  15. core_framework-3.3.0/config.toml +147 -0
  16. core_framework-3.3.0/config.toml.template +131 -0
  17. core_framework-3.3.0/core_framework/api/admin/cache/schemas.py +91 -0
  18. core_framework-3.3.0/core_framework/api/admin/comments/schemas.py +50 -0
  19. core_framework-3.3.0/core_framework/api/admin/outbox/router.py +62 -0
  20. core_framework-3.3.0/core_framework/api/admin/posts/schemas.py +32 -0
  21. core_framework-3.3.0/core_framework/api/admin/users/router.py +189 -0
  22. core_framework-3.3.0/core_framework/api/attachments/router.py +45 -0
  23. core_framework-3.3.0/core_framework/api/attachments/schemas.py +48 -0
  24. core_framework-3.3.0/core_framework/api/auth/router.py +26 -0
  25. core_framework-3.3.0/core_framework/api/comments/authenticated/mappers.py +21 -0
  26. core_framework-3.3.0/core_framework/api/comments/authenticated/router.py +149 -0
  27. core_framework-3.3.0/core_framework/api/comments/authenticated/schemas.py +79 -0
  28. core_framework-3.3.0/core_framework/api/dependencies.py +153 -0
  29. core_framework-3.3.0/core_framework/api/events/router.py +54 -0
  30. core_framework-3.3.0/core_framework/api/posts/authenticated/mappers.py +23 -0
  31. core_framework-3.3.0/core_framework/api/posts/authenticated/router.py +116 -0
  32. core_framework-3.3.0/core_framework/api/posts/authenticated/schemas.py +77 -0
  33. core_framework-3.3.0/core_framework/api/schemas.py +24 -0
  34. core_framework-3.3.0/core_framework/api/users/authenticated/router.py +549 -0
  35. core_framework-3.3.0/core_framework/api/users/public/router.py +33 -0
  36. core_framework-3.3.0/core_framework/api/users/shared/mappers.py +18 -0
  37. core_framework-3.3.0/core_framework/application/analytics/bucket_service.py +77 -0
  38. core_framework-3.3.0/core_framework/application/analytics/refresh_service.py +62 -0
  39. core_framework-3.3.0/core_framework/application/auth/auth_service.py +50 -0
  40. core_framework-3.3.0/core_framework/application/auth/token_verification.py +22 -0
  41. core_framework-3.3.0/core_framework/application/bootstrap.py +61 -0
  42. core_framework-3.3.0/core_framework/application/comments/admin_service.py +559 -0
  43. core_framework-3.3.0/core_framework/application/comments/aggregation_service.py +43 -0
  44. core_framework-3.3.0/core_framework/application/comments/cleanup_service.py +111 -0
  45. core_framework-3.3.0/core_framework/application/comments/public_service.py +324 -0
  46. core_framework-3.3.0/core_framework/application/email/__init__.py +13 -0
  47. core_framework-3.3.0/core_framework/application/email/account_deletion_scheduled.py +77 -0
  48. core_framework-3.3.0/core_framework/application/email/enqueue.py +36 -0
  49. core_framework-3.3.0/core_framework/application/email/registry.py +64 -0
  50. core_framework-3.3.0/core_framework/application/email/send.py +52 -0
  51. core_framework-3.3.0/core_framework/application/events/README.md +31 -0
  52. core_framework-3.3.0/core_framework/application/events/event_service.py +167 -0
  53. core_framework-3.3.0/core_framework/application/events/event_token.py +42 -0
  54. core_framework-3.3.0/core_framework/application/media/README.md +19 -0
  55. core_framework-3.3.0/core_framework/application/media/attachment_service.py +524 -0
  56. core_framework-3.3.0/core_framework/application/media/avatar_service.py +186 -0
  57. core_framework-3.3.0/core_framework/application/media/banner_service.py +182 -0
  58. core_framework-3.3.0/core_framework/application/moderation/appeal_service.py +102 -0
  59. core_framework-3.3.0/core_framework/application/moderation/user_service.py +176 -0
  60. core_framework-3.3.0/core_framework/application/notifications/README.md +17 -0
  61. core_framework-3.3.0/core_framework/application/notifications/inbox_service.py +280 -0
  62. core_framework-3.3.0/core_framework/application/notifications/notification_service.py +187 -0
  63. core_framework-3.3.0/core_framework/application/outbox/ops_service.py +74 -0
  64. core_framework-3.3.0/core_framework/application/outbox/polling_service.py +69 -0
  65. core_framework-3.3.0/core_framework/application/posts/admin_service.py +391 -0
  66. core_framework-3.3.0/core_framework/application/posts/aggregation_service.py +55 -0
  67. core_framework-3.3.0/core_framework/application/posts/authenticated_service.py +130 -0
  68. core_framework-3.3.0/core_framework/application/posts/cleanup_service.py +135 -0
  69. core_framework-3.3.0/core_framework/application/posts/public_service.py +257 -0
  70. core_framework-3.3.0/core_framework/application/shared/deletion_cleanup_ledger.py +60 -0
  71. core_framework-3.3.0/core_framework/application/shared/enums.py +42 -0
  72. core_framework-3.3.0/core_framework/application/shared/exceptions.py +92 -0
  73. core_framework-3.3.0/core_framework/application/shared/worker_jobs.py +63 -0
  74. core_framework-3.3.0/core_framework/application/users/admin_service.py +259 -0
  75. core_framework-3.3.0/core_framework/application/users/aggregation_service.py +21 -0
  76. core_framework-3.3.0/core_framework/application/users/authenticated_service.py +393 -0
  77. core_framework-3.3.0/core_framework/application/users/identity_enrichment.py +35 -0
  78. core_framework-3.3.0/core_framework/application/users/public_service.py +162 -0
  79. core_framework-3.3.0/core_framework/application/users/user_deletion_service.py +697 -0
  80. core_framework-3.3.0/core_framework/constants.py +20 -0
  81. core_framework-3.3.0/core_framework/core/__init__.py +45 -0
  82. core_framework-3.3.0/core_framework/core/cache.py +205 -0
  83. core_framework-3.3.0/core_framework/core/exception_handlers/application.py +131 -0
  84. core_framework-3.3.0/core_framework/core/exception_handlers/common.py +70 -0
  85. core_framework-3.3.0/core_framework/core/exception_handlers/setup.py +46 -0
  86. core_framework-3.3.0/core_framework/core/middleware.py +160 -0
  87. core_framework-3.3.0/core_framework/core/pagination.py +216 -0
  88. core_framework-3.3.0/core_framework/core/process.py +89 -0
  89. core_framework-3.3.0/core_framework/core/rate_limit.py +298 -0
  90. core_framework-3.3.0/core_framework/core/settings.py +555 -0
  91. core_framework-3.3.0/core_framework/domains/analytics/service.py +338 -0
  92. core_framework-3.3.0/core_framework/domains/auth/README.md +75 -0
  93. core_framework-3.3.0/core_framework/domains/auth/__init__.py +16 -0
  94. core_framework-3.3.0/core_framework/domains/auth/outcomes.py +18 -0
  95. core_framework-3.3.0/core_framework/domains/auth/ports/auth.py +57 -0
  96. core_framework-3.3.0/core_framework/domains/auth/service.py +140 -0
  97. core_framework-3.3.0/core_framework/domains/comment/README.md +262 -0
  98. core_framework-3.3.0/core_framework/domains/comment/constants.py +7 -0
  99. core_framework-3.3.0/core_framework/domains/comment/exceptions.py +35 -0
  100. core_framework-3.3.0/core_framework/domains/comment/models.py +228 -0
  101. core_framework-3.3.0/core_framework/domains/comment/repository.py +2683 -0
  102. core_framework-3.3.0/core_framework/domains/comment/service.py +1028 -0
  103. core_framework-3.3.0/core_framework/domains/email/README.md +74 -0
  104. core_framework-3.3.0/core_framework/domains/email/__init__.py +7 -0
  105. core_framework-3.3.0/core_framework/domains/email/dependencies.py +101 -0
  106. core_framework-3.3.0/core_framework/domains/email/exceptions.py +10 -0
  107. core_framework-3.3.0/core_framework/domains/email/models.py +3 -0
  108. core_framework-3.3.0/core_framework/domains/email/ports/send.py +29 -0
  109. core_framework-3.3.0/core_framework/domains/email/service.py +98 -0
  110. core_framework-3.3.0/core_framework/domains/media/README.md +30 -0
  111. core_framework-3.3.0/core_framework/domains/media/__init__.py +57 -0
  112. core_framework-3.3.0/core_framework/domains/media/attachment/components/staging.py +165 -0
  113. core_framework-3.3.0/core_framework/domains/media/attachment/components/variant_encoder.py +28 -0
  114. core_framework-3.3.0/core_framework/domains/media/attachment/constants.py +39 -0
  115. core_framework-3.3.0/core_framework/domains/media/attachment/models.py +29 -0
  116. core_framework-3.3.0/core_framework/domains/media/attachment/ports/variant_encoder.py +26 -0
  117. core_framework-3.3.0/core_framework/domains/media/attachment/service.py +456 -0
  118. core_framework-3.3.0/core_framework/domains/media/avatar/components/variant_encoder.py +27 -0
  119. core_framework-3.3.0/core_framework/domains/media/avatar/ports/variant_encoder.py +24 -0
  120. core_framework-3.3.0/core_framework/domains/media/avatar/service.py +340 -0
  121. core_framework-3.3.0/core_framework/domains/media/banner/components/variant_encoder.py +27 -0
  122. core_framework-3.3.0/core_framework/domains/media/banner/ports/variant_encoder.py +24 -0
  123. core_framework-3.3.0/core_framework/domains/media/banner/service.py +335 -0
  124. core_framework-3.3.0/core_framework/domains/media/dependencies.py +314 -0
  125. core_framework-3.3.0/core_framework/domains/media/shared/constants.py +5 -0
  126. core_framework-3.3.0/core_framework/domains/media/shared/outcomes.py +16 -0
  127. core_framework-3.3.0/core_framework/domains/media/shared/repository.py +812 -0
  128. core_framework-3.3.0/core_framework/domains/moderation/README.md +140 -0
  129. core_framework-3.3.0/core_framework/domains/moderation/dependencies.py +91 -0
  130. core_framework-3.3.0/core_framework/domains/moderation/outbox_repository.py +190 -0
  131. core_framework-3.3.0/core_framework/domains/moderation/outbox_service.py +53 -0
  132. core_framework-3.3.0/core_framework/domains/moderation/repository.py +1396 -0
  133. core_framework-3.3.0/core_framework/domains/moderation/service.py +892 -0
  134. core_framework-3.3.0/core_framework/domains/notification/README.md +151 -0
  135. core_framework-3.3.0/core_framework/domains/notification/repository.py +631 -0
  136. core_framework-3.3.0/core_framework/domains/notification/service.py +304 -0
  137. core_framework-3.3.0/core_framework/domains/outbox/README.md +69 -0
  138. core_framework-3.3.0/core_framework/domains/outbox/ports/admin.py +36 -0
  139. core_framework-3.3.0/core_framework/domains/outbox/service.py +63 -0
  140. core_framework-3.3.0/core_framework/domains/post/README.md +208 -0
  141. core_framework-3.3.0/core_framework/domains/post/constants.py +8 -0
  142. core_framework-3.3.0/core_framework/domains/post/exceptions.py +20 -0
  143. core_framework-3.3.0/core_framework/domains/post/models.py +212 -0
  144. core_framework-3.3.0/core_framework/domains/post/repository.py +2372 -0
  145. core_framework-3.3.0/core_framework/domains/post/service.py +967 -0
  146. core_framework-3.3.0/core_framework/domains/user/README.md +105 -0
  147. core_framework-3.3.0/core_framework/domains/user/__init__.py +63 -0
  148. core_framework-3.3.0/core_framework/domains/user/dependencies.py +91 -0
  149. core_framework-3.3.0/core_framework/domains/user/models.py +346 -0
  150. core_framework-3.3.0/core_framework/domains/user/outbox_repository.py +189 -0
  151. core_framework-3.3.0/core_framework/domains/user/outbox_service.py +53 -0
  152. core_framework-3.3.0/core_framework/domains/user/outcomes.py +33 -0
  153. core_framework-3.3.0/core_framework/domains/user/repository.py +1810 -0
  154. core_framework-3.3.0/core_framework/domains/user/service.py +1054 -0
  155. core_framework-3.3.0/core_framework/infrastructure/email/resend_email_adapter.py +64 -0
  156. core_framework-3.3.0/core_framework/infrastructure/firebase/firebase_auth_adapter.py +125 -0
  157. core_framework-3.3.0/core_framework/infrastructure/media/attachment_staging_display_geometry.py +45 -0
  158. core_framework-3.3.0/core_framework/infrastructure/media/pillow_attachment_variant_encoder_adapter.py +164 -0
  159. core_framework-3.3.0/core_framework/infrastructure/media/pillow_avatar_variant_encoder_adapter.py +74 -0
  160. core_framework-3.3.0/core_framework/infrastructure/media/pillow_banner_variant_encoder_adapter.py +64 -0
  161. core_framework-3.3.0/core_framework/testing/arq.py +141 -0
  162. core_framework-3.3.0/core_framework/testing/auth.py +306 -0
  163. core_framework-3.3.0/core_framework/worker/main.py +136 -0
  164. core_framework-3.3.0/core_framework/worker/schedules/schedule_expired_mute_lifts.py +36 -0
  165. core_framework-3.3.0/core_framework/worker/tasks/__init__.py +112 -0
  166. core_framework-3.3.0/core_framework/worker/tasks/process_account_deletion.py +21 -0
  167. core_framework-3.3.0/core_framework/worker/tasks/process_account_deletion_scheduled_email.py +17 -0
  168. core_framework-3.3.0/core_framework/worker/tasks/process_attachment_asset_variants.py +34 -0
  169. core_framework-3.3.0/core_framework/worker/tasks/process_banner_asset_variants.py +43 -0
  170. core_framework-3.3.0/core_framework/worker/tasks/process_cache_pattern_invalidation.py +19 -0
  171. core_framework-3.3.0/core_framework/worker/tasks/process_destructive_comment_delete.py +38 -0
  172. core_framework-3.3.0/core_framework/worker/tasks/process_destructive_post_delete.py +34 -0
  173. core_framework-3.3.0/core_framework/worker/tasks/process_media_asset_variants.py +43 -0
  174. core_framework-3.3.0/core_framework/worker/tasks/process_transactional_email.py +21 -0
  175. core_framework-3.3.0/core_framework/worker/tasks/process_user_content_deletion.py +18 -0
  176. core_framework-3.3.0/deploy/app/docker-compose.yml +62 -0
  177. core_framework-3.3.0/docs/deployments/deploy-playbook.md +250 -0
  178. core_framework-3.3.0/docs/deployments/e2e-smoke-tests-design.md +353 -0
  179. core_framework-3.3.0/docs/deployments/edge-rate-limits.md +96 -0
  180. core_framework-3.3.0/docs/deployments/guides/setup/cloudflare-setup.md +129 -0
  181. core_framework-3.3.0/docs/deployments/guides/setup/observability-lgtm-setup.md +204 -0
  182. core_framework-3.3.0/docs/deployments/release-playbook.md +92 -0
  183. core_framework-3.3.0/docs/design/README.md +33 -0
  184. core_framework-3.3.0/docs/design/analytics-rollup-design.md +1005 -0
  185. core_framework-3.3.0/docs/design/cache-invalidation-design.md +150 -0
  186. core_framework-3.3.0/docs/design/create-idempotency-design.md +294 -0
  187. core_framework-3.3.0/docs/design/event-outbox-design.md +603 -0
  188. core_framework-3.3.0/docs/design/events-ingest-design.md +229 -0
  189. core_framework-3.3.0/docs/design/media-cpu-off-api-refactor.md +134 -0
  190. core_framework-3.3.0/docs/design/media-storage-topology.md +141 -0
  191. core_framework-3.3.0/docs/design/observability-lgtm-design.md +593 -0
  192. core_framework-3.3.0/docs/design/outbox-admin-ops-design.md +337 -0
  193. core_framework-3.3.0/docs/design/transactional-email-design.md +618 -0
  194. core_framework-3.3.0/docs/domains/README.md +23 -0
  195. core_framework-3.3.0/docs/domains/auth/access_control.md +70 -0
  196. core_framework-3.3.0/docs/domains/auth/registration.md +64 -0
  197. core_framework-3.3.0/docs/domains/cache/admin_cache_invalidation.md +184 -0
  198. core_framework-3.3.0/docs/domains/comments/admin_comments.md +221 -0
  199. core_framework-3.3.0/docs/domains/comments/comment_like.md +102 -0
  200. core_framework-3.3.0/docs/domains/comments/comment_report.md +121 -0
  201. core_framework-3.3.0/docs/domains/comments/comment_stats_aggregation.md +69 -0
  202. core_framework-3.3.0/docs/domains/comments/create_comment.md +193 -0
  203. core_framework-3.3.0/docs/domains/comments/edit_comment.md +74 -0
  204. core_framework-3.3.0/docs/domains/deletion/comments.md +289 -0
  205. core_framework-3.3.0/docs/domains/deletion/posts.md +312 -0
  206. core_framework-3.3.0/docs/domains/deletion/users.md +520 -0
  207. core_framework-3.3.0/docs/domains/events/events.md +248 -0
  208. core_framework-3.3.0/docs/domains/media/attachment_upload.md +77 -0
  209. core_framework-3.3.0/docs/domains/media/avatar-upload-design.md +110 -0
  210. core_framework-3.3.0/docs/domains/media/post-comment-attachments-design.md +521 -0
  211. core_framework-3.3.0/docs/domains/media/upload-pipeline-design.md +468 -0
  212. core_framework-3.3.0/docs/domains/media/upload_pipeline.md +108 -0
  213. core_framework-3.3.0/docs/domains/mentions/mentions_in_content.md +240 -0
  214. core_framework-3.3.0/docs/domains/moderation/appeals.md +248 -0
  215. core_framework-3.3.0/docs/domains/moderation/internal_notes.md +159 -0
  216. core_framework-3.3.0/docs/domains/moderation/moderator_actions.md +70 -0
  217. core_framework-3.3.0/docs/domains/moderation/reports.md +222 -0
  218. core_framework-3.3.0/docs/domains/moderation/restrictions.md +251 -0
  219. core_framework-3.3.0/docs/domains/notifications/notification_inbox.md +383 -0
  220. core_framework-3.3.0/docs/domains/outbox/admin_outbox_ops.md +187 -0
  221. core_framework-3.3.0/docs/domains/posts/admin_posts.md +216 -0
  222. core_framework-3.3.0/docs/domains/posts/author_context.md +92 -0
  223. core_framework-3.3.0/docs/domains/posts/create_post.md +126 -0
  224. core_framework-3.3.0/docs/domains/posts/edit_post.md +83 -0
  225. core_framework-3.3.0/docs/domains/posts/post_like.md +101 -0
  226. core_framework-3.3.0/docs/domains/posts/post_report.md +108 -0
  227. core_framework-3.3.0/docs/domains/posts/post_stats_aggregation.md +90 -0
  228. core_framework-3.3.0/docs/domains/users/account.md +108 -0
  229. core_framework-3.3.0/docs/domains/users/account_deletion.md +99 -0
  230. core_framework-3.3.0/docs/domains/users/admin_users.md +167 -0
  231. core_framework-3.3.0/docs/domains/users/avatar.md +91 -0
  232. core_framework-3.3.0/docs/domains/users/banner.md +77 -0
  233. core_framework-3.3.0/docs/domains/users/blocks.md +132 -0
  234. core_framework-3.3.0/docs/domains/users/change_history.md +128 -0
  235. core_framework-3.3.0/docs/domains/users/check_username_exists.md +62 -0
  236. core_framework-3.3.0/docs/domains/users/follow-system-design.md +424 -0
  237. core_framework-3.3.0/docs/domains/users/follow.md +230 -0
  238. core_framework-3.3.0/docs/domains/users/preferences.md +87 -0
  239. core_framework-3.3.0/docs/domains/users/profile.md +221 -0
  240. core_framework-3.3.0/docs/domains/users/public_profile.md +99 -0
  241. core_framework-3.3.0/docs/domains/users/user_stats_aggregation.md +80 -0
  242. core_framework-3.3.0/docs/domains/users/username_suggest.md +15 -0
  243. core_framework-3.3.0/docs/library/capability-wiring.md +181 -0
  244. core_framework-3.3.0/docs/library/core-framework-migration.md +253 -0
  245. core_framework-3.3.0/docs/library/overview.md +56 -0
  246. core_framework-3.3.0/docs/library/package-api.md +675 -0
  247. core_framework-3.3.0/docs/library/testing-plugin-design.md +317 -0
  248. core_framework-3.3.0/docs/library/workers.md +128 -0
  249. core_framework-3.3.0/docs/platform/architecture-decisions.md +594 -0
  250. core_framework-3.3.0/docs/platform/client-error-visibility.md +278 -0
  251. core_framework-3.3.0/docs/platform/conventions.md +101 -0
  252. core_framework-3.3.0/docs/platform/domain-services-and-adapters.md +73 -0
  253. core_framework-3.3.0/docs/platform/patch-update-typed-payload.md +194 -0
  254. core_framework-3.3.0/docs/reviews/log.md +28 -0
  255. core_framework-3.3.0/docs/reviews/review-playbook.md +192 -0
  256. core_framework-3.3.0/docs/reviews/slices.md +302 -0
  257. core_framework-3.3.0/docs/testing.md +150 -0
  258. core_framework-3.3.0/docs/todo.md +3 -0
  259. core_framework-3.3.0/pyproject.toml +155 -0
  260. core_framework-3.3.0/tach.toml +184 -0
  261. core_framework-3.3.0/tests/conftest.py +52 -0
  262. core_framework-3.3.0/tests/integration/_http_error_details.py +21 -0
  263. core_framework-3.3.0/tests/integration/_poll.py +23 -0
  264. core_framework-3.3.0/tests/integration/api/_auth_helpers.py +21 -0
  265. core_framework-3.3.0/tests/integration/api/_destructive_delete_helpers.py +51 -0
  266. core_framework-3.3.0/tests/integration/api/_http_helpers.py +100 -0
  267. core_framework-3.3.0/tests/integration/api/_user_deletion_helpers.py +63 -0
  268. core_framework-3.3.0/tests/integration/api/_user_helpers.py +63 -0
  269. core_framework-3.3.0/tests/integration/api/admin/_auth_cases.py +97 -0
  270. core_framework-3.3.0/tests/integration/api/admin/analytics/router_test.py +266 -0
  271. core_framework-3.3.0/tests/integration/api/admin/cache/router_test.py +310 -0
  272. core_framework-3.3.0/tests/integration/api/admin/comments/router_test.py +745 -0
  273. core_framework-3.3.0/tests/integration/api/admin/moderation/router_test.py +2444 -0
  274. core_framework-3.3.0/tests/integration/api/admin/outbox/router_test.py +340 -0
  275. core_framework-3.3.0/tests/integration/api/admin/posts/router_test.py +476 -0
  276. core_framework-3.3.0/tests/integration/api/admin/users/router_test.py +1450 -0
  277. core_framework-3.3.0/tests/integration/api/attachments/_helpers.py +289 -0
  278. core_framework-3.3.0/tests/integration/api/attachments/attachment_upload_test.py +31 -0
  279. core_framework-3.3.0/tests/integration/api/attachments/conftest.py +14 -0
  280. core_framework-3.3.0/tests/integration/api/auth/router_test.py +55 -0
  281. core_framework-3.3.0/tests/integration/api/comments/comment_attachments_integration_test.py +572 -0
  282. core_framework-3.3.0/tests/integration/api/comments/public/router_test.py +508 -0
  283. core_framework-3.3.0/tests/integration/api/events/router_test.py +656 -0
  284. core_framework-3.3.0/tests/integration/api/notifications/router_test.py +538 -0
  285. core_framework-3.3.0/tests/integration/api/posts/authenticated/post_writes_integration_test.py +547 -0
  286. core_framework-3.3.0/tests/integration/api/posts/followers_visibility_test.py +144 -0
  287. core_framework-3.3.0/tests/integration/api/posts/post_attachments_integration_test.py +663 -0
  288. core_framework-3.3.0/tests/integration/api/posts/post_deletion_integration_test.py +630 -0
  289. core_framework-3.3.0/tests/integration/api/posts/post_stats_dirty_marking_test.py +212 -0
  290. core_framework-3.3.0/tests/integration/api/posts/public/router_test.py +724 -0
  291. core_framework-3.3.0/tests/integration/api/rate_limit_test.py +349 -0
  292. core_framework-3.3.0/tests/integration/api/users/account_deletion_email_test.py +145 -0
  293. core_framework-3.3.0/tests/integration/api/users/authenticated/profile_media_upload_test.py +187 -0
  294. core_framework-3.3.0/tests/integration/api/users/authenticated/router_test.py +1102 -0
  295. core_framework-3.3.0/tests/integration/api/users/deletion_audit_integration_test.py +187 -0
  296. core_framework-3.3.0/tests/integration/api/users/public/router_test.py +329 -0
  297. core_framework-3.3.0/tests/integration/conftest.py +14 -0
  298. core_framework-3.3.0/tests/integration/worker/_aggregate_stats_helpers.py +57 -0
  299. core_framework-3.3.0/tests/integration/worker/_arq_helpers.py +148 -0
  300. core_framework-3.3.0/tests/integration/worker/_media_upload_helpers.py +84 -0
  301. core_framework-3.3.0/tests/integration/worker/account_deletion_test.py +385 -0
  302. core_framework-3.3.0/tests/integration/worker/aggregate_comment_stats_test.py +328 -0
  303. core_framework-3.3.0/tests/integration/worker/aggregate_post_stats_test.py +219 -0
  304. core_framework-3.3.0/tests/integration/worker/aggregate_user_stats_test.py +103 -0
  305. core_framework-3.3.0/tests/integration/worker/analytics_refresh_test.py +108 -0
  306. core_framework-3.3.0/tests/integration/worker/conftest.py +29 -0
  307. core_framework-3.3.0/tests/integration/worker/create_idempotency_retention_test.py +277 -0
  308. core_framework-3.3.0/tests/integration/worker/moderation_outbox_test.py +313 -0
  309. core_framework-3.3.0/tests/integration/worker/mute_lift_test.py +172 -0
  310. core_framework-3.3.0/tests/integration/worker/profile_media_upload_test.py +458 -0
  311. core_framework-3.3.0/tests/integration/worker/user_outbox_test.py +370 -0
  312. core_framework-3.3.0/tests/unit/api/users/profile_update_mapper_test.py +22 -0
  313. core_framework-3.3.0/tests/unit/application/email/account_deletion_scheduled_test.py +230 -0
  314. core_framework-3.3.0/tests/unit/core/pagination_test.py +466 -0
  315. core_framework-3.3.0/uv.lock +2607 -0
  316. core_framework-3.1.0/.cursor/rules/alembic-migrations.mdc +0 -60
  317. core_framework-3.1.0/.cursor/rules/domain-imports.mdc +0 -44
  318. core_framework-3.1.0/.cursor/rules/error-boundary.mdc +0 -56
  319. core_framework-3.1.0/.cursor/rules/repository-schema-isolation.mdc +0 -85
  320. core_framework-3.1.0/.cursor/skills/code-review/SKILL.md +0 -35
  321. core_framework-3.1.0/.cursor/skills/sync-host-rules/SKILL.md +0 -52
  322. core_framework-3.1.0/.github/workflows/_deploy.yml +0 -233
  323. core_framework-3.1.0/.github/workflows/dev-ci-cd.yaml +0 -235
  324. core_framework-3.1.0/.github/workflows/test.yaml +0 -187
  325. core_framework-3.1.0/.gitignore +0 -38
  326. core_framework-3.1.0/CHANGELOG.md +0 -575
  327. core_framework-3.1.0/PKG-INFO +0 -144
  328. core_framework-3.1.0/config.toml +0 -139
  329. core_framework-3.1.0/config.toml.template +0 -123
  330. core_framework-3.1.0/core_framework/api/admin/cache/schemas.py +0 -91
  331. core_framework-3.1.0/core_framework/api/admin/comments/schemas.py +0 -49
  332. core_framework-3.1.0/core_framework/api/admin/outbox/router.py +0 -61
  333. core_framework-3.1.0/core_framework/api/admin/posts/schemas.py +0 -31
  334. core_framework-3.1.0/core_framework/api/admin/users/router.py +0 -189
  335. core_framework-3.1.0/core_framework/api/attachments/router.py +0 -43
  336. core_framework-3.1.0/core_framework/api/attachments/schemas.py +0 -48
  337. core_framework-3.1.0/core_framework/api/auth/router.py +0 -21
  338. core_framework-3.1.0/core_framework/api/comments/authenticated/mappers.py +0 -17
  339. core_framework-3.1.0/core_framework/api/comments/authenticated/router.py +0 -143
  340. core_framework-3.1.0/core_framework/api/comments/authenticated/schemas.py +0 -79
  341. core_framework-3.1.0/core_framework/api/dependencies.py +0 -145
  342. core_framework-3.1.0/core_framework/api/events/router.py +0 -48
  343. core_framework-3.1.0/core_framework/api/posts/authenticated/mappers.py +0 -19
  344. core_framework-3.1.0/core_framework/api/posts/authenticated/router.py +0 -111
  345. core_framework-3.1.0/core_framework/api/posts/authenticated/schemas.py +0 -77
  346. core_framework-3.1.0/core_framework/api/schemas.py +0 -13
  347. core_framework-3.1.0/core_framework/api/users/authenticated/router.py +0 -542
  348. core_framework-3.1.0/core_framework/api/users/mappers.py +0 -16
  349. core_framework-3.1.0/core_framework/api/users/public/router.py +0 -28
  350. core_framework-3.1.0/core_framework/application/analytics/bucket_service.py +0 -43
  351. core_framework-3.1.0/core_framework/application/analytics/refresh_service.py +0 -54
  352. core_framework-3.1.0/core_framework/application/auth/auth_service.py +0 -26
  353. core_framework-3.1.0/core_framework/application/auth/token_verification.py +0 -29
  354. core_framework-3.1.0/core_framework/application/bootstrap.py +0 -57
  355. core_framework-3.1.0/core_framework/application/comments/admin_service.py +0 -307
  356. core_framework-3.1.0/core_framework/application/comments/aggregation_service.py +0 -39
  357. core_framework-3.1.0/core_framework/application/comments/cleanup_service.py +0 -109
  358. core_framework-3.1.0/core_framework/application/comments/public_service.py +0 -351
  359. core_framework-3.1.0/core_framework/application/events/README.md +0 -31
  360. core_framework-3.1.0/core_framework/application/events/event_service.py +0 -148
  361. core_framework-3.1.0/core_framework/application/events/event_token.py +0 -45
  362. core_framework-3.1.0/core_framework/application/media/README.md +0 -19
  363. core_framework-3.1.0/core_framework/application/media/attachment_service.py +0 -495
  364. core_framework-3.1.0/core_framework/application/media/avatar_service.py +0 -168
  365. core_framework-3.1.0/core_framework/application/media/banner_service.py +0 -164
  366. core_framework-3.1.0/core_framework/application/moderation/appeal_service.py +0 -112
  367. core_framework-3.1.0/core_framework/application/moderation/user_service.py +0 -218
  368. core_framework-3.1.0/core_framework/application/notifications/README.md +0 -16
  369. core_framework-3.1.0/core_framework/application/notifications/inbox_service.py +0 -239
  370. core_framework-3.1.0/core_framework/application/notifications/notification_service.py +0 -156
  371. core_framework-3.1.0/core_framework/application/outbox/ops_service.py +0 -72
  372. core_framework-3.1.0/core_framework/application/outbox/polling_service.py +0 -69
  373. core_framework-3.1.0/core_framework/application/posts/admin_service.py +0 -173
  374. core_framework-3.1.0/core_framework/application/posts/aggregation_service.py +0 -51
  375. core_framework-3.1.0/core_framework/application/posts/authenticated_service.py +0 -130
  376. core_framework-3.1.0/core_framework/application/posts/cleanup_service.py +0 -127
  377. core_framework-3.1.0/core_framework/application/posts/public_service.py +0 -378
  378. core_framework-3.1.0/core_framework/application/shared/enums.py +0 -40
  379. core_framework-3.1.0/core_framework/application/shared/exceptions.py +0 -78
  380. core_framework-3.1.0/core_framework/application/shared/worker_jobs.py +0 -62
  381. core_framework-3.1.0/core_framework/application/users/admin_service.py +0 -308
  382. core_framework-3.1.0/core_framework/application/users/aggregation_service.py +0 -21
  383. core_framework-3.1.0/core_framework/application/users/authenticated_service.py +0 -373
  384. core_framework-3.1.0/core_framework/application/users/public_service.py +0 -152
  385. core_framework-3.1.0/core_framework/application/users/user_deletion_service.py +0 -268
  386. core_framework-3.1.0/core_framework/constants.py +0 -15
  387. core_framework-3.1.0/core_framework/core/__init__.py +0 -33
  388. core_framework-3.1.0/core_framework/core/cache.py +0 -176
  389. core_framework-3.1.0/core_framework/core/exception_handlers/application.py +0 -119
  390. core_framework-3.1.0/core_framework/core/exception_handlers/common.py +0 -66
  391. core_framework-3.1.0/core_framework/core/exception_handlers/setup.py +0 -36
  392. core_framework-3.1.0/core_framework/core/middleware.py +0 -160
  393. core_framework-3.1.0/core_framework/core/pagination.py +0 -198
  394. core_framework-3.1.0/core_framework/core/settings.py +0 -500
  395. core_framework-3.1.0/core_framework/domains/analytics/service.py +0 -300
  396. core_framework-3.1.0/core_framework/domains/auth/README.md +0 -68
  397. core_framework-3.1.0/core_framework/domains/auth/__init__.py +0 -8
  398. core_framework-3.1.0/core_framework/domains/auth/ports/auth.py +0 -54
  399. core_framework-3.1.0/core_framework/domains/auth/service.py +0 -58
  400. core_framework-3.1.0/core_framework/domains/comment/README.md +0 -262
  401. core_framework-3.1.0/core_framework/domains/comment/constants.py +0 -8
  402. core_framework-3.1.0/core_framework/domains/comment/exceptions.py +0 -30
  403. core_framework-3.1.0/core_framework/domains/comment/models.py +0 -225
  404. core_framework-3.1.0/core_framework/domains/comment/repository.py +0 -2394
  405. core_framework-3.1.0/core_framework/domains/comment/service.py +0 -946
  406. core_framework-3.1.0/core_framework/domains/media/README.md +0 -30
  407. core_framework-3.1.0/core_framework/domains/media/__init__.py +0 -59
  408. core_framework-3.1.0/core_framework/domains/media/attachment/components/staging.py +0 -166
  409. core_framework-3.1.0/core_framework/domains/media/attachment/components/variant_encoder.py +0 -55
  410. core_framework-3.1.0/core_framework/domains/media/attachment/constants.py +0 -41
  411. core_framework-3.1.0/core_framework/domains/media/attachment/models.py +0 -27
  412. core_framework-3.1.0/core_framework/domains/media/attachment/ports/variant_encoder.py +0 -36
  413. core_framework-3.1.0/core_framework/domains/media/attachment/service.py +0 -481
  414. core_framework-3.1.0/core_framework/domains/media/avatar/components/variant_encoder.py +0 -41
  415. core_framework-3.1.0/core_framework/domains/media/avatar/ports/variant_encoder.py +0 -21
  416. core_framework-3.1.0/core_framework/domains/media/avatar/service.py +0 -334
  417. core_framework-3.1.0/core_framework/domains/media/banner/components/variant_encoder.py +0 -41
  418. core_framework-3.1.0/core_framework/domains/media/banner/ports/variant_encoder.py +0 -21
  419. core_framework-3.1.0/core_framework/domains/media/banner/service.py +0 -329
  420. core_framework-3.1.0/core_framework/domains/media/dependencies.py +0 -332
  421. core_framework-3.1.0/core_framework/domains/media/shared/constants.py +0 -4
  422. core_framework-3.1.0/core_framework/domains/media/shared/outcomes.py +0 -21
  423. core_framework-3.1.0/core_framework/domains/media/shared/repository.py +0 -806
  424. core_framework-3.1.0/core_framework/domains/media/shared/service.py +0 -8
  425. core_framework-3.1.0/core_framework/domains/moderation/README.md +0 -140
  426. core_framework-3.1.0/core_framework/domains/moderation/dependencies.py +0 -90
  427. core_framework-3.1.0/core_framework/domains/moderation/outbox_repository.py +0 -187
  428. core_framework-3.1.0/core_framework/domains/moderation/outbox_service.py +0 -52
  429. core_framework-3.1.0/core_framework/domains/moderation/repository.py +0 -1304
  430. core_framework-3.1.0/core_framework/domains/moderation/service.py +0 -884
  431. core_framework-3.1.0/core_framework/domains/notification/README.md +0 -156
  432. core_framework-3.1.0/core_framework/domains/notification/repository.py +0 -629
  433. core_framework-3.1.0/core_framework/domains/notification/service.py +0 -301
  434. core_framework-3.1.0/core_framework/domains/outbox/README.md +0 -69
  435. core_framework-3.1.0/core_framework/domains/outbox/ports/admin.py +0 -35
  436. core_framework-3.1.0/core_framework/domains/outbox/service.py +0 -62
  437. core_framework-3.1.0/core_framework/domains/post/README.md +0 -208
  438. core_framework-3.1.0/core_framework/domains/post/constants.py +0 -9
  439. core_framework-3.1.0/core_framework/domains/post/exceptions.py +0 -20
  440. core_framework-3.1.0/core_framework/domains/post/models.py +0 -209
  441. core_framework-3.1.0/core_framework/domains/post/repository.py +0 -2248
  442. core_framework-3.1.0/core_framework/domains/post/service.py +0 -935
  443. core_framework-3.1.0/core_framework/domains/user/README.md +0 -105
  444. core_framework-3.1.0/core_framework/domains/user/__init__.py +0 -55
  445. core_framework-3.1.0/core_framework/domains/user/dependencies.py +0 -90
  446. core_framework-3.1.0/core_framework/domains/user/models.py +0 -348
  447. core_framework-3.1.0/core_framework/domains/user/outbox_repository.py +0 -186
  448. core_framework-3.1.0/core_framework/domains/user/outbox_service.py +0 -52
  449. core_framework-3.1.0/core_framework/domains/user/outcomes.py +0 -26
  450. core_framework-3.1.0/core_framework/domains/user/repository.py +0 -1710
  451. core_framework-3.1.0/core_framework/domains/user/service.py +0 -981
  452. core_framework-3.1.0/core_framework/infrastructure/firebase/firebase_auth_adapter.py +0 -114
  453. core_framework-3.1.0/core_framework/infrastructure/media/attachment_staging_display_geometry.py +0 -71
  454. core_framework-3.1.0/core_framework/infrastructure/media/pillow_attachment_variant_encoder_adapter.py +0 -132
  455. core_framework-3.1.0/core_framework/infrastructure/media/pillow_avatar_variant_encoder_adapter.py +0 -52
  456. core_framework-3.1.0/core_framework/infrastructure/media/pillow_banner_variant_encoder_adapter.py +0 -35
  457. core_framework-3.1.0/core_framework/testing/arq.py +0 -121
  458. core_framework-3.1.0/core_framework/testing/auth.py +0 -304
  459. core_framework-3.1.0/core_framework/worker/main.py +0 -122
  460. core_framework-3.1.0/core_framework/worker/schedules/schedule_expired_mute_lifts.py +0 -34
  461. core_framework-3.1.0/core_framework/worker/tasks/__init__.py +0 -59
  462. core_framework-3.1.0/core_framework/worker/tasks/process_account_deletion.py +0 -21
  463. core_framework-3.1.0/core_framework/worker/tasks/process_attachment_asset_variants.py +0 -24
  464. core_framework-3.1.0/core_framework/worker/tasks/process_banner_asset_variants.py +0 -32
  465. core_framework-3.1.0/core_framework/worker/tasks/process_cache_pattern_invalidation.py +0 -31
  466. core_framework-3.1.0/core_framework/worker/tasks/process_destructive_comment_delete.py +0 -15
  467. core_framework-3.1.0/core_framework/worker/tasks/process_destructive_post_delete.py +0 -15
  468. core_framework-3.1.0/core_framework/worker/tasks/process_media_asset_variants.py +0 -32
  469. core_framework-3.1.0/core_framework/worker/tasks/process_user_content_deletion.py +0 -15
  470. core_framework-3.1.0/deploy/app/docker-compose.yml +0 -44
  471. core_framework-3.1.0/docs/deployments/deploy-playbook.md +0 -236
  472. core_framework-3.1.0/docs/deployments/e2e-smoke-tests-design.md +0 -353
  473. core_framework-3.1.0/docs/deployments/edge-rate-limits.md +0 -63
  474. core_framework-3.1.0/docs/deployments/guides/setup/cloudflare-setup.md +0 -129
  475. core_framework-3.1.0/docs/deployments/guides/setup/observability-lgtm-setup.md +0 -204
  476. core_framework-3.1.0/docs/deployments/release-playbook.md +0 -84
  477. core_framework-3.1.0/docs/design/README.md +0 -31
  478. core_framework-3.1.0/docs/design/analytics-rollup-design.md +0 -985
  479. core_framework-3.1.0/docs/design/cache-invalidation-design.md +0 -141
  480. core_framework-3.1.0/docs/design/create-idempotency-design.md +0 -282
  481. core_framework-3.1.0/docs/design/event-outbox-design.md +0 -603
  482. core_framework-3.1.0/docs/design/events-ingest-design.md +0 -228
  483. core_framework-3.1.0/docs/design/media-storage-topology.md +0 -141
  484. core_framework-3.1.0/docs/design/observability-lgtm-design.md +0 -591
  485. core_framework-3.1.0/docs/design/outbox-admin-ops-design.md +0 -337
  486. core_framework-3.1.0/docs/domains/README.md +0 -23
  487. core_framework-3.1.0/docs/domains/auth/access_control.md +0 -70
  488. core_framework-3.1.0/docs/domains/auth/registration.md +0 -60
  489. core_framework-3.1.0/docs/domains/cache/admin_cache_invalidation.md +0 -182
  490. core_framework-3.1.0/docs/domains/comments/admin_comments.md +0 -218
  491. core_framework-3.1.0/docs/domains/comments/comment_like.md +0 -96
  492. core_framework-3.1.0/docs/domains/comments/comment_report.md +0 -118
  493. core_framework-3.1.0/docs/domains/comments/comment_stats_aggregation.md +0 -68
  494. core_framework-3.1.0/docs/domains/comments/create_comment.md +0 -174
  495. core_framework-3.1.0/docs/domains/comments/edit_comment.md +0 -74
  496. core_framework-3.1.0/docs/domains/deletion/comments.md +0 -289
  497. core_framework-3.1.0/docs/domains/deletion/posts.md +0 -312
  498. core_framework-3.1.0/docs/domains/deletion/users.md +0 -501
  499. core_framework-3.1.0/docs/domains/events/events.md +0 -245
  500. core_framework-3.1.0/docs/domains/media/attachment_upload.md +0 -73
  501. core_framework-3.1.0/docs/domains/media/avatar-upload-design.md +0 -110
  502. core_framework-3.1.0/docs/domains/media/post-comment-attachments-design.md +0 -521
  503. core_framework-3.1.0/docs/domains/media/upload-pipeline-design.md +0 -468
  504. core_framework-3.1.0/docs/domains/media/upload_pipeline.md +0 -106
  505. core_framework-3.1.0/docs/domains/mentions/mentions_in_content.md +0 -238
  506. core_framework-3.1.0/docs/domains/moderation/appeals.md +0 -245
  507. core_framework-3.1.0/docs/domains/moderation/internal_notes.md +0 -159
  508. core_framework-3.1.0/docs/domains/moderation/moderator_actions.md +0 -70
  509. core_framework-3.1.0/docs/domains/moderation/reports.md +0 -186
  510. core_framework-3.1.0/docs/domains/moderation/restrictions.md +0 -250
  511. core_framework-3.1.0/docs/domains/notifications/notification_inbox.md +0 -384
  512. core_framework-3.1.0/docs/domains/outbox/admin_outbox_ops.md +0 -187
  513. core_framework-3.1.0/docs/domains/posts/admin_posts.md +0 -214
  514. core_framework-3.1.0/docs/domains/posts/author_context.md +0 -92
  515. core_framework-3.1.0/docs/domains/posts/create_post.md +0 -120
  516. core_framework-3.1.0/docs/domains/posts/edit_post.md +0 -80
  517. core_framework-3.1.0/docs/domains/posts/post_like.md +0 -95
  518. core_framework-3.1.0/docs/domains/posts/post_report.md +0 -105
  519. core_framework-3.1.0/docs/domains/posts/post_stats_aggregation.md +0 -90
  520. core_framework-3.1.0/docs/domains/users/account.md +0 -106
  521. core_framework-3.1.0/docs/domains/users/account_deletion.md +0 -111
  522. core_framework-3.1.0/docs/domains/users/admin_users.md +0 -166
  523. core_framework-3.1.0/docs/domains/users/avatar.md +0 -92
  524. core_framework-3.1.0/docs/domains/users/banner.md +0 -78
  525. core_framework-3.1.0/docs/domains/users/blocks.md +0 -125
  526. core_framework-3.1.0/docs/domains/users/change_history.md +0 -133
  527. core_framework-3.1.0/docs/domains/users/check_username_exists.md +0 -57
  528. core_framework-3.1.0/docs/domains/users/follow-system-design.md +0 -424
  529. core_framework-3.1.0/docs/domains/users/follow.md +0 -222
  530. core_framework-3.1.0/docs/domains/users/preferences.md +0 -87
  531. core_framework-3.1.0/docs/domains/users/profile.md +0 -203
  532. core_framework-3.1.0/docs/domains/users/public_profile.md +0 -97
  533. core_framework-3.1.0/docs/domains/users/user_stats_aggregation.md +0 -80
  534. core_framework-3.1.0/docs/library/capability-wiring.md +0 -127
  535. core_framework-3.1.0/docs/library/core-framework-migration.md +0 -253
  536. core_framework-3.1.0/docs/library/overview.md +0 -55
  537. core_framework-3.1.0/docs/library/package-api.md +0 -564
  538. core_framework-3.1.0/docs/library/testing-plugin-design.md +0 -317
  539. core_framework-3.1.0/docs/library/workers.md +0 -89
  540. core_framework-3.1.0/docs/platform/architecture-decisions.md +0 -537
  541. core_framework-3.1.0/docs/platform/client-error-visibility.md +0 -271
  542. core_framework-3.1.0/docs/platform/conventions.md +0 -100
  543. core_framework-3.1.0/docs/platform/domain-services-and-adapters.md +0 -60
  544. core_framework-3.1.0/docs/platform/patch-update-typed-payload.md +0 -191
  545. core_framework-3.1.0/docs/reviews/log.md +0 -12
  546. core_framework-3.1.0/docs/reviews/review-playbook.md +0 -192
  547. core_framework-3.1.0/docs/reviews/slices.md +0 -301
  548. core_framework-3.1.0/docs/testing.md +0 -150
  549. core_framework-3.1.0/docs/todo.md +0 -4
  550. core_framework-3.1.0/pyproject.toml +0 -154
  551. core_framework-3.1.0/tach.toml +0 -176
  552. core_framework-3.1.0/tests/conftest.py +0 -49
  553. core_framework-3.1.0/tests/integration/_http_error_details.py +0 -19
  554. core_framework-3.1.0/tests/integration/api/_auth_helpers.py +0 -6
  555. core_framework-3.1.0/tests/integration/api/_destructive_delete_helpers.py +0 -51
  556. core_framework-3.1.0/tests/integration/api/_http_helpers.py +0 -95
  557. core_framework-3.1.0/tests/integration/api/_user_deletion_helpers.py +0 -63
  558. core_framework-3.1.0/tests/integration/api/_user_helpers.py +0 -26
  559. core_framework-3.1.0/tests/integration/api/admin/_auth_cases.py +0 -53
  560. core_framework-3.1.0/tests/integration/api/admin/analytics/router_test.py +0 -263
  561. core_framework-3.1.0/tests/integration/api/admin/cache/router_test.py +0 -307
  562. core_framework-3.1.0/tests/integration/api/admin/comments/router_test.py +0 -735
  563. core_framework-3.1.0/tests/integration/api/admin/moderation/_auth_cases.py +0 -30
  564. core_framework-3.1.0/tests/integration/api/admin/moderation/router_test.py +0 -2545
  565. core_framework-3.1.0/tests/integration/api/admin/outbox/router_test.py +0 -337
  566. core_framework-3.1.0/tests/integration/api/admin/posts/router_test.py +0 -472
  567. core_framework-3.1.0/tests/integration/api/admin/users/router_test.py +0 -1464
  568. core_framework-3.1.0/tests/integration/api/attachments/_helpers.py +0 -210
  569. core_framework-3.1.0/tests/integration/api/attachments/attachment_upload_test.py +0 -29
  570. core_framework-3.1.0/tests/integration/api/auth/router_test.py +0 -52
  571. core_framework-3.1.0/tests/integration/api/comments/comment_attachments_integration_test.py +0 -576
  572. core_framework-3.1.0/tests/integration/api/comments/public/router_test.py +0 -514
  573. core_framework-3.1.0/tests/integration/api/events/router_test.py +0 -758
  574. core_framework-3.1.0/tests/integration/api/notifications/router_test.py +0 -538
  575. core_framework-3.1.0/tests/integration/api/posts/authenticated/post_writes_integration_test.py +0 -311
  576. core_framework-3.1.0/tests/integration/api/posts/followers_visibility_test.py +0 -144
  577. core_framework-3.1.0/tests/integration/api/posts/post_attachments_integration_test.py +0 -660
  578. core_framework-3.1.0/tests/integration/api/posts/post_deletion_integration_test.py +0 -624
  579. core_framework-3.1.0/tests/integration/api/posts/post_stats_dirty_marking_test.py +0 -212
  580. core_framework-3.1.0/tests/integration/api/posts/public/router_test.py +0 -1015
  581. core_framework-3.1.0/tests/integration/api/users/authenticated/avatar_upload_test.py +0 -112
  582. core_framework-3.1.0/tests/integration/api/users/authenticated/banner_upload_test.py +0 -112
  583. core_framework-3.1.0/tests/integration/api/users/authenticated/router_test.py +0 -1100
  584. core_framework-3.1.0/tests/integration/api/users/deletion_audit_integration_test.py +0 -187
  585. core_framework-3.1.0/tests/integration/api/users/public/router_test.py +0 -334
  586. core_framework-3.1.0/tests/integration/worker/_media_upload_helpers.py +0 -84
  587. core_framework-3.1.0/tests/integration/worker/account_deletion_test.py +0 -385
  588. core_framework-3.1.0/tests/integration/worker/aggregate_comment_stats_test.py +0 -354
  589. core_framework-3.1.0/tests/integration/worker/aggregate_post_stats_test.py +0 -257
  590. core_framework-3.1.0/tests/integration/worker/aggregate_user_stats_test.py +0 -123
  591. core_framework-3.1.0/tests/integration/worker/analytics_refresh_test.py +0 -108
  592. core_framework-3.1.0/tests/integration/worker/avatar_upload_test.py +0 -370
  593. core_framework-3.1.0/tests/integration/worker/banner_upload_test.py +0 -367
  594. core_framework-3.1.0/tests/integration/worker/conftest.py +0 -21
  595. core_framework-3.1.0/tests/integration/worker/create_idempotency_retention_test.py +0 -280
  596. core_framework-3.1.0/tests/integration/worker/moderation_outbox_test.py +0 -313
  597. core_framework-3.1.0/tests/integration/worker/mute_lift_test.py +0 -166
  598. core_framework-3.1.0/tests/integration/worker/user_outbox_test.py +0 -370
  599. core_framework-3.1.0/tests/integration/worker/utils_test.py +0 -116
  600. core_framework-3.1.0/tests/unit/api/users/profile_update_mapper_test.py +0 -22
  601. core_framework-3.1.0/tests/unit/core/pagination_test.py +0 -582
  602. core_framework-3.1.0/uv.lock +0 -2587
  603. {core_framework-3.1.0 → core_framework-3.3.0}/.agents/skills/fastapi +0 -0
  604. {core_framework-3.1.0 → core_framework-3.3.0}/.agents/skills/library-skills/.library-skills.json +0 -0
  605. {core_framework-3.1.0 → core_framework-3.3.0}/.agents/skills/library-skills/SKILL.md +0 -0
  606. {core_framework-3.1.0 → core_framework-3.3.0}/.cursor/rules/api-layer.mdc +0 -0
  607. {core_framework-3.1.0 → core_framework-3.3.0}/.cursor/rules/api-reference-docs.mdc +0 -0
  608. {core_framework-3.1.0 → core_framework-3.3.0}/.cursor/rules/api-validation.mdc +0 -0
  609. {core_framework-3.1.0 → core_framework-3.3.0}/.cursor/rules/application-layer.mdc +0 -0
  610. {core_framework-3.1.0 → core_framework-3.3.0}/.cursor/rules/constants-final.mdc +0 -0
  611. {core_framework-3.1.0 → core_framework-3.3.0}/.cursor/rules/constitution.mdc +0 -0
  612. {core_framework-3.1.0 → core_framework-3.3.0}/.cursor/rules/database-triggers.mdc +0 -0
  613. {core_framework-3.1.0 → core_framework-3.3.0}/.cursor/rules/docstrings.mdc +0 -0
  614. {core_framework-3.1.0 → core_framework-3.3.0}/.cursor/rules/domain-caller-context.mdc +0 -0
  615. {core_framework-3.1.0 → core_framework-3.3.0}/.cursor/rules/domain-input-guards.mdc +0 -0
  616. {core_framework-3.1.0 → core_framework-3.3.0}/.cursor/rules/domain-repository-exceptions.mdc +0 -0
  617. {core_framework-3.1.0 → core_framework-3.3.0}/.cursor/rules/domain-services-and-adapters.mdc +0 -0
  618. {core_framework-3.1.0 → core_framework-3.3.0}/.cursor/rules/flow-documentation.mdc +0 -0
  619. {core_framework-3.1.0 → core_framework-3.3.0}/.cursor/rules/inline-raise-messages.mdc +0 -0
  620. {core_framework-3.1.0 → core_framework-3.3.0}/.cursor/rules/integration-test-strategy.mdc +0 -0
  621. {core_framework-3.1.0 → core_framework-3.3.0}/.cursor/rules/layer-boundaries.mdc +0 -0
  622. {core_framework-3.1.0 → core_framework-3.3.0}/.cursor/rules/no-code-in-docs.mdc +0 -0
  623. {core_framework-3.1.0 → core_framework-3.3.0}/.cursor/rules/postgres-config-conventions.mdc +0 -0
  624. {core_framework-3.1.0 → core_framework-3.3.0}/.cursor/rules/strong-reads.mdc +0 -0
  625. {core_framework-3.1.0 → core_framework-3.3.0}/.cursor/rules/structured-logging.mdc +0 -0
  626. {core_framework-3.1.0 → core_framework-3.3.0}/.cursor/skills/add-config/SKILL.md +0 -0
  627. {core_framework-3.1.0 → core_framework-3.3.0}/.cursor/skills/add-domain/SKILL.md +0 -0
  628. {core_framework-3.1.0 → core_framework-3.3.0}/.cursor/skills/fastapi +0 -0
  629. {core_framework-3.1.0 → core_framework-3.3.0}/.cursor/skills/implement-feature/SKILL.md +0 -0
  630. {core_framework-3.1.0 → core_framework-3.3.0}/.cursor/skills/recommend-features/SKILL.md +0 -0
  631. {core_framework-3.1.0 → core_framework-3.3.0}/.cursor/skills/write-flow-doc/SKILL.md +0 -0
  632. {core_framework-3.1.0 → core_framework-3.3.0}/.dockerignore +0 -0
  633. {core_framework-3.1.0 → core_framework-3.3.0}/.github/ci/package-lock.json +0 -0
  634. {core_framework-3.1.0 → core_framework-3.3.0}/.github/ci/package.json +0 -0
  635. {core_framework-3.1.0 → core_framework-3.3.0}/.github/workflows/manual-deployment.yaml +0 -0
  636. {core_framework-3.1.0 → core_framework-3.3.0}/.github/workflows/manual-observability-deployment.yaml +0 -0
  637. {core_framework-3.1.0 → core_framework-3.3.0}/.github/workflows/publish-pypi.yml +0 -0
  638. {core_framework-3.1.0 → core_framework-3.3.0}/.pre-commit-config.yaml +0 -0
  639. {core_framework-3.1.0 → core_framework-3.3.0}/.python-version +0 -0
  640. {core_framework-3.1.0 → core_framework-3.3.0}/LICENSE +0 -0
  641. {core_framework-3.1.0 → core_framework-3.3.0}/README.md +0 -0
  642. {core_framework-3.1.0 → core_framework-3.3.0}/alembic/analytics/alembic/README +0 -0
  643. {core_framework-3.1.0 → core_framework-3.3.0}/alembic/analytics/alembic/env.py +0 -0
  644. {core_framework-3.1.0 → core_framework-3.3.0}/alembic/analytics/alembic/script.py.mako +0 -0
  645. {core_framework-3.1.0 → core_framework-3.3.0}/alembic/analytics/alembic/versions/2d61a5e88d76_analytics_utm_events_add_kind.py +0 -0
  646. {core_framework-3.1.0 → core_framework-3.3.0}/alembic/analytics/alembic/versions/585105e1149e_analytics_add_utm_events.py +0 -0
  647. {core_framework-3.1.0 → core_framework-3.3.0}/alembic/analytics/alembic/versions/5b9ac98bb150_analytics_daily_fact.py +0 -0
  648. {core_framework-3.1.0 → core_framework-3.3.0}/alembic/analytics/alembic/versions/7f2a9c1d4e8b_analytics_daily_fact_day_index.py +0 -0
  649. {core_framework-3.1.0 → core_framework-3.3.0}/alembic/analytics/alembic.ini +0 -0
  650. {core_framework-3.1.0 → core_framework-3.3.0}/alembic/comment/alembic/README +0 -0
  651. {core_framework-3.1.0 → core_framework-3.3.0}/alembic/comment/alembic/env.py +0 -0
  652. {core_framework-3.1.0 → core_framework-3.3.0}/alembic/comment/alembic/script.py.mako +0 -0
  653. {core_framework-3.1.0 → core_framework-3.3.0}/alembic/comment/alembic/versions/comment_add_comment_attachments.py +0 -0
  654. {core_framework-3.1.0 → core_framework-3.3.0}/alembic/comment/alembic/versions/comment_add_comment_create_idempotency.py +0 -0
  655. {core_framework-3.1.0 → core_framework-3.3.0}/alembic/comment/alembic/versions/comment_add_comment_create_idempotency_created_at_index.py +0 -0
  656. {core_framework-3.1.0 → core_framework-3.3.0}/alembic/comment/alembic/versions/comment_add_comment_mentions.py +0 -0
  657. {core_framework-3.1.0 → core_framework-3.3.0}/alembic/comment/alembic/versions/comment_tombstone_status_model.py +0 -0
  658. {core_framework-3.1.0 → core_framework-3.3.0}/alembic/comment/alembic/versions/v1_comment_init_baseline.py +0 -0
  659. {core_framework-3.1.0 → core_framework-3.3.0}/alembic/comment/alembic.ini +0 -0
  660. {core_framework-3.1.0 → core_framework-3.3.0}/alembic/extension/alembic/README +0 -0
  661. {core_framework-3.1.0 → core_framework-3.3.0}/alembic/extension/alembic/env.py +0 -0
  662. {core_framework-3.1.0 → core_framework-3.3.0}/alembic/extension/alembic/script.py.mako +0 -0
  663. {core_framework-3.1.0 → core_framework-3.3.0}/alembic/extension/alembic/versions/v1_ext_init_baseline.py +0 -0
  664. {core_framework-3.1.0 → core_framework-3.3.0}/alembic/extension/alembic.ini +0 -0
  665. {core_framework-3.1.0 → core_framework-3.3.0}/alembic/media/alembic/README +0 -0
  666. {core_framework-3.1.0 → core_framework-3.3.0}/alembic/media/alembic/env.py +0 -0
  667. {core_framework-3.1.0 → core_framework-3.3.0}/alembic/media/alembic/script.py.mako +0 -0
  668. {core_framework-3.1.0 → core_framework-3.3.0}/alembic/media/alembic/versions/media_add_attachment_staging_registry.py +0 -0
  669. {core_framework-3.1.0 → core_framework-3.3.0}/alembic/media/alembic/versions/media_add_banner_staging_and_lease.py +0 -0
  670. {core_framework-3.1.0 → core_framework-3.3.0}/alembic/media/alembic/versions/media_attachment_staging_registry_published_at.py +0 -0
  671. {core_framework-3.1.0 → core_framework-3.3.0}/alembic/media/alembic/versions/v1_media_init_baseline.py +0 -0
  672. {core_framework-3.1.0 → core_framework-3.3.0}/alembic/media/alembic.ini +0 -0
  673. {core_framework-3.1.0 → core_framework-3.3.0}/alembic/moderation/alembic/README +0 -0
  674. {core_framework-3.1.0 → core_framework-3.3.0}/alembic/moderation/alembic/env.py +0 -0
  675. {core_framework-3.1.0 → core_framework-3.3.0}/alembic/moderation/alembic/script.py.mako +0 -0
  676. {core_framework-3.1.0 → core_framework-3.3.0}/alembic/moderation/alembic/versions/moderation_add_event_outbox.py +0 -0
  677. {core_framework-3.1.0 → core_framework-3.3.0}/alembic/moderation/alembic/versions/moderation_add_event_outbox_dead_indexes.py +0 -0
  678. {core_framework-3.1.0 → core_framework-3.3.0}/alembic/moderation/alembic/versions/moderation_add_event_outbox_pending_created_at_index.py +0 -0
  679. {core_framework-3.1.0 → core_framework-3.3.0}/alembic/moderation/alembic/versions/v1_mod_init_baseline.py +0 -0
  680. {core_framework-3.1.0 → core_framework-3.3.0}/alembic/moderation/alembic.ini +0 -0
  681. {core_framework-3.1.0 → core_framework-3.3.0}/alembic/notification/alembic/README +0 -0
  682. {core_framework-3.1.0 → core_framework-3.3.0}/alembic/notification/alembic/env.py +0 -0
  683. {core_framework-3.1.0 → core_framework-3.3.0}/alembic/notification/alembic/script.py.mako +0 -0
  684. {core_framework-3.1.0 → core_framework-3.3.0}/alembic/notification/alembic/versions/2fdd68777706_notification_read_at_retention_index.py +0 -0
  685. {core_framework-3.1.0 → core_framework-3.3.0}/alembic/notification/alembic/versions/v1_notif_init_baseline.py +0 -0
  686. {core_framework-3.1.0 → core_framework-3.3.0}/alembic/notification/alembic.ini +0 -0
  687. {core_framework-3.1.0 → core_framework-3.3.0}/alembic/post/alembic/README +0 -0
  688. {core_framework-3.1.0 → core_framework-3.3.0}/alembic/post/alembic/env.py +0 -0
  689. {core_framework-3.1.0 → core_framework-3.3.0}/alembic/post/alembic/script.py.mako +0 -0
  690. {core_framework-3.1.0 → core_framework-3.3.0}/alembic/post/alembic/versions/post_add_post_attachments.py +0 -0
  691. {core_framework-3.1.0 → core_framework-3.3.0}/alembic/post/alembic/versions/post_add_post_create_idempotency.py +0 -0
  692. {core_framework-3.1.0 → core_framework-3.3.0}/alembic/post/alembic/versions/post_add_post_create_idempotency_created_at_index.py +0 -0
  693. {core_framework-3.1.0 → core_framework-3.3.0}/alembic/post/alembic/versions/post_add_post_mentions.py +0 -0
  694. {core_framework-3.1.0 → core_framework-3.3.0}/alembic/post/alembic/versions/post_post_views_retention_high_water_mark.py +0 -0
  695. {core_framework-3.1.0 → core_framework-3.3.0}/alembic/post/alembic/versions/post_tombstone_status_model.py +0 -0
  696. {core_framework-3.1.0 → core_framework-3.3.0}/alembic/post/alembic/versions/v1_post_init_baseline.py +0 -0
  697. {core_framework-3.1.0 → core_framework-3.3.0}/alembic/post/alembic.ini +0 -0
  698. {core_framework-3.1.0 → core_framework-3.3.0}/alembic/user/alembic/README +0 -0
  699. {core_framework-3.1.0 → core_framework-3.3.0}/alembic/user/alembic/env.py +0 -0
  700. {core_framework-3.1.0 → core_framework-3.3.0}/alembic/user/alembic/script.py.mako +0 -0
  701. {core_framework-3.1.0 → core_framework-3.3.0}/alembic/user/alembic/versions/44df70a45ba6_user_add_signup_events.py +0 -0
  702. {core_framework-3.1.0 → core_framework-3.3.0}/alembic/user/alembic/versions/user_add_avatar_ingest_sequences.py +0 -0
  703. {core_framework-3.1.0 → core_framework-3.3.0}/alembic/user/alembic/versions/user_add_banner_ingest_sequences.py +0 -0
  704. {core_framework-3.1.0 → core_framework-3.3.0}/alembic/user/alembic/versions/user_add_date_of_birth_to_profiles.py +0 -0
  705. {core_framework-3.1.0 → core_framework-3.3.0}/alembic/user/alembic/versions/user_add_event_outbox.py +0 -0
  706. {core_framework-3.1.0 → core_framework-3.3.0}/alembic/user/alembic/versions/user_add_event_outbox_dead_indexes.py +0 -0
  707. {core_framework-3.1.0 → core_framework-3.3.0}/alembic/user/alembic/versions/user_add_event_outbox_pending_created_at_index.py +0 -0
  708. {core_framework-3.1.0 → core_framework-3.3.0}/alembic/user/alembic/versions/user_reserve_sentinel_user_ids.py +0 -0
  709. {core_framework-3.1.0 → core_framework-3.3.0}/alembic/user/alembic/versions/v1_user_init_baseline.py +0 -0
  710. {core_framework-3.1.0 → core_framework-3.3.0}/alembic/user/alembic.ini +0 -0
  711. {core_framework-3.1.0 → core_framework-3.3.0}/core_framework/__init__.py +0 -0
  712. {core_framework-3.1.0 → core_framework-3.3.0}/core_framework/api/__init__.py +0 -0
  713. {core_framework-3.1.0 → core_framework-3.3.0}/core_framework/api/admin/__init__.py +0 -0
  714. {core_framework-3.1.0 → core_framework-3.3.0}/core_framework/api/admin/analytics/__init__.py +0 -0
  715. {core_framework-3.1.0 → core_framework-3.3.0}/core_framework/api/admin/analytics/router.py +0 -0
  716. {core_framework-3.1.0 → core_framework-3.3.0}/core_framework/api/admin/analytics/schemas.py +0 -0
  717. {core_framework-3.1.0 → core_framework-3.3.0}/core_framework/api/admin/cache/__init__.py +0 -0
  718. {core_framework-3.1.0 → core_framework-3.3.0}/core_framework/api/admin/cache/router.py +0 -0
  719. {core_framework-3.1.0 → core_framework-3.3.0}/core_framework/api/admin/comments/__init__.py +0 -0
  720. {core_framework-3.1.0 → core_framework-3.3.0}/core_framework/api/admin/comments/router.py +0 -0
  721. {core_framework-3.1.0 → core_framework-3.3.0}/core_framework/api/admin/moderation/__init__.py +0 -0
  722. {core_framework-3.1.0 → core_framework-3.3.0}/core_framework/api/admin/moderation/router.py +0 -0
  723. {core_framework-3.1.0 → core_framework-3.3.0}/core_framework/api/admin/moderation/schemas.py +0 -0
  724. {core_framework-3.1.0 → core_framework-3.3.0}/core_framework/api/admin/outbox/__init__.py +0 -0
  725. {core_framework-3.1.0 → core_framework-3.3.0}/core_framework/api/admin/outbox/schemas.py +0 -0
  726. {core_framework-3.1.0 → core_framework-3.3.0}/core_framework/api/admin/posts/__init__.py +0 -0
  727. {core_framework-3.1.0 → core_framework-3.3.0}/core_framework/api/admin/posts/router.py +0 -0
  728. {core_framework-3.1.0 → core_framework-3.3.0}/core_framework/api/admin/router.py +0 -0
  729. {core_framework-3.1.0 → core_framework-3.3.0}/core_framework/api/admin/users/__init__.py +0 -0
  730. {core_framework-3.1.0 → core_framework-3.3.0}/core_framework/api/admin/users/schemas.py +0 -0
  731. {core_framework-3.1.0 → core_framework-3.3.0}/core_framework/api/attachments/__init__.py +0 -0
  732. {core_framework-3.1.0 → core_framework-3.3.0}/core_framework/api/auth/__init__.py +0 -0
  733. {core_framework-3.1.0 → core_framework-3.3.0}/core_framework/api/auth/schemas.py +0 -0
  734. {core_framework-3.1.0 → core_framework-3.3.0}/core_framework/api/comments/__init__.py +0 -0
  735. {core_framework-3.1.0 → core_framework-3.3.0}/core_framework/api/comments/authenticated/__init__.py +0 -0
  736. {core_framework-3.1.0 → core_framework-3.3.0}/core_framework/api/comments/public/__init__.py +0 -0
  737. {core_framework-3.1.0 → core_framework-3.3.0}/core_framework/api/comments/public/router.py +0 -0
  738. {core_framework-3.1.0 → core_framework-3.3.0}/core_framework/api/comments/public/schemas.py +0 -0
  739. {core_framework-3.1.0 → core_framework-3.3.0}/core_framework/api/comments/router.py +0 -0
  740. {core_framework-3.1.0 → core_framework-3.3.0}/core_framework/api/comments/schemas.py +0 -0
  741. {core_framework-3.1.0 → core_framework-3.3.0}/core_framework/api/constants.py +0 -0
  742. {core_framework-3.1.0 → core_framework-3.3.0}/core_framework/api/events/__init__.py +0 -0
  743. {core_framework-3.1.0 → core_framework-3.3.0}/core_framework/api/events/schemas.py +0 -0
  744. {core_framework-3.1.0 → core_framework-3.3.0}/core_framework/api/idempotency/__init__.py +0 -0
  745. {core_framework-3.1.0 → core_framework-3.3.0}/core_framework/api/idempotency/dependencies.py +0 -0
  746. {core_framework-3.1.0/core_framework/application/media → core_framework-3.3.0/core_framework/api}/ingest_guards.py +0 -0
  747. {core_framework-3.1.0 → core_framework-3.3.0}/core_framework/api/notifications/__init__.py +0 -0
  748. {core_framework-3.1.0 → core_framework-3.3.0}/core_framework/api/notifications/authenticated/__init__.py +0 -0
  749. {core_framework-3.1.0 → core_framework-3.3.0}/core_framework/api/notifications/authenticated/router.py +0 -0
  750. {core_framework-3.1.0 → core_framework-3.3.0}/core_framework/api/notifications/authenticated/schemas.py +0 -0
  751. {core_framework-3.1.0 → core_framework-3.3.0}/core_framework/api/notifications/router.py +0 -0
  752. {core_framework-3.1.0 → core_framework-3.3.0}/core_framework/api/posts/__init__.py +0 -0
  753. {core_framework-3.1.0 → core_framework-3.3.0}/core_framework/api/posts/authenticated/__init__.py +0 -0
  754. {core_framework-3.1.0 → core_framework-3.3.0}/core_framework/api/posts/public/__init__.py +0 -0
  755. {core_framework-3.1.0 → core_framework-3.3.0}/core_framework/api/posts/public/router.py +0 -0
  756. {core_framework-3.1.0 → core_framework-3.3.0}/core_framework/api/posts/public/schemas.py +0 -0
  757. {core_framework-3.1.0 → core_framework-3.3.0}/core_framework/api/posts/router.py +0 -0
  758. {core_framework-3.1.0 → core_framework-3.3.0}/core_framework/api/posts/schemas.py +0 -0
  759. {core_framework-3.1.0 → core_framework-3.3.0}/core_framework/api/router.py +0 -0
  760. {core_framework-3.1.0 → core_framework-3.3.0}/core_framework/api/system/__init__.py +0 -0
  761. {core_framework-3.1.0 → core_framework-3.3.0}/core_framework/api/system/router.py +0 -0
  762. {core_framework-3.1.0 → core_framework-3.3.0}/core_framework/api/upload.py +0 -0
  763. {core_framework-3.1.0 → core_framework-3.3.0}/core_framework/api/users/__init__.py +0 -0
  764. {core_framework-3.1.0 → core_framework-3.3.0}/core_framework/api/users/authenticated/__init__.py +0 -0
  765. {core_framework-3.1.0 → core_framework-3.3.0}/core_framework/api/users/authenticated/mappers.py +0 -0
  766. {core_framework-3.1.0 → core_framework-3.3.0}/core_framework/api/users/authenticated/schemas.py +0 -0
  767. {core_framework-3.1.0 → core_framework-3.3.0}/core_framework/api/users/public/__init__.py +0 -0
  768. {core_framework-3.1.0 → core_framework-3.3.0}/core_framework/api/users/public/schemas.py +0 -0
  769. {core_framework-3.1.0 → core_framework-3.3.0}/core_framework/api/users/router.py +0 -0
  770. {core_framework-3.1.0 → core_framework-3.3.0}/core_framework/api/users/shared/__init__.py +0 -0
  771. {core_framework-3.1.0 → core_framework-3.3.0}/core_framework/api/users/shared/schemas.py +0 -0
  772. {core_framework-3.1.0 → core_framework-3.3.0}/core_framework/application/__init__.py +0 -0
  773. {core_framework-3.1.0 → core_framework-3.3.0}/core_framework/application/analytics/__init__.py +0 -0
  774. {core_framework-3.1.0 → core_framework-3.3.0}/core_framework/application/analytics/prune_service.py +0 -0
  775. {core_framework-3.1.0 → core_framework-3.3.0}/core_framework/application/analytics/read_service.py +0 -0
  776. {core_framework-3.1.0 → core_framework-3.3.0}/core_framework/application/analytics/registry.py +0 -0
  777. {core_framework-3.1.0 → core_framework-3.3.0}/core_framework/application/analytics/sources/__init__.py +0 -0
  778. {core_framework-3.1.0 → core_framework-3.3.0}/core_framework/application/analytics/sources/comment_created.py +0 -0
  779. {core_framework-3.1.0 → core_framework-3.3.0}/core_framework/application/analytics/sources/post_created.py +0 -0
  780. {core_framework-3.1.0 → core_framework-3.3.0}/core_framework/application/analytics/sources/post_viewed.py +0 -0
  781. {core_framework-3.1.0 → core_framework-3.3.0}/core_framework/application/analytics/sources/user_registered.py +0 -0
  782. {core_framework-3.1.0 → core_framework-3.3.0}/core_framework/application/auth/__init__.py +0 -0
  783. {core_framework-3.1.0 → core_framework-3.3.0}/core_framework/application/auth/access_service.py +0 -0
  784. {core_framework-3.1.0 → core_framework-3.3.0}/core_framework/application/auth/models.py +0 -0
  785. {core_framework-3.1.0 → core_framework-3.3.0}/core_framework/application/cache/__init__.py +0 -0
  786. {core_framework-3.1.0 → core_framework-3.3.0}/core_framework/application/cache/invalidate_service.py +0 -0
  787. {core_framework-3.1.0 → core_framework-3.3.0}/core_framework/application/cache/models.py +0 -0
  788. {core_framework-3.1.0 → core_framework-3.3.0}/core_framework/application/comments/__init__.py +0 -0
  789. {core_framework-3.1.0 → core_framework-3.3.0}/core_framework/application/comments/authenticated_service.py +0 -0
  790. {core_framework-3.1.0 → core_framework-3.3.0}/core_framework/application/events/__init__.py +0 -0
  791. {core_framework-3.1.0 → core_framework-3.3.0}/core_framework/application/events/models.py +0 -0
  792. {core_framework-3.1.0 → core_framework-3.3.0}/core_framework/application/events/utm_capture_kinds.py +0 -0
  793. {core_framework-3.1.0 → core_framework-3.3.0}/core_framework/application/media/__init__.py +0 -0
  794. {core_framework-3.1.0 → core_framework-3.3.0}/core_framework/application/media/attachment_read.py +0 -0
  795. {core_framework-3.1.0 → core_framework-3.3.0}/core_framework/application/media/read_url_config.py +0 -0
  796. {core_framework-3.1.0 → core_framework-3.3.0}/core_framework/application/moderation/__init__.py +0 -0
  797. {core_framework-3.1.0 → core_framework-3.3.0}/core_framework/application/moderation/moderator_service.py +0 -0
  798. {core_framework-3.1.0 → core_framework-3.3.0}/core_framework/application/moderation/report_service.py +0 -0
  799. {core_framework-3.1.0 → core_framework-3.3.0}/core_framework/application/moderation/scheduled_service.py +0 -0
  800. {core_framework-3.1.0 → core_framework-3.3.0}/core_framework/application/notifications/__init__.py +0 -0
  801. {core_framework-3.1.0 → core_framework-3.3.0}/core_framework/application/notifications/enums.py +0 -0
  802. {core_framework-3.1.0 → core_framework-3.3.0}/core_framework/application/notifications/mute_service.py +0 -0
  803. {core_framework-3.1.0 → core_framework-3.3.0}/core_framework/application/notifications/prune_service.py +0 -0
  804. {core_framework-3.1.0 → core_framework-3.3.0}/core_framework/application/outbox/__init__.py +0 -0
  805. {core_framework-3.1.0 → core_framework-3.3.0}/core_framework/application/outbox/block_mirrors.py +0 -0
  806. {core_framework-3.1.0 → core_framework-3.3.0}/core_framework/application/outbox/events.py +0 -0
  807. {core_framework-3.1.0 → core_framework-3.3.0}/core_framework/application/outbox/exceptions.py +0 -0
  808. {core_framework-3.1.0 → core_framework-3.3.0}/core_framework/application/outbox/follow_mirrors.py +0 -0
  809. {core_framework-3.1.0 → core_framework-3.3.0}/core_framework/application/outbox/handlers.py +0 -0
  810. {core_framework-3.1.0 → core_framework-3.3.0}/core_framework/application/outbox/processing_service.py +0 -0
  811. {core_framework-3.1.0 → core_framework-3.3.0}/core_framework/application/outbox/restriction_mirrors.py +0 -0
  812. {core_framework-3.1.0 → core_framework-3.3.0}/core_framework/application/posts/__init__.py +0 -0
  813. {core_framework-3.1.0 → core_framework-3.3.0}/core_framework/application/shared/__init__.py +0 -0
  814. {core_framework-3.1.0 → core_framework-3.3.0}/core_framework/application/shared/request_context.py +0 -0
  815. {core_framework-3.1.0 → core_framework-3.3.0}/core_framework/application/users/__init__.py +0 -0
  816. {core_framework-3.1.0 → core_framework-3.3.0}/core_framework/application/users/deletion_audit.py +0 -0
  817. {core_framework-3.1.0 → core_framework-3.3.0}/core_framework/application/users/enums.py +0 -0
  818. {core_framework-3.1.0 → core_framework-3.3.0}/core_framework/application/users/scheduled_service.py +0 -0
  819. {core_framework-3.1.0 → core_framework-3.3.0}/core_framework/asgi.py +0 -0
  820. {core_framework-3.1.0 → core_framework-3.3.0}/core_framework/bundled_alembic.py +0 -0
  821. {core_framework-3.1.0 → core_framework-3.3.0}/core_framework/core/context.py +0 -0
  822. {core_framework-3.1.0 → core_framework-3.3.0}/core_framework/core/database.py +0 -0
  823. {core_framework-3.1.0 → core_framework-3.3.0}/core_framework/core/exception_handlers/__init__.py +0 -0
  824. {core_framework-3.1.0 → core_framework-3.3.0}/core_framework/core/exceptions.py +0 -0
  825. {core_framework-3.1.0 → core_framework-3.3.0}/core_framework/core/firebase.py +0 -0
  826. {core_framework-3.1.0 → core_framework-3.3.0}/core_framework/core/http_client.py +0 -0
  827. {core_framework-3.1.0 → core_framework-3.3.0}/core_framework/core/http_probes.py +0 -0
  828. {core_framework-3.1.0 → core_framework-3.3.0}/core_framework/core/logging.py +0 -0
  829. {core_framework-3.1.0 → core_framework-3.3.0}/core_framework/core/observability.py +0 -0
  830. {core_framework-3.1.0 → core_framework-3.3.0}/core_framework/core/redis.py +0 -0
  831. {core_framework-3.1.0 → core_framework-3.3.0}/core_framework/core/runtime.py +0 -0
  832. {core_framework-3.1.0 → core_framework-3.3.0}/core_framework/domains/__init__.py +0 -0
  833. {core_framework-3.1.0 → core_framework-3.3.0}/core_framework/domains/analytics/README.md +0 -0
  834. {core_framework-3.1.0 → core_framework-3.3.0}/core_framework/domains/analytics/__init__.py +0 -0
  835. {core_framework-3.1.0 → core_framework-3.3.0}/core_framework/domains/analytics/constants.py +0 -0
  836. {core_framework-3.1.0 → core_framework-3.3.0}/core_framework/domains/analytics/dependencies.py +0 -0
  837. {core_framework-3.1.0 → core_framework-3.3.0}/core_framework/domains/analytics/exceptions.py +0 -0
  838. {core_framework-3.1.0 → core_framework-3.3.0}/core_framework/domains/analytics/models.py +0 -0
  839. {core_framework-3.1.0 → core_framework-3.3.0}/core_framework/domains/analytics/ports/__init__.py +0 -0
  840. {core_framework-3.1.0 → core_framework-3.3.0}/core_framework/domains/analytics/ports/activity_source.py +0 -0
  841. {core_framework-3.1.0 → core_framework-3.3.0}/core_framework/domains/analytics/repository.py +0 -0
  842. {core_framework-3.1.0 → core_framework-3.3.0}/core_framework/domains/auth/dependencies.py +0 -0
  843. {core_framework-3.1.0 → core_framework-3.3.0}/core_framework/domains/auth/exceptions.py +0 -0
  844. {core_framework-3.1.0 → core_framework-3.3.0}/core_framework/domains/auth/models.py +0 -0
  845. {core_framework-3.1.0 → core_framework-3.3.0}/core_framework/domains/auth/ports/__init__.py +0 -0
  846. {core_framework-3.1.0 → core_framework-3.3.0}/core_framework/domains/comment/__init__.py +0 -0
  847. {core_framework-3.1.0 → core_framework-3.3.0}/core_framework/domains/comment/dependencies.py +0 -0
  848. {core_framework-3.1.0 → core_framework-3.3.0}/core_framework/domains/comment/enums.py +0 -0
  849. {core_framework-3.1.0 → core_framework-3.3.0}/core_framework/domains/comment/outcomes.py +0 -0
  850. {core_framework-3.1.0 → core_framework-3.3.0}/core_framework/domains/exceptions.py +0 -0
  851. {core_framework-3.1.0 → core_framework-3.3.0}/core_framework/domains/media/attachment/__init__.py +0 -0
  852. {core_framework-3.1.0 → core_framework-3.3.0}/core_framework/domains/media/attachment/components/__init__.py +0 -0
  853. {core_framework-3.1.0 → core_framework-3.3.0}/core_framework/domains/media/attachment/components/finals_publisher.py +0 -0
  854. {core_framework-3.1.0 → core_framework-3.3.0}/core_framework/domains/media/attachment/exceptions.py +0 -0
  855. {core_framework-3.1.0 → core_framework-3.3.0}/core_framework/domains/media/attachment/ports/__init__.py +0 -0
  856. {core_framework-3.1.0 → core_framework-3.3.0}/core_framework/domains/media/attachment/ports/finals_publisher.py +0 -0
  857. {core_framework-3.1.0 → core_framework-3.3.0}/core_framework/domains/media/attachment/ports/staging.py +0 -0
  858. {core_framework-3.1.0 → core_framework-3.3.0}/core_framework/domains/media/avatar/__init__.py +0 -0
  859. {core_framework-3.1.0 → core_framework-3.3.0}/core_framework/domains/media/avatar/components/__init__.py +0 -0
  860. {core_framework-3.1.0 → core_framework-3.3.0}/core_framework/domains/media/avatar/components/finals_publisher.py +0 -0
  861. {core_framework-3.1.0 → core_framework-3.3.0}/core_framework/domains/media/avatar/components/staging.py +0 -0
  862. {core_framework-3.1.0 → core_framework-3.3.0}/core_framework/domains/media/avatar/constants.py +0 -0
  863. {core_framework-3.1.0 → core_framework-3.3.0}/core_framework/domains/media/avatar/exceptions.py +0 -0
  864. {core_framework-3.1.0 → core_framework-3.3.0}/core_framework/domains/media/avatar/models.py +0 -0
  865. {core_framework-3.1.0 → core_framework-3.3.0}/core_framework/domains/media/avatar/ports/__init__.py +0 -0
  866. {core_framework-3.1.0 → core_framework-3.3.0}/core_framework/domains/media/avatar/ports/finals_publisher.py +0 -0
  867. {core_framework-3.1.0 → core_framework-3.3.0}/core_framework/domains/media/avatar/ports/staging.py +0 -0
  868. {core_framework-3.1.0 → core_framework-3.3.0}/core_framework/domains/media/banner/__init__.py +0 -0
  869. {core_framework-3.1.0 → core_framework-3.3.0}/core_framework/domains/media/banner/components/__init__.py +0 -0
  870. {core_framework-3.1.0 → core_framework-3.3.0}/core_framework/domains/media/banner/components/finals_publisher.py +0 -0
  871. {core_framework-3.1.0 → core_framework-3.3.0}/core_framework/domains/media/banner/components/staging.py +0 -0
  872. {core_framework-3.1.0 → core_framework-3.3.0}/core_framework/domains/media/banner/constants.py +0 -0
  873. {core_framework-3.1.0 → core_framework-3.3.0}/core_framework/domains/media/banner/exceptions.py +0 -0
  874. {core_framework-3.1.0 → core_framework-3.3.0}/core_framework/domains/media/banner/models.py +0 -0
  875. {core_framework-3.1.0 → core_framework-3.3.0}/core_framework/domains/media/banner/ports/__init__.py +0 -0
  876. {core_framework-3.1.0 → core_framework-3.3.0}/core_framework/domains/media/banner/ports/finals_publisher.py +0 -0
  877. {core_framework-3.1.0 → core_framework-3.3.0}/core_framework/domains/media/banner/ports/staging.py +0 -0
  878. {core_framework-3.1.0 → core_framework-3.3.0}/core_framework/domains/media/shared/__init__.py +0 -0
  879. {core_framework-3.1.0 → core_framework-3.3.0}/core_framework/domains/media/shared/exceptions.py +0 -0
  880. {core_framework-3.1.0 → core_framework-3.3.0}/core_framework/domains/media/shared/utils.py +0 -0
  881. {core_framework-3.1.0 → core_framework-3.3.0}/core_framework/domains/moderation/__init__.py +0 -0
  882. {core_framework-3.1.0 → core_framework-3.3.0}/core_framework/domains/moderation/enums.py +0 -0
  883. {core_framework-3.1.0 → core_framework-3.3.0}/core_framework/domains/moderation/exceptions.py +0 -0
  884. {core_framework-3.1.0 → core_framework-3.3.0}/core_framework/domains/moderation/models.py +0 -0
  885. {core_framework-3.1.0 → core_framework-3.3.0}/core_framework/domains/moderation/outcomes.py +0 -0
  886. {core_framework-3.1.0 → core_framework-3.3.0}/core_framework/domains/notification/__init__.py +0 -0
  887. {core_framework-3.1.0 → core_framework-3.3.0}/core_framework/domains/notification/dependencies.py +0 -0
  888. {core_framework-3.1.0 → core_framework-3.3.0}/core_framework/domains/notification/enums.py +0 -0
  889. {core_framework-3.1.0 → core_framework-3.3.0}/core_framework/domains/notification/exceptions.py +0 -0
  890. {core_framework-3.1.0 → core_framework-3.3.0}/core_framework/domains/notification/models.py +0 -0
  891. {core_framework-3.1.0 → core_framework-3.3.0}/core_framework/domains/outbox/__init__.py +0 -0
  892. {core_framework-3.1.0 → core_framework-3.3.0}/core_framework/domains/outbox/dependencies.py +0 -0
  893. {core_framework-3.1.0 → core_framework-3.3.0}/core_framework/domains/outbox/exceptions.py +0 -0
  894. {core_framework-3.1.0 → core_framework-3.3.0}/core_framework/domains/outbox/models.py +0 -0
  895. {core_framework-3.1.0 → core_framework-3.3.0}/core_framework/domains/outbox/ports/__init__.py +0 -0
  896. {core_framework-3.1.0 → core_framework-3.3.0}/core_framework/domains/outbox/ports/consumer.py +0 -0
  897. {core_framework-3.1.0 → core_framework-3.3.0}/core_framework/domains/outbox/ports/producer.py +0 -0
  898. {core_framework-3.1.0 → core_framework-3.3.0}/core_framework/domains/post/__init__.py +0 -0
  899. {core_framework-3.1.0 → core_framework-3.3.0}/core_framework/domains/post/dependencies.py +0 -0
  900. {core_framework-3.1.0 → core_framework-3.3.0}/core_framework/domains/post/enums.py +0 -0
  901. {core_framework-3.1.0 → core_framework-3.3.0}/core_framework/domains/post/outcomes.py +0 -0
  902. {core_framework-3.1.0 → core_framework-3.3.0}/core_framework/domains/repository_sql.py +0 -0
  903. {core_framework-3.1.0 → core_framework-3.3.0}/core_framework/domains/user/constants.py +0 -0
  904. {core_framework-3.1.0 → core_framework-3.3.0}/core_framework/domains/user/enums.py +0 -0
  905. {core_framework-3.1.0 → core_framework-3.3.0}/core_framework/domains/user/exceptions.py +0 -0
  906. {core_framework-3.1.0 → core_framework-3.3.0}/core_framework/domains/user/utils.py +0 -0
  907. {core_framework-3.1.0 → core_framework-3.3.0}/core_framework/domains/utils.py +0 -0
  908. {core_framework-3.1.0 → core_framework-3.3.0}/core_framework/infrastructure/__init__.py +0 -0
  909. {core_framework-3.1.0 → core_framework-3.3.0}/core_framework/infrastructure/firebase/__init__.py +0 -0
  910. {core_framework-3.1.0 → core_framework-3.3.0}/core_framework/infrastructure/media/__init__.py +0 -0
  911. {core_framework-3.1.0 → core_framework-3.3.0}/core_framework/infrastructure/media/local_attachment_staging_adapter.py +0 -0
  912. {core_framework-3.1.0 → core_framework-3.3.0}/core_framework/infrastructure/media/local_avatar_staging_adapter.py +0 -0
  913. {core_framework-3.1.0 → core_framework-3.3.0}/core_framework/infrastructure/media/local_banner_staging_adapter.py +0 -0
  914. {core_framework-3.1.0 → core_framework-3.3.0}/core_framework/infrastructure/media/pillow_staging_image.py +0 -0
  915. {core_framework-3.1.0 → core_framework-3.3.0}/core_framework/infrastructure/media/ssh_attachment_finals_publisher_adapter.py +0 -0
  916. {core_framework-3.1.0 → core_framework-3.3.0}/core_framework/infrastructure/media/ssh_banner_finals_publisher_adapter.py +0 -0
  917. {core_framework-3.1.0 → core_framework-3.3.0}/core_framework/infrastructure/media/ssh_finals_publisher_adapter.py +0 -0
  918. {core_framework-3.1.0 → core_framework-3.3.0}/core_framework/infrastructure/media/staging_paths.py +0 -0
  919. {core_framework-3.1.0 → core_framework-3.3.0}/core_framework/infrastructure/outbox/__init__.py +0 -0
  920. {core_framework-3.1.0 → core_framework-3.3.0}/core_framework/infrastructure/outbox/outbox_consumer_adapter.py +0 -0
  921. {core_framework-3.1.0 → core_framework-3.3.0}/core_framework/infrastructure/outbox/outbox_producer_adapter.py +0 -0
  922. {core_framework-3.1.0 → core_framework-3.3.0}/core_framework/main.py +0 -0
  923. {core_framework-3.1.0 → core_framework-3.3.0}/core_framework/migrate_cli.py +0 -0
  924. {core_framework-3.1.0 → core_framework-3.3.0}/core_framework/py.typed +0 -0
  925. {core_framework-3.1.0 → core_framework-3.3.0}/core_framework/testing/__init__.py +0 -0
  926. {core_framework-3.1.0 → core_framework-3.3.0}/core_framework/testing/config.py +0 -0
  927. {core_framework-3.1.0 → core_framework-3.3.0}/core_framework/testing/containers.py +0 -0
  928. {core_framework-3.1.0 → core_framework-3.3.0}/core_framework/testing/firebase.py +0 -0
  929. {core_framework-3.1.0 → core_framework-3.3.0}/core_framework/testing/firebase_identity_toolkit.py +0 -0
  930. {core_framework-3.1.0 → core_framework-3.3.0}/core_framework/testing/hookspecs.py +0 -0
  931. {core_framework-3.1.0 → core_framework-3.3.0}/core_framework/testing/httpx_test_client.py +0 -0
  932. {core_framework-3.1.0 → core_framework-3.3.0}/core_framework/testing/media.py +0 -0
  933. {core_framework-3.1.0 → core_framework-3.3.0}/core_framework/testing/migrations.py +0 -0
  934. {core_framework-3.1.0 → core_framework-3.3.0}/core_framework/testing/plugin.py +0 -0
  935. {core_framework-3.1.0 → core_framework-3.3.0}/core_framework/worker/__init__.py +0 -0
  936. {core_framework-3.1.0 → core_framework-3.3.0}/core_framework/worker/schedules/__init__.py +0 -0
  937. {core_framework-3.1.0 → core_framework-3.3.0}/core_framework/worker/schedules/analytics_refresh_cron.py +0 -0
  938. {core_framework-3.1.0 → core_framework-3.3.0}/core_framework/worker/schedules/schedule_aggregate_comment_stats.py +0 -0
  939. {core_framework-3.1.0 → core_framework-3.3.0}/core_framework/worker/schedules/schedule_aggregate_post_stats.py +0 -0
  940. {core_framework-3.1.0 → core_framework-3.3.0}/core_framework/worker/schedules/schedule_aggregate_user_stats.py +0 -0
  941. {core_framework-3.1.0 → core_framework-3.3.0}/core_framework/worker/schedules/schedule_expired_account_deletions.py +0 -0
  942. {core_framework-3.1.0 → core_framework-3.3.0}/core_framework/worker/schedules/schedule_poll_outbox.py +0 -0
  943. {core_framework-3.1.0 → core_framework-3.3.0}/core_framework/worker/schedules/schedule_prune_analytics_daily_facts.py +0 -0
  944. {core_framework-3.1.0 → core_framework-3.3.0}/core_framework/worker/schedules/schedule_prune_post_views.py +0 -0
  945. {core_framework-3.1.0 → core_framework-3.3.0}/core_framework/worker/schedules/schedule_prune_read_notifications.py +0 -0
  946. {core_framework-3.1.0 → core_framework-3.3.0}/core_framework/worker/schedules/schedule_purge_expired_create_idempotency_keys.py +0 -0
  947. {core_framework-3.1.0 → core_framework-3.3.0}/core_framework/worker/schedules/schedule_refresh_analytics.py +0 -0
  948. {core_framework-3.1.0 → core_framework-3.3.0}/core_framework/worker/schedules/schedule_sweep_stale_attachment_staging.py +0 -0
  949. {core_framework-3.1.0 → core_framework-3.3.0}/core_framework/worker/schedules/schedule_sweep_stale_avatar_staging.py +0 -0
  950. {core_framework-3.1.0 → core_framework-3.3.0}/core_framework/worker/schedules/schedule_sweep_stale_banner_staging.py +0 -0
  951. {core_framework-3.1.0 → core_framework-3.3.0}/core_framework/worker/tasks/delete_attachment_finals.py +0 -0
  952. {core_framework-3.1.0 → core_framework-3.3.0}/core_framework/worker/tasks/delete_superseded_avatar_finals.py +0 -0
  953. {core_framework-3.1.0 → core_framework-3.3.0}/core_framework/worker/tasks/delete_superseded_banner_finals.py +0 -0
  954. {core_framework-3.1.0 → core_framework-3.3.0}/core_framework/worker/tasks/process_admin_user_deletion.py +0 -0
  955. {core_framework-3.1.0 → core_framework-3.3.0}/core_framework/worker/tasks/process_aggregate_comment_stats.py +0 -0
  956. {core_framework-3.1.0 → core_framework-3.3.0}/core_framework/worker/tasks/process_aggregate_post_stats.py +0 -0
  957. {core_framework-3.1.0 → core_framework-3.3.0}/core_framework/worker/tasks/process_aggregate_user_stats.py +0 -0
  958. {core_framework-3.1.0 → core_framework-3.3.0}/core_framework/worker/tasks/process_mute_lift.py +0 -0
  959. {core_framework-3.1.0 → core_framework-3.3.0}/core_framework/worker/tasks/process_outbox_row.py +0 -0
  960. {core_framework-3.1.0 → core_framework-3.3.0}/core_framework/worker/tasks/process_refresh_analytics_bucket.py +0 -0
  961. {core_framework-3.1.0 → core_framework-3.3.0}/core_framework/worker/worker_context.py +0 -0
  962. {core_framework-3.1.0 → core_framework-3.3.0}/deploy/README.md +0 -0
  963. {core_framework-3.1.0 → core_framework-3.3.0}/deploy/app/docker-compose.dev.yaml +0 -0
  964. {core_framework-3.1.0 → core_framework-3.3.0}/deploy/app/dockerfile +0 -0
  965. {core_framework-3.1.0 → core_framework-3.3.0}/deploy/observability/.env.example +0 -0
  966. {core_framework-3.1.0 → core_framework-3.3.0}/deploy/observability/README.md +0 -0
  967. {core_framework-3.1.0 → core_framework-3.3.0}/deploy/observability/docker-compose.yml +0 -0
  968. {core_framework-3.1.0 → core_framework-3.3.0}/deploy/observability/grafana/dashboards/application/api-http.json +0 -0
  969. {core_framework-3.1.0 → core_framework-3.3.0}/deploy/observability/grafana/dashboards/application/worker-jobs.json +0 -0
  970. {core_framework-3.1.0 → core_framework-3.3.0}/deploy/observability/grafana/dashboards/infrastructure/node-exporter.json +0 -0
  971. {core_framework-3.1.0 → core_framework-3.3.0}/deploy/observability/grafana/dashboards/infrastructure/postgres-exporter.json +0 -0
  972. {core_framework-3.1.0 → core_framework-3.3.0}/deploy/observability/grafana/dashboards/infrastructure/redis-exporter.json +0 -0
  973. {core_framework-3.1.0 → core_framework-3.3.0}/deploy/observability/grafana/provisioning/dashboards/dashboards.yml +0 -0
  974. {core_framework-3.1.0 → core_framework-3.3.0}/deploy/observability/grafana/provisioning/datasources/datasources.yml +0 -0
  975. {core_framework-3.1.0 → core_framework-3.3.0}/deploy/observability/loki.yaml +0 -0
  976. {core_framework-3.1.0 → core_framework-3.3.0}/deploy/observability/otel-collector-config.yaml +0 -0
  977. {core_framework-3.1.0 → core_framework-3.3.0}/deploy/observability/prometheus.yml +0 -0
  978. {core_framework-3.1.0 → core_framework-3.3.0}/deploy/observability/targets/node/.gitkeep +0 -0
  979. {core_framework-3.1.0 → core_framework-3.3.0}/deploy/observability/targets/postgres/.gitkeep +0 -0
  980. {core_framework-3.1.0 → core_framework-3.3.0}/deploy/observability/targets/redis/.gitkeep +0 -0
  981. {core_framework-3.1.0 → core_framework-3.3.0}/deploy/observability/targets.example/README.md +0 -0
  982. {core_framework-3.1.0 → core_framework-3.3.0}/deploy/observability/targets.example/node.yml.example +0 -0
  983. {core_framework-3.1.0 → core_framework-3.3.0}/deploy/observability/targets.example/postgres.yml.example +0 -0
  984. {core_framework-3.1.0 → core_framework-3.3.0}/deploy/observability/targets.example/redis.yml.example +0 -0
  985. {core_framework-3.1.0 → core_framework-3.3.0}/deploy/observability/tempo.yaml +0 -0
  986. {core_framework-3.1.0 → core_framework-3.3.0}/docs/README.md +0 -0
  987. {core_framework-3.1.0 → core_framework-3.3.0}/docs/deployments/README.md +0 -0
  988. {core_framework-3.1.0 → core_framework-3.3.0}/docs/deployments/edge-upload-limits.md +0 -0
  989. {core_framework-3.1.0 → core_framework-3.3.0}/docs/deployments/examples/Caddyfile.example +0 -0
  990. {core_framework-3.1.0 → core_framework-3.3.0}/docs/deployments/examples/Caddyfile.observability.example +0 -0
  991. {core_framework-3.1.0 → core_framework-3.3.0}/docs/deployments/examples/image-server-known-hosts.example +0 -0
  992. {core_framework-3.1.0 → core_framework-3.3.0}/docs/deployments/guides/playbook/postgres-backup-playbook.md +0 -0
  993. {core_framework-3.1.0 → core_framework-3.3.0}/docs/deployments/guides/playbook/py-spy-playbook.md +0 -0
  994. {core_framework-3.1.0 → core_framework-3.3.0}/docs/deployments/guides/setup/app-server-deploy-ssh.md +0 -0
  995. {core_framework-3.1.0 → core_framework-3.3.0}/docs/deployments/guides/setup/caddy-setup.md +0 -0
  996. {core_framework-3.1.0 → core_framework-3.3.0}/docs/deployments/guides/setup/image-server-ssh.md +0 -0
  997. {core_framework-3.1.0 → core_framework-3.3.0}/docs/deployments/guides/setup/postgres-backup-setup.md +0 -0
  998. {core_framework-3.1.0 → core_framework-3.3.0}/docs/deployments/guides/setup/postgres-setup.md +0 -0
  999. {core_framework-3.1.0 → core_framework-3.3.0}/docs/deployments/guides/setup/py-spy-setup.md +0 -0
  1000. {core_framework-3.1.0 → core_framework-3.3.0}/docs/deployments/guides/setup/redis-setup.md +0 -0
  1001. {core_framework-3.1.0 → core_framework-3.3.0}/docs/deployments/guides/setup/ubuntu-server-setup.md +0 -0
  1002. {core_framework-3.1.0 → core_framework-3.3.0}/docs/deployments/postgres-backup-design.md +0 -0
  1003. {core_framework-3.1.0 → core_framework-3.3.0}/docs/design/utm-events-design.md +0 -0
  1004. {core_framework-3.1.0 → core_framework-3.3.0}/docs/domains/analytics/admin_analytics_reads.md +0 -0
  1005. {core_framework-3.1.0 → core_framework-3.3.0}/docs/domains/comments/README.md +0 -0
  1006. {core_framework-3.1.0 → core_framework-3.3.0}/docs/domains/comments/delete_comment.md +0 -0
  1007. {core_framework-3.1.0 → core_framework-3.3.0}/docs/domains/comments/retrieve_comments.md +0 -0
  1008. {core_framework-3.1.0 → core_framework-3.3.0}/docs/domains/deletion/overview.md +0 -0
  1009. {core_framework-3.1.0 → core_framework-3.3.0}/docs/domains/media/README.md +0 -0
  1010. {core_framework-3.1.0 → core_framework-3.3.0}/docs/domains/media/banner-upload-design.md +0 -0
  1011. {core_framework-3.1.0 → core_framework-3.3.0}/docs/domains/moderation/README.md +0 -0
  1012. {core_framework-3.1.0 → core_framework-3.3.0}/docs/domains/posts/README.md +0 -0
  1013. {core_framework-3.1.0 → core_framework-3.3.0}/docs/domains/posts/delete_post.md +0 -0
  1014. {core_framework-3.1.0 → core_framework-3.3.0}/docs/domains/posts/hashtag_discovery.md +0 -0
  1015. {core_framework-3.1.0 → core_framework-3.3.0}/docs/domains/posts/post_visibility.md +0 -0
  1016. {core_framework-3.1.0 → core_framework-3.3.0}/docs/domains/posts/retrieve_posts.md +0 -0
  1017. {core_framework-3.1.0 → core_framework-3.3.0}/docs/domains/users/my_posts_and_comments.md +0 -0
  1018. {core_framework-3.1.0 → core_framework-3.3.0}/docs/domains/users/user_removal.md +0 -0
  1019. {core_framework-3.1.0 → core_framework-3.3.0}/docs/library/README.md +0 -0
  1020. {core_framework-3.1.0 → core_framework-3.3.0}/docs/library/api.md +0 -0
  1021. {core_framework-3.1.0 → core_framework-3.3.0}/docs/platform/README.md +0 -0
  1022. {core_framework-3.1.0 → core_framework-3.3.0}/docs/platform/database-triggers.md +0 -0
  1023. {core_framework-3.1.0 → core_framework-3.3.0}/docs/platform/layers-and-boundaries.md +0 -0
  1024. {core_framework-3.1.0 → core_framework-3.3.0}/docs/reviews/README.md +0 -0
  1025. {core_framework-3.1.0 → core_framework-3.3.0}/firebase_config.example.json +0 -0
  1026. {core_framework-3.1.0 → core_framework-3.3.0}/makefile +0 -0
  1027. {core_framework-3.1.0 → core_framework-3.3.0}/tests/__init__.py +0 -0
  1028. {core_framework-3.1.0 → core_framework-3.3.0}/tests/e2e/_auth.py +0 -0
  1029. {core_framework-3.1.0 → core_framework-3.3.0}/tests/e2e/_canaries.py +0 -0
  1030. {core_framework-3.1.0 → core_framework-3.3.0}/tests/e2e/_media.py +0 -0
  1031. {core_framework-3.1.0 → core_framework-3.3.0}/tests/e2e/_settings.py +0 -0
  1032. {core_framework-3.1.0 → core_framework-3.3.0}/tests/e2e/_upload_payloads.py +0 -0
  1033. {core_framework-3.1.0 → core_framework-3.3.0}/tests/e2e/conftest.py +0 -0
  1034. {core_framework-3.1.0 → core_framework-3.3.0}/tests/e2e/media/pipeline_test.py +0 -0
  1035. {core_framework-3.1.0 → core_framework-3.3.0}/tests/e2e/smoke/canary_test.py +0 -0
  1036. {core_framework-3.1.0 → core_framework-3.3.0}/tests/e2e/smoke/media_test.py +0 -0
  1037. {core_framework-3.1.0 → core_framework-3.3.0}/tests/e2e/smoke/system_test.py +0 -0
  1038. {core_framework-3.1.0 → core_framework-3.3.0}/tests/e2e/smoke/tls_host_test.py +0 -0
  1039. {core_framework-3.1.0 → core_framework-3.3.0}/tests/integration/__init__.py +0 -0
  1040. {core_framework-3.1.0 → core_framework-3.3.0}/tests/integration/analytics/_helpers.py +0 -0
  1041. {core_framework-3.1.0 → core_framework-3.3.0}/tests/integration/api/__init__.py +0 -0
  1042. {core_framework-3.1.0 → core_framework-3.3.0}/tests/integration/api/_outbox_helpers.py +0 -0
  1043. {core_framework-3.1.0 → core_framework-3.3.0}/tests/integration/api/admin/__init__.py +0 -0
  1044. {core_framework-3.1.0 → core_framework-3.3.0}/tests/integration/api/admin/analytics/__init__.py +0 -0
  1045. {core_framework-3.1.0 → core_framework-3.3.0}/tests/integration/api/admin/cache/__init__.py +0 -0
  1046. {core_framework-3.1.0 → core_framework-3.3.0}/tests/integration/api/admin/comments/__init__.py +0 -0
  1047. {core_framework-3.1.0 → core_framework-3.3.0}/tests/integration/api/admin/moderation/__init__.py +0 -0
  1048. {core_framework-3.1.0 → core_framework-3.3.0}/tests/integration/api/admin/outbox/__init__.py +0 -0
  1049. {core_framework-3.1.0 → core_framework-3.3.0}/tests/integration/api/admin/posts/__init__.py +0 -0
  1050. {core_framework-3.1.0 → core_framework-3.3.0}/tests/integration/api/admin/users/__init__.py +0 -0
  1051. {core_framework-3.1.0 → core_framework-3.3.0}/tests/integration/api/auth/__init__.py +0 -0
  1052. {core_framework-3.1.0 → core_framework-3.3.0}/tests/integration/api/comments/__init__.py +0 -0
  1053. {core_framework-3.1.0 → core_framework-3.3.0}/tests/integration/api/comments/authenticated/__init__.py +0 -0
  1054. {core_framework-3.1.0 → core_framework-3.3.0}/tests/integration/api/comments/authenticated/comment_writes_integration_test.py +0 -0
  1055. {core_framework-3.1.0 → core_framework-3.3.0}/tests/integration/api/comments/public/__init__.py +0 -0
  1056. {core_framework-3.1.0 → core_framework-3.3.0}/tests/integration/api/create_idempotency_integration_test.py +0 -0
  1057. {core_framework-3.1.0 → core_framework-3.3.0}/tests/integration/api/media/ingest_contract_test.py +0 -0
  1058. {core_framework-3.1.0 → core_framework-3.3.0}/tests/integration/api/mentions/mentions_integration_test.py +0 -0
  1059. {core_framework-3.1.0 → core_framework-3.3.0}/tests/integration/api/notifications/__init__.py +0 -0
  1060. {core_framework-3.1.0 → core_framework-3.3.0}/tests/integration/api/posts/__init__.py +0 -0
  1061. {core_framework-3.1.0 → core_framework-3.3.0}/tests/integration/api/posts/comment_count_aggregation_test.py +0 -0
  1062. {core_framework-3.1.0 → core_framework-3.3.0}/tests/integration/api/posts/public/__init__.py +0 -0
  1063. {core_framework-3.1.0 → core_framework-3.3.0}/tests/integration/api/public_read_by_id_unavailable_detail_test.py +0 -0
  1064. {core_framework-3.1.0 → core_framework-3.3.0}/tests/integration/api/system/__init__.py +0 -0
  1065. {core_framework-3.1.0 → core_framework-3.3.0}/tests/integration/api/system/router_test.py +0 -0
  1066. {core_framework-3.1.0 → core_framework-3.3.0}/tests/integration/api/users/__init__.py +0 -0
  1067. {core_framework-3.1.0 → core_framework-3.3.0}/tests/integration/api/users/authenticated/__init__.py +0 -0
  1068. {core_framework-3.1.0 → core_framework-3.3.0}/tests/integration/api/users/public/__init__.py +0 -0
  1069. {core_framework-3.1.0 → core_framework-3.3.0}/tests/integration/api/users/user_deletion_integration_test.py +0 -0
  1070. {core_framework-3.1.0 → core_framework-3.3.0}/tests/integration/worker/__init__.py +0 -0
  1071. {core_framework-3.1.0 → core_framework-3.3.0}/tests/integration/worker/analytics_prune_test.py +0 -0
  1072. {core_framework-3.1.0 → core_framework-3.3.0}/tests/integration/worker/attachment_upload_test.py +0 -0
  1073. {core_framework-3.1.0 → core_framework-3.3.0}/tests/integration/worker/read_notifications_retention_test.py +0 -0
  1074. {core_framework-3.1.0 → core_framework-3.3.0}/tests/integration/worker/stale_staging_sweep_test.py +0 -0
  1075. {core_framework-3.1.0 → core_framework-3.3.0}/tests/unit/__init__.py +0 -0
  1076. {core_framework-3.1.0 → core_framework-3.3.0}/tests/unit/api/comments/authenticated/comment_request_schemas_test.py +0 -0
  1077. {core_framework-3.1.0 → core_framework-3.3.0}/tests/unit/api/dedupe_preserving_order_test.py +0 -0
  1078. {core_framework-3.1.0 → core_framework-3.3.0}/tests/unit/api/posts/authenticated/post_update_mapper_test.py +0 -0
  1079. {core_framework-3.1.0 → core_framework-3.3.0}/tests/unit/application/comments/__init__.py +0 -0
  1080. {core_framework-3.1.0 → core_framework-3.3.0}/tests/unit/application/events/event_service_test.py +0 -0
  1081. {core_framework-3.1.0 → core_framework-3.3.0}/tests/unit/application/notifications/inbox_service_test.py +0 -0
  1082. {core_framework-3.1.0 → core_framework-3.3.0}/tests/unit/application/shared/request_context_test.py +0 -0
  1083. {core_framework-3.1.0 → core_framework-3.3.0}/tests/unit/application/users/deletion_audit_test.py +0 -0
  1084. {core_framework-3.1.0 → core_framework-3.3.0}/tests/unit/core/bundled_alembic_test.py +0 -0
  1085. {core_framework-3.1.0 → core_framework-3.3.0}/tests/unit/core/migrate_cli_test.py +0 -0
  1086. {core_framework-3.1.0 → core_framework-3.3.0}/tests/unit/docs/_api_reference.py +0 -0
  1087. {core_framework-3.1.0 → core_framework-3.3.0}/tests/unit/docs/api_routes_test.py +0 -0
  1088. {core_framework-3.1.0 → core_framework-3.3.0}/tests/unit/domains/__init__.py +0 -0
  1089. {core_framework-3.1.0 → core_framework-3.3.0}/tests/unit/domains/comment/__init__.py +0 -0
  1090. {core_framework-3.1.0 → core_framework-3.3.0}/tests/unit/domains/post/models_test.py +0 -0
  1091. {core_framework-3.1.0 → core_framework-3.3.0}/tests/unit/domains/user/service_test.py +0 -0
  1092. {core_framework-3.1.0 → core_framework-3.3.0}/tests/unit/infrastructure/__init__.py +0 -0
  1093. {core_framework-3.1.0 → core_framework-3.3.0}/tests/unit/infrastructure/media/__init__.py +0 -0
  1094. {core_framework-3.1.0 → core_framework-3.3.0}/tests/unit/infrastructure/media/ssh_finals_publisher_adapter_test.py +0 -0
@@ -0,0 +1,61 @@
1
+ ---
2
+ description: Alembic migrations — revision id format and index DDL conventions
3
+ globs: alembic/**/alembic/versions/*.py
4
+ alwaysApply: false
5
+ ---
6
+
7
+ # Alembic migrations
8
+
9
+ ## Revision IDs
10
+
11
+ `alembic_version.version_num` is a **32-character** string. Revision ids must stay well under that limit.
12
+
13
+ ### New revisions (required)
14
+
15
+ - Set `revision` to a **12-character lowercase hex** string (Alembic default), e.g. `a56bc6b7f799`.
16
+ - Generate with `python -c "import secrets; print(secrets.token_hex(6))"` or `alembic revision`.
17
+ - Put the human-readable slug in the **filename** and the module docstring `Revision ID:` line only if you mirror the hex id there — **do not** use descriptive slugs as `revision`.
18
+
19
+ ```python
20
+ # ✅ Preferred
21
+ """replace deleted post status with tombstone statuses
22
+
23
+ Revision ID: 120bf6be81eb
24
+ Revises: a56bc6b7f799
25
+ """
26
+
27
+ revision: str = "120bf6be81eb"
28
+ ```
29
+
30
+ ```python
31
+ # ❌ Avoid — long, wastes version_num budget, inconsistent with recent migrations
32
+ revision: str = "post_tombstone_status_model"
33
+ ```
34
+
35
+ ### Exceptions
36
+
37
+ - Collapsed **`v1_*_init`** baseline revisions keep their stable names (`v1_post_init`, etc.) — do not rename shipped baselines.
38
+ - **Legacy descriptive slug** revision ids (e.g. `post_add_post_mentions`, `user_add_date_of_birth`) stay as-is. Do not rewrite or collapse history just to convert them to hex. Do not re-flag them on B11 unless a deliberate baseline collapse is in progress.
39
+
40
+ ### Do not rename shipped revision ids
41
+
42
+ If a revision may already be applied in any environment, **do not** change its `revision` string. Add a forward migration instead.
43
+
44
+ ## Index DDL
45
+
46
+ ### New index migrations (required)
47
+
48
+ In **`upgrade()`**, create indexes with **`IF NOT EXISTS`** so migrations succeed when an index was already applied manually in production:
49
+
50
+ ```python
51
+ op.execute("""
52
+ create index if not exists idx_example_created_at
53
+ on example_table (created_at);
54
+ """)
55
+ ```
56
+
57
+ Use **`drop index if exists`** in **`downgrade()`**.
58
+
59
+ ### Do not retrofit index DDL
60
+
61
+ Do **not** edit shipped migrations only to add `if not exists` — those revisions may already be applied. New forward migrations follow this rule; legacy `create index` without `if not exists` stays as-is.
@@ -0,0 +1,44 @@
1
+ ---
2
+ description: Enforce importing from domain __init__.py in API/application layers
3
+ globs:
4
+ - core_framework/api/**/*.py
5
+ - core_framework/application/**/*.py
6
+ ---
7
+
8
+ # Domain imports
9
+
10
+ When importing from **`core_framework/domains/*`** in API or application code:
11
+
12
+ ## Allowed
13
+
14
+ - Public symbols from domain **`__init__.py`** (models, enums, constants, outcomes).
15
+ - Services from **`dependencies.py`** (e.g. **`user_service`**).
16
+
17
+ ## Prohibited
18
+
19
+ - Typed or base **domain exceptions** in API/application — use **`application.shared.exceptions`**. Full policy: **`error-boundary.mdc`**.
20
+ - Direct imports from internal modules (`models`, `enums`, `repository`, `service`, `exceptions`).
21
+
22
+ ```python
23
+ # ✅
24
+ from core_framework.domains.user import Profile, UserRole
25
+ from core_framework.domains.user.dependencies import user_service
26
+
27
+ # ❌
28
+ from core_framework.domains.post import PostUpdateNotFoundException
29
+ from core_framework.domains.user.models import Profile
30
+ ```
31
+
32
+ ## Export policy
33
+
34
+ Export from **`__init__.py`** only what outer layers need. Typed exceptions stay internal; export **only** **`BaseXxxException`** per domain for inheritance typing — not for per-domain HTTP handlers. **`DomainValidationError`** lives in **`domains/exceptions.py`** (core handler wiring only).
35
+
36
+ To see what a domain exports, check its **`__init__.py`** **`__all__`**.
37
+
38
+ ## After a domain call
39
+
40
+ 1. Return **`None`** or empty when the use case allows.
41
+ 2. Raise an **application** exception when HTTP must signal failure.
42
+ 3. Extend the domain service API to absorb typed exceptions internally.
43
+
44
+ Application code never imports repositories. Exception boundary: **`error-boundary.mdc`**.
@@ -0,0 +1,56 @@
1
+ ---
2
+ description: HTTP error boundaries — application vs domain exceptions, handlers, anti-enumeration
3
+ globs:
4
+ - core_framework/core/exception_handlers/**/*.py
5
+ - core_framework/application/**/*.py
6
+ - core_framework/api/**/router.py
7
+ - core_framework/api/**/schemas.py
8
+ - core_framework/domains/**/exceptions.py
9
+ ---
10
+
11
+ # Error boundary
12
+
13
+ Platform contract: **`docs/platform/client-error-visibility.md`**. Domain imports: **`domain-imports.mdc`**.
14
+
15
+ ## Layers
16
+
17
+ | Layer | Outward errors | HTTP |
18
+ |-------|----------------|------|
19
+ | **Application** | **`application.shared.exceptions`**, **`InvalidPageTokenError`** | Handlers map type → status + catalog **`detail`** |
20
+ | **API** | Pydantic; **`HTTPException`** for transport-local guards | **422** field errors; router-chosen status + **`detail`** |
21
+ | **Domain typed** | Internal — not imported by API/application | No typed handlers |
22
+ | **Domain `BaseXxxException`** | Handler catch-all only | **500** if leaked |
23
+
24
+ ## Application and domain
25
+
26
+ - Application **must not** import or raise typed domain exceptions. Signal via **`None`**, empty collections, or **`application.shared.exceptions`**.
27
+ - Typed domain exceptions inherit domain **`BaseXxxException`** → **`BaseDomainException`**. Export **only** **`BaseXxxException`** from domain **`__init__.py`**, not typed subclasses.
28
+ - **`DomainValidationError`** → dedicated **400** handler + **`GENERIC_BAD_REQUEST_DETAIL`**; do not put internal reason in HTTP **`detail`**.
29
+ - Leaked typed domain exception → **`BaseDomainException`** handler → **500** + **`GENERIC_INTERNAL_SERVER_ERROR_DETAIL`**.
30
+
31
+ ## Handler registration
32
+
33
+ - Use **`register_exception_handler`** from **`core_framework.core.exception_handlers.common`** — not raw **`app.add_exception_handler`** elsewhere.
34
+ - Register handlers in **`core_framework/core/exception_handlers/setup.py`** and **`application.py`**: application types (specific before any base), **`InvalidPageTokenError`**, cashews **`RateLimitError`** (**429**), **`DomainValidationError`**, one **`BaseDomainException`** leak handler, then **`Exception`** unmapped.
35
+ - No per-domain handler modules for typed exceptions. Handlers translate only — no business logic or repository calls.
36
+ - Do not log **error** for expected application 4xx; **`DomainValidationError`** at **warning**/**info**.
37
+
38
+ ## Catalog constants
39
+
40
+ **`GENERIC_BAD_REQUEST_DETAIL`** (400), **`GENERIC_NOT_FOUND_DETAIL`** (404), **`GENERIC_FORBIDDEN_DETAIL`** (403), **`GENERIC_CONFLICT_DETAIL`** (409), ingest 413/415, **`GENERIC_TOO_MANY_REQUESTS_DETAIL`** (429), **`GENERIC_SERVICE_UNAVAILABLE_DETAIL`** (503), **`GENERIC_INTERNAL_SERVER_ERROR_DETAIL`** (500).
41
+
42
+ ## Anti-enumeration (public routes)
43
+
44
+ - Read-by-id: missing / hidden / withheld → same status + **`GENERIC_NOT_FOUND_DETAIL`** where flow docs align.
45
+ - Idempotent writes on unknown ids → **204** without leaking existence. Empty list pages are OK.
46
+ - Admin/internal routes may differ when documented. Intentional existence-check endpoints are separate product surface.
47
+
48
+ ## Validation order
49
+
50
+ User-fixable input shape → API schemas (**422**) or router **`HTTPException`**. Use-case outcomes → application exceptions + handlers. Domain backstops → **`DomainValidationError`** → generic **400** (never domain text in **`detail`**).
51
+
52
+ ## Logging
53
+
54
+ Do not **`logger.error`** at every domain **`raise`**.
55
+
56
+ Apply to new handlers and touched raise sites unless the task scopes repo-wide migration.
@@ -0,0 +1,87 @@
1
+ ---
2
+ description: Domain repositories must not query other domains' Postgres schemas
3
+ globs:
4
+ - core_framework/domains/**/repository.py
5
+ alwaysApply: false
6
+ ---
7
+
8
+ # Repository schema isolation
9
+
10
+ Each domain repository may only read/write tables in **its own** Postgres schema.
11
+
12
+ Canonical rule: `docs/platform/layers-and-boundaries.md` — *no cross-domain schema reads, writes, joins, or foreign keys*.
13
+
14
+ ## Schema qualification
15
+
16
+ Repositories receive unquoted `schema` from `runtime.settings.postgres_schemas` in `dependencies.py` (keyword-only `__init__` arg). In `__init__`:
17
+
18
+ - `self.schema` — config schema name (e.g. `post`)
19
+ - `self.schema_sql` — `quote_postgres_identifier(schema)` for SQL interpolation
20
+
21
+ Use `{self.schema_sql}.table` in f-string SQL — not hard-coded `"post".` literals.
22
+
23
+ ## Allowed in a repository
24
+
25
+ - SQL qualified with that domain's schema only (e.g. `{self.schema_sql}.posts` in `PostRepository`).
26
+ - **Within-schema** policy gates (e.g. `insert_post_like` checks `{self.schema_sql}.posts.status = active`).
27
+ - **Lookup mirrors** in the same schema (`user_blocks_lookup`, `user_restrictions_lookup`, `user_followers_lookup`) — synced by application flows; mirrors are not authoritative.
28
+
29
+ ## Forbidden in a repository
30
+
31
+ - `FROM` / `JOIN` / `EXISTS` / `INSERT … SELECT` against another domain's schema.
32
+ - Importing another domain's `service`, `repository`, or models to enforce policy.
33
+
34
+ ```python
35
+ # ❌ moderation/repository.py — cross-domain EXISTS (illustrative schema literals)
36
+ insert into {moderation_schema_sql}.post_reports (...)
37
+ select $1, $2, $3, $4
38
+ where exists (
39
+ select 1 from {post_schema_sql}.posts
40
+ where id = $2 and status = 'active'
41
+ )
42
+
43
+ # ❌ notification/repository.py — cross-domain mute gate
44
+ insert into {notification_schema_sql}.notification_mutes (...)
45
+ select ...
46
+ where exists (select 1 from {comment_schema_sql}.comments where ...)
47
+ ```
48
+
49
+ ## Alembic migrations (different convention)
50
+
51
+ Do **not** apply repository schema-qualification rules to `alembic/**/versions/*.py`.
52
+
53
+ Each domain Alembic tree sets `search_path` to that domain's schema in `env.py`. Migration SQL uses **unqualified** table and type names (`posts`, `post_reports`, `create type post_status …`) — not `"post".posts`.
54
+
55
+ **Exception — PL/pgSQL trigger / function bodies:** Runtime `search_path` for functions is not the migration session’s path, so audit trigger bodies may **hard-code** that domain’s schema qualifier (e.g. `"user".user_change_history`, `moderation.restriction_history`). That is required and accepted. Keep `[postgres_schemas]` values aligned with those literals; do not treat this as a B11 isolation violation.
56
+
57
+ Cross-domain rules still apply to migrations:
58
+
59
+ - No `REFERENCES` / FKs to tables in another domain's schema.
60
+ - No DDL that reads or writes another domain's objects.
61
+
62
+ Stay within the migration tree's domain; one schema per Alembic env.
63
+
64
+ ## Where cross-domain policy belongs
65
+
66
+ **Application layer** (or domain service orchestration via dependencies, never cross-schema SQL):
67
+
68
+ ```python
69
+ # ✅ application/posts/authenticated_service.py
70
+ post = await post_deps.post_service.retrieve_post_with_metadata_by_id_if_exists(post_id=post_id)
71
+ if post is None or post.status != PostStatus.ACTIVE:
72
+ return False
73
+ return await moderation_deps.moderation_service.add_post_report(...)
74
+ ```
75
+
76
+ Before adding a repository write that depends on another domain's row state:
77
+
78
+ 1. Can the owning domain gate it within its schema? → do that (likes, views, stats dirty).
79
+ 2. Otherwise → gate in `application/**/*_service.py` via the owning domain's service API.
80
+
81
+ ## Self-check (repositories only)
82
+
83
+ In `domains/<name>/repository.py`:
84
+
85
+ - Every table/type qualifier in SQL must use `{self.schema_sql}.…` (that domain's schema only).
86
+ - Do not hard-code `"user".`, `"post".`, etc. — use `self.schema` / `self.schema_sql` from config.
87
+ - Mirror lookup tables (`user_blocks_lookup`, etc.) still live under `{self.schema_sql}` when they belong to that domain's schema.
@@ -0,0 +1,35 @@
1
+ ---
2
+ name: code-review
3
+ description: Review code for quality, architecture compliance, and best practices. Use when the user asks for a code review, audit, or review.
4
+ ---
5
+
6
+ # Code Review
7
+
8
+ ## Output format (required)
9
+
10
+ **Actionable findings only:**
11
+
12
+ - Bugs, wrong behavior, improvements, optimizations, doc/code contradictions, parallel implementation drift (sibling flows that diverge without documented reason).
13
+ - Prioritize by severity with file context and fix direction.
14
+ - **Do not** praise, summarize strengths, or pad with checklist pass narratives.
15
+ - One-line scope is fine. If nothing is wrong, say so in one sentence.
16
+
17
+ Do **not** flag documented accepted trade-offs in **`docs/platform/architecture-decisions.md`** unless the implementation violates them.
18
+
19
+ ## Workflow
20
+
21
+ 1. Read **`docs/platform/layers-and-boundaries.md`**, **`conventions.md`**, and **`architecture-decisions.md`** for the reviewed scope.
22
+ 1. Apply **scoped rules** (`.cursor/rules/*.mdc`) matching files under review — especially **`error-boundary`**, **`domain-imports`**, **`api-layer`**, **`application-layer`**, **`strong-reads`**.
23
+ 1. Report findings only — no filler.
24
+
25
+ ## Quick checks
26
+
27
+ - Application services: no HTTP types, no domain exceptions, no Pydantic return types, one-line docstrings.
28
+ - API: thin routers, validation in schemas, orchestration in application — **fastapi** skill (`.agents/skills/fastapi/`) + **`api-layer`** / **`api-validation`** / **`error-boundary`** rules.
29
+ - Domain: imports only via **`__init__.py`** / **`dependencies`** from outer layers; no caller-context names (**`domain-caller-context`**).
30
+ - Read-after-write refetches use **`*_strong`** where applicable.
31
+ - **Python modernity (constitution):** prefer current 3.14 syntax in reviewed code — PEP 695 type params over module-level `TypeVar`/`ParamSpec`; no unnecessary `from __future__ import annotations`; builtins / `X | Y` over legacy `typing` aliases; `asyncio.TaskGroup` over `gather`.
32
+
33
+ ## Parallel drift
34
+
35
+ Flag sibling modules with the same job but different structure (async layout, cleanup order, error/idempotency contracts) when docs do not explain the difference. Do **not** flag differences called out as intentional in design/flow docs or in **`docs/reviews/slices.md`** B7 **Do not flag** (for example root vs reply create-idempotency replay placement in **`docs/design/create-idempotency-design.md`**).
@@ -0,0 +1,60 @@
1
+ ---
2
+ name: sync-host-rules
3
+ description: Sync core-framework rules, skills, and platform docs to consuming host applications. Use when the user asks to sync rules to a host, bump core-framework in a host, upgrade a host dependency, or port shared cursor/docs content.
4
+ ---
5
+
6
+ # Sync Host Rules and Docs
7
+
8
+ Consuming applications embed **core-framework** as a dependency.
9
+
10
+ ## Default (core-framework work)
11
+
12
+ When changing **core-framework** code, migrations, tests, or **`docs/`**:
13
+
14
+ - **Do not** edit host repos in the same task.
15
+ - **Do not** port **`docs/platform/`**, **`docs/design/`**, **`docs/deployments/`**, **`.cursor/rules/`**, or **`.cursor/skills/`** to hosts proactively.
16
+ - Mention that host sync is **deferred until the host bumps its core-framework version** (unless the user asked otherwise).
17
+
18
+ ## When host changes are allowed
19
+
20
+ 1. User explicitly scopes work to a host repo.
21
+ 1. User explicitly asks to sync or upgrade the core dependency in a host.
22
+ 1. You are editing a host repo directly — follow that repo's rules.
23
+
24
+ ## Sync procedure
25
+
26
+ Diff by **basename** against the host's **`.cursor/`** and applicable **`docs/`** paths. Port shared content and **adapt**:
27
+
28
+ - globs: **`core_framework/**`** → host source tree where applicable
29
+ - imports: **`core_framework....`** → host package prefix
30
+ - strong reads: **`strong-reads`** → host equivalent rule if present
31
+
32
+ **Do not overwrite** host-only rules, skills, or product docs.
33
+
34
+ ### Transactional email (when the bumped core ships it)
35
+
36
+ Remind the host (via upgrade notes / playbook, not code changes here):
37
+
38
+ 1. Put **`register_email_content`** in the **same** shared host bootstrap helper API and worker already call — worker is load-bearing.
39
+ 1. Register branded renderers **before** **`EMAIL_ENABLED=true`** (core default deletion copy is generic English).
40
+ 1. Do **not** **`enqueue_transactional_email`** for **`account_deletion_scheduled`** unless the host re-implements gated checks — use the core gated task.
41
+
42
+ ### `docs/deployments/guides/` layout
43
+
44
+ Core walkthroughs live under **`docs/deployments/guides/setup/`** (one-time install) and **`docs/deployments/guides/playbook/`** (ops / incident runbooks) — not a flat **`guides/`** directory.
45
+
46
+ When syncing **`docs/deployments/`** to a host:
47
+
48
+ 1. **Match the directory layout** — create **`guides/setup/`** and **`guides/playbook/`** on the host; move or rewrite files into those paths. Do **not** leave stale flat **`guides/*.md`** copies beside the new tree.
49
+ 1. **Basename alone is not enough** — a host may still have **`guides/ubuntu-server-setup.md`** while core has **`guides/setup/ubuntu-server-setup.md`**. Diff by relative path under **`docs/deployments/`**, then port.
50
+ 1. **Renames** — e.g. **`postgres-backup-ops.md`** → **`guides/playbook/postgres-backup-playbook.md`**. Delete the old host path after porting.
51
+ 1. **Adapt host paths** in playbooks (Compose project dir, image names, **`app_configs/<host>/`**) — keep Henry-specific notes in host **`deploy-playbook.md`** / **`release-playbook.md`**.
52
+
53
+ ## Docs boundaries
54
+
55
+ **Core `docs/` must stay host-agnostic** — no references to specific consuming applications.
56
+
57
+ | Core path | Host behavior |
58
+ | ----------------------------------------------------------------- | ------------------------------------------------------------- |
59
+ | **`docs/platform/`**, **`docs/design/`**, **`docs/deployments/`** | Sync on dependency upgrade or explicit sync request |
60
+ | **`docs/domains/`**, **`docs/library/`** | Canonical in core only — do not mirror product trees to hosts |
@@ -0,0 +1,238 @@
1
+ name: Reusable Deployment
2
+
3
+ on:
4
+ workflow_call:
5
+ inputs:
6
+ env_name:
7
+ type: string
8
+ required: true
9
+ dockerhub_username:
10
+ type: string
11
+ required: true
12
+ worker_replicas:
13
+ type: number
14
+ required: false
15
+ default: 1
16
+ secrets:
17
+ SECRET_KEY:
18
+ required: true
19
+ WRITE_POSTGRES_PASSWORD:
20
+ required: true
21
+ READ_POSTGRES_PASSWORD:
22
+ required: true
23
+ FIREBASE_CONFIG:
24
+ required: true
25
+ IMAGE_SERVER_SSH_PRIVATE_KEY:
26
+ required: true
27
+ IMAGE_SERVER_KNOWN_HOSTS:
28
+ required: true
29
+ DEPLOY_SERVER_SSH_KEY:
30
+ required: true
31
+ DOCKERHUB_TOKEN:
32
+ required: true
33
+
34
+ permissions: {}
35
+
36
+ jobs:
37
+ deploy:
38
+ runs-on: ubuntu-latest
39
+ environment: ${{ inputs.env_name }}
40
+ permissions:
41
+ contents: read
42
+ steps:
43
+ - name: Checkout code
44
+ uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0
45
+ with:
46
+ persist-credentials: false
47
+
48
+ - name: Render config.toml from template
49
+ env:
50
+ ENVIRONMENT: ${{ inputs.env_name }}
51
+ SECRET_KEY: ${{ secrets.SECRET_KEY }}
52
+ WRITE_POSTGRES_HOST: ${{ vars.WRITE_POSTGRES_HOST }}
53
+ WRITE_POSTGRES_PORT: ${{ vars.WRITE_POSTGRES_PORT }}
54
+ WRITE_POSTGRES_USER: ${{ vars.WRITE_POSTGRES_USER }}
55
+ WRITE_POSTGRES_PASSWORD: ${{ secrets.WRITE_POSTGRES_PASSWORD }}
56
+ WRITE_POSTGRES_DB: ${{ vars.WRITE_POSTGRES_DB }}
57
+ READ_POSTGRES_HOST: ${{ vars.READ_POSTGRES_HOST }}
58
+ READ_POSTGRES_PORT: ${{ vars.READ_POSTGRES_PORT }}
59
+ READ_POSTGRES_USER: ${{ vars.READ_POSTGRES_USER }}
60
+ READ_POSTGRES_PASSWORD: ${{ secrets.READ_POSTGRES_PASSWORD }}
61
+ READ_POSTGRES_DB: ${{ vars.READ_POSTGRES_DB }}
62
+ REDIS_HOST: ${{ vars.REDIS_HOST }}
63
+ REDIS_PORT: ${{ vars.REDIS_PORT }}
64
+ ALLOWED_HOSTS: ${{ vars.ALLOWED_HOSTS }}
65
+ APP_TITLE: ${{ vars.APP_TITLE }}
66
+ APP_DEBUG: ${{ vars.APP_DEBUG }}
67
+ OPENAPI_URL: ${{ vars.OPENAPI_URL }}
68
+ AVATAR_HOST_DOMAIN: ${{ vars.AVATAR_HOST_DOMAIN }}
69
+ AVATAR_DEFAULT_IMAGE: ${{ vars.AVATAR_DEFAULT_IMAGE }}
70
+ AVATAR_PUBLISH_ROOT: ${{ vars.AVATAR_PUBLISH_ROOT }}
71
+ BANNER_HOST_DOMAIN: ${{ vars.BANNER_HOST_DOMAIN }}
72
+ BANNER_DEFAULT_IMAGE: ${{ vars.BANNER_DEFAULT_IMAGE }}
73
+ BANNER_PUBLISH_ROOT: ${{ vars.BANNER_PUBLISH_ROOT }}
74
+ ATTACHMENT_HOST_DOMAIN: ${{ vars.ATTACHMENT_HOST_DOMAIN }}
75
+ ATTACHMENT_DEFAULT_IMAGE: ${{ vars.ATTACHMENT_DEFAULT_IMAGE }}
76
+ ATTACHMENT_PUBLISH_ROOT: ${{ vars.ATTACHMENT_PUBLISH_ROOT }}
77
+ IMAGE_SERVER_HOST: ${{ vars.IMAGE_SERVER_HOST }}
78
+ IMAGE_SERVER_PORT: ${{ vars.IMAGE_SERVER_PORT }}
79
+ IMAGE_SERVER_USER: ${{ vars.IMAGE_SERVER_USER }}
80
+ OBSERVABILITY_ENABLED: ${{ vars.OBSERVABILITY_ENABLED }}
81
+ OBSERVABILITY_OTLP_ENDPOINT: ${{ vars.OBSERVABILITY_OTLP_ENDPOINT }}
82
+ PROFILING_KEY: ${{ vars.PROFILING_KEY }}
83
+ PROFILING_ENABLED: ${{ vars.PROFILING_ENABLED }}
84
+ LOG_LEVEL: ${{ vars.LOG_LEVEL }}
85
+ CORS_ALLOWED_ORIGINS: ${{ vars.CORS_ALLOWED_ORIGINS }}
86
+ RETENTION_POST_VIEWS_DAYS: ${{ vars.RETENTION_POST_VIEWS_DAYS }}
87
+ RETENTION_READ_NOTIFICATIONS_DAYS: ${{ vars.RETENTION_READ_NOTIFICATIONS_DAYS }}
88
+ ANALYTICS_REFRESH_INTERVAL_SECONDS: ${{ vars.ANALYTICS_REFRESH_INTERVAL_SECONDS }}
89
+ EMAIL_ENABLED: ${{ vars.EMAIL_ENABLED }}
90
+ EMAIL_PROVIDER: ${{ vars.EMAIL_PROVIDER }}
91
+ EMAIL_API_KEY: ${{ secrets.EMAIL_API_KEY }}
92
+ EMAIL_FROM_ADDRESS: ${{ vars.EMAIL_FROM_ADDRESS }}
93
+ EMAIL_FROM_NAME: ${{ vars.EMAIL_FROM_NAME }}
94
+ run: |
95
+ set -euo pipefail
96
+
97
+ echo "Rendering config..."
98
+ envsubst < config.toml.template > config.toml
99
+ test -s config.toml
100
+ python3 - <<'PY'
101
+ import sys
102
+ import tomllib
103
+
104
+ try:
105
+ with open("config.toml", "rb") as f:
106
+ tomllib.load(f)
107
+ except Exception as e:
108
+ print("ERROR: config.toml is invalid TOML", file=sys.stderr)
109
+ print(e, file=sys.stderr)
110
+ sys.exit(1)
111
+ PY
112
+
113
+ - name: Generate firebase_config.json from secret
114
+ env:
115
+ FIREBASE_CONFIG: ${{ secrets.FIREBASE_CONFIG }}
116
+ run: |
117
+ set -euo pipefail
118
+
119
+ echo "Generating firebase_config.json..."
120
+ echo "$FIREBASE_CONFIG" > firebase_config.json
121
+ test -s firebase_config.json
122
+ python3 - <<'PY'
123
+ import sys
124
+ import json
125
+
126
+ try:
127
+ with open("firebase_config.json", "r") as f:
128
+ json.load(f)
129
+ except Exception as e:
130
+ print("ERROR: firebase_config.json is invalid JSON", file=sys.stderr)
131
+ print(e, file=sys.stderr)
132
+ sys.exit(1)
133
+ PY
134
+
135
+ - name: Generate image_server_ssh_key from secret
136
+ env:
137
+ IMAGE_SERVER_SSH_PRIVATE_KEY: ${{ secrets.IMAGE_SERVER_SSH_PRIVATE_KEY }}
138
+ run: |
139
+ set -euo pipefail
140
+
141
+ echo "Generating image_server_ssh_key..."
142
+ printf '%s\n' "$IMAGE_SERVER_SSH_PRIVATE_KEY" > image_server_ssh_key
143
+ test -s image_server_ssh_key
144
+ chmod 600 image_server_ssh_key
145
+
146
+ - name: Generate image_server_known_hosts from secret
147
+ env:
148
+ IMAGE_SERVER_KNOWN_HOSTS: ${{ secrets.IMAGE_SERVER_KNOWN_HOSTS }}
149
+ run: |
150
+ set -euo pipefail
151
+
152
+ echo "Generating image_server_known_hosts..."
153
+ printf '%s\n' "$IMAGE_SERVER_KNOWN_HOSTS" > image_server_known_hosts
154
+ test -s image_server_known_hosts
155
+ chmod 644 image_server_known_hosts
156
+
157
+ - name: Stage docker-compose.yml for upload
158
+ run: cp deploy/app/docker-compose.yml ./docker-compose.yml
159
+
160
+ - name: Upload rendered config.toml, firebase_config.json and docker-compose.yml
161
+ uses: appleboy/scp-action@ff85246acaad7bdce478db94a363cd2bf7c90345 # v1.0.0
162
+ with:
163
+ host: ${{ vars.DEPLOY_SERVER_HOST }}
164
+ username: ${{ vars.DEPLOY_SERVER_USER }}
165
+ key: ${{ secrets.DEPLOY_SERVER_SSH_KEY }}
166
+ port: ${{ vars.DEPLOY_SERVER_PORT }}
167
+ source: "config.toml,firebase_config.json,docker-compose.yml,image_server_ssh_key,image_server_known_hosts"
168
+ target: "/home/${{ vars.DEPLOY_SERVER_USER }}/app_configs/core-framework"
169
+
170
+ - name: Deploy to Server via SSH
171
+ uses: appleboy/ssh-action@0ff4204d59e8e51228ff73bce53f80d53301dee2 # v1.2.5
172
+ env:
173
+ DOCKERHUB_TOKEN: ${{ secrets.DOCKERHUB_TOKEN }}
174
+ DOCKERHUB_USERNAME: ${{ inputs.dockerhub_username }}
175
+ DEPLOY_SERVER_USER: ${{ vars.DEPLOY_SERVER_USER }}
176
+ WORKER_REPLICAS: ${{ inputs.worker_replicas }}
177
+ with:
178
+ host: ${{ vars.DEPLOY_SERVER_HOST }}
179
+ username: ${{ vars.DEPLOY_SERVER_USER }}
180
+ key: ${{ secrets.DEPLOY_SERVER_SSH_KEY }}
181
+ port: ${{ vars.DEPLOY_SERVER_PORT }}
182
+ envs: DOCKERHUB_TOKEN,DOCKERHUB_USERNAME,DEPLOY_SERVER_USER,WORKER_REPLICAS
183
+ script: |
184
+ set -euo pipefail
185
+
186
+ echo "Logging in to Docker Hub"
187
+ printf '%s' "$DOCKERHUB_TOKEN" | docker login -u "$DOCKERHUB_USERNAME" --password-stdin
188
+
189
+ COMPOSE_FILE="/home/$DEPLOY_SERVER_USER/app_configs/core-framework/docker-compose.yml"
190
+ CONFIG_PATH="/home/$DEPLOY_SERVER_USER/app_configs/core-framework/config.toml"
191
+ FIREBASE_CONFIG_PATH="/home/$DEPLOY_SERVER_USER/app_configs/core-framework/firebase_config.json"
192
+ MEDIA_STAGING_PATH="/home/$DEPLOY_SERVER_USER/app_configs/core-framework/media-staging"
193
+ IMAGE_SERVER_SSH_KEY_PATH="/home/$DEPLOY_SERVER_USER/app_configs/core-framework/image_server_ssh_key"
194
+ IMAGE_SERVER_KNOWN_HOSTS_PATH="/home/$DEPLOY_SERVER_USER/app_configs/core-framework/image_server_known_hosts"
195
+
196
+ echo "Pulling latest image"
197
+ DOCKERHUB_USERNAME="$DOCKERHUB_USERNAME" \
198
+ CONFIG_PATH="$CONFIG_PATH" \
199
+ FIREBASE_CONFIG_PATH="$FIREBASE_CONFIG_PATH" \
200
+ MEDIA_STAGING_PATH="$MEDIA_STAGING_PATH" \
201
+ IMAGE_SERVER_SSH_KEY_PATH="$IMAGE_SERVER_SSH_KEY_PATH" \
202
+ IMAGE_SERVER_KNOWN_HOSTS_PATH="$IMAGE_SERVER_KNOWN_HOSTS_PATH" \
203
+ docker compose -f "$COMPOSE_FILE" pull
204
+
205
+ echo "Preparing media staging directory and image server SSH key permissions"
206
+ mkdir -p "$MEDIA_STAGING_PATH"
207
+ docker run --rm \
208
+ --user root \
209
+ -v "$MEDIA_STAGING_PATH:/app/media-staging" \
210
+ -v "$IMAGE_SERVER_SSH_KEY_PATH:/app/image-server-ssh-key" \
211
+ -v "$IMAGE_SERVER_KNOWN_HOSTS_PATH:/app/image-server-known-hosts" \
212
+ --entrypoint "" \
213
+ "$DOCKERHUB_USERNAME/core-framework:latest" \
214
+ sh -c 'mkdir -p /app/media-staging && chown -R appuser:appgroup /app/media-staging && chown appuser:appgroup /app/image-server-ssh-key && chmod 600 /app/image-server-ssh-key && chown appuser:appgroup /app/image-server-known-hosts && chmod 644 /app/image-server-known-hosts'
215
+
216
+ echo "Running database migrations (cf-alembic iterates core_framework.bundled_alembic.ALEMBIC_DOMAINS in order)"
217
+ docker run --rm \
218
+ --network host \
219
+ -v "$CONFIG_PATH:/app/config.toml:ro" \
220
+ "$DOCKERHUB_USERNAME/core-framework:latest" \
221
+ cf-alembic
222
+
223
+ echo "Starting services with Docker Compose"
224
+ DOCKERHUB_USERNAME="$DOCKERHUB_USERNAME" \
225
+ CONFIG_PATH="$CONFIG_PATH" \
226
+ FIREBASE_CONFIG_PATH="$FIREBASE_CONFIG_PATH" \
227
+ MEDIA_STAGING_PATH="$MEDIA_STAGING_PATH" \
228
+ IMAGE_SERVER_SSH_KEY_PATH="$IMAGE_SERVER_SSH_KEY_PATH" \
229
+ IMAGE_SERVER_KNOWN_HOSTS_PATH="$IMAGE_SERVER_KNOWN_HOSTS_PATH" \
230
+ docker compose -f "$COMPOSE_FILE" up -d \
231
+ --remove-orphans \
232
+ --force-recreate \
233
+ --scale worker="$WORKER_REPLICAS"
234
+
235
+ echo "Cleaning up dangling Docker images"
236
+ docker image prune -f
237
+
238
+ echo "Deployment complete"