core-framework 3.2.0__tar.gz → 4.0.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 (1354) hide show
  1. core_framework-4.0.0/.cursor/rules/alembic-migrations.mdc +61 -0
  2. core_framework-4.0.0/.cursor/rules/constitution.mdc +50 -0
  3. core_framework-4.0.0/.cursor/rules/domain-imports.mdc +44 -0
  4. core_framework-4.0.0/.cursor/rules/error-boundary.mdc +56 -0
  5. core_framework-4.0.0/.cursor/rules/flow-documentation.mdc +15 -0
  6. core_framework-4.0.0/.cursor/rules/ignore-analytics-warehouse.mdc +21 -0
  7. core_framework-4.0.0/.cursor/rules/integration-test-strategy.mdc +30 -0
  8. core_framework-4.0.0/.cursor/rules/no-code-in-docs.mdc +36 -0
  9. core_framework-4.0.0/.cursor/rules/postgres-config-conventions.mdc +57 -0
  10. core_framework-4.0.0/.cursor/rules/repository-schema-isolation.mdc +89 -0
  11. core_framework-4.0.0/.cursor/rules/strong-reads.mdc +39 -0
  12. core_framework-4.0.0/.cursor/skills/code-review/SKILL.md +85 -0
  13. core_framework-4.0.0/.cursor/skills/design-review/SKILL.md +59 -0
  14. core_framework-4.0.0/.cursor/skills/grill/SKILL.md +75 -0
  15. core_framework-4.0.0/.cursor/skills/implement-feature/SKILL.md +109 -0
  16. core_framework-4.0.0/.cursor/skills/write-flow-doc/SKILL.md +84 -0
  17. core_framework-4.0.0/.github/ci/package-smoke.sh +13 -0
  18. core_framework-4.0.0/.github/ci/package_smoke.py +306 -0
  19. core_framework-4.0.0/.github/workflows/_deploy.yml +245 -0
  20. core_framework-4.0.0/.github/workflows/dev-ci-cd.yaml +178 -0
  21. core_framework-4.0.0/.github/workflows/manual-deployment.yaml +53 -0
  22. core_framework-4.0.0/.github/workflows/manual-observability-deployment.yaml +268 -0
  23. core_framework-4.0.0/.github/workflows/test.yaml +129 -0
  24. core_framework-4.0.0/CHANGELOG.md +773 -0
  25. core_framework-4.0.0/PKG-INFO +144 -0
  26. core_framework-4.0.0/README.md +97 -0
  27. core_framework-4.0.0/alembic/comment/alembic/versions/comment_subject_kind_varchar.py +42 -0
  28. core_framework-4.0.0/alembic/moderation/alembic/versions/3027828c2c80_align_dead_outbox_keyset_index.py +34 -0
  29. core_framework-4.0.0/alembic/moderation/alembic/versions/5be85718122a_moderation_add_review_reports.py +55 -0
  30. core_framework-4.0.0/alembic/notification/alembic/versions/a5f29155815d_notification_add_friendship_types.py +28 -0
  31. core_framework-4.0.0/alembic/notification/alembic/versions/b1263ed1a303_notification_inbox_redesign_preview.py +47 -0
  32. core_framework-4.0.0/alembic/notification/alembic/versions/c6b9941065ec_notification_add_group_invite_type.py +28 -0
  33. core_framework-4.0.0/alembic/notification/alembic/versions/fbe8476b4437_notification_add_rating_owner_cue_labels.py +29 -0
  34. core_framework-4.0.0/alembic/rating/alembic/env.py +74 -0
  35. core_framework-4.0.0/alembic/rating/alembic/versions/04182d734619_rating_list_indexes.py +38 -0
  36. core_framework-4.0.0/alembic/rating/alembic/versions/2ef924b0be4c_rating_schema.py +150 -0
  37. core_framework-4.0.0/alembic/rating/alembic.ini +52 -0
  38. core_framework-4.0.0/alembic/user/alembic/README +1 -0
  39. core_framework-4.0.0/alembic/user/alembic/script.py.mako +28 -0
  40. core_framework-4.0.0/alembic/user/alembic/versions/24ba262c4ef2_user_add_account_removal_started_at.py +30 -0
  41. core_framework-4.0.0/alembic/user/alembic/versions/2dc1d398a840_user_add_groups.py +120 -0
  42. core_framework-4.0.0/alembic/user/alembic/versions/7078e4313554_user_add_friendships.py +78 -0
  43. core_framework-4.0.0/alembic/user/alembic/versions/922eece707db_align_dead_outbox_keyset_index.py +34 -0
  44. core_framework-4.0.0/config.toml +148 -0
  45. core_framework-4.0.0/config.toml.template +136 -0
  46. core_framework-4.0.0/core_framework/api/admin/analytics/router.py +46 -0
  47. core_framework-4.0.0/core_framework/api/admin/analytics/schemas.py +59 -0
  48. core_framework-4.0.0/core_framework/api/admin/cache/router.py +27 -0
  49. core_framework-4.0.0/core_framework/api/admin/cache/schemas.py +91 -0
  50. core_framework-4.0.0/core_framework/api/admin/comments/router.py +69 -0
  51. core_framework-4.0.0/core_framework/api/admin/comments/schemas.py +45 -0
  52. core_framework-4.0.0/core_framework/api/admin/moderation/router.py +222 -0
  53. core_framework-4.0.0/core_framework/api/admin/moderation/schemas.py +120 -0
  54. core_framework-4.0.0/core_framework/api/admin/outbox/router.py +63 -0
  55. core_framework-4.0.0/core_framework/api/admin/posts/router.py +62 -0
  56. core_framework-4.0.0/core_framework/api/admin/posts/schemas.py +32 -0
  57. core_framework-4.0.0/core_framework/api/admin/ratings/router.py +46 -0
  58. core_framework-4.0.0/core_framework/api/admin/ratings/schemas.py +25 -0
  59. core_framework-4.0.0/core_framework/api/admin/router.py +25 -0
  60. core_framework-4.0.0/core_framework/api/admin/users/router.py +206 -0
  61. core_framework-4.0.0/core_framework/api/admin/users/schemas.py +137 -0
  62. core_framework-4.0.0/core_framework/api/attachments/router.py +45 -0
  63. core_framework-4.0.0/core_framework/api/attachments/schemas.py +48 -0
  64. core_framework-4.0.0/core_framework/api/auth/router.py +26 -0
  65. core_framework-4.0.0/core_framework/api/auth/schemas.py +15 -0
  66. core_framework-4.0.0/core_framework/api/comments/authenticated/mappers.py +21 -0
  67. core_framework-4.0.0/core_framework/api/comments/authenticated/router.py +145 -0
  68. core_framework-4.0.0/core_framework/api/comments/authenticated/schemas.py +78 -0
  69. core_framework-4.0.0/core_framework/api/comments/public/router.py +121 -0
  70. core_framework-4.0.0/core_framework/api/comments/public/schemas.py +44 -0
  71. core_framework-4.0.0/core_framework/api/comments/schemas.py +29 -0
  72. core_framework-4.0.0/core_framework/api/dependencies.py +209 -0
  73. core_framework-4.0.0/core_framework/api/events/router.py +56 -0
  74. core_framework-4.0.0/core_framework/api/groups/router.py +207 -0
  75. core_framework-4.0.0/core_framework/api/groups/schemas.py +69 -0
  76. core_framework-4.0.0/core_framework/api/notifications/authenticated/router.py +78 -0
  77. core_framework-4.0.0/core_framework/api/notifications/authenticated/schemas.py +141 -0
  78. core_framework-4.0.0/core_framework/api/pagination.py +239 -0
  79. core_framework-4.0.0/core_framework/api/posts/authenticated/mappers.py +23 -0
  80. core_framework-4.0.0/core_framework/api/posts/authenticated/router.py +116 -0
  81. core_framework-4.0.0/core_framework/api/posts/authenticated/schemas.py +77 -0
  82. core_framework-4.0.0/core_framework/api/posts/public/router.py +110 -0
  83. core_framework-4.0.0/core_framework/api/posts/schemas.py +37 -0
  84. core_framework-4.0.0/core_framework/api/ratings/authenticated/router.py +99 -0
  85. core_framework-4.0.0/core_framework/api/ratings/pagination.py +37 -0
  86. core_framework-4.0.0/core_framework/api/ratings/public/router.py +79 -0
  87. core_framework-4.0.0/core_framework/api/ratings/router.py +9 -0
  88. core_framework-4.0.0/core_framework/api/ratings/schemas.py +125 -0
  89. core_framework-4.0.0/core_framework/api/router.py +27 -0
  90. core_framework-4.0.0/core_framework/api/schemas.py +24 -0
  91. core_framework-4.0.0/core_framework/api/users/authenticated/router.py +748 -0
  92. core_framework-4.0.0/core_framework/api/users/authenticated/schemas.py +110 -0
  93. core_framework-4.0.0/core_framework/api/users/public/router.py +66 -0
  94. core_framework-4.0.0/core_framework/api/users/public/schemas.py +35 -0
  95. core_framework-4.0.0/core_framework/api/users/shared/mappers.py +18 -0
  96. core_framework-4.0.0/core_framework/api/users/shared/schemas.py +205 -0
  97. core_framework-4.0.0/core_framework/application/analytics/bucket_service.py +77 -0
  98. core_framework-4.0.0/core_framework/application/analytics/read_service.py +74 -0
  99. core_framework-4.0.0/core_framework/application/analytics/refresh_service.py +62 -0
  100. core_framework-4.0.0/core_framework/application/auth/access_service.py +31 -0
  101. core_framework-4.0.0/core_framework/application/auth/auth_service.py +53 -0
  102. core_framework-4.0.0/core_framework/application/auth/models.py +13 -0
  103. core_framework-4.0.0/core_framework/application/auth/token_verification.py +32 -0
  104. core_framework-4.0.0/core_framework/application/bootstrap.py +73 -0
  105. core_framework-4.0.0/core_framework/application/comments/__init__.py +13 -0
  106. core_framework-4.0.0/core_framework/application/comments/admin_service.py +592 -0
  107. core_framework-4.0.0/core_framework/application/comments/aggregation_service.py +57 -0
  108. core_framework-4.0.0/core_framework/application/comments/authenticated_service.py +271 -0
  109. core_framework-4.0.0/core_framework/application/comments/cleanup_service.py +170 -0
  110. core_framework-4.0.0/core_framework/application/comments/host_service.py +40 -0
  111. core_framework-4.0.0/core_framework/application/comments/kind_registry.py +35 -0
  112. core_framework-4.0.0/core_framework/application/comments/post_subject.py +89 -0
  113. core_framework-4.0.0/core_framework/application/comments/public_service.py +382 -0
  114. core_framework-4.0.0/core_framework/application/comments/rating_subject.py +67 -0
  115. core_framework-4.0.0/core_framework/application/email/__init__.py +13 -0
  116. core_framework-4.0.0/core_framework/application/email/account_deletion_scheduled.py +77 -0
  117. core_framework-4.0.0/core_framework/application/events/README.md +33 -0
  118. core_framework-4.0.0/core_framework/application/events/event_service.py +207 -0
  119. core_framework-4.0.0/core_framework/application/groups/authenticated_service.py +291 -0
  120. core_framework-4.0.0/core_framework/application/groups/cleanup_service.py +52 -0
  121. core_framework-4.0.0/core_framework/application/groups/group_invite_link_token.py +68 -0
  122. core_framework-4.0.0/core_framework/application/groups/strip_service.py +71 -0
  123. core_framework-4.0.0/core_framework/application/media/README.md +28 -0
  124. core_framework-4.0.0/core_framework/application/media/attachment_service.py +524 -0
  125. core_framework-4.0.0/core_framework/application/media/avatar_service.py +189 -0
  126. core_framework-4.0.0/core_framework/application/media/banner_service.py +185 -0
  127. core_framework-4.0.0/core_framework/application/moderation/appeal_service.py +98 -0
  128. core_framework-4.0.0/core_framework/application/moderation/moderator_service.py +41 -0
  129. core_framework-4.0.0/core_framework/application/moderation/report_service.py +210 -0
  130. core_framework-4.0.0/core_framework/application/moderation/restriction_fanout/__init__.py +17 -0
  131. core_framework-4.0.0/core_framework/application/moderation/restriction_fanout/heals.py +48 -0
  132. core_framework-4.0.0/core_framework/application/moderation/restriction_fanout/mirrors.py +50 -0
  133. core_framework-4.0.0/core_framework/application/moderation/restriction_fanout/reactions.py +12 -0
  134. core_framework-4.0.0/core_framework/application/moderation/restriction_fanout/registry.py +182 -0
  135. core_framework-4.0.0/core_framework/application/moderation/restriction_fanout/runner.py +154 -0
  136. core_framework-4.0.0/core_framework/application/moderation/user_service.py +168 -0
  137. core_framework-4.0.0/core_framework/application/notifications/README.md +25 -0
  138. core_framework-4.0.0/core_framework/application/notifications/enums.py +15 -0
  139. core_framework-4.0.0/core_framework/application/notifications/friendship_notification_service.py +68 -0
  140. core_framework-4.0.0/core_framework/application/notifications/group_invite_notification_service.py +54 -0
  141. core_framework-4.0.0/core_framework/application/notifications/inbox_service.py +148 -0
  142. core_framework-4.0.0/core_framework/application/notifications/mute_service.py +40 -0
  143. core_framework-4.0.0/core_framework/application/notifications/notification_service.py +252 -0
  144. core_framework-4.0.0/core_framework/application/notifications/preview.py +12 -0
  145. core_framework-4.0.0/core_framework/application/notifications/wipe_service.py +78 -0
  146. core_framework-4.0.0/core_framework/application/outbox/block_mirrors.py +67 -0
  147. core_framework-4.0.0/core_framework/application/outbox/events.py +133 -0
  148. core_framework-4.0.0/core_framework/application/outbox/handlers.py +137 -0
  149. core_framework-4.0.0/core_framework/application/outbox/ops_service.py +74 -0
  150. core_framework-4.0.0/core_framework/application/outbox/processing_service.py +105 -0
  151. core_framework-4.0.0/core_framework/application/outbox/restriction_mirrors.py +61 -0
  152. core_framework-4.0.0/core_framework/application/posts/admin_service.py +389 -0
  153. core_framework-4.0.0/core_framework/application/posts/aggregation_service.py +59 -0
  154. core_framework-4.0.0/core_framework/application/posts/authenticated_service.py +153 -0
  155. core_framework-4.0.0/core_framework/application/posts/cleanup_service.py +182 -0
  156. core_framework-4.0.0/core_framework/application/posts/public_service.py +264 -0
  157. core_framework-4.0.0/core_framework/application/ratings/__init__.py +9 -0
  158. core_framework-4.0.0/core_framework/application/ratings/admin_service.py +56 -0
  159. core_framework-4.0.0/core_framework/application/ratings/aggregation_service.py +52 -0
  160. core_framework-4.0.0/core_framework/application/ratings/authenticated_service.py +107 -0
  161. core_framework-4.0.0/core_framework/application/ratings/kind_registry.py +39 -0
  162. core_framework-4.0.0/core_framework/application/ratings/public_service.py +140 -0
  163. core_framework-4.0.0/core_framework/application/ratings/purge_service.py +53 -0
  164. core_framework-4.0.0/core_framework/application/ratings/serialization.py +134 -0
  165. core_framework-4.0.0/core_framework/application/ratings/subject_existence.py +33 -0
  166. core_framework-4.0.0/core_framework/application/shared/deletion_cleanup_ledger.py +60 -0
  167. core_framework-4.0.0/core_framework/application/shared/enums.py +51 -0
  168. core_framework-4.0.0/core_framework/application/shared/exceptions.py +100 -0
  169. core_framework-4.0.0/core_framework/application/shared/worker_jobs.py +63 -0
  170. core_framework-4.0.0/core_framework/application/users/account_removal/__init__.py +11 -0
  171. core_framework-4.0.0/core_framework/application/users/account_removal/contributors.py +96 -0
  172. core_framework-4.0.0/core_framework/application/users/account_removal/registry.py +99 -0
  173. core_framework-4.0.0/core_framework/application/users/account_removal/runner.py +122 -0
  174. core_framework-4.0.0/core_framework/application/users/admin_service.py +257 -0
  175. core_framework-4.0.0/core_framework/application/users/aggregation_service.py +22 -0
  176. core_framework-4.0.0/core_framework/application/users/authenticated_service.py +616 -0
  177. core_framework-4.0.0/core_framework/application/users/identity_enrichment.py +28 -0
  178. core_framework-4.0.0/core_framework/application/users/public_service.py +195 -0
  179. core_framework-4.0.0/core_framework/application/users/scheduled_service.py +6 -0
  180. core_framework-4.0.0/core_framework/application/users/user_deletion_service.py +693 -0
  181. core_framework-4.0.0/core_framework/bundled_alembic.py +45 -0
  182. core_framework-4.0.0/core_framework/constants.py +29 -0
  183. core_framework-4.0.0/core_framework/core/__init__.py +45 -0
  184. core_framework-4.0.0/core_framework/core/cache.py +229 -0
  185. core_framework-4.0.0/core_framework/core/exception_handlers/application.py +152 -0
  186. core_framework-4.0.0/core_framework/core/exception_handlers/common.py +78 -0
  187. core_framework-4.0.0/core_framework/core/exception_handlers/setup.py +46 -0
  188. core_framework-4.0.0/core_framework/core/middleware.py +160 -0
  189. core_framework-4.0.0/core_framework/core/observability.py +649 -0
  190. core_framework-4.0.0/core_framework/core/pagination.py +123 -0
  191. core_framework-4.0.0/core_framework/core/rate_limit.py +340 -0
  192. core_framework-4.0.0/core_framework/core/settings.py +922 -0
  193. core_framework-4.0.0/core_framework/domains/analytics/README.md +25 -0
  194. core_framework-4.0.0/core_framework/domains/analytics/__init__.py +24 -0
  195. core_framework-4.0.0/core_framework/domains/analytics/constants.py +22 -0
  196. core_framework-4.0.0/core_framework/domains/analytics/repository.py +261 -0
  197. core_framework-4.0.0/core_framework/domains/analytics/service.py +306 -0
  198. core_framework-4.0.0/core_framework/domains/auth/README.md +78 -0
  199. core_framework-4.0.0/core_framework/domains/auth/__init__.py +18 -0
  200. core_framework-4.0.0/core_framework/domains/auth/dependencies.py +28 -0
  201. core_framework-4.0.0/core_framework/domains/auth/exceptions.py +14 -0
  202. core_framework-4.0.0/core_framework/domains/auth/models.py +31 -0
  203. core_framework-4.0.0/core_framework/domains/auth/outcomes.py +24 -0
  204. core_framework-4.0.0/core_framework/domains/auth/ports/auth.py +73 -0
  205. core_framework-4.0.0/core_framework/domains/auth/service.py +188 -0
  206. core_framework-4.0.0/core_framework/domains/comment/README.md +271 -0
  207. core_framework-4.0.0/core_framework/domains/comment/__init__.py +76 -0
  208. core_framework-4.0.0/core_framework/domains/comment/constants.py +13 -0
  209. core_framework-4.0.0/core_framework/domains/comment/enums.py +28 -0
  210. core_framework-4.0.0/core_framework/domains/comment/exceptions.py +30 -0
  211. core_framework-4.0.0/core_framework/domains/comment/models.py +223 -0
  212. core_framework-4.0.0/core_framework/domains/comment/outcomes.py +25 -0
  213. core_framework-4.0.0/core_framework/domains/comment/ports/subject.py +88 -0
  214. core_framework-4.0.0/core_framework/domains/comment/repository.py +2523 -0
  215. core_framework-4.0.0/core_framework/domains/comment/service.py +980 -0
  216. core_framework-4.0.0/core_framework/domains/email/dependencies.py +101 -0
  217. core_framework-4.0.0/core_framework/domains/email/models.py +3 -0
  218. core_framework-4.0.0/core_framework/domains/media/README.md +34 -0
  219. core_framework-4.0.0/core_framework/domains/media/__init__.py +57 -0
  220. core_framework-4.0.0/core_framework/domains/media/attachment/components/staging.py +165 -0
  221. core_framework-4.0.0/core_framework/domains/media/attachment/components/variant_encoder.py +28 -0
  222. core_framework-4.0.0/core_framework/domains/media/attachment/constants.py +39 -0
  223. core_framework-4.0.0/core_framework/domains/media/attachment/models.py +29 -0
  224. core_framework-4.0.0/core_framework/domains/media/attachment/ports/variant_encoder.py +26 -0
  225. core_framework-4.0.0/core_framework/domains/media/attachment/service.py +459 -0
  226. core_framework-4.0.0/core_framework/domains/media/avatar/service.py +343 -0
  227. core_framework-4.0.0/core_framework/domains/media/banner/service.py +338 -0
  228. core_framework-4.0.0/core_framework/domains/media/dependencies.py +314 -0
  229. core_framework-4.0.0/core_framework/domains/media/shared/outcomes.py +17 -0
  230. core_framework-4.0.0/core_framework/domains/media/shared/repository.py +812 -0
  231. core_framework-4.0.0/core_framework/domains/moderation/README.md +164 -0
  232. core_framework-4.0.0/core_framework/domains/moderation/dependencies.py +91 -0
  233. core_framework-4.0.0/core_framework/domains/moderation/enums.py +68 -0
  234. core_framework-4.0.0/core_framework/domains/moderation/outbox_repository.py +190 -0
  235. core_framework-4.0.0/core_framework/domains/moderation/outbox_service.py +53 -0
  236. core_framework-4.0.0/core_framework/domains/moderation/repository.py +1686 -0
  237. core_framework-4.0.0/core_framework/domains/moderation/service.py +1053 -0
  238. core_framework-4.0.0/core_framework/domains/notification/README.md +144 -0
  239. core_framework-4.0.0/core_framework/domains/notification/__init__.py +15 -0
  240. core_framework-4.0.0/core_framework/domains/notification/enums.py +26 -0
  241. core_framework-4.0.0/core_framework/domains/notification/models.py +18 -0
  242. core_framework-4.0.0/core_framework/domains/notification/repository.py +941 -0
  243. core_framework-4.0.0/core_framework/domains/notification/service.py +489 -0
  244. core_framework-4.0.0/core_framework/domains/outbox/README.md +69 -0
  245. core_framework-4.0.0/core_framework/domains/outbox/__init__.py +23 -0
  246. core_framework-4.0.0/core_framework/domains/outbox/ports/admin.py +36 -0
  247. core_framework-4.0.0/core_framework/domains/outbox/service.py +63 -0
  248. core_framework-4.0.0/core_framework/domains/post/README.md +216 -0
  249. core_framework-4.0.0/core_framework/domains/post/__init__.py +44 -0
  250. core_framework-4.0.0/core_framework/domains/post/constants.py +8 -0
  251. core_framework-4.0.0/core_framework/domains/post/enums.py +35 -0
  252. core_framework-4.0.0/core_framework/domains/post/exceptions.py +20 -0
  253. core_framework-4.0.0/core_framework/domains/post/models.py +217 -0
  254. core_framework-4.0.0/core_framework/domains/post/repository.py +2175 -0
  255. core_framework-4.0.0/core_framework/domains/post/service.py +990 -0
  256. core_framework-4.0.0/core_framework/domains/rating/README.md +81 -0
  257. core_framework-4.0.0/core_framework/domains/rating/__init__.py +31 -0
  258. core_framework-4.0.0/core_framework/domains/rating/constants.py +10 -0
  259. core_framework-4.0.0/core_framework/domains/rating/dependencies.py +61 -0
  260. core_framework-4.0.0/core_framework/domains/rating/exceptions.py +5 -0
  261. core_framework-4.0.0/core_framework/domains/rating/models.py +52 -0
  262. core_framework-4.0.0/core_framework/domains/rating/outcomes.py +13 -0
  263. core_framework-4.0.0/core_framework/domains/rating/ports/subject_existence.py +18 -0
  264. core_framework-4.0.0/core_framework/domains/rating/repository.py +1365 -0
  265. core_framework-4.0.0/core_framework/domains/rating/service.py +901 -0
  266. core_framework-4.0.0/core_framework/domains/repository_sql.py +90 -0
  267. core_framework-4.0.0/core_framework/domains/user/README.md +140 -0
  268. core_framework-4.0.0/core_framework/domains/user/__init__.py +95 -0
  269. core_framework-4.0.0/core_framework/domains/user/constants.py +38 -0
  270. core_framework-4.0.0/core_framework/domains/user/dependencies.py +132 -0
  271. core_framework-4.0.0/core_framework/domains/user/enums.py +24 -0
  272. core_framework-4.0.0/core_framework/domains/user/group_repository.py +1708 -0
  273. core_framework-4.0.0/core_framework/domains/user/group_service.py +572 -0
  274. core_framework-4.0.0/core_framework/domains/user/models.py +412 -0
  275. core_framework-4.0.0/core_framework/domains/user/outbox_repository.py +189 -0
  276. core_framework-4.0.0/core_framework/domains/user/outbox_service.py +53 -0
  277. core_framework-4.0.0/core_framework/domains/user/outcomes.py +72 -0
  278. core_framework-4.0.0/core_framework/domains/user/repository.py +2341 -0
  279. core_framework-4.0.0/core_framework/domains/user/service.py +1248 -0
  280. core_framework-4.0.0/core_framework/domains/utils.py +244 -0
  281. core_framework-4.0.0/core_framework/infrastructure/firebase/firebase_auth_adapter.py +156 -0
  282. core_framework-4.0.0/core_framework/infrastructure/media/attachment_staging_display_geometry.py +45 -0
  283. core_framework-4.0.0/core_framework/infrastructure/media/pillow_attachment_variant_encoder_adapter.py +164 -0
  284. core_framework-4.0.0/core_framework/main.py +69 -0
  285. core_framework-4.0.0/core_framework/testing/__init__.py +19 -0
  286. core_framework-4.0.0/core_framework/testing/arq.py +141 -0
  287. core_framework-4.0.0/core_framework/testing/auth.py +351 -0
  288. core_framework-4.0.0/core_framework/testing/blockbuster.py +38 -0
  289. core_framework-4.0.0/core_framework/testing/config.py +48 -0
  290. core_framework-4.0.0/core_framework/testing/containers.py +101 -0
  291. core_framework-4.0.0/core_framework/testing/hookspecs.py +16 -0
  292. core_framework-4.0.0/core_framework/testing/media.py +271 -0
  293. core_framework-4.0.0/core_framework/testing/plugin.py +250 -0
  294. core_framework-4.0.0/core_framework/worker/main.py +172 -0
  295. core_framework-4.0.0/core_framework/worker/schedules/__init__.py +172 -0
  296. core_framework-4.0.0/core_framework/worker/schedules/schedule_aggregate_rating_stats.py +43 -0
  297. core_framework-4.0.0/core_framework/worker/schedules/schedule_aggregate_rating_subject_stats.py +65 -0
  298. core_framework-4.0.0/core_framework/worker/schedules/schedule_expired_account_deletions.py +37 -0
  299. core_framework-4.0.0/core_framework/worker/schedules/schedule_expired_mute_lifts.py +36 -0
  300. core_framework-4.0.0/core_framework/worker/schedules/schedule_purge_expired_create_idempotency_keys.py +25 -0
  301. core_framework-4.0.0/core_framework/worker/schedules/schedule_purge_expired_group_invites.py +18 -0
  302. core_framework-4.0.0/core_framework/worker/schedules/schedule_refresh_analytics.py +15 -0
  303. core_framework-4.0.0/core_framework/worker/schedules/schedule_restriction_heals.py +15 -0
  304. core_framework-4.0.0/core_framework/worker/tasks/__init__.py +166 -0
  305. core_framework-4.0.0/core_framework/worker/tasks/process_account_deletion.py +21 -0
  306. core_framework-4.0.0/core_framework/worker/tasks/process_aggregate_rating_stats.py +19 -0
  307. core_framework-4.0.0/core_framework/worker/tasks/process_aggregate_rating_subject_stats.py +30 -0
  308. core_framework-4.0.0/core_framework/worker/tasks/process_block_notification_wipe.py +35 -0
  309. core_framework-4.0.0/core_framework/worker/tasks/process_cache_pattern_invalidation.py +19 -0
  310. core_framework-4.0.0/core_framework/worker/tasks/process_comment_tombstone_cleanup.py +33 -0
  311. core_framework-4.0.0/core_framework/worker/tasks/process_destructive_comment_delete.py +38 -0
  312. core_framework-4.0.0/core_framework/worker/tasks/process_destructive_post_delete.py +34 -0
  313. core_framework-4.0.0/core_framework/worker/tasks/process_friendship_pair_notification_wipe.py +35 -0
  314. core_framework-4.0.0/core_framework/worker/tasks/process_group_invite_notification_wipe.py +26 -0
  315. core_framework-4.0.0/core_framework/worker/tasks/process_post_private_notification_wipe.py +26 -0
  316. core_framework-4.0.0/core_framework/worker/tasks/process_post_tombstone_cleanup.py +27 -0
  317. core_framework-4.0.0/core_framework/worker/tasks/process_restriction_reactions.py +44 -0
  318. core_framework-4.0.0/core_framework/worker/tasks/process_user_content_deletion.py +18 -0
  319. core_framework-4.0.0/deploy/app/docker-compose.yml +62 -0
  320. core_framework-4.0.0/deploy/observability/README.md +11 -0
  321. core_framework-4.0.0/deploy/observability/docker-compose.yml +153 -0
  322. core_framework-4.0.0/deploy/observability/prometheus.yml +40 -0
  323. core_framework-4.0.0/deploy/observability/targets.default/node.yml +6 -0
  324. core_framework-4.0.0/deploy/observability/targets.default/postgres.yml +6 -0
  325. core_framework-4.0.0/deploy/observability/targets.default/redis.yml +6 -0
  326. core_framework-4.0.0/deploy/observability/targets.example/README.md +25 -0
  327. core_framework-4.0.0/docs/README.md +49 -0
  328. core_framework-4.0.0/docs/deployments/README.md +58 -0
  329. core_framework-4.0.0/docs/deployments/deploy-playbook.md +199 -0
  330. core_framework-4.0.0/docs/deployments/e2e-smoke-tests-design.md +352 -0
  331. core_framework-4.0.0/docs/deployments/edge-rate-limits.md +114 -0
  332. core_framework-4.0.0/docs/deployments/guides/playbook/postgres-backup-playbook.md +302 -0
  333. core_framework-4.0.0/docs/deployments/guides/setup/app-server-deploy-ssh.md +72 -0
  334. core_framework-4.0.0/docs/deployments/guides/setup/caddy-setup.md +67 -0
  335. core_framework-4.0.0/docs/deployments/guides/setup/cloudflare-setup.md +129 -0
  336. core_framework-4.0.0/docs/deployments/guides/setup/image-server-ssh.md +99 -0
  337. core_framework-4.0.0/docs/deployments/guides/setup/observability-lgtm-setup.md +204 -0
  338. core_framework-4.0.0/docs/deployments/guides/setup/postgres-backup-setup.md +322 -0
  339. core_framework-4.0.0/docs/deployments/guides/setup/postgres-setup.md +163 -0
  340. core_framework-4.0.0/docs/deployments/guides/setup/redis-setup.md +119 -0
  341. core_framework-4.0.0/docs/deployments/guides/setup/ubuntu-server-setup.md +179 -0
  342. core_framework-4.0.0/docs/deployments/host-config-defaults-design.md +836 -0
  343. core_framework-4.0.0/docs/deployments/host-config-defaults-implementation.md +251 -0
  344. core_framework-4.0.0/docs/deployments/postgres-backup-design.md +175 -0
  345. core_framework-4.0.0/docs/deployments/release-playbook.md +92 -0
  346. core_framework-4.0.0/docs/design/README.md +55 -0
  347. core_framework-4.0.0/docs/design/account-removal-spine-design.md +428 -0
  348. core_framework-4.0.0/docs/design/account-removal-spine-implementation.md +265 -0
  349. core_framework-4.0.0/docs/design/analytics-rollup-design.md +1007 -0
  350. core_framework-4.0.0/docs/design/analytics-warehouse-design.md +686 -0
  351. core_framework-4.0.0/docs/design/cache-invalidation-design.md +151 -0
  352. core_framework-4.0.0/docs/design/comment-subject-kinds-design.md +589 -0
  353. core_framework-4.0.0/docs/design/create-idempotency-design.md +365 -0
  354. core_framework-4.0.0/docs/design/event-outbox-design.md +664 -0
  355. core_framework-4.0.0/docs/design/events-ingest-design.md +229 -0
  356. core_framework-4.0.0/docs/design/media-cpu-off-api-refactor.md +134 -0
  357. core_framework-4.0.0/docs/design/media-storage-topology.md +141 -0
  358. core_framework-4.0.0/docs/design/moderation-restriction-fanout-design.md +464 -0
  359. core_framework-4.0.0/docs/design/moderation-restriction-fanout-implementation.md +266 -0
  360. core_framework-4.0.0/docs/design/moderator-surfaces-design.md +303 -0
  361. core_framework-4.0.0/docs/design/moderator-surfaces-implementation.md +242 -0
  362. core_framework-4.0.0/docs/design/observability-lgtm-design.md +594 -0
  363. core_framework-4.0.0/docs/design/outbox-admin-ops-design.md +339 -0
  364. core_framework-4.0.0/docs/design/rating-thread-owner-cue-design.md +382 -0
  365. core_framework-4.0.0/docs/design/rating-thread-owner-cue-implementation.md +235 -0
  366. core_framework-4.0.0/docs/design/restriction-and-block-visibility-design.md +383 -0
  367. core_framework-4.0.0/docs/design/restriction-and-block-visibility-implementation.md +212 -0
  368. core_framework-4.0.0/docs/design/transactional-email-design.md +620 -0
  369. core_framework-4.0.0/docs/design/utm-events-design.md +275 -0
  370. core_framework-4.0.0/docs/domains/README.md +24 -0
  371. core_framework-4.0.0/docs/domains/analytics/admin_analytics_reads.md +130 -0
  372. core_framework-4.0.0/docs/domains/auth/access_control.md +131 -0
  373. core_framework-4.0.0/docs/domains/auth/registration.md +66 -0
  374. core_framework-4.0.0/docs/domains/cache/admin_cache_invalidation.md +180 -0
  375. core_framework-4.0.0/docs/domains/comments/README.md +38 -0
  376. core_framework-4.0.0/docs/domains/comments/admin_comments.md +221 -0
  377. core_framework-4.0.0/docs/domains/comments/comment_like.md +99 -0
  378. core_framework-4.0.0/docs/domains/comments/comment_report.md +119 -0
  379. core_framework-4.0.0/docs/domains/comments/comment_stats_aggregation.md +68 -0
  380. core_framework-4.0.0/docs/domains/comments/create_comment.md +200 -0
  381. core_framework-4.0.0/docs/domains/comments/delete_comment.md +65 -0
  382. core_framework-4.0.0/docs/domains/comments/edit_comment.md +72 -0
  383. core_framework-4.0.0/docs/domains/comments/retrieve_comments.md +260 -0
  384. core_framework-4.0.0/docs/domains/deletion/comments.md +300 -0
  385. core_framework-4.0.0/docs/domains/deletion/overview.md +209 -0
  386. core_framework-4.0.0/docs/domains/deletion/posts.md +312 -0
  387. core_framework-4.0.0/docs/domains/deletion/ratings.md +42 -0
  388. core_framework-4.0.0/docs/domains/deletion/users.md +530 -0
  389. core_framework-4.0.0/docs/domains/events/events.md +258 -0
  390. core_framework-4.0.0/docs/domains/media/README.md +36 -0
  391. core_framework-4.0.0/docs/domains/media/attachment_upload.md +102 -0
  392. core_framework-4.0.0/docs/domains/media/avatar-upload-design.md +110 -0
  393. core_framework-4.0.0/docs/domains/media/banner-upload-design.md +150 -0
  394. core_framework-4.0.0/docs/domains/media/post-comment-attachments-design.md +521 -0
  395. core_framework-4.0.0/docs/domains/media/upload-pipeline-design.md +468 -0
  396. core_framework-4.0.0/docs/domains/media/upload_pipeline.md +104 -0
  397. core_framework-4.0.0/docs/domains/mentions/mentions_in_content.md +239 -0
  398. core_framework-4.0.0/docs/domains/moderation/README.md +32 -0
  399. core_framework-4.0.0/docs/domains/moderation/appeals.md +272 -0
  400. core_framework-4.0.0/docs/domains/moderation/internal_notes.md +158 -0
  401. core_framework-4.0.0/docs/domains/moderation/moderator_actions.md +75 -0
  402. core_framework-4.0.0/docs/domains/moderation/reports.md +231 -0
  403. core_framework-4.0.0/docs/domains/moderation/restrictions.md +369 -0
  404. core_framework-4.0.0/docs/domains/notifications/inbox-redesign-design.md +1342 -0
  405. core_framework-4.0.0/docs/domains/notifications/notification_inbox.md +434 -0
  406. core_framework-4.0.0/docs/domains/outbox/admin_outbox_ops.md +185 -0
  407. core_framework-4.0.0/docs/domains/posts/admin_posts.md +188 -0
  408. core_framework-4.0.0/docs/domains/posts/author_context.md +92 -0
  409. core_framework-4.0.0/docs/domains/posts/create_post.md +124 -0
  410. core_framework-4.0.0/docs/domains/posts/delete_post.md +62 -0
  411. core_framework-4.0.0/docs/domains/posts/edit_post.md +82 -0
  412. core_framework-4.0.0/docs/domains/posts/hashtag_discovery.md +63 -0
  413. core_framework-4.0.0/docs/domains/posts/post_like.md +99 -0
  414. core_framework-4.0.0/docs/domains/posts/post_report.md +105 -0
  415. core_framework-4.0.0/docs/domains/posts/post_stats_aggregation.md +86 -0
  416. core_framework-4.0.0/docs/domains/posts/post_visibility.md +83 -0
  417. core_framework-4.0.0/docs/domains/posts/retrieve_posts.md +193 -0
  418. core_framework-4.0.0/docs/domains/ratings/README.md +37 -0
  419. core_framework-4.0.0/docs/domains/ratings/admin_ratings.md +127 -0
  420. core_framework-4.0.0/docs/domains/ratings/delete_rating.md +61 -0
  421. core_framework-4.0.0/docs/domains/ratings/edit_rating.md +68 -0
  422. core_framework-4.0.0/docs/domains/ratings/rating-design.md +564 -0
  423. core_framework-4.0.0/docs/domains/ratings/rating-implementation-plan.md +677 -0
  424. core_framework-4.0.0/docs/domains/ratings/rating_report.md +101 -0
  425. core_framework-4.0.0/docs/domains/ratings/rating_stats_aggregation.md +70 -0
  426. core_framework-4.0.0/docs/domains/ratings/rating_upvote.md +96 -0
  427. core_framework-4.0.0/docs/domains/ratings/retrieve_ratings.md +186 -0
  428. core_framework-4.0.0/docs/domains/ratings/upsert_rating.md +75 -0
  429. core_framework-4.0.0/docs/domains/users/account.md +106 -0
  430. core_framework-4.0.0/docs/domains/users/account_deletion.md +174 -0
  431. core_framework-4.0.0/docs/domains/users/admin_users.md +202 -0
  432. core_framework-4.0.0/docs/domains/users/avatar.md +89 -0
  433. core_framework-4.0.0/docs/domains/users/banner.md +77 -0
  434. core_framework-4.0.0/docs/domains/users/blocks.md +138 -0
  435. core_framework-4.0.0/docs/domains/users/change_history.md +127 -0
  436. core_framework-4.0.0/docs/domains/users/check_username_exists.md +60 -0
  437. core_framework-4.0.0/docs/domains/users/follow-system-design.md +464 -0
  438. core_framework-4.0.0/docs/domains/users/follow.md +270 -0
  439. core_framework-4.0.0/docs/domains/users/friendship-system-design.md +1144 -0
  440. core_framework-4.0.0/docs/domains/users/friendship.md +411 -0
  441. core_framework-4.0.0/docs/domains/users/groups-system-design.md +1014 -0
  442. core_framework-4.0.0/docs/domains/users/groups.md +509 -0
  443. core_framework-4.0.0/docs/domains/users/my_posts_and_comments.md +154 -0
  444. core_framework-4.0.0/docs/domains/users/preferences.md +87 -0
  445. core_framework-4.0.0/docs/domains/users/profile.md +221 -0
  446. core_framework-4.0.0/docs/domains/users/public_profile.md +104 -0
  447. core_framework-4.0.0/docs/domains/users/user_removal.md +93 -0
  448. core_framework-4.0.0/docs/domains/users/user_stats_aggregation.md +84 -0
  449. core_framework-4.0.0/docs/domains/users/username_suggest.md +15 -0
  450. core_framework-4.0.0/docs/library/README.md +15 -0
  451. core_framework-4.0.0/docs/library/api.md +275 -0
  452. core_framework-4.0.0/docs/library/capability-wiring.md +357 -0
  453. core_framework-4.0.0/docs/library/core-framework-migration.md +247 -0
  454. core_framework-4.0.0/docs/library/overview.md +56 -0
  455. core_framework-4.0.0/docs/library/package-api.md +1195 -0
  456. core_framework-4.0.0/docs/library/testing-plugin-design.md +255 -0
  457. core_framework-4.0.0/docs/library/workers.md +151 -0
  458. core_framework-4.0.0/docs/platform/README.md +20 -0
  459. core_framework-4.0.0/docs/platform/architecture-decisions.md +855 -0
  460. core_framework-4.0.0/docs/platform/client-error-visibility.md +281 -0
  461. core_framework-4.0.0/docs/platform/conventions.md +108 -0
  462. core_framework-4.0.0/docs/platform/domain-services-and-adapters.md +73 -0
  463. core_framework-4.0.0/docs/platform/glossary.md +190 -0
  464. core_framework-4.0.0/docs/platform/layers-and-boundaries.md +47 -0
  465. core_framework-4.0.0/docs/platform/patch-update-typed-payload.md +194 -0
  466. core_framework-4.0.0/docs/platform/response-composition-and-caching.md +188 -0
  467. core_framework-4.0.0/docs/reviews/README.md +16 -0
  468. core_framework-4.0.0/docs/reviews/log.md +77 -0
  469. core_framework-4.0.0/docs/reviews/review-playbook.md +257 -0
  470. core_framework-4.0.0/docs/reviews/slices.md +337 -0
  471. core_framework-4.0.0/docs/testing.md +167 -0
  472. core_framework-4.0.0/docs/todo.md +9 -0
  473. core_framework-4.0.0/pyproject.toml +156 -0
  474. core_framework-4.0.0/tach.toml +191 -0
  475. core_framework-4.0.0/tests/conftest.py +52 -0
  476. core_framework-4.0.0/tests/e2e/_canaries.py +237 -0
  477. core_framework-4.0.0/tests/e2e/_settings.py +41 -0
  478. core_framework-4.0.0/tests/e2e/_upload_payloads.py +22 -0
  479. core_framework-4.0.0/tests/integration/_http_error_details.py +23 -0
  480. core_framework-4.0.0/tests/integration/_poll.py +23 -0
  481. core_framework-4.0.0/tests/integration/api/_auth_helpers.py +37 -0
  482. core_framework-4.0.0/tests/integration/api/_destructive_delete_helpers.py +108 -0
  483. core_framework-4.0.0/tests/integration/api/_http_helpers.py +100 -0
  484. core_framework-4.0.0/tests/integration/api/_user_deletion_helpers.py +63 -0
  485. core_framework-4.0.0/tests/integration/api/_user_helpers.py +63 -0
  486. core_framework-4.0.0/tests/integration/api/admin/_auth_cases.py +139 -0
  487. core_framework-4.0.0/tests/integration/api/admin/analytics/router_test.py +266 -0
  488. core_framework-4.0.0/tests/integration/api/admin/cache/router_test.py +310 -0
  489. core_framework-4.0.0/tests/integration/api/admin/comments/router_test.py +745 -0
  490. core_framework-4.0.0/tests/integration/api/admin/moderation/router_test.py +2468 -0
  491. core_framework-4.0.0/tests/integration/api/admin/moderator_surfaces_test.py +555 -0
  492. core_framework-4.0.0/tests/integration/api/admin/outbox/router_test.py +340 -0
  493. core_framework-4.0.0/tests/integration/api/admin/posts/router_test.py +476 -0
  494. core_framework-4.0.0/tests/integration/api/admin/users/router_test.py +1450 -0
  495. core_framework-4.0.0/tests/integration/api/attachments/_helpers.py +289 -0
  496. core_framework-4.0.0/tests/integration/api/attachments/attachment_upload_test.py +31 -0
  497. core_framework-4.0.0/tests/integration/api/attachments/conftest.py +14 -0
  498. core_framework-4.0.0/tests/integration/api/auth/router_test.py +55 -0
  499. core_framework-4.0.0/tests/integration/api/comments/authenticated/comment_writes_integration_test.py +668 -0
  500. core_framework-4.0.0/tests/integration/api/comments/comment_attachments_integration_test.py +572 -0
  501. core_framework-4.0.0/tests/integration/api/comments/comment_kind_registry_integration_test.py +266 -0
  502. core_framework-4.0.0/tests/integration/api/comments/public/router_test.py +508 -0
  503. core_framework-4.0.0/tests/integration/api/create_idempotency_integration_test.py +486 -0
  504. core_framework-4.0.0/tests/integration/api/events/router_test.py +710 -0
  505. core_framework-4.0.0/tests/integration/api/groups/groups_integration_test.py +1028 -0
  506. core_framework-4.0.0/tests/integration/api/notifications/inbox_redesign_integration_test.py +596 -0
  507. core_framework-4.0.0/tests/integration/api/notifications/router_test.py +532 -0
  508. core_framework-4.0.0/tests/integration/api/posts/authenticated/post_writes_integration_test.py +547 -0
  509. core_framework-4.0.0/tests/integration/api/posts/followers_visibility_test.py +144 -0
  510. core_framework-4.0.0/tests/integration/api/posts/post_attachments_integration_test.py +663 -0
  511. core_framework-4.0.0/tests/integration/api/posts/post_deletion_integration_test.py +639 -0
  512. core_framework-4.0.0/tests/integration/api/posts/post_stats_dirty_marking_test.py +212 -0
  513. core_framework-4.0.0/tests/integration/api/posts/public/router_test.py +724 -0
  514. core_framework-4.0.0/tests/integration/api/rate_limit_test.py +367 -0
  515. core_framework-4.0.0/tests/integration/api/ratings/_helpers.py +81 -0
  516. core_framework-4.0.0/tests/integration/api/ratings/conftest.py +8 -0
  517. core_framework-4.0.0/tests/integration/api/ratings/ratings_integration_test.py +352 -0
  518. core_framework-4.0.0/tests/integration/api/ratings/ratings_visibility_integration_test.py +273 -0
  519. core_framework-4.0.0/tests/integration/api/restriction_visibility_integration_test.py +410 -0
  520. core_framework-4.0.0/tests/integration/api/users/account_deletion_email_test.py +145 -0
  521. core_framework-4.0.0/tests/integration/api/users/authenticated/friendship_integration_test.py +1022 -0
  522. core_framework-4.0.0/tests/integration/api/users/authenticated/profile_media_upload_test.py +187 -0
  523. core_framework-4.0.0/tests/integration/api/users/authenticated/router_test.py +1110 -0
  524. core_framework-4.0.0/tests/integration/api/users/deletion_audit_integration_test.py +187 -0
  525. core_framework-4.0.0/tests/integration/api/users/public/router_test.py +363 -0
  526. core_framework-4.0.0/tests/integration/api/users/user_deletion_integration_test.py +371 -0
  527. core_framework-4.0.0/tests/integration/conftest.py +14 -0
  528. core_framework-4.0.0/tests/integration/worker/_aggregate_stats_helpers.py +57 -0
  529. core_framework-4.0.0/tests/integration/worker/_arq_helpers.py +148 -0
  530. core_framework-4.0.0/tests/integration/worker/_media_upload_helpers.py +84 -0
  531. core_framework-4.0.0/tests/integration/worker/account_deletion_test.py +431 -0
  532. core_framework-4.0.0/tests/integration/worker/aggregate_comment_stats_test.py +328 -0
  533. core_framework-4.0.0/tests/integration/worker/aggregate_post_stats_test.py +219 -0
  534. core_framework-4.0.0/tests/integration/worker/aggregate_user_stats_test.py +140 -0
  535. core_framework-4.0.0/tests/integration/worker/analytics_refresh_test.py +108 -0
  536. core_framework-4.0.0/tests/integration/worker/conftest.py +29 -0
  537. core_framework-4.0.0/tests/integration/worker/create_idempotency_retention_test.py +277 -0
  538. core_framework-4.0.0/tests/integration/worker/moderation_outbox_test.py +313 -0
  539. core_framework-4.0.0/tests/integration/worker/mute_lift_test.py +174 -0
  540. core_framework-4.0.0/tests/integration/worker/profile_media_upload_test.py +458 -0
  541. core_framework-4.0.0/tests/integration/worker/restriction_fanout_test.py +464 -0
  542. core_framework-4.0.0/tests/integration/worker/user_outbox_test.py +370 -0
  543. core_framework-4.0.0/tests/unit/api/comments/authenticated/comment_request_schemas_test.py +60 -0
  544. core_framework-4.0.0/tests/unit/api/users/profile_update_mapper_test.py +22 -0
  545. core_framework-4.0.0/tests/unit/application/comments/kind_registry_test.py +77 -0
  546. core_framework-4.0.0/tests/unit/application/email/account_deletion_scheduled_test.py +229 -0
  547. core_framework-4.0.0/tests/unit/application/events/event_service_test.py +166 -0
  548. core_framework-4.0.0/tests/unit/application/moderation/restriction_fanout_registry_test.py +119 -0
  549. core_framework-4.0.0/tests/unit/application/notifications/preview_test.py +19 -0
  550. core_framework-4.0.0/tests/unit/application/ratings/kind_registry_test.py +41 -0
  551. core_framework-4.0.0/tests/unit/application/users/account_removal_registry_test.py +70 -0
  552. core_framework-4.0.0/tests/unit/application/users/account_removal_runner_test.py +136 -0
  553. core_framework-4.0.0/tests/unit/core/pagination_test.py +468 -0
  554. core_framework-4.0.0/tests/unit/domains/user/service_test.py +216 -0
  555. core_framework-4.0.0/tests/unit/worker/tasks_registration_test.py +23 -0
  556. core_framework-4.0.0/uv.lock +2778 -0
  557. core_framework-3.2.0/.cursor/rules/alembic-migrations.mdc +0 -60
  558. core_framework-3.2.0/.cursor/rules/constitution.mdc +0 -47
  559. core_framework-3.2.0/.cursor/rules/domain-imports.mdc +0 -44
  560. core_framework-3.2.0/.cursor/rules/error-boundary.mdc +0 -56
  561. core_framework-3.2.0/.cursor/rules/flow-documentation.mdc +0 -15
  562. core_framework-3.2.0/.cursor/rules/integration-test-strategy.mdc +0 -29
  563. core_framework-3.2.0/.cursor/rules/no-code-in-docs.mdc +0 -35
  564. core_framework-3.2.0/.cursor/rules/postgres-config-conventions.mdc +0 -56
  565. core_framework-3.2.0/.cursor/rules/repository-schema-isolation.mdc +0 -85
  566. core_framework-3.2.0/.cursor/rules/strong-reads.mdc +0 -37
  567. core_framework-3.2.0/.cursor/skills/code-review/SKILL.md +0 -35
  568. core_framework-3.2.0/.cursor/skills/implement-feature/SKILL.md +0 -93
  569. core_framework-3.2.0/.cursor/skills/write-flow-doc/SKILL.md +0 -79
  570. core_framework-3.2.0/.github/workflows/_deploy.yml +0 -238
  571. core_framework-3.2.0/.github/workflows/dev-ci-cd.yaml +0 -235
  572. core_framework-3.2.0/.github/workflows/manual-deployment.yaml +0 -52
  573. core_framework-3.2.0/.github/workflows/manual-observability-deployment.yaml +0 -225
  574. core_framework-3.2.0/.github/workflows/test.yaml +0 -187
  575. core_framework-3.2.0/CHANGELOG.md +0 -606
  576. core_framework-3.2.0/PKG-INFO +0 -145
  577. core_framework-3.2.0/README.md +0 -99
  578. core_framework-3.2.0/config.toml +0 -147
  579. core_framework-3.2.0/config.toml.template +0 -131
  580. core_framework-3.2.0/core_framework/api/admin/analytics/router.py +0 -44
  581. core_framework-3.2.0/core_framework/api/admin/analytics/schemas.py +0 -59
  582. core_framework-3.2.0/core_framework/api/admin/cache/router.py +0 -26
  583. core_framework-3.2.0/core_framework/api/admin/cache/schemas.py +0 -91
  584. core_framework-3.2.0/core_framework/api/admin/comments/router.py +0 -68
  585. core_framework-3.2.0/core_framework/api/admin/comments/schemas.py +0 -49
  586. core_framework-3.2.0/core_framework/api/admin/moderation/router.py +0 -211
  587. core_framework-3.2.0/core_framework/api/admin/moderation/schemas.py +0 -105
  588. core_framework-3.2.0/core_framework/api/admin/outbox/router.py +0 -61
  589. core_framework-3.2.0/core_framework/api/admin/posts/router.py +0 -58
  590. core_framework-3.2.0/core_framework/api/admin/posts/schemas.py +0 -31
  591. core_framework-3.2.0/core_framework/api/admin/router.py +0 -23
  592. core_framework-3.2.0/core_framework/api/admin/users/router.py +0 -189
  593. core_framework-3.2.0/core_framework/api/admin/users/schemas.py +0 -136
  594. core_framework-3.2.0/core_framework/api/attachments/router.py +0 -43
  595. core_framework-3.2.0/core_framework/api/attachments/schemas.py +0 -48
  596. core_framework-3.2.0/core_framework/api/auth/router.py +0 -21
  597. core_framework-3.2.0/core_framework/api/auth/schemas.py +0 -15
  598. core_framework-3.2.0/core_framework/api/comments/authenticated/mappers.py +0 -17
  599. core_framework-3.2.0/core_framework/api/comments/authenticated/router.py +0 -143
  600. core_framework-3.2.0/core_framework/api/comments/authenticated/schemas.py +0 -79
  601. core_framework-3.2.0/core_framework/api/comments/public/router.py +0 -100
  602. core_framework-3.2.0/core_framework/api/comments/public/schemas.py +0 -42
  603. core_framework-3.2.0/core_framework/api/comments/schemas.py +0 -19
  604. core_framework-3.2.0/core_framework/api/constants.py +0 -3
  605. core_framework-3.2.0/core_framework/api/dependencies.py +0 -145
  606. core_framework-3.2.0/core_framework/api/events/router.py +0 -48
  607. core_framework-3.2.0/core_framework/api/notifications/authenticated/router.py +0 -78
  608. core_framework-3.2.0/core_framework/api/notifications/authenticated/schemas.py +0 -104
  609. core_framework-3.2.0/core_framework/api/posts/authenticated/mappers.py +0 -19
  610. core_framework-3.2.0/core_framework/api/posts/authenticated/router.py +0 -111
  611. core_framework-3.2.0/core_framework/api/posts/authenticated/schemas.py +0 -77
  612. core_framework-3.2.0/core_framework/api/posts/public/router.py +0 -109
  613. core_framework-3.2.0/core_framework/api/posts/schemas.py +0 -35
  614. core_framework-3.2.0/core_framework/api/router.py +0 -23
  615. core_framework-3.2.0/core_framework/api/schemas.py +0 -13
  616. core_framework-3.2.0/core_framework/api/users/authenticated/router.py +0 -542
  617. core_framework-3.2.0/core_framework/api/users/authenticated/schemas.py +0 -101
  618. core_framework-3.2.0/core_framework/api/users/mappers.py +0 -16
  619. core_framework-3.2.0/core_framework/api/users/public/router.py +0 -28
  620. core_framework-3.2.0/core_framework/api/users/public/schemas.py +0 -33
  621. core_framework-3.2.0/core_framework/api/users/shared/schemas.py +0 -204
  622. core_framework-3.2.0/core_framework/application/analytics/bucket_service.py +0 -43
  623. core_framework-3.2.0/core_framework/application/analytics/read_service.py +0 -74
  624. core_framework-3.2.0/core_framework/application/analytics/refresh_service.py +0 -54
  625. core_framework-3.2.0/core_framework/application/auth/access_service.py +0 -29
  626. core_framework-3.2.0/core_framework/application/auth/auth_service.py +0 -26
  627. core_framework-3.2.0/core_framework/application/auth/models.py +0 -12
  628. core_framework-3.2.0/core_framework/application/auth/token_verification.py +0 -29
  629. core_framework-3.2.0/core_framework/application/bootstrap.py +0 -61
  630. core_framework-3.2.0/core_framework/application/comments/admin_service.py +0 -307
  631. core_framework-3.2.0/core_framework/application/comments/aggregation_service.py +0 -43
  632. core_framework-3.2.0/core_framework/application/comments/authenticated_service.py +0 -234
  633. core_framework-3.2.0/core_framework/application/comments/cleanup_service.py +0 -109
  634. core_framework-3.2.0/core_framework/application/comments/public_service.py +0 -339
  635. core_framework-3.2.0/core_framework/application/email/__init__.py +0 -29
  636. core_framework-3.2.0/core_framework/application/email/account_deletion_scheduled.py +0 -77
  637. core_framework-3.2.0/core_framework/application/events/README.md +0 -31
  638. core_framework-3.2.0/core_framework/application/events/event_service.py +0 -148
  639. core_framework-3.2.0/core_framework/application/media/README.md +0 -19
  640. core_framework-3.2.0/core_framework/application/media/attachment_service.py +0 -503
  641. core_framework-3.2.0/core_framework/application/media/avatar_service.py +0 -168
  642. core_framework-3.2.0/core_framework/application/media/banner_service.py +0 -164
  643. core_framework-3.2.0/core_framework/application/moderation/appeal_service.py +0 -112
  644. core_framework-3.2.0/core_framework/application/moderation/moderator_service.py +0 -42
  645. core_framework-3.2.0/core_framework/application/moderation/report_service.py +0 -203
  646. core_framework-3.2.0/core_framework/application/moderation/user_service.py +0 -218
  647. core_framework-3.2.0/core_framework/application/notifications/README.md +0 -16
  648. core_framework-3.2.0/core_framework/application/notifications/enums.py +0 -11
  649. core_framework-3.2.0/core_framework/application/notifications/inbox_service.py +0 -239
  650. core_framework-3.2.0/core_framework/application/notifications/mute_service.py +0 -34
  651. core_framework-3.2.0/core_framework/application/notifications/notification_service.py +0 -170
  652. core_framework-3.2.0/core_framework/application/outbox/block_mirrors.py +0 -54
  653. core_framework-3.2.0/core_framework/application/outbox/events.py +0 -122
  654. core_framework-3.2.0/core_framework/application/outbox/handlers.py +0 -115
  655. core_framework-3.2.0/core_framework/application/outbox/ops_service.py +0 -72
  656. core_framework-3.2.0/core_framework/application/outbox/processing_service.py +0 -94
  657. core_framework-3.2.0/core_framework/application/outbox/restriction_mirrors.py +0 -46
  658. core_framework-3.2.0/core_framework/application/posts/admin_service.py +0 -173
  659. core_framework-3.2.0/core_framework/application/posts/aggregation_service.py +0 -55
  660. core_framework-3.2.0/core_framework/application/posts/authenticated_service.py +0 -130
  661. core_framework-3.2.0/core_framework/application/posts/cleanup_service.py +0 -127
  662. core_framework-3.2.0/core_framework/application/posts/public_service.py +0 -365
  663. core_framework-3.2.0/core_framework/application/shared/enums.py +0 -42
  664. core_framework-3.2.0/core_framework/application/shared/exceptions.py +0 -92
  665. core_framework-3.2.0/core_framework/application/shared/worker_jobs.py +0 -62
  666. core_framework-3.2.0/core_framework/application/users/admin_service.py +0 -308
  667. core_framework-3.2.0/core_framework/application/users/aggregation_service.py +0 -21
  668. core_framework-3.2.0/core_framework/application/users/authenticated_service.py +0 -388
  669. core_framework-3.2.0/core_framework/application/users/public_service.py +0 -162
  670. core_framework-3.2.0/core_framework/application/users/scheduled_service.py +0 -6
  671. core_framework-3.2.0/core_framework/application/users/user_deletion_service.py +0 -268
  672. core_framework-3.2.0/core_framework/bundled_alembic.py +0 -44
  673. core_framework-3.2.0/core_framework/constants.py +0 -15
  674. core_framework-3.2.0/core_framework/core/__init__.py +0 -33
  675. core_framework-3.2.0/core_framework/core/cache.py +0 -193
  676. core_framework-3.2.0/core_framework/core/exception_handlers/application.py +0 -131
  677. core_framework-3.2.0/core_framework/core/exception_handlers/common.py +0 -68
  678. core_framework-3.2.0/core_framework/core/exception_handlers/setup.py +0 -36
  679. core_framework-3.2.0/core_framework/core/middleware.py +0 -160
  680. core_framework-3.2.0/core_framework/core/observability.py +0 -648
  681. core_framework-3.2.0/core_framework/core/pagination.py +0 -198
  682. core_framework-3.2.0/core_framework/core/settings.py +0 -555
  683. core_framework-3.2.0/core_framework/domains/analytics/README.md +0 -42
  684. core_framework-3.2.0/core_framework/domains/analytics/__init__.py +0 -22
  685. core_framework-3.2.0/core_framework/domains/analytics/constants.py +0 -19
  686. core_framework-3.2.0/core_framework/domains/analytics/repository.py +0 -260
  687. core_framework-3.2.0/core_framework/domains/analytics/service.py +0 -300
  688. core_framework-3.2.0/core_framework/domains/auth/README.md +0 -68
  689. core_framework-3.2.0/core_framework/domains/auth/__init__.py +0 -8
  690. core_framework-3.2.0/core_framework/domains/auth/dependencies.py +0 -28
  691. core_framework-3.2.0/core_framework/domains/auth/exceptions.py +0 -10
  692. core_framework-3.2.0/core_framework/domains/auth/models.py +0 -31
  693. core_framework-3.2.0/core_framework/domains/auth/ports/auth.py +0 -54
  694. core_framework-3.2.0/core_framework/domains/auth/service.py +0 -58
  695. core_framework-3.2.0/core_framework/domains/comment/README.md +0 -262
  696. core_framework-3.2.0/core_framework/domains/comment/__init__.py +0 -51
  697. core_framework-3.2.0/core_framework/domains/comment/constants.py +0 -8
  698. core_framework-3.2.0/core_framework/domains/comment/enums.py +0 -32
  699. core_framework-3.2.0/core_framework/domains/comment/exceptions.py +0 -30
  700. core_framework-3.2.0/core_framework/domains/comment/models.py +0 -225
  701. core_framework-3.2.0/core_framework/domains/comment/outcomes.py +0 -19
  702. core_framework-3.2.0/core_framework/domains/comment/repository.py +0 -2400
  703. core_framework-3.2.0/core_framework/domains/comment/service.py +0 -946
  704. core_framework-3.2.0/core_framework/domains/email/dependencies.py +0 -91
  705. core_framework-3.2.0/core_framework/domains/email/models.py +0 -3
  706. core_framework-3.2.0/core_framework/domains/media/README.md +0 -30
  707. core_framework-3.2.0/core_framework/domains/media/__init__.py +0 -59
  708. core_framework-3.2.0/core_framework/domains/media/attachment/components/staging.py +0 -166
  709. core_framework-3.2.0/core_framework/domains/media/attachment/components/variant_encoder.py +0 -48
  710. core_framework-3.2.0/core_framework/domains/media/attachment/constants.py +0 -41
  711. core_framework-3.2.0/core_framework/domains/media/attachment/models.py +0 -27
  712. core_framework-3.2.0/core_framework/domains/media/attachment/ports/variant_encoder.py +0 -42
  713. core_framework-3.2.0/core_framework/domains/media/attachment/service.py +0 -501
  714. core_framework-3.2.0/core_framework/domains/media/avatar/service.py +0 -340
  715. core_framework-3.2.0/core_framework/domains/media/banner/service.py +0 -335
  716. core_framework-3.2.0/core_framework/domains/media/dependencies.py +0 -332
  717. core_framework-3.2.0/core_framework/domains/media/shared/outcomes.py +0 -21
  718. core_framework-3.2.0/core_framework/domains/media/shared/repository.py +0 -806
  719. core_framework-3.2.0/core_framework/domains/media/shared/service.py +0 -8
  720. core_framework-3.2.0/core_framework/domains/moderation/README.md +0 -140
  721. core_framework-3.2.0/core_framework/domains/moderation/dependencies.py +0 -90
  722. core_framework-3.2.0/core_framework/domains/moderation/enums.py +0 -66
  723. core_framework-3.2.0/core_framework/domains/moderation/outbox_repository.py +0 -187
  724. core_framework-3.2.0/core_framework/domains/moderation/outbox_service.py +0 -52
  725. core_framework-3.2.0/core_framework/domains/moderation/repository.py +0 -1308
  726. core_framework-3.2.0/core_framework/domains/moderation/service.py +0 -884
  727. core_framework-3.2.0/core_framework/domains/notification/README.md +0 -156
  728. core_framework-3.2.0/core_framework/domains/notification/__init__.py +0 -16
  729. core_framework-3.2.0/core_framework/domains/notification/enums.py +0 -19
  730. core_framework-3.2.0/core_framework/domains/notification/models.py +0 -24
  731. core_framework-3.2.0/core_framework/domains/notification/repository.py +0 -629
  732. core_framework-3.2.0/core_framework/domains/notification/service.py +0 -301
  733. core_framework-3.2.0/core_framework/domains/outbox/README.md +0 -69
  734. core_framework-3.2.0/core_framework/domains/outbox/__init__.py +0 -19
  735. core_framework-3.2.0/core_framework/domains/outbox/ports/admin.py +0 -35
  736. core_framework-3.2.0/core_framework/domains/outbox/service.py +0 -62
  737. core_framework-3.2.0/core_framework/domains/post/README.md +0 -208
  738. core_framework-3.2.0/core_framework/domains/post/__init__.py +0 -42
  739. core_framework-3.2.0/core_framework/domains/post/constants.py +0 -9
  740. core_framework-3.2.0/core_framework/domains/post/enums.py +0 -40
  741. core_framework-3.2.0/core_framework/domains/post/exceptions.py +0 -20
  742. core_framework-3.2.0/core_framework/domains/post/models.py +0 -209
  743. core_framework-3.2.0/core_framework/domains/post/repository.py +0 -2255
  744. core_framework-3.2.0/core_framework/domains/post/service.py +0 -935
  745. core_framework-3.2.0/core_framework/domains/repository_sql.py +0 -44
  746. core_framework-3.2.0/core_framework/domains/user/README.md +0 -105
  747. core_framework-3.2.0/core_framework/domains/user/__init__.py +0 -57
  748. core_framework-3.2.0/core_framework/domains/user/constants.py +0 -19
  749. core_framework-3.2.0/core_framework/domains/user/dependencies.py +0 -90
  750. core_framework-3.2.0/core_framework/domains/user/enums.py +0 -19
  751. core_framework-3.2.0/core_framework/domains/user/models.py +0 -348
  752. core_framework-3.2.0/core_framework/domains/user/outbox_repository.py +0 -186
  753. core_framework-3.2.0/core_framework/domains/user/outbox_service.py +0 -52
  754. core_framework-3.2.0/core_framework/domains/user/outcomes.py +0 -31
  755. core_framework-3.2.0/core_framework/domains/user/repository.py +0 -1745
  756. core_framework-3.2.0/core_framework/domains/user/service.py +0 -999
  757. core_framework-3.2.0/core_framework/domains/utils.py +0 -241
  758. core_framework-3.2.0/core_framework/infrastructure/firebase/firebase_auth_adapter.py +0 -114
  759. core_framework-3.2.0/core_framework/infrastructure/media/attachment_staging_display_geometry.py +0 -71
  760. core_framework-3.2.0/core_framework/infrastructure/media/pillow_attachment_variant_encoder_adapter.py +0 -194
  761. core_framework-3.2.0/core_framework/main.py +0 -69
  762. core_framework-3.2.0/core_framework/testing/__init__.py +0 -7
  763. core_framework-3.2.0/core_framework/testing/arq.py +0 -121
  764. core_framework-3.2.0/core_framework/testing/auth.py +0 -304
  765. core_framework-3.2.0/core_framework/testing/config.py +0 -44
  766. core_framework-3.2.0/core_framework/testing/containers.py +0 -77
  767. core_framework-3.2.0/core_framework/testing/hookspecs.py +0 -14
  768. core_framework-3.2.0/core_framework/testing/media.py +0 -271
  769. core_framework-3.2.0/core_framework/testing/plugin.py +0 -218
  770. core_framework-3.2.0/core_framework/worker/main.py +0 -136
  771. core_framework-3.2.0/core_framework/worker/schedules/__init__.py +0 -138
  772. core_framework-3.2.0/core_framework/worker/schedules/schedule_expired_account_deletions.py +0 -37
  773. core_framework-3.2.0/core_framework/worker/schedules/schedule_expired_mute_lifts.py +0 -34
  774. core_framework-3.2.0/core_framework/worker/schedules/schedule_purge_expired_create_idempotency_keys.py +0 -17
  775. core_framework-3.2.0/core_framework/worker/schedules/schedule_refresh_analytics.py +0 -7
  776. core_framework-3.2.0/core_framework/worker/tasks/__init__.py +0 -77
  777. core_framework-3.2.0/core_framework/worker/tasks/process_account_deletion.py +0 -21
  778. core_framework-3.2.0/core_framework/worker/tasks/process_cache_pattern_invalidation.py +0 -31
  779. core_framework-3.2.0/core_framework/worker/tasks/process_destructive_comment_delete.py +0 -15
  780. core_framework-3.2.0/core_framework/worker/tasks/process_destructive_post_delete.py +0 -15
  781. core_framework-3.2.0/core_framework/worker/tasks/process_user_content_deletion.py +0 -15
  782. core_framework-3.2.0/deploy/app/docker-compose.yml +0 -47
  783. core_framework-3.2.0/deploy/observability/README.md +0 -11
  784. core_framework-3.2.0/deploy/observability/docker-compose.yml +0 -153
  785. core_framework-3.2.0/deploy/observability/prometheus.yml +0 -39
  786. core_framework-3.2.0/deploy/observability/targets.example/README.md +0 -19
  787. core_framework-3.2.0/deploy/observability/targets.example/node.yml.example +0 -9
  788. core_framework-3.2.0/deploy/observability/targets.example/postgres.yml.example +0 -5
  789. core_framework-3.2.0/deploy/observability/targets.example/redis.yml.example +0 -6
  790. core_framework-3.2.0/docs/README.md +0 -48
  791. core_framework-3.2.0/docs/deployments/README.md +0 -56
  792. core_framework-3.2.0/docs/deployments/deploy-playbook.md +0 -246
  793. core_framework-3.2.0/docs/deployments/e2e-smoke-tests-design.md +0 -353
  794. core_framework-3.2.0/docs/deployments/edge-rate-limits.md +0 -63
  795. core_framework-3.2.0/docs/deployments/guides/playbook/postgres-backup-playbook.md +0 -303
  796. core_framework-3.2.0/docs/deployments/guides/setup/app-server-deploy-ssh.md +0 -72
  797. core_framework-3.2.0/docs/deployments/guides/setup/caddy-setup.md +0 -57
  798. core_framework-3.2.0/docs/deployments/guides/setup/cloudflare-setup.md +0 -129
  799. core_framework-3.2.0/docs/deployments/guides/setup/image-server-ssh.md +0 -99
  800. core_framework-3.2.0/docs/deployments/guides/setup/observability-lgtm-setup.md +0 -204
  801. core_framework-3.2.0/docs/deployments/guides/setup/postgres-backup-setup.md +0 -323
  802. core_framework-3.2.0/docs/deployments/guides/setup/postgres-setup.md +0 -165
  803. core_framework-3.2.0/docs/deployments/guides/setup/redis-setup.md +0 -117
  804. core_framework-3.2.0/docs/deployments/guides/setup/ubuntu-server-setup.md +0 -179
  805. core_framework-3.2.0/docs/deployments/postgres-backup-design.md +0 -176
  806. core_framework-3.2.0/docs/deployments/release-playbook.md +0 -84
  807. core_framework-3.2.0/docs/design/README.md +0 -32
  808. core_framework-3.2.0/docs/design/analytics-rollup-design.md +0 -985
  809. core_framework-3.2.0/docs/design/cache-invalidation-design.md +0 -148
  810. core_framework-3.2.0/docs/design/create-idempotency-design.md +0 -282
  811. core_framework-3.2.0/docs/design/event-outbox-design.md +0 -603
  812. core_framework-3.2.0/docs/design/events-ingest-design.md +0 -228
  813. core_framework-3.2.0/docs/design/media-storage-topology.md +0 -141
  814. core_framework-3.2.0/docs/design/observability-lgtm-design.md +0 -591
  815. core_framework-3.2.0/docs/design/outbox-admin-ops-design.md +0 -337
  816. core_framework-3.2.0/docs/design/transactional-email-design.md +0 -616
  817. core_framework-3.2.0/docs/design/utm-events-design.md +0 -272
  818. core_framework-3.2.0/docs/domains/README.md +0 -23
  819. core_framework-3.2.0/docs/domains/analytics/admin_analytics_reads.md +0 -135
  820. core_framework-3.2.0/docs/domains/auth/access_control.md +0 -70
  821. core_framework-3.2.0/docs/domains/auth/registration.md +0 -60
  822. core_framework-3.2.0/docs/domains/cache/admin_cache_invalidation.md +0 -182
  823. core_framework-3.2.0/docs/domains/comments/README.md +0 -31
  824. core_framework-3.2.0/docs/domains/comments/admin_comments.md +0 -218
  825. core_framework-3.2.0/docs/domains/comments/comment_like.md +0 -96
  826. core_framework-3.2.0/docs/domains/comments/comment_report.md +0 -118
  827. core_framework-3.2.0/docs/domains/comments/comment_stats_aggregation.md +0 -69
  828. core_framework-3.2.0/docs/domains/comments/create_comment.md +0 -174
  829. core_framework-3.2.0/docs/domains/comments/delete_comment.md +0 -67
  830. core_framework-3.2.0/docs/domains/comments/edit_comment.md +0 -74
  831. core_framework-3.2.0/docs/domains/comments/retrieve_comments.md +0 -228
  832. core_framework-3.2.0/docs/domains/deletion/comments.md +0 -289
  833. core_framework-3.2.0/docs/domains/deletion/overview.md +0 -202
  834. core_framework-3.2.0/docs/domains/deletion/posts.md +0 -312
  835. core_framework-3.2.0/docs/domains/deletion/users.md +0 -501
  836. core_framework-3.2.0/docs/domains/events/events.md +0 -245
  837. core_framework-3.2.0/docs/domains/media/README.md +0 -36
  838. core_framework-3.2.0/docs/domains/media/attachment_upload.md +0 -75
  839. core_framework-3.2.0/docs/domains/media/avatar-upload-design.md +0 -110
  840. core_framework-3.2.0/docs/domains/media/banner-upload-design.md +0 -150
  841. core_framework-3.2.0/docs/domains/media/post-comment-attachments-design.md +0 -521
  842. core_framework-3.2.0/docs/domains/media/upload-pipeline-design.md +0 -468
  843. core_framework-3.2.0/docs/domains/media/upload_pipeline.md +0 -110
  844. core_framework-3.2.0/docs/domains/mentions/mentions_in_content.md +0 -238
  845. core_framework-3.2.0/docs/domains/moderation/README.md +0 -28
  846. core_framework-3.2.0/docs/domains/moderation/appeals.md +0 -245
  847. core_framework-3.2.0/docs/domains/moderation/internal_notes.md +0 -159
  848. core_framework-3.2.0/docs/domains/moderation/moderator_actions.md +0 -70
  849. core_framework-3.2.0/docs/domains/moderation/reports.md +0 -186
  850. core_framework-3.2.0/docs/domains/moderation/restrictions.md +0 -250
  851. core_framework-3.2.0/docs/domains/notifications/notification_inbox.md +0 -384
  852. core_framework-3.2.0/docs/domains/outbox/admin_outbox_ops.md +0 -187
  853. core_framework-3.2.0/docs/domains/posts/admin_posts.md +0 -214
  854. core_framework-3.2.0/docs/domains/posts/author_context.md +0 -92
  855. core_framework-3.2.0/docs/domains/posts/create_post.md +0 -121
  856. core_framework-3.2.0/docs/domains/posts/delete_post.md +0 -64
  857. core_framework-3.2.0/docs/domains/posts/edit_post.md +0 -80
  858. core_framework-3.2.0/docs/domains/posts/hashtag_discovery.md +0 -61
  859. core_framework-3.2.0/docs/domains/posts/post_like.md +0 -95
  860. core_framework-3.2.0/docs/domains/posts/post_report.md +0 -105
  861. core_framework-3.2.0/docs/domains/posts/post_stats_aggregation.md +0 -90
  862. core_framework-3.2.0/docs/domains/posts/post_visibility.md +0 -83
  863. core_framework-3.2.0/docs/domains/posts/retrieve_posts.md +0 -190
  864. core_framework-3.2.0/docs/domains/users/account.md +0 -106
  865. core_framework-3.2.0/docs/domains/users/account_deletion.md +0 -128
  866. core_framework-3.2.0/docs/domains/users/admin_users.md +0 -166
  867. core_framework-3.2.0/docs/domains/users/avatar.md +0 -92
  868. core_framework-3.2.0/docs/domains/users/banner.md +0 -78
  869. core_framework-3.2.0/docs/domains/users/blocks.md +0 -125
  870. core_framework-3.2.0/docs/domains/users/change_history.md +0 -133
  871. core_framework-3.2.0/docs/domains/users/check_username_exists.md +0 -57
  872. core_framework-3.2.0/docs/domains/users/follow-system-design.md +0 -424
  873. core_framework-3.2.0/docs/domains/users/follow.md +0 -222
  874. core_framework-3.2.0/docs/domains/users/my_posts_and_comments.md +0 -113
  875. core_framework-3.2.0/docs/domains/users/preferences.md +0 -87
  876. core_framework-3.2.0/docs/domains/users/profile.md +0 -204
  877. core_framework-3.2.0/docs/domains/users/public_profile.md +0 -99
  878. core_framework-3.2.0/docs/domains/users/user_removal.md +0 -86
  879. core_framework-3.2.0/docs/domains/users/user_stats_aggregation.md +0 -80
  880. core_framework-3.2.0/docs/library/README.md +0 -15
  881. core_framework-3.2.0/docs/library/api.md +0 -212
  882. core_framework-3.2.0/docs/library/capability-wiring.md +0 -170
  883. core_framework-3.2.0/docs/library/core-framework-migration.md +0 -253
  884. core_framework-3.2.0/docs/library/overview.md +0 -55
  885. core_framework-3.2.0/docs/library/package-api.md +0 -622
  886. core_framework-3.2.0/docs/library/testing-plugin-design.md +0 -317
  887. core_framework-3.2.0/docs/library/workers.md +0 -105
  888. core_framework-3.2.0/docs/platform/README.md +0 -18
  889. core_framework-3.2.0/docs/platform/architecture-decisions.md +0 -555
  890. core_framework-3.2.0/docs/platform/client-error-visibility.md +0 -274
  891. core_framework-3.2.0/docs/platform/conventions.md +0 -101
  892. core_framework-3.2.0/docs/platform/domain-services-and-adapters.md +0 -71
  893. core_framework-3.2.0/docs/platform/layers-and-boundaries.md +0 -46
  894. core_framework-3.2.0/docs/platform/patch-update-typed-payload.md +0 -191
  895. core_framework-3.2.0/docs/reviews/README.md +0 -11
  896. core_framework-3.2.0/docs/reviews/log.md +0 -12
  897. core_framework-3.2.0/docs/reviews/review-playbook.md +0 -192
  898. core_framework-3.2.0/docs/reviews/slices.md +0 -301
  899. core_framework-3.2.0/docs/testing.md +0 -150
  900. core_framework-3.2.0/docs/todo.md +0 -5
  901. core_framework-3.2.0/pyproject.toml +0 -155
  902. core_framework-3.2.0/tach.toml +0 -184
  903. core_framework-3.2.0/tests/conftest.py +0 -49
  904. core_framework-3.2.0/tests/e2e/_canaries.py +0 -140
  905. core_framework-3.2.0/tests/e2e/_settings.py +0 -40
  906. core_framework-3.2.0/tests/e2e/_upload_payloads.py +0 -18
  907. core_framework-3.2.0/tests/integration/_http_error_details.py +0 -19
  908. core_framework-3.2.0/tests/integration/api/_auth_helpers.py +0 -6
  909. core_framework-3.2.0/tests/integration/api/_destructive_delete_helpers.py +0 -51
  910. core_framework-3.2.0/tests/integration/api/_http_helpers.py +0 -95
  911. core_framework-3.2.0/tests/integration/api/_user_deletion_helpers.py +0 -63
  912. core_framework-3.2.0/tests/integration/api/_user_helpers.py +0 -26
  913. core_framework-3.2.0/tests/integration/api/admin/_auth_cases.py +0 -53
  914. core_framework-3.2.0/tests/integration/api/admin/analytics/router_test.py +0 -263
  915. core_framework-3.2.0/tests/integration/api/admin/cache/router_test.py +0 -307
  916. core_framework-3.2.0/tests/integration/api/admin/comments/router_test.py +0 -735
  917. core_framework-3.2.0/tests/integration/api/admin/moderation/_auth_cases.py +0 -30
  918. core_framework-3.2.0/tests/integration/api/admin/moderation/router_test.py +0 -2545
  919. core_framework-3.2.0/tests/integration/api/admin/outbox/router_test.py +0 -337
  920. core_framework-3.2.0/tests/integration/api/admin/posts/router_test.py +0 -472
  921. core_framework-3.2.0/tests/integration/api/admin/users/router_test.py +0 -1464
  922. core_framework-3.2.0/tests/integration/api/attachments/_helpers.py +0 -210
  923. core_framework-3.2.0/tests/integration/api/attachments/attachment_upload_test.py +0 -29
  924. core_framework-3.2.0/tests/integration/api/auth/router_test.py +0 -52
  925. core_framework-3.2.0/tests/integration/api/comments/authenticated/comment_writes_integration_test.py +0 -663
  926. core_framework-3.2.0/tests/integration/api/comments/comment_attachments_integration_test.py +0 -576
  927. core_framework-3.2.0/tests/integration/api/comments/public/router_test.py +0 -514
  928. core_framework-3.2.0/tests/integration/api/create_idempotency_integration_test.py +0 -486
  929. core_framework-3.2.0/tests/integration/api/events/router_test.py +0 -758
  930. core_framework-3.2.0/tests/integration/api/notifications/router_test.py +0 -538
  931. core_framework-3.2.0/tests/integration/api/posts/authenticated/post_writes_integration_test.py +0 -311
  932. core_framework-3.2.0/tests/integration/api/posts/followers_visibility_test.py +0 -144
  933. core_framework-3.2.0/tests/integration/api/posts/post_attachments_integration_test.py +0 -660
  934. core_framework-3.2.0/tests/integration/api/posts/post_deletion_integration_test.py +0 -624
  935. core_framework-3.2.0/tests/integration/api/posts/post_stats_dirty_marking_test.py +0 -212
  936. core_framework-3.2.0/tests/integration/api/posts/public/router_test.py +0 -1015
  937. core_framework-3.2.0/tests/integration/api/users/account_deletion_email_test.py +0 -145
  938. core_framework-3.2.0/tests/integration/api/users/authenticated/avatar_upload_test.py +0 -112
  939. core_framework-3.2.0/tests/integration/api/users/authenticated/banner_upload_test.py +0 -112
  940. core_framework-3.2.0/tests/integration/api/users/authenticated/router_test.py +0 -1100
  941. core_framework-3.2.0/tests/integration/api/users/deletion_audit_integration_test.py +0 -187
  942. core_framework-3.2.0/tests/integration/api/users/public/router_test.py +0 -334
  943. core_framework-3.2.0/tests/integration/api/users/user_deletion_integration_test.py +0 -371
  944. core_framework-3.2.0/tests/integration/worker/_media_upload_helpers.py +0 -84
  945. core_framework-3.2.0/tests/integration/worker/account_deletion_test.py +0 -385
  946. core_framework-3.2.0/tests/integration/worker/aggregate_comment_stats_test.py +0 -354
  947. core_framework-3.2.0/tests/integration/worker/aggregate_post_stats_test.py +0 -257
  948. core_framework-3.2.0/tests/integration/worker/aggregate_user_stats_test.py +0 -123
  949. core_framework-3.2.0/tests/integration/worker/analytics_refresh_test.py +0 -108
  950. core_framework-3.2.0/tests/integration/worker/avatar_upload_test.py +0 -370
  951. core_framework-3.2.0/tests/integration/worker/banner_upload_test.py +0 -367
  952. core_framework-3.2.0/tests/integration/worker/conftest.py +0 -21
  953. core_framework-3.2.0/tests/integration/worker/create_idempotency_retention_test.py +0 -280
  954. core_framework-3.2.0/tests/integration/worker/moderation_outbox_test.py +0 -313
  955. core_framework-3.2.0/tests/integration/worker/mute_lift_test.py +0 -166
  956. core_framework-3.2.0/tests/integration/worker/user_outbox_test.py +0 -370
  957. core_framework-3.2.0/tests/integration/worker/utils_test.py +0 -116
  958. core_framework-3.2.0/tests/unit/api/comments/authenticated/comment_request_schemas_test.py +0 -60
  959. core_framework-3.2.0/tests/unit/api/users/profile_update_mapper_test.py +0 -22
  960. core_framework-3.2.0/tests/unit/application/email/account_deletion_scheduled_test.py +0 -219
  961. core_framework-3.2.0/tests/unit/application/events/event_service_test.py +0 -149
  962. core_framework-3.2.0/tests/unit/application/notifications/inbox_service_test.py +0 -111
  963. core_framework-3.2.0/tests/unit/core/pagination_test.py +0 -582
  964. core_framework-3.2.0/tests/unit/domains/user/service_test.py +0 -228
  965. core_framework-3.2.0/uv.lock +0 -2607
  966. {core_framework-3.2.0 → core_framework-4.0.0}/.agents/skills/fastapi +0 -0
  967. {core_framework-3.2.0 → core_framework-4.0.0}/.agents/skills/library-skills/.library-skills.json +0 -0
  968. {core_framework-3.2.0 → core_framework-4.0.0}/.agents/skills/library-skills/SKILL.md +0 -0
  969. {core_framework-3.2.0 → core_framework-4.0.0}/.cursor/rules/api-layer.mdc +0 -0
  970. {core_framework-3.2.0 → core_framework-4.0.0}/.cursor/rules/api-reference-docs.mdc +0 -0
  971. {core_framework-3.2.0 → core_framework-4.0.0}/.cursor/rules/api-validation.mdc +0 -0
  972. {core_framework-3.2.0 → core_framework-4.0.0}/.cursor/rules/application-layer.mdc +0 -0
  973. {core_framework-3.2.0 → core_framework-4.0.0}/.cursor/rules/constants-final.mdc +0 -0
  974. {core_framework-3.2.0 → core_framework-4.0.0}/.cursor/rules/database-triggers.mdc +0 -0
  975. {core_framework-3.2.0 → core_framework-4.0.0}/.cursor/rules/docstrings.mdc +0 -0
  976. {core_framework-3.2.0 → core_framework-4.0.0}/.cursor/rules/domain-caller-context.mdc +0 -0
  977. {core_framework-3.2.0 → core_framework-4.0.0}/.cursor/rules/domain-input-guards.mdc +0 -0
  978. {core_framework-3.2.0 → core_framework-4.0.0}/.cursor/rules/domain-repository-exceptions.mdc +0 -0
  979. {core_framework-3.2.0 → core_framework-4.0.0}/.cursor/rules/domain-services-and-adapters.mdc +0 -0
  980. {core_framework-3.2.0 → core_framework-4.0.0}/.cursor/rules/inline-raise-messages.mdc +0 -0
  981. {core_framework-3.2.0 → core_framework-4.0.0}/.cursor/rules/layer-boundaries.mdc +0 -0
  982. {core_framework-3.2.0 → core_framework-4.0.0}/.cursor/rules/structured-logging.mdc +0 -0
  983. {core_framework-3.2.0 → core_framework-4.0.0}/.cursor/skills/add-config/SKILL.md +0 -0
  984. {core_framework-3.2.0 → core_framework-4.0.0}/.cursor/skills/add-domain/SKILL.md +0 -0
  985. {core_framework-3.2.0 → core_framework-4.0.0}/.cursor/skills/fastapi +0 -0
  986. {core_framework-3.2.0 → core_framework-4.0.0}/.cursor/skills/recommend-features/SKILL.md +0 -0
  987. {core_framework-3.2.0 → core_framework-4.0.0}/.cursor/skills/sync-host-rules/SKILL.md +0 -0
  988. {core_framework-3.2.0 → core_framework-4.0.0}/.dockerignore +0 -0
  989. {core_framework-3.2.0 → core_framework-4.0.0}/.github/ci/package-lock.json +0 -0
  990. {core_framework-3.2.0 → core_framework-4.0.0}/.github/ci/package.json +0 -0
  991. {core_framework-3.2.0 → core_framework-4.0.0}/.github/workflows/publish-pypi.yml +0 -0
  992. {core_framework-3.2.0 → core_framework-4.0.0}/.gitignore +0 -0
  993. {core_framework-3.2.0 → core_framework-4.0.0}/.pre-commit-config.yaml +0 -0
  994. {core_framework-3.2.0 → core_framework-4.0.0}/.python-version +0 -0
  995. {core_framework-3.2.0 → core_framework-4.0.0}/LICENSE +0 -0
  996. {core_framework-3.2.0 → core_framework-4.0.0}/alembic/analytics/alembic/README +0 -0
  997. {core_framework-3.2.0 → core_framework-4.0.0}/alembic/analytics/alembic/env.py +0 -0
  998. {core_framework-3.2.0 → core_framework-4.0.0}/alembic/analytics/alembic/script.py.mako +0 -0
  999. {core_framework-3.2.0 → core_framework-4.0.0}/alembic/analytics/alembic/versions/2d61a5e88d76_analytics_utm_events_add_kind.py +0 -0
  1000. {core_framework-3.2.0 → core_framework-4.0.0}/alembic/analytics/alembic/versions/585105e1149e_analytics_add_utm_events.py +0 -0
  1001. {core_framework-3.2.0 → core_framework-4.0.0}/alembic/analytics/alembic/versions/5b9ac98bb150_analytics_daily_fact.py +0 -0
  1002. {core_framework-3.2.0 → core_framework-4.0.0}/alembic/analytics/alembic/versions/7f2a9c1d4e8b_analytics_daily_fact_day_index.py +0 -0
  1003. {core_framework-3.2.0 → core_framework-4.0.0}/alembic/analytics/alembic.ini +0 -0
  1004. {core_framework-3.2.0 → core_framework-4.0.0}/alembic/comment/alembic/README +0 -0
  1005. {core_framework-3.2.0 → core_framework-4.0.0}/alembic/comment/alembic/env.py +0 -0
  1006. {core_framework-3.2.0 → core_framework-4.0.0}/alembic/comment/alembic/script.py.mako +0 -0
  1007. {core_framework-3.2.0 → core_framework-4.0.0}/alembic/comment/alembic/versions/comment_add_comment_attachments.py +0 -0
  1008. {core_framework-3.2.0 → core_framework-4.0.0}/alembic/comment/alembic/versions/comment_add_comment_create_idempotency.py +0 -0
  1009. {core_framework-3.2.0 → core_framework-4.0.0}/alembic/comment/alembic/versions/comment_add_comment_create_idempotency_created_at_index.py +0 -0
  1010. {core_framework-3.2.0 → core_framework-4.0.0}/alembic/comment/alembic/versions/comment_add_comment_mentions.py +0 -0
  1011. {core_framework-3.2.0 → core_framework-4.0.0}/alembic/comment/alembic/versions/comment_tombstone_status_model.py +0 -0
  1012. {core_framework-3.2.0 → core_framework-4.0.0}/alembic/comment/alembic/versions/v1_comment_init_baseline.py +0 -0
  1013. {core_framework-3.2.0 → core_framework-4.0.0}/alembic/comment/alembic.ini +0 -0
  1014. {core_framework-3.2.0 → core_framework-4.0.0}/alembic/extension/alembic/README +0 -0
  1015. {core_framework-3.2.0 → core_framework-4.0.0}/alembic/extension/alembic/env.py +0 -0
  1016. {core_framework-3.2.0 → core_framework-4.0.0}/alembic/extension/alembic/script.py.mako +0 -0
  1017. {core_framework-3.2.0 → core_framework-4.0.0}/alembic/extension/alembic/versions/v1_ext_init_baseline.py +0 -0
  1018. {core_framework-3.2.0 → core_framework-4.0.0}/alembic/extension/alembic.ini +0 -0
  1019. {core_framework-3.2.0 → core_framework-4.0.0}/alembic/media/alembic/README +0 -0
  1020. {core_framework-3.2.0 → core_framework-4.0.0}/alembic/media/alembic/env.py +0 -0
  1021. {core_framework-3.2.0 → core_framework-4.0.0}/alembic/media/alembic/script.py.mako +0 -0
  1022. {core_framework-3.2.0 → core_framework-4.0.0}/alembic/media/alembic/versions/media_add_attachment_staging_registry.py +0 -0
  1023. {core_framework-3.2.0 → core_framework-4.0.0}/alembic/media/alembic/versions/media_add_banner_staging_and_lease.py +0 -0
  1024. {core_framework-3.2.0 → core_framework-4.0.0}/alembic/media/alembic/versions/media_attachment_staging_registry_published_at.py +0 -0
  1025. {core_framework-3.2.0 → core_framework-4.0.0}/alembic/media/alembic/versions/v1_media_init_baseline.py +0 -0
  1026. {core_framework-3.2.0 → core_framework-4.0.0}/alembic/media/alembic.ini +0 -0
  1027. {core_framework-3.2.0 → core_framework-4.0.0}/alembic/moderation/alembic/README +0 -0
  1028. {core_framework-3.2.0 → core_framework-4.0.0}/alembic/moderation/alembic/env.py +0 -0
  1029. {core_framework-3.2.0 → core_framework-4.0.0}/alembic/moderation/alembic/script.py.mako +0 -0
  1030. {core_framework-3.2.0 → core_framework-4.0.0}/alembic/moderation/alembic/versions/moderation_add_event_outbox.py +0 -0
  1031. {core_framework-3.2.0 → core_framework-4.0.0}/alembic/moderation/alembic/versions/moderation_add_event_outbox_dead_indexes.py +0 -0
  1032. {core_framework-3.2.0 → core_framework-4.0.0}/alembic/moderation/alembic/versions/moderation_add_event_outbox_pending_created_at_index.py +0 -0
  1033. {core_framework-3.2.0 → core_framework-4.0.0}/alembic/moderation/alembic/versions/v1_mod_init_baseline.py +0 -0
  1034. {core_framework-3.2.0 → core_framework-4.0.0}/alembic/moderation/alembic.ini +0 -0
  1035. {core_framework-3.2.0 → core_framework-4.0.0}/alembic/notification/alembic/README +0 -0
  1036. {core_framework-3.2.0 → core_framework-4.0.0}/alembic/notification/alembic/env.py +0 -0
  1037. {core_framework-3.2.0 → core_framework-4.0.0}/alembic/notification/alembic/script.py.mako +0 -0
  1038. {core_framework-3.2.0 → core_framework-4.0.0}/alembic/notification/alembic/versions/2fdd68777706_notification_read_at_retention_index.py +0 -0
  1039. {core_framework-3.2.0 → core_framework-4.0.0}/alembic/notification/alembic/versions/v1_notif_init_baseline.py +0 -0
  1040. {core_framework-3.2.0 → core_framework-4.0.0}/alembic/notification/alembic.ini +0 -0
  1041. {core_framework-3.2.0 → core_framework-4.0.0}/alembic/post/alembic/README +0 -0
  1042. {core_framework-3.2.0 → core_framework-4.0.0}/alembic/post/alembic/env.py +0 -0
  1043. {core_framework-3.2.0 → core_framework-4.0.0}/alembic/post/alembic/script.py.mako +0 -0
  1044. {core_framework-3.2.0 → core_framework-4.0.0}/alembic/post/alembic/versions/post_add_post_attachments.py +0 -0
  1045. {core_framework-3.2.0 → core_framework-4.0.0}/alembic/post/alembic/versions/post_add_post_create_idempotency.py +0 -0
  1046. {core_framework-3.2.0 → core_framework-4.0.0}/alembic/post/alembic/versions/post_add_post_create_idempotency_created_at_index.py +0 -0
  1047. {core_framework-3.2.0 → core_framework-4.0.0}/alembic/post/alembic/versions/post_add_post_mentions.py +0 -0
  1048. {core_framework-3.2.0 → core_framework-4.0.0}/alembic/post/alembic/versions/post_post_views_retention_high_water_mark.py +0 -0
  1049. {core_framework-3.2.0 → core_framework-4.0.0}/alembic/post/alembic/versions/post_tombstone_status_model.py +0 -0
  1050. {core_framework-3.2.0 → core_framework-4.0.0}/alembic/post/alembic/versions/v1_post_init_baseline.py +0 -0
  1051. {core_framework-3.2.0 → core_framework-4.0.0}/alembic/post/alembic.ini +0 -0
  1052. {core_framework-3.2.0/alembic/user → core_framework-4.0.0/alembic/rating}/alembic/README +0 -0
  1053. {core_framework-3.2.0/alembic/user → core_framework-4.0.0/alembic/rating}/alembic/script.py.mako +0 -0
  1054. {core_framework-3.2.0 → core_framework-4.0.0}/alembic/user/alembic/env.py +0 -0
  1055. {core_framework-3.2.0 → core_framework-4.0.0}/alembic/user/alembic/versions/44df70a45ba6_user_add_signup_events.py +0 -0
  1056. {core_framework-3.2.0 → core_framework-4.0.0}/alembic/user/alembic/versions/user_add_avatar_ingest_sequences.py +0 -0
  1057. {core_framework-3.2.0 → core_framework-4.0.0}/alembic/user/alembic/versions/user_add_banner_ingest_sequences.py +0 -0
  1058. {core_framework-3.2.0 → core_framework-4.0.0}/alembic/user/alembic/versions/user_add_date_of_birth_to_profiles.py +0 -0
  1059. {core_framework-3.2.0 → core_framework-4.0.0}/alembic/user/alembic/versions/user_add_event_outbox.py +0 -0
  1060. {core_framework-3.2.0 → core_framework-4.0.0}/alembic/user/alembic/versions/user_add_event_outbox_dead_indexes.py +0 -0
  1061. {core_framework-3.2.0 → core_framework-4.0.0}/alembic/user/alembic/versions/user_add_event_outbox_pending_created_at_index.py +0 -0
  1062. {core_framework-3.2.0 → core_framework-4.0.0}/alembic/user/alembic/versions/user_reserve_sentinel_user_ids.py +0 -0
  1063. {core_framework-3.2.0 → core_framework-4.0.0}/alembic/user/alembic/versions/v1_user_init_baseline.py +0 -0
  1064. {core_framework-3.2.0 → core_framework-4.0.0}/alembic/user/alembic.ini +0 -0
  1065. {core_framework-3.2.0 → core_framework-4.0.0}/core_framework/__init__.py +0 -0
  1066. {core_framework-3.2.0 → core_framework-4.0.0}/core_framework/api/__init__.py +0 -0
  1067. {core_framework-3.2.0 → core_framework-4.0.0}/core_framework/api/admin/__init__.py +0 -0
  1068. {core_framework-3.2.0 → core_framework-4.0.0}/core_framework/api/admin/analytics/__init__.py +0 -0
  1069. {core_framework-3.2.0 → core_framework-4.0.0}/core_framework/api/admin/cache/__init__.py +0 -0
  1070. {core_framework-3.2.0 → core_framework-4.0.0}/core_framework/api/admin/comments/__init__.py +0 -0
  1071. {core_framework-3.2.0 → core_framework-4.0.0}/core_framework/api/admin/moderation/__init__.py +0 -0
  1072. {core_framework-3.2.0 → core_framework-4.0.0}/core_framework/api/admin/outbox/__init__.py +0 -0
  1073. {core_framework-3.2.0 → core_framework-4.0.0}/core_framework/api/admin/outbox/schemas.py +0 -0
  1074. {core_framework-3.2.0 → core_framework-4.0.0}/core_framework/api/admin/posts/__init__.py +0 -0
  1075. {core_framework-3.2.0 → core_framework-4.0.0}/core_framework/api/admin/users/__init__.py +0 -0
  1076. {core_framework-3.2.0 → core_framework-4.0.0}/core_framework/api/attachments/__init__.py +0 -0
  1077. {core_framework-3.2.0 → core_framework-4.0.0}/core_framework/api/auth/__init__.py +0 -0
  1078. {core_framework-3.2.0 → core_framework-4.0.0}/core_framework/api/comments/__init__.py +0 -0
  1079. {core_framework-3.2.0 → core_framework-4.0.0}/core_framework/api/comments/authenticated/__init__.py +0 -0
  1080. {core_framework-3.2.0 → core_framework-4.0.0}/core_framework/api/comments/public/__init__.py +0 -0
  1081. {core_framework-3.2.0 → core_framework-4.0.0}/core_framework/api/comments/router.py +0 -0
  1082. {core_framework-3.2.0 → core_framework-4.0.0}/core_framework/api/events/__init__.py +0 -0
  1083. {core_framework-3.2.0 → core_framework-4.0.0}/core_framework/api/events/schemas.py +0 -0
  1084. {core_framework-3.2.0 → core_framework-4.0.0}/core_framework/api/idempotency/__init__.py +0 -0
  1085. {core_framework-3.2.0 → core_framework-4.0.0}/core_framework/api/idempotency/dependencies.py +0 -0
  1086. {core_framework-3.2.0/core_framework/application/media → core_framework-4.0.0/core_framework/api}/ingest_guards.py +0 -0
  1087. {core_framework-3.2.0 → core_framework-4.0.0}/core_framework/api/notifications/__init__.py +0 -0
  1088. {core_framework-3.2.0 → core_framework-4.0.0}/core_framework/api/notifications/authenticated/__init__.py +0 -0
  1089. {core_framework-3.2.0 → core_framework-4.0.0}/core_framework/api/notifications/router.py +0 -0
  1090. {core_framework-3.2.0 → core_framework-4.0.0}/core_framework/api/posts/__init__.py +0 -0
  1091. {core_framework-3.2.0 → core_framework-4.0.0}/core_framework/api/posts/authenticated/__init__.py +0 -0
  1092. {core_framework-3.2.0 → core_framework-4.0.0}/core_framework/api/posts/public/__init__.py +0 -0
  1093. {core_framework-3.2.0 → core_framework-4.0.0}/core_framework/api/posts/public/schemas.py +0 -0
  1094. {core_framework-3.2.0 → core_framework-4.0.0}/core_framework/api/posts/router.py +0 -0
  1095. {core_framework-3.2.0 → core_framework-4.0.0}/core_framework/api/system/__init__.py +0 -0
  1096. {core_framework-3.2.0 → core_framework-4.0.0}/core_framework/api/system/router.py +0 -0
  1097. {core_framework-3.2.0 → core_framework-4.0.0}/core_framework/api/upload.py +0 -0
  1098. {core_framework-3.2.0 → core_framework-4.0.0}/core_framework/api/users/__init__.py +0 -0
  1099. {core_framework-3.2.0 → core_framework-4.0.0}/core_framework/api/users/authenticated/__init__.py +0 -0
  1100. {core_framework-3.2.0 → core_framework-4.0.0}/core_framework/api/users/authenticated/mappers.py +0 -0
  1101. {core_framework-3.2.0 → core_framework-4.0.0}/core_framework/api/users/public/__init__.py +0 -0
  1102. {core_framework-3.2.0 → core_framework-4.0.0}/core_framework/api/users/router.py +0 -0
  1103. {core_framework-3.2.0 → core_framework-4.0.0}/core_framework/api/users/shared/__init__.py +0 -0
  1104. {core_framework-3.2.0 → core_framework-4.0.0}/core_framework/application/__init__.py +0 -0
  1105. {core_framework-3.2.0 → core_framework-4.0.0}/core_framework/application/analytics/__init__.py +0 -0
  1106. {core_framework-3.2.0 → core_framework-4.0.0}/core_framework/application/analytics/prune_service.py +0 -0
  1107. {core_framework-3.2.0 → core_framework-4.0.0}/core_framework/application/analytics/registry.py +0 -0
  1108. {core_framework-3.2.0 → core_framework-4.0.0}/core_framework/application/analytics/sources/__init__.py +0 -0
  1109. {core_framework-3.2.0 → core_framework-4.0.0}/core_framework/application/analytics/sources/comment_created.py +0 -0
  1110. {core_framework-3.2.0 → core_framework-4.0.0}/core_framework/application/analytics/sources/post_created.py +0 -0
  1111. {core_framework-3.2.0 → core_framework-4.0.0}/core_framework/application/analytics/sources/post_viewed.py +0 -0
  1112. {core_framework-3.2.0 → core_framework-4.0.0}/core_framework/application/analytics/sources/user_registered.py +0 -0
  1113. {core_framework-3.2.0 → core_framework-4.0.0}/core_framework/application/auth/__init__.py +0 -0
  1114. {core_framework-3.2.0 → core_framework-4.0.0}/core_framework/application/cache/__init__.py +0 -0
  1115. {core_framework-3.2.0 → core_framework-4.0.0}/core_framework/application/cache/invalidate_service.py +0 -0
  1116. {core_framework-3.2.0 → core_framework-4.0.0}/core_framework/application/cache/models.py +0 -0
  1117. {core_framework-3.2.0 → core_framework-4.0.0}/core_framework/application/email/enqueue.py +0 -0
  1118. {core_framework-3.2.0 → core_framework-4.0.0}/core_framework/application/email/registry.py +0 -0
  1119. {core_framework-3.2.0 → core_framework-4.0.0}/core_framework/application/email/send.py +0 -0
  1120. {core_framework-3.2.0/core_framework/application/comments → core_framework-4.0.0/core_framework/application/events}/__init__.py +0 -0
  1121. {core_framework-3.2.0 → core_framework-4.0.0}/core_framework/application/events/event_token.py +0 -0
  1122. {core_framework-3.2.0 → core_framework-4.0.0}/core_framework/application/events/models.py +0 -0
  1123. {core_framework-3.2.0 → core_framework-4.0.0}/core_framework/application/events/utm_capture_kinds.py +0 -0
  1124. {core_framework-3.2.0/core_framework/application/events → core_framework-4.0.0/core_framework/application/media}/__init__.py +0 -0
  1125. {core_framework-3.2.0 → core_framework-4.0.0}/core_framework/application/media/attachment_read.py +0 -0
  1126. {core_framework-3.2.0 → core_framework-4.0.0}/core_framework/application/media/read_url_config.py +0 -0
  1127. {core_framework-3.2.0/core_framework/application/media → core_framework-4.0.0/core_framework/application/moderation}/__init__.py +0 -0
  1128. {core_framework-3.2.0 → core_framework-4.0.0}/core_framework/application/moderation/scheduled_service.py +0 -0
  1129. {core_framework-3.2.0/core_framework/application/moderation → core_framework-4.0.0/core_framework/application/notifications}/__init__.py +0 -0
  1130. {core_framework-3.2.0 → core_framework-4.0.0}/core_framework/application/notifications/prune_service.py +0 -0
  1131. {core_framework-3.2.0/core_framework/application/notifications → core_framework-4.0.0/core_framework/application/outbox}/__init__.py +0 -0
  1132. {core_framework-3.2.0 → core_framework-4.0.0}/core_framework/application/outbox/exceptions.py +0 -0
  1133. {core_framework-3.2.0 → core_framework-4.0.0}/core_framework/application/outbox/follow_mirrors.py +0 -0
  1134. {core_framework-3.2.0 → core_framework-4.0.0}/core_framework/application/outbox/polling_service.py +0 -0
  1135. {core_framework-3.2.0/core_framework/application/outbox → core_framework-4.0.0/core_framework/application/posts}/__init__.py +0 -0
  1136. {core_framework-3.2.0/core_framework/application/posts → core_framework-4.0.0/core_framework/application/shared}/__init__.py +0 -0
  1137. {core_framework-3.2.0 → core_framework-4.0.0}/core_framework/application/shared/request_context.py +0 -0
  1138. {core_framework-3.2.0/core_framework/application/shared → core_framework-4.0.0/core_framework/application/users}/__init__.py +0 -0
  1139. {core_framework-3.2.0 → core_framework-4.0.0}/core_framework/application/users/deletion_audit.py +0 -0
  1140. {core_framework-3.2.0 → core_framework-4.0.0}/core_framework/application/users/enums.py +0 -0
  1141. {core_framework-3.2.0 → core_framework-4.0.0}/core_framework/asgi.py +0 -0
  1142. {core_framework-3.2.0 → core_framework-4.0.0}/core_framework/core/context.py +0 -0
  1143. {core_framework-3.2.0 → core_framework-4.0.0}/core_framework/core/database.py +0 -0
  1144. {core_framework-3.2.0 → core_framework-4.0.0}/core_framework/core/exception_handlers/__init__.py +0 -0
  1145. {core_framework-3.2.0 → core_framework-4.0.0}/core_framework/core/exceptions.py +0 -0
  1146. {core_framework-3.2.0 → core_framework-4.0.0}/core_framework/core/firebase.py +0 -0
  1147. {core_framework-3.2.0 → core_framework-4.0.0}/core_framework/core/http_client.py +0 -0
  1148. {core_framework-3.2.0 → core_framework-4.0.0}/core_framework/core/http_probes.py +0 -0
  1149. {core_framework-3.2.0 → core_framework-4.0.0}/core_framework/core/logging.py +0 -0
  1150. {core_framework-3.2.0 → core_framework-4.0.0}/core_framework/core/process.py +0 -0
  1151. {core_framework-3.2.0 → core_framework-4.0.0}/core_framework/core/redis.py +0 -0
  1152. {core_framework-3.2.0 → core_framework-4.0.0}/core_framework/core/runtime.py +0 -0
  1153. {core_framework-3.2.0/core_framework/application/users → core_framework-4.0.0/core_framework/domains}/__init__.py +0 -0
  1154. {core_framework-3.2.0 → core_framework-4.0.0}/core_framework/domains/analytics/dependencies.py +0 -0
  1155. {core_framework-3.2.0 → core_framework-4.0.0}/core_framework/domains/analytics/exceptions.py +0 -0
  1156. {core_framework-3.2.0 → core_framework-4.0.0}/core_framework/domains/analytics/models.py +0 -0
  1157. {core_framework-3.2.0/core_framework/domains → core_framework-4.0.0/core_framework/domains/analytics/ports}/__init__.py +0 -0
  1158. {core_framework-3.2.0 → core_framework-4.0.0}/core_framework/domains/analytics/ports/activity_source.py +0 -0
  1159. {core_framework-3.2.0/core_framework/domains/analytics → core_framework-4.0.0/core_framework/domains/auth}/ports/__init__.py +0 -0
  1160. {core_framework-3.2.0 → core_framework-4.0.0}/core_framework/domains/comment/dependencies.py +0 -0
  1161. {core_framework-3.2.0 → core_framework-4.0.0}/core_framework/domains/email/README.md +0 -0
  1162. {core_framework-3.2.0 → core_framework-4.0.0}/core_framework/domains/email/__init__.py +0 -0
  1163. {core_framework-3.2.0 → core_framework-4.0.0}/core_framework/domains/email/exceptions.py +0 -0
  1164. {core_framework-3.2.0 → core_framework-4.0.0}/core_framework/domains/email/ports/send.py +0 -0
  1165. {core_framework-3.2.0 → core_framework-4.0.0}/core_framework/domains/email/service.py +0 -0
  1166. {core_framework-3.2.0 → core_framework-4.0.0}/core_framework/domains/exceptions.py +0 -0
  1167. {core_framework-3.2.0/core_framework/domains/auth/ports → core_framework-4.0.0/core_framework/domains/media/attachment}/__init__.py +0 -0
  1168. {core_framework-3.2.0/core_framework/domains/media/attachment → core_framework-4.0.0/core_framework/domains/media/attachment/components}/__init__.py +0 -0
  1169. {core_framework-3.2.0 → core_framework-4.0.0}/core_framework/domains/media/attachment/components/finals_publisher.py +0 -0
  1170. {core_framework-3.2.0 → core_framework-4.0.0}/core_framework/domains/media/attachment/exceptions.py +0 -0
  1171. {core_framework-3.2.0/core_framework/domains/media/attachment/components → core_framework-4.0.0/core_framework/domains/media/attachment/ports}/__init__.py +0 -0
  1172. {core_framework-3.2.0 → core_framework-4.0.0}/core_framework/domains/media/attachment/ports/finals_publisher.py +0 -0
  1173. {core_framework-3.2.0 → core_framework-4.0.0}/core_framework/domains/media/attachment/ports/staging.py +0 -0
  1174. {core_framework-3.2.0/core_framework/domains/media/attachment/ports → core_framework-4.0.0/core_framework/domains/media/avatar}/__init__.py +0 -0
  1175. {core_framework-3.2.0/core_framework/domains/media/avatar → core_framework-4.0.0/core_framework/domains/media/avatar/components}/__init__.py +0 -0
  1176. {core_framework-3.2.0 → core_framework-4.0.0}/core_framework/domains/media/avatar/components/finals_publisher.py +0 -0
  1177. {core_framework-3.2.0 → core_framework-4.0.0}/core_framework/domains/media/avatar/components/staging.py +0 -0
  1178. {core_framework-3.2.0 → core_framework-4.0.0}/core_framework/domains/media/avatar/components/variant_encoder.py +0 -0
  1179. {core_framework-3.2.0 → core_framework-4.0.0}/core_framework/domains/media/avatar/constants.py +0 -0
  1180. {core_framework-3.2.0 → core_framework-4.0.0}/core_framework/domains/media/avatar/exceptions.py +0 -0
  1181. {core_framework-3.2.0 → core_framework-4.0.0}/core_framework/domains/media/avatar/models.py +0 -0
  1182. {core_framework-3.2.0/core_framework/domains/media/avatar/components → core_framework-4.0.0/core_framework/domains/media/avatar/ports}/__init__.py +0 -0
  1183. {core_framework-3.2.0 → core_framework-4.0.0}/core_framework/domains/media/avatar/ports/finals_publisher.py +0 -0
  1184. {core_framework-3.2.0 → core_framework-4.0.0}/core_framework/domains/media/avatar/ports/staging.py +0 -0
  1185. {core_framework-3.2.0 → core_framework-4.0.0}/core_framework/domains/media/avatar/ports/variant_encoder.py +0 -0
  1186. {core_framework-3.2.0/core_framework/domains/media/avatar/ports → core_framework-4.0.0/core_framework/domains/media/banner}/__init__.py +0 -0
  1187. {core_framework-3.2.0/core_framework/domains/media/banner → core_framework-4.0.0/core_framework/domains/media/banner/components}/__init__.py +0 -0
  1188. {core_framework-3.2.0 → core_framework-4.0.0}/core_framework/domains/media/banner/components/finals_publisher.py +0 -0
  1189. {core_framework-3.2.0 → core_framework-4.0.0}/core_framework/domains/media/banner/components/staging.py +0 -0
  1190. {core_framework-3.2.0 → core_framework-4.0.0}/core_framework/domains/media/banner/components/variant_encoder.py +0 -0
  1191. {core_framework-3.2.0 → core_framework-4.0.0}/core_framework/domains/media/banner/constants.py +0 -0
  1192. {core_framework-3.2.0 → core_framework-4.0.0}/core_framework/domains/media/banner/exceptions.py +0 -0
  1193. {core_framework-3.2.0 → core_framework-4.0.0}/core_framework/domains/media/banner/models.py +0 -0
  1194. {core_framework-3.2.0/core_framework/domains/media/banner/components → core_framework-4.0.0/core_framework/domains/media/banner/ports}/__init__.py +0 -0
  1195. {core_framework-3.2.0 → core_framework-4.0.0}/core_framework/domains/media/banner/ports/finals_publisher.py +0 -0
  1196. {core_framework-3.2.0 → core_framework-4.0.0}/core_framework/domains/media/banner/ports/staging.py +0 -0
  1197. {core_framework-3.2.0 → core_framework-4.0.0}/core_framework/domains/media/banner/ports/variant_encoder.py +0 -0
  1198. {core_framework-3.2.0/core_framework/domains/media/banner/ports → core_framework-4.0.0/core_framework/domains/media/shared}/__init__.py +0 -0
  1199. {core_framework-3.2.0 → core_framework-4.0.0}/core_framework/domains/media/shared/constants.py +0 -0
  1200. {core_framework-3.2.0 → core_framework-4.0.0}/core_framework/domains/media/shared/exceptions.py +0 -0
  1201. {core_framework-3.2.0 → core_framework-4.0.0}/core_framework/domains/media/shared/utils.py +0 -0
  1202. {core_framework-3.2.0 → core_framework-4.0.0}/core_framework/domains/moderation/__init__.py +0 -0
  1203. {core_framework-3.2.0 → core_framework-4.0.0}/core_framework/domains/moderation/exceptions.py +0 -0
  1204. {core_framework-3.2.0 → core_framework-4.0.0}/core_framework/domains/moderation/models.py +0 -0
  1205. {core_framework-3.2.0 → core_framework-4.0.0}/core_framework/domains/moderation/outcomes.py +0 -0
  1206. {core_framework-3.2.0 → core_framework-4.0.0}/core_framework/domains/notification/dependencies.py +0 -0
  1207. {core_framework-3.2.0 → core_framework-4.0.0}/core_framework/domains/notification/exceptions.py +0 -0
  1208. {core_framework-3.2.0 → core_framework-4.0.0}/core_framework/domains/outbox/dependencies.py +0 -0
  1209. {core_framework-3.2.0 → core_framework-4.0.0}/core_framework/domains/outbox/exceptions.py +0 -0
  1210. {core_framework-3.2.0 → core_framework-4.0.0}/core_framework/domains/outbox/models.py +0 -0
  1211. {core_framework-3.2.0/core_framework/domains/media/shared → core_framework-4.0.0/core_framework/domains/outbox/ports}/__init__.py +0 -0
  1212. {core_framework-3.2.0 → core_framework-4.0.0}/core_framework/domains/outbox/ports/consumer.py +0 -0
  1213. {core_framework-3.2.0 → core_framework-4.0.0}/core_framework/domains/outbox/ports/producer.py +0 -0
  1214. {core_framework-3.2.0 → core_framework-4.0.0}/core_framework/domains/post/dependencies.py +0 -0
  1215. {core_framework-3.2.0 → core_framework-4.0.0}/core_framework/domains/post/outcomes.py +0 -0
  1216. {core_framework-3.2.0 → core_framework-4.0.0}/core_framework/domains/user/exceptions.py +0 -0
  1217. {core_framework-3.2.0 → core_framework-4.0.0}/core_framework/domains/user/utils.py +0 -0
  1218. {core_framework-3.2.0/core_framework/domains/outbox/ports → core_framework-4.0.0/core_framework/infrastructure}/__init__.py +0 -0
  1219. {core_framework-3.2.0 → core_framework-4.0.0}/core_framework/infrastructure/email/resend_email_adapter.py +0 -0
  1220. {core_framework-3.2.0/core_framework/infrastructure → core_framework-4.0.0/core_framework/infrastructure/firebase}/__init__.py +0 -0
  1221. {core_framework-3.2.0/core_framework/infrastructure/firebase → core_framework-4.0.0/core_framework/infrastructure/media}/__init__.py +0 -0
  1222. {core_framework-3.2.0 → core_framework-4.0.0}/core_framework/infrastructure/media/local_attachment_staging_adapter.py +0 -0
  1223. {core_framework-3.2.0 → core_framework-4.0.0}/core_framework/infrastructure/media/local_avatar_staging_adapter.py +0 -0
  1224. {core_framework-3.2.0 → core_framework-4.0.0}/core_framework/infrastructure/media/local_banner_staging_adapter.py +0 -0
  1225. {core_framework-3.2.0 → core_framework-4.0.0}/core_framework/infrastructure/media/pillow_avatar_variant_encoder_adapter.py +0 -0
  1226. {core_framework-3.2.0 → core_framework-4.0.0}/core_framework/infrastructure/media/pillow_banner_variant_encoder_adapter.py +0 -0
  1227. {core_framework-3.2.0 → core_framework-4.0.0}/core_framework/infrastructure/media/pillow_staging_image.py +0 -0
  1228. {core_framework-3.2.0 → core_framework-4.0.0}/core_framework/infrastructure/media/ssh_attachment_finals_publisher_adapter.py +0 -0
  1229. {core_framework-3.2.0 → core_framework-4.0.0}/core_framework/infrastructure/media/ssh_banner_finals_publisher_adapter.py +0 -0
  1230. {core_framework-3.2.0 → core_framework-4.0.0}/core_framework/infrastructure/media/ssh_finals_publisher_adapter.py +0 -0
  1231. {core_framework-3.2.0 → core_framework-4.0.0}/core_framework/infrastructure/media/staging_paths.py +0 -0
  1232. {core_framework-3.2.0/core_framework/infrastructure/media → core_framework-4.0.0/core_framework/infrastructure/outbox}/__init__.py +0 -0
  1233. {core_framework-3.2.0 → core_framework-4.0.0}/core_framework/infrastructure/outbox/outbox_consumer_adapter.py +0 -0
  1234. {core_framework-3.2.0 → core_framework-4.0.0}/core_framework/infrastructure/outbox/outbox_producer_adapter.py +0 -0
  1235. {core_framework-3.2.0 → core_framework-4.0.0}/core_framework/migrate_cli.py +0 -0
  1236. {core_framework-3.2.0 → core_framework-4.0.0}/core_framework/py.typed +0 -0
  1237. {core_framework-3.2.0 → core_framework-4.0.0}/core_framework/testing/firebase.py +0 -0
  1238. {core_framework-3.2.0 → core_framework-4.0.0}/core_framework/testing/firebase_identity_toolkit.py +0 -0
  1239. {core_framework-3.2.0 → core_framework-4.0.0}/core_framework/testing/httpx_test_client.py +0 -0
  1240. {core_framework-3.2.0 → core_framework-4.0.0}/core_framework/testing/migrations.py +0 -0
  1241. {core_framework-3.2.0/core_framework/infrastructure/outbox → core_framework-4.0.0/core_framework/worker}/__init__.py +0 -0
  1242. {core_framework-3.2.0 → core_framework-4.0.0}/core_framework/worker/schedules/analytics_refresh_cron.py +0 -0
  1243. {core_framework-3.2.0 → core_framework-4.0.0}/core_framework/worker/schedules/schedule_aggregate_comment_stats.py +0 -0
  1244. {core_framework-3.2.0 → core_framework-4.0.0}/core_framework/worker/schedules/schedule_aggregate_post_stats.py +0 -0
  1245. {core_framework-3.2.0 → core_framework-4.0.0}/core_framework/worker/schedules/schedule_aggregate_user_stats.py +0 -0
  1246. {core_framework-3.2.0 → core_framework-4.0.0}/core_framework/worker/schedules/schedule_poll_outbox.py +0 -0
  1247. {core_framework-3.2.0 → core_framework-4.0.0}/core_framework/worker/schedules/schedule_prune_analytics_daily_facts.py +0 -0
  1248. {core_framework-3.2.0 → core_framework-4.0.0}/core_framework/worker/schedules/schedule_prune_post_views.py +0 -0
  1249. {core_framework-3.2.0 → core_framework-4.0.0}/core_framework/worker/schedules/schedule_prune_read_notifications.py +0 -0
  1250. {core_framework-3.2.0 → core_framework-4.0.0}/core_framework/worker/schedules/schedule_sweep_stale_attachment_staging.py +0 -0
  1251. {core_framework-3.2.0 → core_framework-4.0.0}/core_framework/worker/schedules/schedule_sweep_stale_avatar_staging.py +0 -0
  1252. {core_framework-3.2.0 → core_framework-4.0.0}/core_framework/worker/schedules/schedule_sweep_stale_banner_staging.py +0 -0
  1253. {core_framework-3.2.0 → core_framework-4.0.0}/core_framework/worker/tasks/delete_attachment_finals.py +0 -0
  1254. {core_framework-3.2.0 → core_framework-4.0.0}/core_framework/worker/tasks/delete_superseded_avatar_finals.py +0 -0
  1255. {core_framework-3.2.0 → core_framework-4.0.0}/core_framework/worker/tasks/delete_superseded_banner_finals.py +0 -0
  1256. {core_framework-3.2.0 → core_framework-4.0.0}/core_framework/worker/tasks/process_account_deletion_scheduled_email.py +0 -0
  1257. {core_framework-3.2.0 → core_framework-4.0.0}/core_framework/worker/tasks/process_admin_user_deletion.py +0 -0
  1258. {core_framework-3.2.0 → core_framework-4.0.0}/core_framework/worker/tasks/process_aggregate_comment_stats.py +0 -0
  1259. {core_framework-3.2.0 → core_framework-4.0.0}/core_framework/worker/tasks/process_aggregate_post_stats.py +0 -0
  1260. {core_framework-3.2.0 → core_framework-4.0.0}/core_framework/worker/tasks/process_aggregate_user_stats.py +0 -0
  1261. {core_framework-3.2.0 → core_framework-4.0.0}/core_framework/worker/tasks/process_attachment_asset_variants.py +0 -0
  1262. {core_framework-3.2.0 → core_framework-4.0.0}/core_framework/worker/tasks/process_banner_asset_variants.py +0 -0
  1263. {core_framework-3.2.0 → core_framework-4.0.0}/core_framework/worker/tasks/process_media_asset_variants.py +0 -0
  1264. {core_framework-3.2.0 → core_framework-4.0.0}/core_framework/worker/tasks/process_mute_lift.py +0 -0
  1265. {core_framework-3.2.0 → core_framework-4.0.0}/core_framework/worker/tasks/process_outbox_row.py +0 -0
  1266. {core_framework-3.2.0 → core_framework-4.0.0}/core_framework/worker/tasks/process_refresh_analytics_bucket.py +0 -0
  1267. {core_framework-3.2.0 → core_framework-4.0.0}/core_framework/worker/tasks/process_transactional_email.py +0 -0
  1268. {core_framework-3.2.0 → core_framework-4.0.0}/core_framework/worker/worker_context.py +0 -0
  1269. {core_framework-3.2.0 → core_framework-4.0.0}/deploy/README.md +0 -0
  1270. {core_framework-3.2.0 → core_framework-4.0.0}/deploy/app/docker-compose.dev.yaml +0 -0
  1271. {core_framework-3.2.0 → core_framework-4.0.0}/deploy/app/dockerfile +0 -0
  1272. {core_framework-3.2.0 → core_framework-4.0.0}/deploy/observability/.env.example +0 -0
  1273. {core_framework-3.2.0 → core_framework-4.0.0}/deploy/observability/grafana/dashboards/application/api-http.json +0 -0
  1274. {core_framework-3.2.0 → core_framework-4.0.0}/deploy/observability/grafana/dashboards/application/worker-jobs.json +0 -0
  1275. {core_framework-3.2.0 → core_framework-4.0.0}/deploy/observability/grafana/dashboards/infrastructure/node-exporter.json +0 -0
  1276. {core_framework-3.2.0 → core_framework-4.0.0}/deploy/observability/grafana/dashboards/infrastructure/postgres-exporter.json +0 -0
  1277. {core_framework-3.2.0 → core_framework-4.0.0}/deploy/observability/grafana/dashboards/infrastructure/redis-exporter.json +0 -0
  1278. {core_framework-3.2.0 → core_framework-4.0.0}/deploy/observability/grafana/provisioning/dashboards/dashboards.yml +0 -0
  1279. {core_framework-3.2.0 → core_framework-4.0.0}/deploy/observability/grafana/provisioning/datasources/datasources.yml +0 -0
  1280. {core_framework-3.2.0 → core_framework-4.0.0}/deploy/observability/loki.yaml +0 -0
  1281. {core_framework-3.2.0 → core_framework-4.0.0}/deploy/observability/otel-collector-config.yaml +0 -0
  1282. {core_framework-3.2.0 → core_framework-4.0.0}/deploy/observability/targets/node/.gitkeep +0 -0
  1283. {core_framework-3.2.0 → core_framework-4.0.0}/deploy/observability/targets/postgres/.gitkeep +0 -0
  1284. {core_framework-3.2.0 → core_framework-4.0.0}/deploy/observability/targets/redis/.gitkeep +0 -0
  1285. {core_framework-3.2.0 → core_framework-4.0.0}/deploy/observability/tempo.yaml +0 -0
  1286. {core_framework-3.2.0 → core_framework-4.0.0}/docs/deployments/edge-upload-limits.md +0 -0
  1287. {core_framework-3.2.0 → core_framework-4.0.0}/docs/deployments/examples/Caddyfile.example +0 -0
  1288. {core_framework-3.2.0 → core_framework-4.0.0}/docs/deployments/examples/Caddyfile.observability.example +0 -0
  1289. {core_framework-3.2.0 → core_framework-4.0.0}/docs/deployments/examples/image-server-known-hosts.example +0 -0
  1290. {core_framework-3.2.0 → core_framework-4.0.0}/docs/deployments/guides/playbook/py-spy-playbook.md +0 -0
  1291. {core_framework-3.2.0 → core_framework-4.0.0}/docs/deployments/guides/setup/py-spy-setup.md +0 -0
  1292. {core_framework-3.2.0 → core_framework-4.0.0}/docs/domains/posts/README.md +0 -0
  1293. {core_framework-3.2.0 → core_framework-4.0.0}/docs/platform/database-triggers.md +0 -0
  1294. {core_framework-3.2.0 → core_framework-4.0.0}/firebase_config.example.json +0 -0
  1295. {core_framework-3.2.0 → core_framework-4.0.0}/makefile +0 -0
  1296. {core_framework-3.2.0/core_framework/worker → core_framework-4.0.0/tests}/__init__.py +0 -0
  1297. {core_framework-3.2.0 → core_framework-4.0.0}/tests/e2e/_auth.py +0 -0
  1298. {core_framework-3.2.0 → core_framework-4.0.0}/tests/e2e/_media.py +0 -0
  1299. {core_framework-3.2.0 → core_framework-4.0.0}/tests/e2e/conftest.py +0 -0
  1300. {core_framework-3.2.0 → core_framework-4.0.0}/tests/e2e/media/pipeline_test.py +0 -0
  1301. {core_framework-3.2.0 → core_framework-4.0.0}/tests/e2e/smoke/canary_test.py +0 -0
  1302. {core_framework-3.2.0 → core_framework-4.0.0}/tests/e2e/smoke/media_test.py +0 -0
  1303. {core_framework-3.2.0 → core_framework-4.0.0}/tests/e2e/smoke/system_test.py +0 -0
  1304. {core_framework-3.2.0 → core_framework-4.0.0}/tests/e2e/smoke/tls_host_test.py +0 -0
  1305. {core_framework-3.2.0/tests → core_framework-4.0.0/tests/integration}/__init__.py +0 -0
  1306. {core_framework-3.2.0 → core_framework-4.0.0}/tests/integration/analytics/_helpers.py +0 -0
  1307. {core_framework-3.2.0/tests/integration → core_framework-4.0.0/tests/integration/api}/__init__.py +0 -0
  1308. {core_framework-3.2.0 → core_framework-4.0.0}/tests/integration/api/_outbox_helpers.py +0 -0
  1309. {core_framework-3.2.0/tests/integration/api → core_framework-4.0.0/tests/integration/api/admin}/__init__.py +0 -0
  1310. {core_framework-3.2.0/tests/integration/api/admin → core_framework-4.0.0/tests/integration/api/admin/analytics}/__init__.py +0 -0
  1311. {core_framework-3.2.0/tests/integration/api/admin/analytics → core_framework-4.0.0/tests/integration/api/admin/cache}/__init__.py +0 -0
  1312. {core_framework-3.2.0/tests/integration/api/admin/cache → core_framework-4.0.0/tests/integration/api/admin/comments}/__init__.py +0 -0
  1313. {core_framework-3.2.0/tests/integration/api/admin/comments → core_framework-4.0.0/tests/integration/api/admin/moderation}/__init__.py +0 -0
  1314. {core_framework-3.2.0/tests/integration/api/admin/moderation → core_framework-4.0.0/tests/integration/api/admin/outbox}/__init__.py +0 -0
  1315. {core_framework-3.2.0/tests/integration/api/admin/outbox → core_framework-4.0.0/tests/integration/api/admin/posts}/__init__.py +0 -0
  1316. {core_framework-3.2.0/tests/integration/api/admin/posts → core_framework-4.0.0/tests/integration/api/admin/users}/__init__.py +0 -0
  1317. {core_framework-3.2.0/tests/integration/api/admin/users → core_framework-4.0.0/tests/integration/api/auth}/__init__.py +0 -0
  1318. {core_framework-3.2.0/tests/integration/api/auth → core_framework-4.0.0/tests/integration/api/comments}/__init__.py +0 -0
  1319. {core_framework-3.2.0/tests/integration/api/comments → core_framework-4.0.0/tests/integration/api/comments/authenticated}/__init__.py +0 -0
  1320. {core_framework-3.2.0/tests/integration/api/comments/authenticated → core_framework-4.0.0/tests/integration/api/comments/public}/__init__.py +0 -0
  1321. {core_framework-3.2.0 → core_framework-4.0.0}/tests/integration/api/media/ingest_contract_test.py +0 -0
  1322. {core_framework-3.2.0 → core_framework-4.0.0}/tests/integration/api/mentions/mentions_integration_test.py +0 -0
  1323. {core_framework-3.2.0/tests/integration/api/comments/public → core_framework-4.0.0/tests/integration/api/notifications}/__init__.py +0 -0
  1324. {core_framework-3.2.0/tests/integration/api/notifications → core_framework-4.0.0/tests/integration/api/posts}/__init__.py +0 -0
  1325. {core_framework-3.2.0 → core_framework-4.0.0}/tests/integration/api/posts/comment_count_aggregation_test.py +0 -0
  1326. {core_framework-3.2.0/tests/integration/api/posts → core_framework-4.0.0/tests/integration/api/posts/public}/__init__.py +0 -0
  1327. {core_framework-3.2.0 → core_framework-4.0.0}/tests/integration/api/public_read_by_id_unavailable_detail_test.py +0 -0
  1328. {core_framework-3.2.0/tests/integration/api/posts/public → core_framework-4.0.0/tests/integration/api/ratings}/__init__.py +0 -0
  1329. {core_framework-3.2.0 → core_framework-4.0.0}/tests/integration/api/system/__init__.py +0 -0
  1330. {core_framework-3.2.0 → core_framework-4.0.0}/tests/integration/api/system/router_test.py +0 -0
  1331. {core_framework-3.2.0 → core_framework-4.0.0}/tests/integration/api/users/__init__.py +0 -0
  1332. {core_framework-3.2.0 → core_framework-4.0.0}/tests/integration/api/users/authenticated/__init__.py +0 -0
  1333. {core_framework-3.2.0 → core_framework-4.0.0}/tests/integration/api/users/public/__init__.py +0 -0
  1334. {core_framework-3.2.0 → core_framework-4.0.0}/tests/integration/worker/__init__.py +0 -0
  1335. {core_framework-3.2.0 → core_framework-4.0.0}/tests/integration/worker/analytics_prune_test.py +0 -0
  1336. {core_framework-3.2.0 → core_framework-4.0.0}/tests/integration/worker/attachment_upload_test.py +0 -0
  1337. {core_framework-3.2.0 → core_framework-4.0.0}/tests/integration/worker/read_notifications_retention_test.py +0 -0
  1338. {core_framework-3.2.0 → core_framework-4.0.0}/tests/integration/worker/stale_staging_sweep_test.py +0 -0
  1339. {core_framework-3.2.0 → core_framework-4.0.0}/tests/unit/__init__.py +0 -0
  1340. {core_framework-3.2.0 → core_framework-4.0.0}/tests/unit/api/dedupe_preserving_order_test.py +0 -0
  1341. {core_framework-3.2.0 → core_framework-4.0.0}/tests/unit/api/posts/authenticated/post_update_mapper_test.py +0 -0
  1342. {core_framework-3.2.0 → core_framework-4.0.0}/tests/unit/application/comments/__init__.py +0 -0
  1343. {core_framework-3.2.0 → core_framework-4.0.0}/tests/unit/application/shared/request_context_test.py +0 -0
  1344. {core_framework-3.2.0 → core_framework-4.0.0}/tests/unit/application/users/deletion_audit_test.py +0 -0
  1345. {core_framework-3.2.0 → core_framework-4.0.0}/tests/unit/core/bundled_alembic_test.py +0 -0
  1346. {core_framework-3.2.0 → core_framework-4.0.0}/tests/unit/core/migrate_cli_test.py +0 -0
  1347. {core_framework-3.2.0 → core_framework-4.0.0}/tests/unit/docs/_api_reference.py +0 -0
  1348. {core_framework-3.2.0 → core_framework-4.0.0}/tests/unit/docs/api_routes_test.py +0 -0
  1349. {core_framework-3.2.0 → core_framework-4.0.0}/tests/unit/domains/__init__.py +0 -0
  1350. {core_framework-3.2.0 → core_framework-4.0.0}/tests/unit/domains/comment/__init__.py +0 -0
  1351. {core_framework-3.2.0 → core_framework-4.0.0}/tests/unit/domains/post/models_test.py +0 -0
  1352. {core_framework-3.2.0 → core_framework-4.0.0}/tests/unit/infrastructure/__init__.py +0 -0
  1353. {core_framework-3.2.0 → core_framework-4.0.0}/tests/unit/infrastructure/media/__init__.py +0 -0
  1354. {core_framework-3.2.0 → core_framework-4.0.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,50 @@
1
+ ---
2
+ description: Core non-negotiables — behavior, tech stack, layer direction, host scope
3
+ alwaysApply: true
4
+ ---
5
+
6
+ # Constitution
7
+
8
+ ## Behavior
9
+
10
+ - State assumptions; ask when unclear. Prefer the simplest correct solution.
11
+ - Use the terms in [`docs/platform/glossary.md`](docs/platform/glossary.md) in **new** writing. Do not invent synonyms for those concepts. Do not rewrite shipped ADRs or docs solely to match the glossary.
12
+ - Touch only what the task requires. Match existing style. Remove orphans your edits create.
13
+ - Define verifiable success criteria for non-trivial work.
14
+ - **Wait for the third copy before you extract** — do not extract a private function used once or twice when it is only a few lines (identifier quoting, a short SQL fragment, pass-through wrappers). Extract on the **third** real copy, or earlier when the logic is **~15+ lines / non-obvious branching**, or a scoped rule requires sharing (e.g. normal + `*_strong` repository reads in **`strong-reads.mdc`**). Do not repo-wide refactor unrelated existing helpers.
15
+
16
+ ## Tech stack
17
+
18
+ - Python 3.14, Pydantic v2, PostgreSQL 18, orjson (not stdlib json).
19
+ - Absolute imports only (`from core_framework....`). Comma-style `except A, B:` is intentional.
20
+ - Prefer newer APIs and **current Python syntax** over older equivalents still legal on 3.14, for example:
21
+ - `asyncio.TaskGroup` over `asyncio.gather`
22
+ - PEP 695 type parameters (`def f[T](...)`, `def f[**P, R](...)`) over module-level `TypeVar` / `ParamSpec`
23
+ - Built-in generics (`list[str]`, `dict[str, int]`) over `typing.List` / `typing.Dict`
24
+ - `X | Y` over `Optional[X]` / `Union[X, Y]` unless a library API requires the old form
25
+ - Do **not** add `from __future__ import annotations` — 3.14 deferred annotations are the default (PEP 649)
26
+
27
+ ## Layers
28
+
29
+ Dependencies point inward: API/worker → application → domain. Never reverse.
30
+
31
+ - **API/worker** — transport adapters; call application services.
32
+ - **Application** — orchestration shared by API + worker; no FastAPI types.
33
+ - **Domain** — models, repositories (Postgres only), services. No API/worker/application imports except wiring in `dependencies.py`.
34
+
35
+ Path-scoped rules under `.cursor/rules/` add detail (API, domains, docs, etc.). For FastAPI/Pydantic work in `core_framework/api/`, use the **fastapi** skill (`.agents/skills/fastapi/`).
36
+
37
+ ## Agent skills
38
+
39
+ - Package skills (for example **fastapi**) are Library Skills-managed symlinks under **`.agents/skills/<name>/`**. Rules and hand-authored skills reference that path, not a copied tree under **`.cursor/skills/`**.
40
+ - **`.cursor/skills/<name>`** may symlink to **`.agents/skills/<name>`** for Cursor; Library Skills repairs **`.agents/skills`** links when packages move. After **`uv sync`** or a dependency upgrade, run **`uvx library-skills --yes`** if symlinks are stale.
41
+
42
+ ## Host applications
43
+
44
+ Do not edit consuming host repos in the same task as core-framework work unless the user scopes work to a host or asks to sync/upgrade. See the **sync-host-rules** skill.
45
+
46
+ ## Feature implementation
47
+
48
+ When the user asks to **grill**, interview, or sharpen a design before building, use the **grill** skill (`.cursor/skills/grill/`). Do not start **implement-feature** until that alignment is done (or the user skips it).
49
+
50
+ Greenfield features (DB → API → repository → service → **documentation** → tests): use the **implement-feature** skill — one layer per response unless the user says otherwise. A feature is **not done** until documentation is updated. A **main feature** is **not done** until its design doc includes a mermaid flowchart of the main control flow (see the **implement-feature** skill). Do not backfill charts onto unrelated older design docs in the same task.
@@ -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_UNPROCESSABLE_ENTITY_DETAIL`** (422), **`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,15 @@
1
+ ---
2
+ description: Flow docs describe user-facing API behavior only — no implementation code
3
+ globs:
4
+ - docs/domains/**/*.md
5
+ alwaysApply: false
6
+ ---
7
+
8
+ # Flow documentation
9
+
10
+ Flow docs under **`docs/domains/{domain}/`** describe **client-visible API behavior**, not implementation.
11
+
12
+ - **Include**: endpoints, auth, request/response fields (text, not JSON examples), errors, idempotency, side effects. A mermaid **flowchart** when the flow is a main multi-step lifecycle (schedule/cancel/worker, command then fan-out) — match **`account_deletion.md`**, **`restrictions.md`**. Skip for a single CRUD endpoint; do not backfill unrelated older flow docs in the same task.
13
+ - **Exclude**: Python/SQL snippets, function names, layer internals, schema DDL — see **`no-code-in-docs.mdc`**.
14
+
15
+ When creating or rewriting flow docs, use the **write-flow-doc** skill and match existing docs (e.g. **`profile.md`**, **`restrictions.md`**).
@@ -0,0 +1,21 @@
1
+ ---
2
+ description: Ignore exploratory ClickHouse warehouse notes unless the user explicitly opens that topic
3
+ alwaysApply: true
4
+ ---
5
+
6
+ # Ignore analytics-warehouse notes
7
+
8
+ [`docs/design/analytics-warehouse-design.md`](docs/design/analytics-warehouse-design.md) is an **exploratory scratchpad**. It is **not** in the pipeline, **not** a backlog item, and **not** a constraint on the shipped system.
9
+
10
+ ## Do not
11
+
12
+ - Read, cite, or align work to that document when changing events ingest, analytics rollup, `post_views` / `*_stats`, settings, workers, hosts, or any other area.
13
+ - Add ClickHouse, a richer `POST /events` envelope, warehouse sinks, or “buffer vs diary” migrations **because** that doc exists.
14
+ - Treat its placement rules, sequence, or sale/consent notes as accepted ADRs.
15
+
16
+ ## Do
17
+
18
+ - Follow shipped docs: [`docs/domains/events/events.md`](docs/domains/events/events.md), [`docs/design/events-ingest-design.md`](docs/design/events-ingest-design.md), [`docs/design/analytics-rollup-design.md`](docs/design/analytics-rollup-design.md), [`docs/domains/posts/post_stats_aggregation.md`](docs/domains/posts/post_stats_aggregation.md).
19
+ - Open the warehouse notes **only** when the user explicitly asks about that file, ClickHouse warehouse, or returning to that idea.
20
+
21
+ If the user later wants it implemented, they will say so; then make it fit the system as it exists at that time.
@@ -0,0 +1,30 @@
1
+ ---
2
+ description: Integration tests should prefer API-level assertions when endpoints exist
3
+ globs:
4
+ - tests/integration/**/*.py
5
+ ---
6
+
7
+ # Integration Test Strategy
8
+
9
+ Treat integration tests as black-box API behavior tests whenever possible.
10
+
11
+ ## Core Rule
12
+
13
+ - Prefer exercising behavior through HTTP endpoints and asserting API responses.
14
+ - Use internal/database assertions only when no API endpoint exists yet for that behavior.
15
+ - Name the test so a failure line states the broken invariant, not the endpoint/function or a generic `success` / `happy_path`.
16
+
17
+ ## Lifecycle Guidance
18
+
19
+ - During initial endpoint implementation (for example, POST exists but GET does not), internal assertions are acceptable to confirm persistence/side effects.
20
+ - After the corresponding read/inspect endpoint is implemented, migrate assertions to that API path and avoid direct DB checks for the same behavior.
21
+
22
+ ## Allowed Internal Checks
23
+
24
+ - Setup/seed data when there is no practical API path for test preconditions.
25
+ - Verify side effects that are intentionally not exposed via API (for example, queue internals, non-user-facing audit fields).
26
+
27
+ ## Avoid
28
+
29
+ - Testing API behavior by primarily querying the database when an API route already exposes that behavior.
30
+ - Coupling integration tests to repository internals when a stable endpoint contract is available.
@@ -0,0 +1,36 @@
1
+ ---
2
+ description: Docs avoid implementation code; HTTP interface listings and schema DDL are OK
3
+ globs: docs/**/*.md
4
+ alwaysApply: false
5
+ ---
6
+
7
+ # No Code in Documentation
8
+
9
+ Documentation under **`docs/`** must not carry **implementation** snippets that belong in the repo (executable Python, shell, operational SQL queries, etc.). **`docs/`** describes **what** and **why**; the codebase shows **how**.
10
+
11
+ ## What to exclude
12
+
13
+ - Python class/function definitions or examples
14
+ - **SQL for data access or mutation** — `SELECT`, `INSERT`, `UPDATE`, `DELETE`, `MERGE`, CTE-heavy reports, cleanup queries, etc. (describe behavior in prose or name the operation; do not paste DML/query text)
15
+ - Shell commands — **except** in deployment runbooks under **`docs/deployments/`** (see *Exceptions* below)
16
+ - Pseudocode that mimics real code syntax
17
+ - Inline backticked references to internal function/method/class names when prose suffices (prefer describing behavior)
18
+
19
+ ## What is allowed
20
+
21
+ - **HTTP API interface listings** — fenced **`http`** blocks or plain lines listing `METHOD /path # short note`. That is **surface contract**, not implementation code.
22
+ - **SQL for table creation / physical design** — e.g. `CREATE TABLE` (and table-level DDL in the same design story, such as `CREATE INDEX`). DDL is a design artifact, not runtime query text.
23
+ - ASCII diagrams and flowcharts (box-drawing characters)
24
+ - Mermaid diagrams (preferred for main-feature control flow: fenced `mermaid` with `flowchart TD` / `flowchart LR`)
25
+ - Markdown tables of fields and types (`jsonb`, `varchar(26)`, etc.)
26
+ - Plain-text lifecycle diagrams (arrows, boxes)
27
+ - File/directory tree layouts (plain text or a neutral fence such as `text` if helpful)
28
+
29
+ ## Exceptions
30
+
31
+ - **Deployment runbooks** under **`docs/deployments/`** (setup guides, deploy/release playbooks, SSH/image-server guides) may include fenced **`bash`** shell blocks. These are operator instructions for interactive server setup, not implementation that drifts from source; copy-paste commands are the practical content. This exemption does **not** extend to **`docs/deployments/*-design.md`** design docs, which follow the general rules above.
32
+ - **Design docs** under **`docs/design/`**, **`docs/platform/`**, and **`docs/library/`** (and **`docs/deployments/*-design.md`**) follow the general allow/exclude lists — DDL is allowed, DML and Python are not. Flow docs under **`docs/domains/**`** are stricter: see **`flow-documentation.mdc`** (no DDL, no JSON request bodies, fields described as text/tables).
33
+
34
+ ## Rationale
35
+
36
+ Implementation snippets in docs drift from source. **HTTP listings** stay stable as the public contract. **DDL** documents intended physical shape. **DML** and **application code** belong in migrations and modules. Deployment runbooks are operator-facing setup instructions where shell commands are the deliverable, not source-bound implementation.
@@ -0,0 +1,57 @@
1
+ ---
2
+ description: Postgres write/read config and wiring conventions
3
+ globs:
4
+ - core_framework/core/settings.py
5
+ - core_framework/core/runtime.py
6
+ - config.toml
7
+ - config.toml.template
8
+ - docs/deployments/**/*.md
9
+ alwaysApply: false
10
+ ---
11
+
12
+ # Postgres Config Conventions
13
+
14
+ Use explicit write/read configuration and keep schema names shared.
15
+
16
+ ## Settings Model
17
+
18
+ - Use `PostgresConnectionConfig` for connection and pool settings.
19
+ - Use `PostgresSchemasConfig` for schema names.
20
+ - Settings fields must be:
21
+ - `write_postgres`
22
+ - `read_postgres`
23
+ - `postgres_schemas`
24
+ - Do not reintroduce `settings.postgres`.
25
+
26
+ ## Config Files
27
+
28
+ - `config.toml` and `config.toml.template` must contain:
29
+ - `[write_postgres]`
30
+ - `[read_postgres]`
31
+ - `[postgres_schemas]`
32
+ - Keep schema values only in `[postgres_schemas]` (no schema duplication inside write/read sections).
33
+
34
+ ## Deploy Variables
35
+
36
+ - Use separate env vars for write/read DB rendering:
37
+ - `WRITE_POSTGRES_HOST`, `WRITE_POSTGRES_PORT`, `WRITE_POSTGRES_USER`, `WRITE_POSTGRES_PASSWORD`, `WRITE_POSTGRES_DB`
38
+ - `READ_POSTGRES_HOST`, `READ_POSTGRES_PORT`, `READ_POSTGRES_USER`, `READ_POSTGRES_PASSWORD`, `READ_POSTGRES_DB`
39
+ - Do not use shared `POSTGRES_*` vars for both sections.
40
+
41
+ ## Runtime Wiring
42
+
43
+ - Core module globals (`core_framework.core`) export separate instances:
44
+ - `write_postgres`
45
+ - `read_postgres`
46
+ - `CoreRuntime` also holds `outbox_postgres`: same database as `write_postgres`, separate pool sized from `[outbox]` (`min_connections` / `max_connections`). The worker connects it at startup; the API lifespan does not. Do not rebind it as a `core_framework.core` global.
47
+ - Domain dependencies pass `(write, read, strong)` explicitly to repositories.
48
+ - Until a dedicated strong instance exists, use write instance for the strong argument intentionally.
49
+
50
+ ## Schema names in SQL
51
+
52
+ - Schema names come only from `settings.postgres_schemas` (see **Settings Model** above).
53
+ - Domain `dependencies.py` passes unquoted `schema=runtime.settings.postgres_schemas.schema_<domain>` into repositories (keyword-only `__init__`).
54
+ - Repositories cache `self.schema_sql = quote_postgres_identifier(schema)` and use `{self.schema_sql}.table` in f-string SQL — never hard-coded `"post".` literals.
55
+ - Outbox producer adapter is wired per domain with `schema` at construction; consumer adapter receives unquoted `schema` per call and caches quoted SQL.
56
+
57
+ Repository isolation rules (no cross-domain schema access): **`repository-schema-isolation.mdc`**.
@@ -0,0 +1,89 @@
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
+ **Exception — shared extension-schema types:** Domain Alembic `env.py` sets `search_path` to that domain’s schema only, so types and operator classes that live in the shared extensions schema must be **hard-coded** as `extension.…` (e.g. `extension.ltree` on comment `path`, `extension.gin_trgm_ops` on user `username`). That is required and accepted. Leave `[postgres_schemas].schema_extension` as **`extension`** (see `docs/library/overview.md`); do not treat this as a B11 isolation violation.
58
+
59
+ Cross-domain rules still apply to migrations:
60
+
61
+ - No `REFERENCES` / FKs to tables in another domain's schema.
62
+ - No DDL that reads or writes another domain's objects.
63
+
64
+ Stay within the migration tree's domain; one schema per Alembic env.
65
+
66
+ ## Where cross-domain policy belongs
67
+
68
+ **Application layer** (or domain service orchestration via dependencies, never cross-schema SQL):
69
+
70
+ ```python
71
+ # ✅ application/posts/authenticated_service.py
72
+ post = await post_deps.post_service.retrieve_post_with_metadata_by_id_if_exists(post_id=post_id)
73
+ if post is None or post.status != PostStatus.ACTIVE:
74
+ return False
75
+ return await moderation_deps.moderation_service.add_post_report(...)
76
+ ```
77
+
78
+ Before adding a repository write that depends on another domain's row state:
79
+
80
+ 1. Can the owning domain gate it within its schema? → do that (likes, views, stats dirty).
81
+ 2. Otherwise → gate in `application/**/*_service.py` via the owning domain's service API.
82
+
83
+ ## Self-check (repositories only)
84
+
85
+ In `domains/<name>/repository.py`:
86
+
87
+ - Every table/type qualifier in SQL must use `{self.schema_sql}.…` (that domain's schema only).
88
+ - Do not hard-code `"user".`, `"post".`, etc. — use `self.schema` / `self.schema_sql` from config.
89
+ - Mirror lookup tables (`user_blocks_lookup`, etc.) still live under `{self.schema_sql}` when they belong to that domain's schema.
@@ -0,0 +1,39 @@
1
+ ---
2
+ description: Strong read policy and repository naming for read-after-write consistency
3
+ globs:
4
+ - core_framework/domains/**/repository.py
5
+ - core_framework/domains/**/service.py
6
+ - core_framework/domains/**/dependencies.py
7
+ - core_framework/application/**/*.py
8
+ ---
9
+
10
+ # Strong reads
11
+
12
+ ## Policy
13
+
14
+ - **Read-after-write** in the same HTTP request or worker job → **strong** read (required). Refetch with `strong_read_database`, `*_strong` repository methods, or service accessors that call them.
15
+ - **Decision-critical guards** where stale data can cause incorrect branching → **strong** read (required). These are reads performed to decide a branch (for example pre-write existence, role, or state checks that determine whether a write runs or which outcome is returned), even when there is no immediate prior write in the flow. See the "Read Consistency (Strong vs Normal Reads)" ADR.
16
+ - **Accepted exception:** **`check_caller_identity`** / **`check_not_banned`** (alias) / **`get_user_detail`** (`USER_DETAIL_V2` cache + normal reads) — ban, deleted-user, and account-removal-in-progress visibility are eventually consistent by design. The removal-started fence rides that cache; do not strong-read it on every gated request. See **`docs/platform/architecture-decisions.md`** → *Ban / identity gate via cached `USER_DETAIL` is eventually consistent*. Do not flag as a strong-read defect unless that ADR is updated.
17
+ - **Accepted exception:** account-removal media **owner listing** of avatar/banner/attachment staging-registry rows uses the **read replica**. Replica lag or swallowed per-blob staging deletes can leave orphan staging after a successful spine. See **`docs/platform/architecture-decisions.md`** → *Account-removal staging leftovers (Accepted)*. Do not flag as a must-succeed or strong-read defect unless that ADR is updated.
18
+ - **Accepted exception:** followers-only **mention** recipient filtering uses the **follow replica** (`retrieve_follow_exists`, not `_strong`). Lag-window miss or extra mention is accepted. See **`docs/platform/architecture-decisions.md`** → *Followers-only mention eligibility uses the follow replica (Accepted)*. Do not flag as a strong-read defect unless that ADR is updated.
19
+ - **All other strong-read usage** (e.g., list/browse freshness) → opt-in unless the user explicitly requested it in the task.
20
+ - If a flow writes then reads and only a normal-read API exists, add or extend the `*_strong` path and call it from that flow.
21
+ - Repositories accept `strong_read_database: Postgres` on `__init__` for wiring symmetry even when unused.
22
+
23
+ ## Repository pattern
24
+
25
+ - Normal reads: explicit methods (e.g. `select_appeal`) using `read_database`.
26
+ - Strong reads: separate methods only where needed (e.g. `select_appeal_strong`) using `strong_read_database`.
27
+ - Share one private helper that accepts a database handle when **both** normal and strong public methods exist — do not duplicate SQL or mapping. If only a `*_strong` method exists today, keep SQL inline in that method (constitution → inline small single-use helpers).
28
+ - Service accessors that call strong repository methods should use **`retrieve_*_strong`** naming (repositories keep **`select_*_strong`**).
29
+
30
+ ```python
31
+ # Preferred
32
+ async def select_appeal(self, *, appeal_id: int) -> Appeal:
33
+ return await self._select_appeal_with_database(appeal_id=appeal_id, database=self.read_database)
34
+
35
+ async def select_appeal_strong(self, *, appeal_id: int) -> Appeal:
36
+ return await self._select_appeal_with_database(appeal_id=appeal_id, database=self.strong_read_database)
37
+ ```
38
+
39
+ Keep consistency decisions in services/use-case orchestration, not hidden in unrelated call paths.
@@ -0,0 +1,85 @@
1
+ ---
2
+ name: code-review
3
+ description: >-
4
+ Review code and report a single list of items to address. Use when the user
5
+ asks for a code review, audit of code/implementation, or review of code
6
+ changes — and when they ask to elaborate, expand, or explain those findings.
7
+ Do not use for design / system-design / product-design doc readiness reviews
8
+ (use design-review).
9
+ ---
10
+
11
+ # Code Review
12
+
13
+ Report **one list of items to address**. Check repo rules and originating docs internally. Do **not** split the report into Standards vs Spec (or any other axis). Do **not** tag findings by source.
14
+
15
+ ## What to check
16
+
17
+ **Repo rules.** Does the diff follow this repo’s rules and accepted decisions?
18
+
19
+ Layers, conventions, scoped `.cursor/rules`, **Residue**, parallel drift, third-copy, strong reads, test names, main-feature flowchart when this change adds or alters a design doc. Use [`docs/platform/glossary.md`](docs/platform/glossary.md) terms.
20
+
21
+ Do **not** flag documented accepted trade-offs in **`docs/platform/architecture-decisions.md`** unless the implementation violates them. Do **not** flag two similar copies as needing extraction (wait for the third). Do **not** import a generic smell list that fights those rules.
22
+
23
+ **Originating docs.** Does the diff match the design and flow docs?
24
+
25
+ - Missing or partial relative to the spec
26
+ - Behavior the spec did not ask for
27
+ - Implemented but wrong relative to a spec line (quote that line)
28
+
29
+ **Spec sources** (first that applies): docs the user named; design/flow docs the change clearly belongs to; matching `docs/design/*-design.md` / `docs/domains/**/*-design.md` plus the paired flow doc. If none exist, skip this check — do not mention that there is no spec.
30
+
31
+ ## Output format (required)
32
+
33
+ **Actionable findings only**, under `## Findings`:
34
+
35
+ - Bugs, wrong behavior, improvements, optimizations, doc/code contradictions, parallel implementation drift (sibling flows that diverge without documented reason), **Residue** after an implementation or refactor, spec gaps / extras / mismatches.
36
+ - One numbered list, prioritized by severity. Each item: file context, what is wrong, fix direction.
37
+ - **Do not** praise, summarize strengths, pad with checklist pass narratives, or emit empty-axis sentences.
38
+ - One-line scope is fine. If there is nothing to address, say so in one sentence — no `## Findings` heading.
39
+
40
+ ## Elaborating review points (required)
41
+
42
+ When the user asks to elaborate, expand, explain, or go deeper on review findings (one point, several, or all):
43
+
44
+ - **Always include concrete examples** for each point — never prose-only elaboration.
45
+ - Prefer examples from the reviewed code: cite the relevant snippet, then show a corrected or alternative version when a fix is implied.
46
+ - If the issue is behavioral (race, ordering, missing branch), give a short before/after scenario or input sequence that triggers it.
47
+ - Keep the example tight (a few lines); do not re-dump the whole review.
48
+
49
+ ## Workflow
50
+
51
+ 1. Pin the diff (named files, or `git diff` against the branch base / range the user gave).
52
+ 1. Identify spec sources (see **Originating docs** above).
53
+ 1. Read **`docs/platform/layers-and-boundaries.md`**, **`conventions.md`**, **`architecture-decisions.md`**, and **`glossary.md`** for the reviewed scope.
54
+ 1. Apply **scoped rules** (`.cursor/rules/*.mdc`) matching files under review — especially **`error-boundary`**, **`domain-imports`**, **`api-layer`**, **`application-layer`**, **`strong-reads`**.
55
+ 1. Check for **Residue** from this implementation or refactor (section below). Flag it with delete-now direction unless a live consumer still needs the old path.
56
+ 1. Check rules and originating docs. If the diff is large, parallel exploration is fine; **merge into one severity-ordered list** before reporting. Do not paste unmerged sub-agent reports.
57
+ 1. Report findings only — no filler.
58
+ 1. On elaborate/expand follow-ups, re-read this skill and apply **Elaborating review points**.
59
+
60
+ ## Quick checks
61
+
62
+ - Application services: no HTTP types, no domain exceptions, no Pydantic return types, one-line docstrings.
63
+ - API: thin routers, validation in schemas, orchestration in application — **fastapi** skill (`.agents/skills/fastapi/`) + **`api-layer`** / **`api-validation`** / **`error-boundary`** rules.
64
+ - Domain: imports only via **`__init__.py`** / **`dependencies`** from outer layers; no caller-context names (**`domain-caller-context`**).
65
+ - Read-after-write refetches use **`*_strong`** where applicable.
66
+ - **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`.
67
+ - **Wait for the third copy before you extract** (`docs/platform/conventions.md`): flag a new private helper with one or two call sites unless it is ~15+ lines / non-obvious branching, or a scoped rule requires sharing (`strong-reads`). Do **not** flag two similar inlined copies as needing extraction.
68
+ - **Test name should tell me what broke:** flag tests whose names only name the unit under test or a generic outcome (`test_create_post`, `test_success`, `test_happy_path`). The pytest failure line must state the invariant (e.g. `test_public_feed_excludes_others_followers_only_post`).
69
+ - **Main-feature design flowchart:** if this change introduces a new `*-design.md` (or changes that design’s control flow) and there is no mermaid **`flowchart`** of the main control flow, flag it. Do **not** flag older design docs that never had a chart.
70
+
71
+ ## Residue
72
+
73
+ Leftover seams after the new path shipped. Flag them; they are not “later retirement” unless a live producer or in-flight consumer still needs the old path. On greenfield (no hosts, no traffic), treat as **safe to delete now**.
74
+
75
+ Look for:
76
+
77
+ - Dead registration — worker tasks, enums, schedules, or “keep registered for drain” docs with no remaining producer.
78
+ - Compatibility branches the new producers never write (old payload versions, dual handlers, mirrors-only v1).
79
+ - Incomplete moves — logic still in the old module, a shared helper unused while call sites inline the same shape, types left as `Any` after a typed model exists.
80
+ - Docs / OpenAPI still describing the pre-change stored shape, cutover drain, or a history/status value that is never written.
81
+ - Naming leftovers after a rename (old helper name used for a different role).
82
+
83
+ ## Parallel drift
84
+
85
+ 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`**).