core-framework 1.8.1__tar.gz → 2.1.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 (845) hide show
  1. core_framework-2.1.0/.agents/skills/fastapi +1 -0
  2. core_framework-2.1.0/.agents/skills/library-skills/.library-skills.json +4 -0
  3. core_framework-2.1.0/.agents/skills/library-skills/SKILL.md +37 -0
  4. core_framework-2.1.0/.cursor/rules/alembic-revision-ids.mdc +39 -0
  5. core_framework-2.1.0/.cursor/rules/api-layer.mdc +36 -0
  6. core_framework-2.1.0/.cursor/rules/api-validation.mdc +22 -0
  7. core_framework-2.1.0/.cursor/rules/application-layer.mdc +29 -0
  8. core_framework-2.1.0/.cursor/rules/constants-final.mdc +15 -0
  9. core_framework-2.1.0/.cursor/rules/constitution.mdc +36 -0
  10. core_framework-2.1.0/.cursor/rules/database-triggers.mdc +23 -0
  11. core_framework-2.1.0/.cursor/rules/docstrings.mdc +29 -0
  12. core_framework-2.1.0/.cursor/rules/domain-caller-context.mdc +44 -0
  13. core_framework-2.1.0/.cursor/rules/domain-imports.mdc +44 -0
  14. core_framework-2.1.0/.cursor/rules/domain-input-guards.mdc +32 -0
  15. core_framework-2.1.0/.cursor/rules/error-boundary.mdc +55 -0
  16. core_framework-2.1.0/.cursor/rules/flow-documentation.mdc +15 -0
  17. core_framework-2.1.0/.cursor/rules/inline-raise-messages.mdc +46 -0
  18. core_framework-2.1.0/.cursor/rules/layer-boundaries.mdc +24 -0
  19. core_framework-2.1.0/.cursor/rules/no-code-in-docs.mdc +35 -0
  20. core_framework-2.1.0/.cursor/rules/postgres-config-conventions.mdc +47 -0
  21. core_framework-2.1.0/.cursor/rules/repository-schema-isolation.mdc +72 -0
  22. core_framework-2.1.0/.cursor/rules/strong-reads.mdc +37 -0
  23. core_framework-2.1.0/.cursor/rules/structured-logging.mdc +37 -0
  24. core_framework-2.1.0/.cursor/skills/add-config/SKILL.md +61 -0
  25. core_framework-2.1.0/.cursor/skills/add-domain/SKILL.md +216 -0
  26. core_framework-2.1.0/.cursor/skills/code-review/SKILL.md +34 -0
  27. core_framework-2.1.0/.cursor/skills/fastapi +1 -0
  28. core_framework-2.1.0/.cursor/skills/implement-feature/SKILL.md +66 -0
  29. core_framework-2.1.0/.cursor/skills/recommend-features/SKILL.md +136 -0
  30. core_framework-2.1.0/.cursor/skills/sync-host-rules/SKILL.md +41 -0
  31. core_framework-2.1.0/.cursor/skills/write-flow-doc/SKILL.md +78 -0
  32. core_framework-2.1.0/.github/workflows/_deploy.yml +198 -0
  33. core_framework-2.1.0/.github/workflows/dev-ci-cd.yaml +162 -0
  34. core_framework-2.1.0/.github/workflows/test.yaml +114 -0
  35. core_framework-2.1.0/.pre-commit-config.yaml +51 -0
  36. core_framework-2.1.0/CHANGELOG.md +352 -0
  37. core_framework-2.1.0/PKG-INFO +120 -0
  38. core_framework-2.1.0/alembic/comment/alembic/versions/comment_add_comment_attachments.py +37 -0
  39. core_framework-2.1.0/alembic/comment/alembic/versions/comment_add_comment_create_idempotency.py +44 -0
  40. core_framework-2.1.0/alembic/comment/alembic/versions/comment_add_comment_create_idempotency_created_at_index.py +27 -0
  41. core_framework-2.1.0/alembic/comment/alembic/versions/comment_tombstone_status_model.py +103 -0
  42. core_framework-2.1.0/alembic/media/alembic/versions/media_add_attachment_staging_registry.py +44 -0
  43. core_framework-2.1.0/alembic/media/alembic/versions/media_attachment_staging_registry_published_at.py +34 -0
  44. core_framework-2.1.0/alembic/post/alembic/versions/post_add_post_attachments.py +37 -0
  45. core_framework-2.1.0/alembic/post/alembic/versions/post_add_post_create_idempotency.py +41 -0
  46. core_framework-2.1.0/alembic/post/alembic/versions/post_add_post_create_idempotency_created_at_index.py +27 -0
  47. core_framework-2.1.0/alembic/post/alembic/versions/post_tombstone_status_model.py +95 -0
  48. core_framework-2.1.0/alembic/user/alembic/versions/user_reserve_sentinel_user_ids.py +34 -0
  49. core_framework-2.1.0/config.toml +118 -0
  50. core_framework-2.1.0/config.toml.template +102 -0
  51. core_framework-2.1.0/core_framework/api/admin/cache/router.py +32 -0
  52. core_framework-2.1.0/core_framework/api/admin/cache/schemas.py +91 -0
  53. core_framework-2.1.0/core_framework/api/admin/comments/router.py +78 -0
  54. core_framework-2.1.0/core_framework/api/admin/comments/schemas.py +49 -0
  55. core_framework-2.1.0/core_framework/api/admin/moderation/router.py +219 -0
  56. core_framework-2.1.0/core_framework/api/admin/moderation/schemas.py +105 -0
  57. core_framework-2.1.0/core_framework/api/admin/posts/router.py +67 -0
  58. core_framework-2.1.0/core_framework/api/admin/posts/schemas.py +31 -0
  59. core_framework-2.1.0/core_framework/api/admin/users/router.py +197 -0
  60. core_framework-2.1.0/core_framework/api/admin/users/schemas.py +136 -0
  61. core_framework-2.1.0/core_framework/api/attachments/router.py +51 -0
  62. core_framework-2.1.0/core_framework/api/attachments/schemas.py +48 -0
  63. core_framework-2.1.0/core_framework/api/auth/router.py +21 -0
  64. core_framework-2.1.0/core_framework/api/auth/schemas.py +26 -0
  65. core_framework-2.1.0/core_framework/api/comments/authenticated/mappers.py +17 -0
  66. core_framework-2.1.0/core_framework/api/comments/authenticated/router.py +160 -0
  67. core_framework-2.1.0/core_framework/api/comments/authenticated/schemas.py +77 -0
  68. core_framework-2.1.0/core_framework/api/comments/public/router.py +100 -0
  69. core_framework-2.1.0/core_framework/api/comments/public/schemas.py +42 -0
  70. core_framework-2.1.0/core_framework/api/comments/schemas.py +19 -0
  71. core_framework-2.1.0/core_framework/api/dependencies.py +147 -0
  72. core_framework-2.1.0/core_framework/api/idempotency/__init__.py +5 -0
  73. core_framework-2.1.0/core_framework/api/idempotency/dependencies.py +56 -0
  74. core_framework-2.1.0/core_framework/api/notifications/authenticated/router.py +84 -0
  75. core_framework-2.1.0/core_framework/api/posts/authenticated/mappers.py +19 -0
  76. core_framework-2.1.0/core_framework/api/posts/authenticated/router.py +109 -0
  77. core_framework-2.1.0/core_framework/api/posts/authenticated/schemas.py +75 -0
  78. core_framework-2.1.0/core_framework/api/posts/public/router.py +109 -0
  79. core_framework-2.1.0/core_framework/api/posts/public/schemas.py +44 -0
  80. core_framework-2.1.0/core_framework/api/posts/schemas.py +35 -0
  81. core_framework-2.1.0/core_framework/api/router.py +23 -0
  82. core_framework-2.1.0/core_framework/api/schemas.py +13 -0
  83. core_framework-2.1.0/core_framework/api/system/router.py +112 -0
  84. core_framework-2.1.0/core_framework/api/users/authenticated/mappers.py +19 -0
  85. core_framework-2.1.0/core_framework/api/users/authenticated/router.py +589 -0
  86. core_framework-2.1.0/core_framework/api/users/authenticated/schemas.py +101 -0
  87. core_framework-2.1.0/core_framework/api/users/mappers.py +16 -0
  88. core_framework-2.1.0/core_framework/api/users/public/router.py +28 -0
  89. core_framework-2.1.0/core_framework/api/users/shared/schemas.py +204 -0
  90. core_framework-2.1.0/core_framework/application/auth/access_service.py +28 -0
  91. core_framework-2.1.0/core_framework/application/auth/auth_service.py +24 -0
  92. core_framework-2.1.0/core_framework/application/bootstrap.py +28 -0
  93. core_framework-2.1.0/core_framework/application/cache/invalidate_service.py +54 -0
  94. core_framework-2.1.0/core_framework/application/comments/admin_service.py +315 -0
  95. core_framework-2.1.0/core_framework/application/comments/aggregation_service.py +39 -0
  96. core_framework-2.1.0/core_framework/application/comments/authenticated_service.py +236 -0
  97. core_framework-2.1.0/core_framework/application/comments/cleanup_service.py +109 -0
  98. core_framework-2.1.0/core_framework/application/comments/public_service.py +360 -0
  99. core_framework-2.1.0/core_framework/application/events/event_service.py +74 -0
  100. core_framework-2.1.0/core_framework/application/events/event_token.py +50 -0
  101. core_framework-2.1.0/core_framework/application/media/README.md +17 -0
  102. core_framework-2.1.0/core_framework/application/media/attachment_read.py +77 -0
  103. core_framework-2.1.0/core_framework/application/media/attachment_service.py +491 -0
  104. core_framework-2.1.0/core_framework/application/media/avatar_service.py +179 -0
  105. core_framework-2.1.0/core_framework/application/media/banner_service.py +169 -0
  106. core_framework-2.1.0/core_framework/application/media/ingest_guards.py +17 -0
  107. core_framework-2.1.0/core_framework/application/media/read_url_config.py +50 -0
  108. core_framework-2.1.0/core_framework/application/moderation/appeal_service.py +108 -0
  109. core_framework-2.1.0/core_framework/application/moderation/moderator_service.py +47 -0
  110. core_framework-2.1.0/core_framework/application/moderation/report_service.py +203 -0
  111. core_framework-2.1.0/core_framework/application/moderation/scheduled_service.py +6 -0
  112. core_framework-2.1.0/core_framework/application/moderation/user_service.py +218 -0
  113. core_framework-2.1.0/core_framework/application/notifications/inbox_service.py +248 -0
  114. core_framework-2.1.0/core_framework/application/notifications/mute_service.py +38 -0
  115. core_framework-2.1.0/core_framework/application/notifications/notification_service.py +166 -0
  116. core_framework-2.1.0/core_framework/application/posts/admin_service.py +173 -0
  117. core_framework-2.1.0/core_framework/application/posts/aggregation_service.py +38 -0
  118. core_framework-2.1.0/core_framework/application/posts/authenticated_service.py +115 -0
  119. core_framework-2.1.0/core_framework/application/posts/cleanup_service.py +127 -0
  120. core_framework-2.1.0/core_framework/application/posts/public_service.py +377 -0
  121. core_framework-2.1.0/core_framework/application/shared/enums.py +30 -0
  122. core_framework-2.1.0/core_framework/application/shared/exceptions.py +52 -0
  123. core_framework-2.1.0/core_framework/application/users/admin_service.py +332 -0
  124. core_framework-2.1.0/core_framework/application/users/authenticated_service.py +376 -0
  125. core_framework-2.1.0/core_framework/application/users/deletion_audit.py +12 -0
  126. core_framework-2.1.0/core_framework/application/users/enums.py +6 -0
  127. core_framework-2.1.0/core_framework/application/users/public_service.py +150 -0
  128. core_framework-2.1.0/core_framework/application/users/scheduled_service.py +6 -0
  129. core_framework-2.1.0/core_framework/application/users/user_deletion_service.py +245 -0
  130. core_framework-2.1.0/core_framework/bundled_alembic.py +43 -0
  131. core_framework-2.1.0/core_framework/core/cache.py +155 -0
  132. core_framework-2.1.0/core_framework/core/exception_handlers/application.py +130 -0
  133. core_framework-2.1.0/core_framework/core/exception_handlers/common.py +69 -0
  134. core_framework-2.1.0/core_framework/core/exception_handlers/setup.py +36 -0
  135. core_framework-2.1.0/core_framework/core/middleware.py +116 -0
  136. core_framework-2.1.0/core_framework/core/pagination.py +198 -0
  137. core_framework-2.1.0/core_framework/core/runtime.py +59 -0
  138. core_framework-2.1.0/core_framework/core/settings.py +339 -0
  139. core_framework-2.1.0/core_framework/domains/auth/__init__.py +8 -0
  140. core_framework-2.1.0/core_framework/domains/auth/dependencies.py +28 -0
  141. core_framework-2.1.0/core_framework/domains/auth/exceptions.py +10 -0
  142. core_framework-2.1.0/core_framework/domains/auth/models.py +31 -0
  143. core_framework-2.1.0/core_framework/domains/auth/ports/auth.py +51 -0
  144. core_framework-2.1.0/core_framework/domains/auth/service.py +57 -0
  145. core_framework-2.1.0/core_framework/domains/comment/README.md +259 -0
  146. core_framework-2.1.0/core_framework/domains/comment/__init__.py +51 -0
  147. core_framework-2.1.0/core_framework/domains/comment/constants.py +8 -0
  148. core_framework-2.1.0/core_framework/domains/comment/enums.py +32 -0
  149. core_framework-2.1.0/core_framework/domains/comment/exceptions.py +30 -0
  150. core_framework-2.1.0/core_framework/domains/comment/models.py +225 -0
  151. core_framework-2.1.0/core_framework/domains/comment/outcomes.py +19 -0
  152. core_framework-2.1.0/core_framework/domains/comment/repository.py +2408 -0
  153. core_framework-2.1.0/core_framework/domains/comment/service.py +941 -0
  154. core_framework-2.1.0/core_framework/domains/exceptions.py +11 -0
  155. core_framework-2.1.0/core_framework/domains/media/README.md +28 -0
  156. core_framework-2.1.0/core_framework/domains/media/__init__.py +59 -0
  157. core_framework-2.1.0/core_framework/domains/media/attachment/components/finals_publisher.py +45 -0
  158. core_framework-2.1.0/core_framework/domains/media/attachment/components/staging.py +164 -0
  159. core_framework-2.1.0/core_framework/domains/media/attachment/components/variant_encoder.py +53 -0
  160. core_framework-2.1.0/core_framework/domains/media/attachment/constants.py +41 -0
  161. core_framework-2.1.0/core_framework/domains/media/attachment/exceptions.py +25 -0
  162. core_framework-2.1.0/core_framework/domains/media/attachment/models.py +27 -0
  163. core_framework-2.1.0/core_framework/domains/media/attachment/ports/finals_publisher.py +36 -0
  164. core_framework-2.1.0/core_framework/domains/media/attachment/ports/staging.py +44 -0
  165. core_framework-2.1.0/core_framework/domains/media/attachment/ports/variant_encoder.py +34 -0
  166. core_framework-2.1.0/core_framework/domains/media/attachment/service.py +489 -0
  167. core_framework-2.1.0/core_framework/domains/media/avatar/components/staging.py +139 -0
  168. core_framework-2.1.0/core_framework/domains/media/avatar/service.py +348 -0
  169. core_framework-2.1.0/core_framework/domains/media/banner/components/staging.py +109 -0
  170. core_framework-2.1.0/core_framework/domains/media/banner/service.py +343 -0
  171. core_framework-2.1.0/core_framework/domains/media/dependencies.py +328 -0
  172. core_framework-2.1.0/core_framework/domains/media/shared/exceptions.py +9 -0
  173. core_framework-2.1.0/core_framework/domains/media/shared/outcomes.py +21 -0
  174. core_framework-2.1.0/core_framework/domains/media/shared/repository.py +815 -0
  175. core_framework-2.1.0/core_framework/domains/moderation/__init__.py +41 -0
  176. core_framework-2.1.0/core_framework/domains/moderation/enums.py +66 -0
  177. core_framework-2.1.0/core_framework/domains/moderation/exceptions.py +30 -0
  178. core_framework-2.1.0/core_framework/domains/moderation/outcomes.py +18 -0
  179. core_framework-2.1.0/core_framework/domains/moderation/repository.py +1198 -0
  180. core_framework-2.1.0/core_framework/domains/moderation/service.py +794 -0
  181. core_framework-2.1.0/core_framework/domains/notification/README.md +156 -0
  182. core_framework-2.1.0/core_framework/domains/notification/exceptions.py +5 -0
  183. core_framework-2.1.0/core_framework/domains/notification/repository.py +592 -0
  184. core_framework-2.1.0/core_framework/domains/notification/service.py +279 -0
  185. core_framework-2.1.0/core_framework/domains/post/README.md +205 -0
  186. core_framework-2.1.0/core_framework/domains/post/__init__.py +41 -0
  187. core_framework-2.1.0/core_framework/domains/post/constants.py +9 -0
  188. core_framework-2.1.0/core_framework/domains/post/enums.py +40 -0
  189. core_framework-2.1.0/core_framework/domains/post/exceptions.py +20 -0
  190. core_framework-2.1.0/core_framework/domains/post/models.py +197 -0
  191. core_framework-2.1.0/core_framework/domains/post/outcomes.py +7 -0
  192. core_framework-2.1.0/core_framework/domains/post/repository.py +2145 -0
  193. core_framework-2.1.0/core_framework/domains/post/service.py +832 -0
  194. core_framework-2.1.0/core_framework/domains/user/__init__.py +55 -0
  195. core_framework-2.1.0/core_framework/domains/user/constants.py +19 -0
  196. core_framework-2.1.0/core_framework/domains/user/exceptions.py +35 -0
  197. core_framework-2.1.0/core_framework/domains/user/outcomes.py +24 -0
  198. core_framework-2.1.0/core_framework/domains/user/repository.py +1520 -0
  199. core_framework-2.1.0/core_framework/domains/user/service.py +864 -0
  200. core_framework-2.1.0/core_framework/domains/utils.py +266 -0
  201. core_framework-2.1.0/core_framework/infrastructure/firebase/firebase_auth_adapter.py +110 -0
  202. core_framework-2.1.0/core_framework/infrastructure/media/attachment_staging_display_geometry.py +67 -0
  203. core_framework-2.1.0/core_framework/infrastructure/media/local_attachment_staging_adapter.py +73 -0
  204. core_framework-2.1.0/core_framework/infrastructure/media/local_banner_staging_adapter.py +60 -0
  205. core_framework-2.1.0/core_framework/infrastructure/media/local_staging_adapter.py +90 -0
  206. core_framework-2.1.0/core_framework/infrastructure/media/pillow_attachment_variant_encoder_adapter.py +130 -0
  207. core_framework-2.1.0/core_framework/infrastructure/media/ssh_attachment_finals_publisher_adapter.py +130 -0
  208. core_framework-2.1.0/core_framework/infrastructure/media/ssh_finals_publisher_adapter.py +127 -0
  209. core_framework-2.1.0/core_framework/main.py +91 -0
  210. core_framework-2.1.0/core_framework/testing/arq.py +120 -0
  211. core_framework-2.1.0/core_framework/testing/firebase.py +95 -0
  212. core_framework-2.1.0/core_framework/testing/media.py +283 -0
  213. core_framework-2.1.0/core_framework/testing/plugin.py +216 -0
  214. core_framework-2.1.0/core_framework/worker/schedules/__init__.py +88 -0
  215. core_framework-2.1.0/core_framework/worker/schedules/schedule_aggregate_comment_stats.py +43 -0
  216. core_framework-2.1.0/core_framework/worker/schedules/schedule_aggregate_post_stats.py +41 -0
  217. core_framework-2.1.0/core_framework/worker/schedules/schedule_aggregate_user_stats.py +41 -0
  218. core_framework-2.1.0/core_framework/worker/schedules/schedule_expired_account_deletions.py +34 -0
  219. core_framework-2.1.0/core_framework/worker/schedules/schedule_expired_mute_lifts.py +31 -0
  220. core_framework-2.1.0/core_framework/worker/schedules/schedule_purge_expired_create_idempotency_keys.py +23 -0
  221. core_framework-2.1.0/core_framework/worker/schedules/schedule_sweep_stale_attachment_staging.py +15 -0
  222. core_framework-2.1.0/core_framework/worker/schedules/schedule_sweep_stale_avatar_staging.py +15 -0
  223. core_framework-2.1.0/core_framework/worker/tasks/__init__.py +35 -0
  224. core_framework-2.1.0/core_framework/worker/tasks/delete_attachment_finals.py +17 -0
  225. core_framework-2.1.0/core_framework/worker/tasks/delete_superseded_avatar_finals.py +17 -0
  226. core_framework-2.1.0/core_framework/worker/tasks/process_account_deletion.py +21 -0
  227. core_framework-2.1.0/core_framework/worker/tasks/process_admin_user_deletion.py +34 -0
  228. core_framework-2.1.0/core_framework/worker/tasks/process_aggregate_comment_stats.py +22 -0
  229. core_framework-2.1.0/core_framework/worker/tasks/process_aggregate_post_stats.py +19 -0
  230. core_framework-2.1.0/core_framework/worker/tasks/process_aggregate_user_stats.py +19 -0
  231. core_framework-2.1.0/core_framework/worker/tasks/process_attachment_asset_variants.py +29 -0
  232. core_framework-2.1.0/core_framework/worker/tasks/process_cache_pattern_invalidation.py +31 -0
  233. core_framework-2.1.0/core_framework/worker/tasks/process_destructive_comment_delete.py +15 -0
  234. core_framework-2.1.0/core_framework/worker/tasks/process_destructive_post_delete.py +15 -0
  235. core_framework-2.1.0/core_framework/worker/tasks/process_media_asset_variants.py +38 -0
  236. core_framework-2.1.0/core_framework/worker/tasks/process_mute_lift.py +16 -0
  237. core_framework-2.1.0/core_framework/worker/tasks/process_user_content_deletion.py +15 -0
  238. core_framework-2.1.0/dockerfile +70 -0
  239. core_framework-2.1.0/docs/deployments/README.md +35 -0
  240. core_framework-2.1.0/docs/deployments/deploy-playbook.md +195 -0
  241. core_framework-2.1.0/docs/deployments/e2e-smoke-tests-design.md +353 -0
  242. core_framework-2.1.0/docs/deployments/edge-upload-limits.md +67 -0
  243. core_framework-2.1.0/docs/deployments/examples/Caddyfile.example +48 -0
  244. core_framework-2.1.0/docs/deployments/guides/app-server-deploy-ssh.md +55 -0
  245. core_framework-2.1.0/docs/deployments/guides/image-server-ssh.md +62 -0
  246. core_framework-2.1.0/docs/deployments/guides/postgres-setup.md +153 -0
  247. core_framework-2.1.0/docs/deployments/guides/redis-setup.md +109 -0
  248. core_framework-2.1.0/docs/deployments/guides/ubuntu-server-setup.md +173 -0
  249. core_framework-2.1.0/docs/domains/README.md +17 -0
  250. core_framework-2.1.0/docs/domains/auth/access_control.md +58 -0
  251. core_framework-2.1.0/docs/domains/auth/registration.md +58 -0
  252. core_framework-2.1.0/docs/domains/comments/admin_comments.md +217 -0
  253. core_framework-2.1.0/docs/domains/comments/comment_stats_aggregation.md +69 -0
  254. core_framework-2.1.0/docs/domains/comments/create_comment.md +154 -0
  255. core_framework-2.1.0/docs/domains/comments/delete_comment.md +67 -0
  256. core_framework-2.1.0/docs/domains/comments/edit_comment.md +71 -0
  257. core_framework-2.1.0/docs/domains/comments/retrieve_comments.md +224 -0
  258. core_framework-2.1.0/docs/domains/deletion/comments.md +288 -0
  259. core_framework-2.1.0/docs/domains/deletion/overview.md +185 -0
  260. core_framework-2.1.0/docs/domains/deletion/posts.md +298 -0
  261. core_framework-2.1.0/docs/domains/deletion/users.md +458 -0
  262. core_framework-2.1.0/docs/domains/media/avatar-upload-design.md +110 -0
  263. core_framework-2.1.0/docs/domains/media/banner-upload-design.md +150 -0
  264. core_framework-2.1.0/docs/domains/media/post-comment-attachments-design.md +522 -0
  265. core_framework-2.1.0/docs/domains/media/upload-pipeline-design.md +464 -0
  266. core_framework-2.1.0/docs/domains/media/upload_pipeline.md +91 -0
  267. core_framework-2.1.0/docs/domains/mentions/mentions_in_content.md +237 -0
  268. core_framework-2.1.0/docs/domains/moderation/appeals.md +217 -0
  269. core_framework-2.1.0/docs/domains/moderation/internal_notes.md +158 -0
  270. core_framework-2.1.0/docs/domains/moderation/reports.md +184 -0
  271. core_framework-2.1.0/docs/domains/notifications/notification_inbox.md +384 -0
  272. core_framework-2.1.0/docs/domains/posts/admin_posts.md +212 -0
  273. core_framework-2.1.0/docs/domains/posts/author_context.md +92 -0
  274. core_framework-2.1.0/docs/domains/posts/hashtag_discovery.md +59 -0
  275. core_framework-2.1.0/docs/domains/posts/post_like.md +94 -0
  276. core_framework-2.1.0/docs/domains/posts/post_stats_aggregation.md +90 -0
  277. core_framework-2.1.0/docs/domains/posts/post_visibility.md +83 -0
  278. core_framework-2.1.0/docs/domains/users/account_deletion.md +110 -0
  279. core_framework-2.1.0/docs/domains/users/blocks.md +115 -0
  280. core_framework-2.1.0/docs/domains/users/follow-system-design.md +422 -0
  281. core_framework-2.1.0/docs/domains/users/follow.md +215 -0
  282. core_framework-2.1.0/docs/domains/users/user_removal.md +129 -0
  283. core_framework-2.1.0/docs/library/api.md +197 -0
  284. core_framework-2.1.0/docs/library/core-framework-migration.md +296 -0
  285. core_framework-2.1.0/docs/library/package-api.md +266 -0
  286. core_framework-2.1.0/docs/library/testing-plugin-design.md +319 -0
  287. core_framework-2.1.0/docs/platform/README.md +16 -0
  288. core_framework-2.1.0/docs/platform/architecture-decisions.md +476 -0
  289. core_framework-2.1.0/docs/platform/client-error-visibility.md +227 -0
  290. core_framework-2.1.0/docs/platform/conventions.md +80 -0
  291. core_framework-2.1.0/docs/platform/create-idempotency-design.md +283 -0
  292. core_framework-2.1.0/docs/platform/domain-services-and-adapters.md +116 -0
  293. core_framework-2.1.0/docs/platform/event-outbox-design.md +529 -0
  294. core_framework-2.1.0/docs/platform/layers-and-boundaries.md +46 -0
  295. core_framework-2.1.0/docs/platform/media-storage-topology.md +141 -0
  296. core_framework-2.1.0/docs/platform/patch-update-typed-payload.md +190 -0
  297. core_framework-2.1.0/docs/todo.md +10 -0
  298. core_framework-2.1.0/makefile +68 -0
  299. core_framework-2.1.0/pyproject.toml +137 -0
  300. core_framework-2.1.0/tests/conftest.py +49 -0
  301. core_framework-2.1.0/tests/e2e/_auth.py +54 -0
  302. core_framework-2.1.0/tests/e2e/_canaries.py +140 -0
  303. core_framework-2.1.0/tests/e2e/_media.py +84 -0
  304. core_framework-2.1.0/tests/e2e/_settings.py +40 -0
  305. core_framework-2.1.0/tests/e2e/_upload_payloads.py +18 -0
  306. core_framework-2.1.0/tests/e2e/conftest.py +76 -0
  307. core_framework-2.1.0/tests/e2e/media/pipeline_test.py +154 -0
  308. core_framework-2.1.0/tests/e2e/smoke/canary_test.py +36 -0
  309. core_framework-2.1.0/tests/e2e/smoke/media_test.py +179 -0
  310. core_framework-2.1.0/tests/e2e/smoke/system_test.py +32 -0
  311. core_framework-2.1.0/tests/e2e/smoke/tls_host_test.py +66 -0
  312. core_framework-2.1.0/tests/integration/_http_error_details.py +19 -0
  313. core_framework-2.1.0/tests/integration/api/_auth_helpers.py +12 -0
  314. core_framework-2.1.0/tests/integration/api/_destructive_delete_helpers.py +51 -0
  315. core_framework-2.1.0/tests/integration/api/_http_helpers.py +106 -0
  316. core_framework-2.1.0/tests/integration/api/_user_deletion_helpers.py +63 -0
  317. core_framework-2.1.0/tests/integration/api/_user_helpers.py +24 -0
  318. core_framework-2.1.0/tests/integration/api/admin/_auth_cases.py +42 -0
  319. core_framework-2.1.0/tests/integration/api/admin/cache/router_test.py +327 -0
  320. core_framework-2.1.0/tests/integration/api/admin/comments/router_test.py +749 -0
  321. core_framework-2.1.0/tests/integration/api/admin/moderation/_auth_cases.py +30 -0
  322. core_framework-2.1.0/tests/integration/api/admin/moderation/router_test.py +2462 -0
  323. core_framework-2.1.0/tests/integration/api/admin/posts/router_test.py +475 -0
  324. core_framework-2.1.0/tests/integration/api/admin/users/router_test.py +1477 -0
  325. core_framework-2.1.0/tests/integration/api/attachments/_helpers.py +214 -0
  326. core_framework-2.1.0/tests/integration/api/attachments/attachment_upload_test.py +33 -0
  327. core_framework-2.1.0/tests/integration/api/comments/authenticated/comment_writes_integration_test.py +680 -0
  328. core_framework-2.1.0/tests/integration/api/comments/comment_attachments_integration_test.py +352 -0
  329. core_framework-2.1.0/tests/integration/api/comments/public/router_test.py +520 -0
  330. core_framework-2.1.0/tests/integration/api/create_idempotency_integration_test.py +481 -0
  331. core_framework-2.1.0/tests/integration/api/media/ingest_contract_test.py +179 -0
  332. core_framework-2.1.0/tests/integration/api/mentions/mentions_integration_test.py +394 -0
  333. core_framework-2.1.0/tests/integration/api/notifications/router_test.py +548 -0
  334. core_framework-2.1.0/tests/integration/api/posts/authenticated/post_writes_integration_test.py +325 -0
  335. core_framework-2.1.0/tests/integration/api/posts/comment_count_aggregation_test.py +144 -0
  336. core_framework-2.1.0/tests/integration/api/posts/followers_visibility_test.py +123 -0
  337. core_framework-2.1.0/tests/integration/api/posts/post_attachments_integration_test.py +383 -0
  338. core_framework-2.1.0/tests/integration/api/posts/post_deletion_integration_test.py +547 -0
  339. core_framework-2.1.0/tests/integration/api/posts/public/router_test.py +1066 -0
  340. core_framework-2.1.0/tests/integration/api/public_read_by_id_unavailable_detail_test.py +31 -0
  341. core_framework-2.1.0/tests/integration/api/users/authenticated/avatar_upload_test.py +112 -0
  342. core_framework-2.1.0/tests/integration/api/users/authenticated/banner_upload_test.py +112 -0
  343. core_framework-2.1.0/tests/integration/api/users/authenticated/router_test.py +1167 -0
  344. core_framework-2.1.0/tests/integration/api/users/deletion_audit_integration_test.py +180 -0
  345. core_framework-2.1.0/tests/integration/api/users/public/router_test.py +332 -0
  346. core_framework-2.1.0/tests/integration/api/users/user_deletion_integration_test.py +245 -0
  347. core_framework-2.1.0/tests/integration/worker/_media_upload_helpers.py +77 -0
  348. core_framework-2.1.0/tests/integration/worker/account_deletion_test.py +390 -0
  349. core_framework-2.1.0/tests/integration/worker/aggregate_comment_stats_test.py +363 -0
  350. core_framework-2.1.0/tests/integration/worker/aggregate_user_stats_test.py +144 -0
  351. core_framework-2.1.0/tests/integration/worker/attachment_upload_test.py +96 -0
  352. core_framework-2.1.0/tests/integration/worker/avatar_upload_test.py +370 -0
  353. core_framework-2.1.0/tests/integration/worker/banner_upload_test.py +367 -0
  354. core_framework-2.1.0/tests/integration/worker/create_idempotency_retention_test.py +289 -0
  355. core_framework-2.1.0/tests/integration/worker/stale_staging_sweep_test.py +169 -0
  356. core_framework-2.1.0/tests/integration/worker/utils_test.py +124 -0
  357. core_framework-2.1.0/tests/unit/api/comments/authenticated/comment_request_schemas_test.py +60 -0
  358. core_framework-2.1.0/tests/unit/api/dedupe_preserving_order_test.py +12 -0
  359. core_framework-2.1.0/tests/unit/api/posts/authenticated/post_update_mapper_test.py +29 -0
  360. core_framework-2.1.0/tests/unit/api/users/profile_update_mapper_test.py +22 -0
  361. core_framework-2.1.0/tests/unit/application/notifications/inbox_service_test.py +111 -0
  362. core_framework-2.1.0/tests/unit/application/users/deletion_audit_test.py +56 -0
  363. core_framework-2.1.0/tests/unit/domains/comment/__init__.py +0 -0
  364. core_framework-2.1.0/tests/unit/domains/post/models_test.py +28 -0
  365. core_framework-2.1.0/tests/unit/infrastructure/__init__.py +0 -0
  366. core_framework-2.1.0/tests/unit/infrastructure/media/__init__.py +0 -0
  367. core_framework-2.1.0/tests/unit/infrastructure/media/ssh_finals_publisher_adapter_test.py +278 -0
  368. core_framework-2.1.0/uv.lock +2327 -0
  369. core_framework-1.8.1/.cursor/rules/api-layer.mdc +0 -37
  370. core_framework-1.8.1/.cursor/rules/api-security.mdc +0 -18
  371. core_framework-1.8.1/.cursor/rules/api-validation.mdc +0 -107
  372. core_framework-1.8.1/.cursor/rules/application-layer.mdc +0 -83
  373. core_framework-1.8.1/.cursor/rules/code-review-output.mdc +0 -31
  374. core_framework-1.8.1/.cursor/rules/constants-final.mdc +0 -15
  375. core_framework-1.8.1/.cursor/rules/database-triggers.md +0 -184
  376. core_framework-1.8.1/.cursor/rules/docstrings.mdc +0 -81
  377. core_framework-1.8.1/.cursor/rules/domain-caller-context.mdc +0 -45
  378. core_framework-1.8.1/.cursor/rules/domain-imports.mdc +0 -99
  379. core_framework-1.8.1/.cursor/rules/domain-input-guards.mdc +0 -72
  380. core_framework-1.8.1/.cursor/rules/exception-handlers.mdc +0 -33
  381. core_framework-1.8.1/.cursor/rules/flow-documentation.mdc +0 -326
  382. core_framework-1.8.1/.cursor/rules/henry-cursor-rules-sync.mdc +0 -51
  383. core_framework-1.8.1/.cursor/rules/implementation-workflow.mdc +0 -68
  384. core_framework-1.8.1/.cursor/rules/karpathy-guidelines.mdc +0 -70
  385. core_framework-1.8.1/.cursor/rules/layer-boundaries.mdc +0 -38
  386. core_framework-1.8.1/.cursor/rules/no-code-in-docs.mdc +0 -30
  387. core_framework-1.8.1/.cursor/rules/postgres-config-conventions.mdc +0 -41
  388. core_framework-1.8.1/.cursor/rules/repository-read-consistency.mdc +0 -55
  389. core_framework-1.8.1/.cursor/rules/strong-read-opt-in.mdc +0 -22
  390. core_framework-1.8.1/.cursor/rules/structured-logging.mdc +0 -35
  391. core_framework-1.8.1/.cursor/rules/tech-stack.mdc +0 -14
  392. core_framework-1.8.1/.cursor/skills/add-config/SKILL.md +0 -57
  393. core_framework-1.8.1/.cursor/skills/add-domain/SKILL.md +0 -205
  394. core_framework-1.8.1/.cursor/skills/code-review/SKILL.md +0 -102
  395. core_framework-1.8.1/.cursor/skills/recommend-features/SKILL.md +0 -136
  396. core_framework-1.8.1/.github/workflows/_deploy.yml +0 -190
  397. core_framework-1.8.1/.github/workflows/dev-ci-cd.yaml +0 -125
  398. core_framework-1.8.1/.github/workflows/test.yaml +0 -114
  399. core_framework-1.8.1/.pre-commit-config.yaml +0 -51
  400. core_framework-1.8.1/CHANGELOG.md +0 -266
  401. core_framework-1.8.1/PKG-INFO +0 -119
  402. core_framework-1.8.1/config.toml +0 -100
  403. core_framework-1.8.1/config.toml.template +0 -90
  404. core_framework-1.8.1/core_framework/api/admin/cache/router.py +0 -32
  405. core_framework-1.8.1/core_framework/api/admin/cache/schemas.py +0 -95
  406. core_framework-1.8.1/core_framework/api/admin/comments/router.py +0 -76
  407. core_framework-1.8.1/core_framework/api/admin/comments/schemas.py +0 -47
  408. core_framework-1.8.1/core_framework/api/admin/moderation/router.py +0 -211
  409. core_framework-1.8.1/core_framework/api/admin/moderation/schemas.py +0 -112
  410. core_framework-1.8.1/core_framework/api/admin/posts/router.py +0 -62
  411. core_framework-1.8.1/core_framework/api/admin/posts/schemas.py +0 -29
  412. core_framework-1.8.1/core_framework/api/admin/users/router.py +0 -185
  413. core_framework-1.8.1/core_framework/api/admin/users/schemas.py +0 -140
  414. core_framework-1.8.1/core_framework/api/auth/router.py +0 -21
  415. core_framework-1.8.1/core_framework/api/auth/schemas.py +0 -29
  416. core_framework-1.8.1/core_framework/api/comments/authenticated/mappers.py +0 -20
  417. core_framework-1.8.1/core_framework/api/comments/authenticated/router.py +0 -141
  418. core_framework-1.8.1/core_framework/api/comments/authenticated/schemas.py +0 -49
  419. core_framework-1.8.1/core_framework/api/comments/public/router.py +0 -100
  420. core_framework-1.8.1/core_framework/api/comments/public/schemas.py +0 -38
  421. core_framework-1.8.1/core_framework/api/comments/schemas.py +0 -18
  422. core_framework-1.8.1/core_framework/api/dependencies.py +0 -178
  423. core_framework-1.8.1/core_framework/api/notifications/authenticated/router.py +0 -84
  424. core_framework-1.8.1/core_framework/api/posts/authenticated/mappers.py +0 -28
  425. core_framework-1.8.1/core_framework/api/posts/authenticated/router.py +0 -98
  426. core_framework-1.8.1/core_framework/api/posts/authenticated/schemas.py +0 -54
  427. core_framework-1.8.1/core_framework/api/posts/public/router.py +0 -109
  428. core_framework-1.8.1/core_framework/api/posts/public/schemas.py +0 -41
  429. core_framework-1.8.1/core_framework/api/posts/schemas.py +0 -40
  430. core_framework-1.8.1/core_framework/api/router.py +0 -21
  431. core_framework-1.8.1/core_framework/api/schemas.py +0 -15
  432. core_framework-1.8.1/core_framework/api/system/router.py +0 -111
  433. core_framework-1.8.1/core_framework/api/users/authenticated/mappers.py +0 -21
  434. core_framework-1.8.1/core_framework/api/users/authenticated/router.py +0 -578
  435. core_framework-1.8.1/core_framework/api/users/authenticated/schemas.py +0 -101
  436. core_framework-1.8.1/core_framework/api/users/mappers.py +0 -52
  437. core_framework-1.8.1/core_framework/api/users/public/router.py +0 -35
  438. core_framework-1.8.1/core_framework/api/users/shared/schemas.py +0 -231
  439. core_framework-1.8.1/core_framework/application/auth/access_service.py +0 -33
  440. core_framework-1.8.1/core_framework/application/auth/auth_service.py +0 -16
  441. core_framework-1.8.1/core_framework/application/bootstrap.py +0 -26
  442. core_framework-1.8.1/core_framework/application/cache/invalidate_service.py +0 -59
  443. core_framework-1.8.1/core_framework/application/comments/admin_service.py +0 -263
  444. core_framework-1.8.1/core_framework/application/comments/aggregation_service.py +0 -35
  445. core_framework-1.8.1/core_framework/application/comments/authenticated_service.py +0 -142
  446. core_framework-1.8.1/core_framework/application/comments/public_service.py +0 -366
  447. core_framework-1.8.1/core_framework/application/events/event_service.py +0 -85
  448. core_framework-1.8.1/core_framework/application/events/event_token.py +0 -51
  449. core_framework-1.8.1/core_framework/application/media/README.md +0 -17
  450. core_framework-1.8.1/core_framework/application/media/avatar_service.py +0 -187
  451. core_framework-1.8.1/core_framework/application/media/banner_service.py +0 -150
  452. core_framework-1.8.1/core_framework/application/moderation/appeal_service.py +0 -107
  453. core_framework-1.8.1/core_framework/application/moderation/moderator_service.py +0 -52
  454. core_framework-1.8.1/core_framework/application/moderation/report_service.py +0 -209
  455. core_framework-1.8.1/core_framework/application/moderation/scheduled_service.py +0 -10
  456. core_framework-1.8.1/core_framework/application/moderation/user_service.py +0 -246
  457. core_framework-1.8.1/core_framework/application/notifications/inbox_service.py +0 -256
  458. core_framework-1.8.1/core_framework/application/notifications/mute_service.py +0 -18
  459. core_framework-1.8.1/core_framework/application/notifications/notification_service.py +0 -174
  460. core_framework-1.8.1/core_framework/application/posts/admin_service.py +0 -131
  461. core_framework-1.8.1/core_framework/application/posts/aggregation_service.py +0 -42
  462. core_framework-1.8.1/core_framework/application/posts/authenticated_service.py +0 -90
  463. core_framework-1.8.1/core_framework/application/posts/public_service.py +0 -365
  464. core_framework-1.8.1/core_framework/application/shared/enums.py +0 -24
  465. core_framework-1.8.1/core_framework/application/shared/exceptions.py +0 -16
  466. core_framework-1.8.1/core_framework/application/users/admin_service.py +0 -361
  467. core_framework-1.8.1/core_framework/application/users/authenticated_service.py +0 -326
  468. core_framework-1.8.1/core_framework/application/users/public_service.py +0 -155
  469. core_framework-1.8.1/core_framework/application/users/scheduled_service.py +0 -6
  470. core_framework-1.8.1/core_framework/bundled_alembic.py +0 -45
  471. core_framework-1.8.1/core_framework/core/cache.py +0 -158
  472. core_framework-1.8.1/core_framework/core/exception_handlers/comment.py +0 -84
  473. core_framework-1.8.1/core_framework/core/exception_handlers/common.py +0 -19
  474. core_framework-1.8.1/core_framework/core/exception_handlers/media.py +0 -104
  475. core_framework-1.8.1/core_framework/core/exception_handlers/moderation.py +0 -84
  476. core_framework-1.8.1/core_framework/core/exception_handlers/notification.py +0 -22
  477. core_framework-1.8.1/core_framework/core/exception_handlers/post.py +0 -48
  478. core_framework-1.8.1/core_framework/core/exception_handlers/setup.py +0 -82
  479. core_framework-1.8.1/core_framework/core/exception_handlers/user.py +0 -60
  480. core_framework-1.8.1/core_framework/core/middleware.py +0 -64
  481. core_framework-1.8.1/core_framework/core/pagination.py +0 -200
  482. core_framework-1.8.1/core_framework/core/runtime.py +0 -60
  483. core_framework-1.8.1/core_framework/core/settings.py +0 -288
  484. core_framework-1.8.1/core_framework/domains/comment/README.md +0 -262
  485. core_framework-1.8.1/core_framework/domains/comment/__init__.py +0 -34
  486. core_framework-1.8.1/core_framework/domains/comment/constants.py +0 -5
  487. core_framework-1.8.1/core_framework/domains/comment/enums.py +0 -10
  488. core_framework-1.8.1/core_framework/domains/comment/exceptions.py +0 -31
  489. core_framework-1.8.1/core_framework/domains/comment/models.py +0 -132
  490. core_framework-1.8.1/core_framework/domains/comment/repository.py +0 -1451
  491. core_framework-1.8.1/core_framework/domains/comment/service.py +0 -636
  492. core_framework-1.8.1/core_framework/domains/exceptions.py +0 -6
  493. core_framework-1.8.1/core_framework/domains/media/README.md +0 -28
  494. core_framework-1.8.1/core_framework/domains/media/__init__.py +0 -59
  495. core_framework-1.8.1/core_framework/domains/media/avatar/components/staging.py +0 -121
  496. core_framework-1.8.1/core_framework/domains/media/avatar/service.py +0 -298
  497. core_framework-1.8.1/core_framework/domains/media/banner/components/staging.py +0 -91
  498. core_framework-1.8.1/core_framework/domains/media/banner/service.py +0 -293
  499. core_framework-1.8.1/core_framework/domains/media/dependencies.py +0 -236
  500. core_framework-1.8.1/core_framework/domains/media/shared/exceptions.py +0 -10
  501. core_framework-1.8.1/core_framework/domains/media/shared/repository.py +0 -521
  502. core_framework-1.8.1/core_framework/domains/moderation/__init__.py +0 -49
  503. core_framework-1.8.1/core_framework/domains/moderation/enums.py +0 -62
  504. core_framework-1.8.1/core_framework/domains/moderation/exceptions.py +0 -31
  505. core_framework-1.8.1/core_framework/domains/moderation/repository.py +0 -1274
  506. core_framework-1.8.1/core_framework/domains/moderation/service.py +0 -715
  507. core_framework-1.8.1/core_framework/domains/notification/README.md +0 -151
  508. core_framework-1.8.1/core_framework/domains/notification/exceptions.py +0 -6
  509. core_framework-1.8.1/core_framework/domains/notification/repository.py +0 -569
  510. core_framework-1.8.1/core_framework/domains/notification/service.py +0 -261
  511. core_framework-1.8.1/core_framework/domains/post/README.md +0 -194
  512. core_framework-1.8.1/core_framework/domains/post/__init__.py +0 -23
  513. core_framework-1.8.1/core_framework/domains/post/constants.py +0 -6
  514. core_framework-1.8.1/core_framework/domains/post/enums.py +0 -18
  515. core_framework-1.8.1/core_framework/domains/post/exceptions.py +0 -21
  516. core_framework-1.8.1/core_framework/domains/post/models.py +0 -134
  517. core_framework-1.8.1/core_framework/domains/post/repository.py +0 -1476
  518. core_framework-1.8.1/core_framework/domains/post/service.py +0 -598
  519. core_framework-1.8.1/core_framework/domains/user/__init__.py +0 -55
  520. core_framework-1.8.1/core_framework/domains/user/constants.py +0 -11
  521. core_framework-1.8.1/core_framework/domains/user/exceptions.py +0 -31
  522. core_framework-1.8.1/core_framework/domains/user/repository.py +0 -1487
  523. core_framework-1.8.1/core_framework/domains/user/service.py +0 -811
  524. core_framework-1.8.1/core_framework/domains/utils.py +0 -121
  525. core_framework-1.8.1/core_framework/infrastructure/media/local_banner_staging_adapter.py +0 -89
  526. core_framework-1.8.1/core_framework/infrastructure/media/local_staging_adapter.py +0 -97
  527. core_framework-1.8.1/core_framework/infrastructure/media/ssh_finals_publisher_adapter.py +0 -127
  528. core_framework-1.8.1/core_framework/main.py +0 -98
  529. core_framework-1.8.1/core_framework/testing/arq.py +0 -94
  530. core_framework-1.8.1/core_framework/testing/firebase.py +0 -96
  531. core_framework-1.8.1/core_framework/testing/media.py +0 -197
  532. core_framework-1.8.1/core_framework/testing/plugin.py +0 -215
  533. core_framework-1.8.1/core_framework/worker/schedules/__init__.py +0 -69
  534. core_framework-1.8.1/core_framework/worker/schedules/schedule_aggregate_comment_stats.py +0 -58
  535. core_framework-1.8.1/core_framework/worker/schedules/schedule_aggregate_post_stats.py +0 -56
  536. core_framework-1.8.1/core_framework/worker/schedules/schedule_aggregate_user_stats.py +0 -56
  537. core_framework-1.8.1/core_framework/worker/schedules/schedule_expired_account_deletions.py +0 -45
  538. core_framework-1.8.1/core_framework/worker/schedules/schedule_expired_mute_lifts.py +0 -45
  539. core_framework-1.8.1/core_framework/worker/schedules/schedule_sweep_stale_avatar_staging.py +0 -26
  540. core_framework-1.8.1/core_framework/worker/tasks/__init__.py +0 -23
  541. core_framework-1.8.1/core_framework/worker/tasks/delete_superseded_avatar_finals.py +0 -28
  542. core_framework-1.8.1/core_framework/worker/tasks/process_account_deletion.py +0 -29
  543. core_framework-1.8.1/core_framework/worker/tasks/process_aggregate_comment_stats.py +0 -36
  544. core_framework-1.8.1/core_framework/worker/tasks/process_aggregate_post_stats.py +0 -33
  545. core_framework-1.8.1/core_framework/worker/tasks/process_aggregate_user_stats.py +0 -33
  546. core_framework-1.8.1/core_framework/worker/tasks/process_cache_pattern_invalidation.py +0 -26
  547. core_framework-1.8.1/core_framework/worker/tasks/process_media_asset_variants.py +0 -52
  548. core_framework-1.8.1/core_framework/worker/tasks/process_mute_lift.py +0 -28
  549. core_framework-1.8.1/dockerfile +0 -56
  550. core_framework-1.8.1/docs/deployments/README.md +0 -32
  551. core_framework-1.8.1/docs/deployments/deploy-playbook.md +0 -140
  552. core_framework-1.8.1/docs/deployments/edge-upload-limits.md +0 -61
  553. core_framework-1.8.1/docs/deployments/examples/Caddyfile.example +0 -36
  554. core_framework-1.8.1/docs/deployments/guides/app-server-deploy-ssh.md +0 -50
  555. core_framework-1.8.1/docs/deployments/guides/image-server-ssh.md +0 -57
  556. core_framework-1.8.1/docs/deployments/guides/postgres-setup.md +0 -153
  557. core_framework-1.8.1/docs/deployments/guides/redis-setup.md +0 -109
  558. core_framework-1.8.1/docs/deployments/guides/ubuntu-server-setup.md +0 -173
  559. core_framework-1.8.1/docs/domains/README.md +0 -16
  560. core_framework-1.8.1/docs/domains/auth/access_control.md +0 -58
  561. core_framework-1.8.1/docs/domains/auth/registration.md +0 -58
  562. core_framework-1.8.1/docs/domains/comments/admin_comments.md +0 -245
  563. core_framework-1.8.1/docs/domains/comments/comment_stats_aggregation.md +0 -69
  564. core_framework-1.8.1/docs/domains/comments/create_comment.md +0 -135
  565. core_framework-1.8.1/docs/domains/comments/delete_comment.md +0 -60
  566. core_framework-1.8.1/docs/domains/comments/edit_comment.md +0 -71
  567. core_framework-1.8.1/docs/domains/comments/retrieve_comments.md +0 -218
  568. core_framework-1.8.1/docs/domains/media/avatar-upload-design.md +0 -110
  569. core_framework-1.8.1/docs/domains/media/banner-upload-design.md +0 -150
  570. core_framework-1.8.1/docs/domains/media/upload-pipeline-design.md +0 -464
  571. core_framework-1.8.1/docs/domains/media/upload_pipeline.md +0 -60
  572. core_framework-1.8.1/docs/domains/mentions/mentions_in_content.md +0 -237
  573. core_framework-1.8.1/docs/domains/moderation/appeals.md +0 -216
  574. core_framework-1.8.1/docs/domains/moderation/internal_notes.md +0 -158
  575. core_framework-1.8.1/docs/domains/moderation/reports.md +0 -183
  576. core_framework-1.8.1/docs/domains/notifications/notification_inbox.md +0 -373
  577. core_framework-1.8.1/docs/domains/posts/admin_posts.md +0 -247
  578. core_framework-1.8.1/docs/domains/posts/author_context.md +0 -86
  579. core_framework-1.8.1/docs/domains/posts/hashtag_discovery.md +0 -59
  580. core_framework-1.8.1/docs/domains/posts/post_like.md +0 -94
  581. core_framework-1.8.1/docs/domains/posts/post_stats_aggregation.md +0 -81
  582. core_framework-1.8.1/docs/domains/posts/post_visibility.md +0 -75
  583. core_framework-1.8.1/docs/domains/users/account_deletion.md +0 -108
  584. core_framework-1.8.1/docs/domains/users/blocks.md +0 -115
  585. core_framework-1.8.1/docs/domains/users/follow-system-design.md +0 -422
  586. core_framework-1.8.1/docs/domains/users/follow.md +0 -215
  587. core_framework-1.8.1/docs/domains/users/user_removal.md +0 -86
  588. core_framework-1.8.1/docs/library/api.md +0 -192
  589. core_framework-1.8.1/docs/library/core-framework-migration.md +0 -307
  590. core_framework-1.8.1/docs/library/package-api.md +0 -287
  591. core_framework-1.8.1/docs/library/testing-plugin-design.md +0 -390
  592. core_framework-1.8.1/docs/platform/README.md +0 -13
  593. core_framework-1.8.1/docs/platform/architecture-decisions.md +0 -460
  594. core_framework-1.8.1/docs/platform/conventions.md +0 -75
  595. core_framework-1.8.1/docs/platform/domain-services-and-adapters.md +0 -93
  596. core_framework-1.8.1/docs/platform/event-outbox-design.md +0 -528
  597. core_framework-1.8.1/docs/platform/layers-and-boundaries.md +0 -46
  598. core_framework-1.8.1/docs/platform/patch-update-typed-payload.md +0 -188
  599. core_framework-1.8.1/docs/todo.md +0 -11
  600. core_framework-1.8.1/makefile +0 -54
  601. core_framework-1.8.1/pyproject.toml +0 -126
  602. core_framework-1.8.1/tests/conftest.py +0 -33
  603. core_framework-1.8.1/tests/integration/api/_http_helpers.py +0 -90
  604. core_framework-1.8.1/tests/integration/api/admin/cache/router_test.py +0 -357
  605. core_framework-1.8.1/tests/integration/api/admin/comments/router_test.py +0 -666
  606. core_framework-1.8.1/tests/integration/api/admin/moderation/router_test.py +0 -2475
  607. core_framework-1.8.1/tests/integration/api/admin/posts/router_test.py +0 -539
  608. core_framework-1.8.1/tests/integration/api/admin/users/router_test.py +0 -1615
  609. core_framework-1.8.1/tests/integration/api/comments/authenticated/comment_writes_integration_test.py +0 -515
  610. core_framework-1.8.1/tests/integration/api/comments/public/router_test.py +0 -403
  611. core_framework-1.8.1/tests/integration/api/mentions/mentions_integration_test.py +0 -348
  612. core_framework-1.8.1/tests/integration/api/notifications/router_test.py +0 -548
  613. core_framework-1.8.1/tests/integration/api/posts/authenticated/post_writes_integration_test.py +0 -340
  614. core_framework-1.8.1/tests/integration/api/posts/comment_count_aggregation_test.py +0 -144
  615. core_framework-1.8.1/tests/integration/api/posts/followers_visibility_test.py +0 -123
  616. core_framework-1.8.1/tests/integration/api/posts/public/router_test.py +0 -1071
  617. core_framework-1.8.1/tests/integration/api/users/authenticated/avatar_upload_test.py +0 -200
  618. core_framework-1.8.1/tests/integration/api/users/authenticated/banner_upload_test.py +0 -200
  619. core_framework-1.8.1/tests/integration/api/users/authenticated/router_test.py +0 -1157
  620. core_framework-1.8.1/tests/integration/api/users/public/router_test.py +0 -331
  621. core_framework-1.8.1/tests/integration/worker/account_deletion_test.py +0 -368
  622. core_framework-1.8.1/tests/integration/worker/aggregate_comment_stats_test.py +0 -294
  623. core_framework-1.8.1/tests/integration/worker/aggregate_user_stats_test.py +0 -144
  624. core_framework-1.8.1/tests/integration/worker/avatar_upload_test.py +0 -232
  625. core_framework-1.8.1/tests/integration/worker/banner_upload_test.py +0 -229
  626. core_framework-1.8.1/tests/integration/worker/utils_test.py +0 -46
  627. core_framework-1.8.1/tests/unit/application/notifications/inbox_service_test.py +0 -111
  628. core_framework-1.8.1/tests/unit/infrastructure/media/ssh_finals_publisher_adapter_test.py +0 -279
  629. core_framework-1.8.1/uv.lock +0 -2251
  630. {core_framework-1.8.1 → core_framework-2.1.0}/.cursor/rules/api-reference-docs.mdc +0 -0
  631. {core_framework-1.8.1 → core_framework-2.1.0}/.cursor/rules/domain-repository-exceptions.mdc +0 -0
  632. {core_framework-1.8.1 → core_framework-2.1.0}/.cursor/rules/domain-services-and-adapters.mdc +0 -0
  633. {core_framework-1.8.1 → core_framework-2.1.0}/.cursor/rules/integration-test-strategy.mdc +0 -0
  634. {core_framework-1.8.1 → core_framework-2.1.0}/.dockerignore +0 -0
  635. {core_framework-1.8.1 → core_framework-2.1.0}/.github/workflows/manual-deployment.yaml +0 -0
  636. {core_framework-1.8.1 → core_framework-2.1.0}/.github/workflows/publish-pypi.yml +0 -0
  637. {core_framework-1.8.1 → core_framework-2.1.0}/.gitignore +0 -0
  638. {core_framework-1.8.1 → core_framework-2.1.0}/.python-version +0 -0
  639. {core_framework-1.8.1 → core_framework-2.1.0}/LICENSE +0 -0
  640. {core_framework-1.8.1 → core_framework-2.1.0}/README.md +0 -0
  641. {core_framework-1.8.1 → core_framework-2.1.0}/alembic/comment/alembic/README +0 -0
  642. {core_framework-1.8.1 → core_framework-2.1.0}/alembic/comment/alembic/env.py +0 -0
  643. {core_framework-1.8.1 → core_framework-2.1.0}/alembic/comment/alembic/script.py.mako +0 -0
  644. {core_framework-1.8.1 → core_framework-2.1.0}/alembic/comment/alembic/versions/comment_add_comment_mentions.py +0 -0
  645. {core_framework-1.8.1 → core_framework-2.1.0}/alembic/comment/alembic/versions/v1_comment_init_baseline.py +0 -0
  646. {core_framework-1.8.1 → core_framework-2.1.0}/alembic/comment/alembic.ini +0 -0
  647. {core_framework-1.8.1 → core_framework-2.1.0}/alembic/extension/alembic/README +0 -0
  648. {core_framework-1.8.1 → core_framework-2.1.0}/alembic/extension/alembic/env.py +0 -0
  649. {core_framework-1.8.1 → core_framework-2.1.0}/alembic/extension/alembic/script.py.mako +0 -0
  650. {core_framework-1.8.1 → core_framework-2.1.0}/alembic/extension/alembic/versions/v1_ext_init_baseline.py +0 -0
  651. {core_framework-1.8.1 → core_framework-2.1.0}/alembic/extension/alembic.ini +0 -0
  652. {core_framework-1.8.1 → core_framework-2.1.0}/alembic/media/alembic/README +0 -0
  653. {core_framework-1.8.1 → core_framework-2.1.0}/alembic/media/alembic/env.py +0 -0
  654. {core_framework-1.8.1 → core_framework-2.1.0}/alembic/media/alembic/script.py.mako +0 -0
  655. {core_framework-1.8.1 → core_framework-2.1.0}/alembic/media/alembic/versions/media_add_banner_staging_and_lease.py +0 -0
  656. {core_framework-1.8.1 → core_framework-2.1.0}/alembic/media/alembic/versions/v1_media_init_baseline.py +0 -0
  657. {core_framework-1.8.1 → core_framework-2.1.0}/alembic/media/alembic.ini +0 -0
  658. {core_framework-1.8.1 → core_framework-2.1.0}/alembic/moderation/alembic/README +0 -0
  659. {core_framework-1.8.1 → core_framework-2.1.0}/alembic/moderation/alembic/env.py +0 -0
  660. {core_framework-1.8.1 → core_framework-2.1.0}/alembic/moderation/alembic/script.py.mako +0 -0
  661. {core_framework-1.8.1 → core_framework-2.1.0}/alembic/moderation/alembic/versions/v1_mod_init_baseline.py +0 -0
  662. {core_framework-1.8.1 → core_framework-2.1.0}/alembic/moderation/alembic.ini +0 -0
  663. {core_framework-1.8.1 → core_framework-2.1.0}/alembic/notification/alembic/README +0 -0
  664. {core_framework-1.8.1 → core_framework-2.1.0}/alembic/notification/alembic/env.py +0 -0
  665. {core_framework-1.8.1 → core_framework-2.1.0}/alembic/notification/alembic/script.py.mako +0 -0
  666. {core_framework-1.8.1 → core_framework-2.1.0}/alembic/notification/alembic/versions/v1_notif_init_baseline.py +0 -0
  667. {core_framework-1.8.1 → core_framework-2.1.0}/alembic/notification/alembic.ini +0 -0
  668. {core_framework-1.8.1 → core_framework-2.1.0}/alembic/post/alembic/README +0 -0
  669. {core_framework-1.8.1 → core_framework-2.1.0}/alembic/post/alembic/env.py +0 -0
  670. {core_framework-1.8.1 → core_framework-2.1.0}/alembic/post/alembic/script.py.mako +0 -0
  671. {core_framework-1.8.1 → core_framework-2.1.0}/alembic/post/alembic/versions/post_add_post_mentions.py +0 -0
  672. {core_framework-1.8.1 → core_framework-2.1.0}/alembic/post/alembic/versions/v1_post_init_baseline.py +0 -0
  673. {core_framework-1.8.1 → core_framework-2.1.0}/alembic/post/alembic.ini +0 -0
  674. {core_framework-1.8.1 → core_framework-2.1.0}/alembic/user/alembic/README +0 -0
  675. {core_framework-1.8.1 → core_framework-2.1.0}/alembic/user/alembic/env.py +0 -0
  676. {core_framework-1.8.1 → core_framework-2.1.0}/alembic/user/alembic/script.py.mako +0 -0
  677. {core_framework-1.8.1 → core_framework-2.1.0}/alembic/user/alembic/versions/user_add_avatar_ingest_sequences.py +0 -0
  678. {core_framework-1.8.1 → core_framework-2.1.0}/alembic/user/alembic/versions/user_add_banner_ingest_sequences.py +0 -0
  679. {core_framework-1.8.1 → core_framework-2.1.0}/alembic/user/alembic/versions/user_add_date_of_birth_to_profiles.py +0 -0
  680. {core_framework-1.8.1 → core_framework-2.1.0}/alembic/user/alembic/versions/v1_user_init_baseline.py +0 -0
  681. {core_framework-1.8.1 → core_framework-2.1.0}/alembic/user/alembic.ini +0 -0
  682. {core_framework-1.8.1 → core_framework-2.1.0}/core_framework/__init__.py +0 -0
  683. {core_framework-1.8.1 → core_framework-2.1.0}/core_framework/api/__init__.py +0 -0
  684. {core_framework-1.8.1 → core_framework-2.1.0}/core_framework/api/admin/__init__.py +0 -0
  685. {core_framework-1.8.1 → core_framework-2.1.0}/core_framework/api/admin/moderation/__init__.py +0 -0
  686. {core_framework-1.8.1 → core_framework-2.1.0}/core_framework/api/admin/router.py +0 -0
  687. {core_framework-1.8.1 → core_framework-2.1.0}/core_framework/api/admin/users/__init__.py +0 -0
  688. {core_framework-1.8.1 → core_framework-2.1.0}/core_framework/api/auth/__init__.py +0 -0
  689. {core_framework-1.8.1 → core_framework-2.1.0}/core_framework/api/comments/router.py +0 -0
  690. {core_framework-1.8.1 → core_framework-2.1.0}/core_framework/api/constants.py +0 -0
  691. {core_framework-1.8.1 → core_framework-2.1.0}/core_framework/api/events/router.py +0 -0
  692. {core_framework-1.8.1 → core_framework-2.1.0}/core_framework/api/events/schemas.py +0 -0
  693. {core_framework-1.8.1 → core_framework-2.1.0}/core_framework/api/notifications/authenticated/schemas.py +0 -0
  694. {core_framework-1.8.1 → core_framework-2.1.0}/core_framework/api/notifications/router.py +0 -0
  695. {core_framework-1.8.1 → core_framework-2.1.0}/core_framework/api/posts/router.py +0 -0
  696. {core_framework-1.8.1 → core_framework-2.1.0}/core_framework/api/system/__init__.py +0 -0
  697. {core_framework-1.8.1 → core_framework-2.1.0}/core_framework/api/users/__init__.py +0 -0
  698. {core_framework-1.8.1 → core_framework-2.1.0}/core_framework/api/users/authenticated/__init__.py +0 -0
  699. {core_framework-1.8.1 → core_framework-2.1.0}/core_framework/api/users/public/__init__.py +0 -0
  700. {core_framework-1.8.1 → core_framework-2.1.0}/core_framework/api/users/public/schemas.py +0 -0
  701. {core_framework-1.8.1 → core_framework-2.1.0}/core_framework/api/users/router.py +0 -0
  702. {core_framework-1.8.1 → core_framework-2.1.0}/core_framework/application/__init__.py +0 -0
  703. {core_framework-1.8.1 → core_framework-2.1.0}/core_framework/application/auth/__init__.py +0 -0
  704. {core_framework-1.8.1 → core_framework-2.1.0}/core_framework/application/auth/models.py +0 -0
  705. {core_framework-1.8.1 → core_framework-2.1.0}/core_framework/application/cache/models.py +0 -0
  706. {core_framework-1.8.1 → core_framework-2.1.0}/core_framework/application/events/README.md +0 -0
  707. {core_framework-1.8.1 → core_framework-2.1.0}/core_framework/application/events/models.py +0 -0
  708. {core_framework-1.8.1 → core_framework-2.1.0}/core_framework/application/moderation/__init__.py +0 -0
  709. {core_framework-1.8.1 → core_framework-2.1.0}/core_framework/application/notifications/README.md +0 -0
  710. {core_framework-1.8.1 → core_framework-2.1.0}/core_framework/application/notifications/enums.py +0 -0
  711. {core_framework-1.8.1 → core_framework-2.1.0}/core_framework/application/shared/__init__.py +0 -0
  712. {core_framework-1.8.1 → core_framework-2.1.0}/core_framework/application/shared/user_agent.py +0 -0
  713. {core_framework-1.8.1 → core_framework-2.1.0}/core_framework/application/shared/worker_jobs.py +0 -0
  714. {core_framework-1.8.1 → core_framework-2.1.0}/core_framework/application/users/__init__.py +0 -0
  715. {core_framework-1.8.1 → core_framework-2.1.0}/core_framework/application/users/aggregation_service.py +0 -0
  716. {core_framework-1.8.1 → core_framework-2.1.0}/core_framework/asgi.py +0 -0
  717. {core_framework-1.8.1 → core_framework-2.1.0}/core_framework/constants.py +0 -0
  718. {core_framework-1.8.1 → core_framework-2.1.0}/core_framework/core/__init__.py +0 -0
  719. {core_framework-1.8.1 → core_framework-2.1.0}/core_framework/core/context.py +0 -0
  720. {core_framework-1.8.1 → core_framework-2.1.0}/core_framework/core/database.py +0 -0
  721. {core_framework-1.8.1 → core_framework-2.1.0}/core_framework/core/exception_handlers/__init__.py +0 -0
  722. {core_framework-1.8.1 → core_framework-2.1.0}/core_framework/core/firebase.py +0 -0
  723. {core_framework-1.8.1 → core_framework-2.1.0}/core_framework/core/http_client.py +0 -0
  724. {core_framework-1.8.1 → core_framework-2.1.0}/core_framework/core/logging.py +0 -0
  725. {core_framework-1.8.1 → core_framework-2.1.0}/core_framework/core/observability.py +0 -0
  726. {core_framework-1.8.1 → core_framework-2.1.0}/core_framework/core/redis.py +0 -0
  727. {core_framework-1.8.1 → core_framework-2.1.0}/core_framework/domains/__init__.py +0 -0
  728. {core_framework-1.8.1/core_framework/domains/media/avatar → core_framework-2.1.0/core_framework/domains/auth/ports}/__init__.py +0 -0
  729. {core_framework-1.8.1 → core_framework-2.1.0}/core_framework/domains/comment/dependencies.py +0 -0
  730. {core_framework-1.8.1/core_framework/domains/media/avatar/components → core_framework-2.1.0/core_framework/domains/media/avatar}/__init__.py +0 -0
  731. {core_framework-1.8.1/core_framework/domains/media/avatar/ports → core_framework-2.1.0/core_framework/domains/media/avatar/components}/__init__.py +0 -0
  732. {core_framework-1.8.1 → core_framework-2.1.0}/core_framework/domains/media/avatar/components/finals_publisher.py +0 -0
  733. {core_framework-1.8.1 → core_framework-2.1.0}/core_framework/domains/media/avatar/components/variant_encoder.py +0 -0
  734. {core_framework-1.8.1 → core_framework-2.1.0}/core_framework/domains/media/avatar/constants.py +0 -0
  735. {core_framework-1.8.1 → core_framework-2.1.0}/core_framework/domains/media/avatar/exceptions.py +0 -0
  736. {core_framework-1.8.1 → core_framework-2.1.0}/core_framework/domains/media/avatar/models.py +0 -0
  737. {core_framework-1.8.1/core_framework/domains/media/shared → core_framework-2.1.0/core_framework/domains/media/avatar/ports}/__init__.py +0 -0
  738. {core_framework-1.8.1 → core_framework-2.1.0}/core_framework/domains/media/avatar/ports/finals_publisher.py +0 -0
  739. {core_framework-1.8.1 → core_framework-2.1.0}/core_framework/domains/media/avatar/ports/staging.py +0 -0
  740. {core_framework-1.8.1 → core_framework-2.1.0}/core_framework/domains/media/avatar/ports/variant_encoder.py +0 -0
  741. {core_framework-1.8.1 → core_framework-2.1.0}/core_framework/domains/media/banner/components/finals_publisher.py +0 -0
  742. {core_framework-1.8.1 → core_framework-2.1.0}/core_framework/domains/media/banner/components/variant_encoder.py +0 -0
  743. {core_framework-1.8.1 → core_framework-2.1.0}/core_framework/domains/media/banner/constants.py +0 -0
  744. {core_framework-1.8.1 → core_framework-2.1.0}/core_framework/domains/media/banner/exceptions.py +0 -0
  745. {core_framework-1.8.1 → core_framework-2.1.0}/core_framework/domains/media/banner/models.py +0 -0
  746. {core_framework-1.8.1 → core_framework-2.1.0}/core_framework/domains/media/banner/ports/finals_publisher.py +0 -0
  747. {core_framework-1.8.1 → core_framework-2.1.0}/core_framework/domains/media/banner/ports/staging.py +0 -0
  748. {core_framework-1.8.1 → core_framework-2.1.0}/core_framework/domains/media/banner/ports/variant_encoder.py +0 -0
  749. {core_framework-1.8.1/core_framework/infrastructure → core_framework-2.1.0/core_framework/domains/media/shared}/__init__.py +0 -0
  750. {core_framework-1.8.1 → core_framework-2.1.0}/core_framework/domains/media/shared/constants.py +0 -0
  751. {core_framework-1.8.1 → core_framework-2.1.0}/core_framework/domains/media/shared/service.py +0 -0
  752. {core_framework-1.8.1 → core_framework-2.1.0}/core_framework/domains/media/shared/utils.py +0 -0
  753. {core_framework-1.8.1 → core_framework-2.1.0}/core_framework/domains/moderation/README.md +0 -0
  754. {core_framework-1.8.1 → core_framework-2.1.0}/core_framework/domains/moderation/dependencies.py +0 -0
  755. {core_framework-1.8.1 → core_framework-2.1.0}/core_framework/domains/moderation/models.py +0 -0
  756. {core_framework-1.8.1 → core_framework-2.1.0}/core_framework/domains/notification/__init__.py +0 -0
  757. {core_framework-1.8.1 → core_framework-2.1.0}/core_framework/domains/notification/dependencies.py +0 -0
  758. {core_framework-1.8.1 → core_framework-2.1.0}/core_framework/domains/notification/enums.py +0 -0
  759. {core_framework-1.8.1 → core_framework-2.1.0}/core_framework/domains/notification/models.py +0 -0
  760. {core_framework-1.8.1 → core_framework-2.1.0}/core_framework/domains/post/dependencies.py +0 -0
  761. {core_framework-1.8.1 → core_framework-2.1.0}/core_framework/domains/user/README.md +0 -0
  762. {core_framework-1.8.1 → core_framework-2.1.0}/core_framework/domains/user/dependencies.py +0 -0
  763. {core_framework-1.8.1 → core_framework-2.1.0}/core_framework/domains/user/enums.py +0 -0
  764. {core_framework-1.8.1 → core_framework-2.1.0}/core_framework/domains/user/models.py +0 -0
  765. {core_framework-1.8.1 → core_framework-2.1.0}/core_framework/domains/user/utils.py +0 -0
  766. {core_framework-1.8.1/core_framework/infrastructure/media → core_framework-2.1.0/core_framework/infrastructure}/__init__.py +0 -0
  767. {core_framework-1.8.1/core_framework/worker → core_framework-2.1.0/core_framework/infrastructure/firebase}/__init__.py +0 -0
  768. {core_framework-1.8.1/tests → core_framework-2.1.0/core_framework/infrastructure/media}/__init__.py +0 -0
  769. {core_framework-1.8.1 → core_framework-2.1.0}/core_framework/infrastructure/media/pillow_avatar_variant_encoder_adapter.py +0 -0
  770. {core_framework-1.8.1 → core_framework-2.1.0}/core_framework/infrastructure/media/pillow_banner_variant_encoder_adapter.py +0 -0
  771. {core_framework-1.8.1 → core_framework-2.1.0}/core_framework/infrastructure/media/pillow_staging_image.py +0 -0
  772. {core_framework-1.8.1 → core_framework-2.1.0}/core_framework/infrastructure/media/ssh_banner_finals_publisher_adapter.py +0 -0
  773. {core_framework-1.8.1 → core_framework-2.1.0}/core_framework/migrate_cli.py +0 -0
  774. {core_framework-1.8.1 → core_framework-2.1.0}/core_framework/testing/__init__.py +0 -0
  775. {core_framework-1.8.1 → core_framework-2.1.0}/core_framework/testing/auth.py +0 -0
  776. {core_framework-1.8.1 → core_framework-2.1.0}/core_framework/testing/config.py +0 -0
  777. {core_framework-1.8.1 → core_framework-2.1.0}/core_framework/testing/containers.py +0 -0
  778. {core_framework-1.8.1 → core_framework-2.1.0}/core_framework/testing/hookspecs.py +0 -0
  779. {core_framework-1.8.1 → core_framework-2.1.0}/core_framework/testing/httpx_test_client.py +0 -0
  780. {core_framework-1.8.1 → core_framework-2.1.0}/core_framework/testing/migrations.py +0 -0
  781. {core_framework-1.8.1/tests/integration → core_framework-2.1.0/core_framework/worker}/__init__.py +0 -0
  782. {core_framework-1.8.1 → core_framework-2.1.0}/core_framework/worker/main.py +0 -0
  783. {core_framework-1.8.1 → core_framework-2.1.0}/core_framework/worker/schedules/schedule_sweep_stale_banner_staging.py +0 -0
  784. {core_framework-1.8.1 → core_framework-2.1.0}/core_framework/worker/tasks/delete_superseded_banner_finals.py +0 -0
  785. {core_framework-1.8.1 → core_framework-2.1.0}/core_framework/worker/tasks/process_banner_asset_variants.py +0 -0
  786. {core_framework-1.8.1 → core_framework-2.1.0}/core_framework/worker/worker_context.py +0 -0
  787. {core_framework-1.8.1 → core_framework-2.1.0}/docker-compose.dev.yaml +0 -0
  788. {core_framework-1.8.1 → core_framework-2.1.0}/docker-compose.yml +0 -0
  789. {core_framework-1.8.1 → core_framework-2.1.0}/docs/README.md +0 -0
  790. {core_framework-1.8.1 → core_framework-2.1.0}/docs/deployments/examples/image-server-known-hosts.example +0 -0
  791. {core_framework-1.8.1 → core_framework-2.1.0}/docs/deployments/release-playbook.md +0 -0
  792. {core_framework-1.8.1 → core_framework-2.1.0}/docs/domains/cache/admin_cache_invalidation.md +0 -0
  793. {core_framework-1.8.1 → core_framework-2.1.0}/docs/domains/comments/comment_report.md +0 -0
  794. {core_framework-1.8.1 → core_framework-2.1.0}/docs/domains/events/events.md +0 -0
  795. {core_framework-1.8.1 → core_framework-2.1.0}/docs/domains/moderation/moderator_actions.md +0 -0
  796. {core_framework-1.8.1 → core_framework-2.1.0}/docs/domains/moderation/restrictions.md +0 -0
  797. {core_framework-1.8.1 → core_framework-2.1.0}/docs/domains/users/account.md +0 -0
  798. {core_framework-1.8.1 → core_framework-2.1.0}/docs/domains/users/avatar.md +0 -0
  799. {core_framework-1.8.1 → core_framework-2.1.0}/docs/domains/users/banner.md +0 -0
  800. {core_framework-1.8.1 → core_framework-2.1.0}/docs/domains/users/change_history.md +0 -0
  801. {core_framework-1.8.1 → core_framework-2.1.0}/docs/domains/users/check_username_exists.md +0 -0
  802. {core_framework-1.8.1 → core_framework-2.1.0}/docs/domains/users/my_posts_and_comments.md +0 -0
  803. {core_framework-1.8.1 → core_framework-2.1.0}/docs/domains/users/preferences.md +0 -0
  804. {core_framework-1.8.1 → core_framework-2.1.0}/docs/domains/users/profile.md +0 -0
  805. {core_framework-1.8.1 → core_framework-2.1.0}/docs/domains/users/public_profile.md +0 -0
  806. {core_framework-1.8.1 → core_framework-2.1.0}/docs/library/README.md +0 -0
  807. {core_framework-1.8.1 → core_framework-2.1.0}/docs/library/overview.md +0 -0
  808. {core_framework-1.8.1 → core_framework-2.1.0}/docs/platform/database-triggers.md +0 -0
  809. {core_framework-1.8.1 → core_framework-2.1.0}/firebase_config.example.json +0 -0
  810. {core_framework-1.8.1/tests/integration/api → core_framework-2.1.0/tests}/__init__.py +0 -0
  811. {core_framework-1.8.1/tests/integration/api/admin → core_framework-2.1.0/tests/integration}/__init__.py +0 -0
  812. {core_framework-1.8.1/tests/integration/api/admin/cache → core_framework-2.1.0/tests/integration/api}/__init__.py +0 -0
  813. {core_framework-1.8.1/tests/integration/api/admin/comments → core_framework-2.1.0/tests/integration/api/admin}/__init__.py +0 -0
  814. {core_framework-1.8.1/tests/integration/api/admin/moderation → core_framework-2.1.0/tests/integration/api/admin/cache}/__init__.py +0 -0
  815. {core_framework-1.8.1/tests/integration/api/admin/posts → core_framework-2.1.0/tests/integration/api/admin/comments}/__init__.py +0 -0
  816. {core_framework-1.8.1/tests/integration/api/admin/users → core_framework-2.1.0/tests/integration/api/admin/moderation}/__init__.py +0 -0
  817. {core_framework-1.8.1/tests/integration/api/auth → core_framework-2.1.0/tests/integration/api/admin/posts}/__init__.py +0 -0
  818. {core_framework-1.8.1/tests/integration/api/comments → core_framework-2.1.0/tests/integration/api/admin/users}/__init__.py +0 -0
  819. {core_framework-1.8.1/tests/integration/api/comments/public → core_framework-2.1.0/tests/integration/api/auth}/__init__.py +0 -0
  820. {core_framework-1.8.1 → core_framework-2.1.0}/tests/integration/api/auth/router_test.py +0 -0
  821. {core_framework-1.8.1/tests/integration/api/notifications → core_framework-2.1.0/tests/integration/api/comments}/__init__.py +0 -0
  822. {core_framework-1.8.1/tests/integration/api/posts → core_framework-2.1.0/tests/integration/api/comments/authenticated}/__init__.py +0 -0
  823. {core_framework-1.8.1/tests/integration/api/posts → core_framework-2.1.0/tests/integration/api/comments}/public/__init__.py +0 -0
  824. {core_framework-1.8.1 → core_framework-2.1.0}/tests/integration/api/events/router_test.py +0 -0
  825. {core_framework-1.8.1/tests/integration/api/system → core_framework-2.1.0/tests/integration/api/notifications}/__init__.py +0 -0
  826. {core_framework-1.8.1/tests/integration/api/users → core_framework-2.1.0/tests/integration/api/posts}/__init__.py +0 -0
  827. {core_framework-1.8.1 → core_framework-2.1.0}/tests/integration/api/posts/post_stats_dirty_marking_test.py +0 -0
  828. {core_framework-1.8.1/tests/integration/api/users/authenticated → core_framework-2.1.0/tests/integration/api/posts/public}/__init__.py +0 -0
  829. {core_framework-1.8.1/tests/integration/api/users/public → core_framework-2.1.0/tests/integration/api/system}/__init__.py +0 -0
  830. {core_framework-1.8.1 → core_framework-2.1.0}/tests/integration/api/system/router_test.py +0 -0
  831. {core_framework-1.8.1/tests/integration/worker → core_framework-2.1.0/tests/integration/api/users}/__init__.py +0 -0
  832. {core_framework-1.8.1/tests/unit → core_framework-2.1.0/tests/integration/api/users/authenticated}/__init__.py +0 -0
  833. {core_framework-1.8.1/tests/unit/application/comments → core_framework-2.1.0/tests/integration/api/users/public}/__init__.py +0 -0
  834. {core_framework-1.8.1/tests/unit/domains → core_framework-2.1.0/tests/integration/worker}/__init__.py +0 -0
  835. {core_framework-1.8.1 → core_framework-2.1.0}/tests/integration/worker/aggregate_post_stats_test.py +0 -0
  836. {core_framework-1.8.1 → core_framework-2.1.0}/tests/integration/worker/conftest.py +0 -0
  837. {core_framework-1.8.1 → core_framework-2.1.0}/tests/integration/worker/mute_lift_test.py +0 -0
  838. {core_framework-1.8.1/tests/unit/domains/comment → core_framework-2.1.0/tests/unit}/__init__.py +0 -0
  839. {core_framework-1.8.1/tests/unit/infrastructure → core_framework-2.1.0/tests/unit/application/comments}/__init__.py +0 -0
  840. {core_framework-1.8.1 → core_framework-2.1.0}/tests/unit/application/events/event_service_test.py +0 -0
  841. {core_framework-1.8.1 → core_framework-2.1.0}/tests/unit/core/bundled_alembic_test.py +0 -0
  842. {core_framework-1.8.1 → core_framework-2.1.0}/tests/unit/core/migrate_cli_test.py +0 -0
  843. {core_framework-1.8.1 → core_framework-2.1.0}/tests/unit/core/pagination_test.py +0 -0
  844. {core_framework-1.8.1/tests/unit/infrastructure/media → core_framework-2.1.0/tests/unit/domains}/__init__.py +0 -0
  845. {core_framework-1.8.1 → core_framework-2.1.0}/tests/unit/domains/user/service_test.py +0 -0
@@ -0,0 +1 @@
1
+ ../../.venv/lib/python3.14/site-packages/fastapi/.agents/skills/fastapi
@@ -0,0 +1,4 @@
1
+ {
2
+ "kind": "tool-skill",
3
+ "version": "0.0.19"
4
+ }
@@ -0,0 +1,37 @@
1
+ ---
2
+ name: library-skills
3
+ description: Use Library Skills to discover, install, refresh, repair, check, and manage agent skills from installed packages.
4
+ ---
5
+
6
+ # Library Skills
7
+
8
+ Use this skill when a project might benefit from agent skills bundled by its installed packages, or when existing Library Skills-managed symlinks are stale, broken, orphaned, or need to be checked.
9
+
10
+ Run commands from the project root.
11
+
12
+ Agents bundle their own skills by including an `.agents/skills` directory. More details in [Library Skills](https://library-skills.io).
13
+
14
+ ## First-Time Setup
15
+
16
+ - Make sure project dependencies are installed first, for example with `uv sync` for Python projects or `npm install` / `bun install` for Node.js projects.
17
+ - Run `uvx library-skills` or `npx library-skills` to discover skills bundled by the installed packages and install selected skills interactively.
18
+ - Use `uvx library-skills --all` or `npx library-skills --all` only when all newly discovered skills should be installed without selecting individual skills.
19
+ - Use `uvx library-skills --tool-skill` or `npx library-skills --tool-skill` to copy this Library Skills tool skill into the project so future agents know how to discover, install, update, repair, and check skills.
20
+
21
+ ## Commands
22
+
23
+ - Run `uvx library-skills` or `npx library-skills` to discover package-provided skills, install selected new skills, and reconcile existing managed symlinks.
24
+ - Run `uvx library-skills list` or `npx library-skills list` to inspect discovered and installed skills.
25
+ - Run `uvx library-skills list --json` or `npx library-skills list --json` for machine-readable installed status.
26
+ - Run `uvx library-skills scan --json` or `npx library-skills scan --json` for discovery-only automation.
27
+ - Run `uvx library-skills --check` or `npx library-skills --check` to validate managed skill symlink state without changing files.
28
+ - Run `uvx library-skills --yes` or `npx library-skills --yes` to repair stale managed symlinks and remove orphaned managed symlinks non-interactively.
29
+ - Add `--claude` when `.claude/skills` should also be managed.
30
+ - Add `--skill NAME` to install a specific discovered skill by name.
31
+
32
+ ## Safety
33
+
34
+ - Prefer rerunning `library-skills` over editing managed symlinks manually.
35
+ - If installed skill symlinks are broken, dependencies may not be installed yet. Try the project's normal install command first, such as `uv sync`, `npm install`, or `bun install`, then rerun `library-skills`.
36
+ - Do not delete or overwrite hand-authored skill directories.
37
+ - Library Skills only removes managed symlinks. It should not remove copied or hand-authored skill directories.
@@ -0,0 +1,39 @@
1
+ ---
2
+ description: Alembic revision id format — short random hex, not descriptive slugs
3
+ globs: alembic/**/alembic/versions/*.py
4
+ alwaysApply: false
5
+ ---
6
+
7
+ # Alembic revision IDs
8
+
9
+ `alembic_version.version_num` is a **32-character** string. Revision ids must stay well under that limit.
10
+
11
+ ## New revisions (required)
12
+
13
+ - Set `revision` to a **12-character lowercase hex** string (Alembic default), e.g. `a56bc6b7f799`.
14
+ - Generate with `python -c "import secrets; print(secrets.token_hex(6))"` or `alembic revision`.
15
+ - 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`.
16
+
17
+ ```python
18
+ # ✅ Preferred
19
+ """replace deleted post status with tombstone statuses
20
+
21
+ Revision ID: 120bf6be81eb
22
+ Revises: a56bc6b7f799
23
+ """
24
+
25
+ revision: str = "120bf6be81eb"
26
+ ```
27
+
28
+ ```python
29
+ # ❌ Avoid — long, wastes version_num budget, inconsistent with recent migrations
30
+ revision: str = "post_tombstone_status_model"
31
+ ```
32
+
33
+ ## Exceptions
34
+
35
+ - Collapsed **`v1_*_init`** baseline revisions keep their stable names (`v1_post_init`, etc.) — do not rename shipped baselines.
36
+
37
+ ## Do not rename shipped revision ids
38
+
39
+ If a revision may already be applied in any environment, **do not** change its `revision` string. Add a forward migration instead.
@@ -0,0 +1,36 @@
1
+ ---
2
+ description: Core-framework API architecture — HTTP adapters only. FastAPI/Pydantic patterns in the fastapi skill.
3
+ globs:
4
+ - core_framework/api/**/*.py
5
+ ---
6
+
7
+ # API layer (core-framework)
8
+
9
+ **Framework patterns:** use the **fastapi** skill (`.cursor/skills/fastapi/`) — `Annotated`, dependencies, routers, Pydantic v2, CLI.
10
+
11
+ **Validation:** **`api-validation.mdc`**. **Errors:** **`error-boundary.mdc`**. **Domain imports:** **`domain-imports.mdc`**.
12
+
13
+ ## Architecture
14
+
15
+ The API layer is an HTTP adapter, not a business-logic layer.
16
+
17
+ - Routers, schemas, and HTTP dependencies only.
18
+ - Call **application** services in `core_framework/application/...` — not domain repositories.
19
+ - No orchestration shared with workers; no worker-only logic here.
20
+
21
+ ## Routers
22
+
23
+ - Own HTTP concerns: status codes, `HTTPException`, `response_model`, request parsing.
24
+ - When a route sets **`response_model`**, annotate the handler return type as **`typing.Any`** (OpenAPI documents the shape; services may return dicts or domain types). Body-less routes (**`204`**, no **`response_model`**) use **`None`**.
25
+ - Call `validate_*` schema helpers before invoking application services.
26
+ - Do **not** set **`summary=`** or **`description=`** on route decorators or use route docstrings for OpenAPI prose — paths, handler names, **`response_model`**, and schemas suffice.
27
+
28
+ ## Response models
29
+
30
+ - Do **not** use bare collection types (e.g. `list[Item]`) as `response_model`. Wrap in a named `BaseModel` with an **`items`** field for extensibility.
31
+
32
+ ## Avoid
33
+
34
+ - Reusable business workflows in API modules.
35
+ - Direct imports from domain internals (only `__init__.py` and `dependencies.py`).
36
+ - `ORJSONResponse` / `UJSONResponse` — use return types / `response_model` per the fastapi skill.
@@ -0,0 +1,22 @@
1
+ ---
2
+ description: API layer must validate all fields that have database constraints
3
+ globs: ["core_framework/api/**/*.py"]
4
+ ---
5
+
6
+ # API validation
7
+
8
+ Any field with a database constraint (CHECK, NOT NULL, UNIQUE, FK, length) **must** be validated at the API layer before Postgres — return **422**, not **500** from constraint violations.
9
+
10
+ ## How
11
+
12
+ 1. Review migrations when adding endpoints; mirror constraints in Pydantic (`Field`, `field_validator`, enums).
13
+ 2. Map common patterns: `varchar(n)` → `max_length`, CHECK patterns → `pattern`/`EmailStr`, enums → Python `Enum`, required → no bare `| None`.
14
+ 3. Skip validation only for unconstrained free text, system-generated fields, and internal-only values.
15
+
16
+ ## Layer split
17
+
18
+ - **API** — client contract, **422**, OpenAPI accuracy.
19
+ - **Domain service** — business preconditions for all callers (workers too); see **`domain-input-guards.mdc`**.
20
+ - Domain backstops must not become a second client channel: **`DomainValidationError`** → **`GENERIC_BAD_REQUEST_DETAIL`** per **`error-boundary.mdc`**.
21
+
22
+ Canonical doc: **`docs/platform/client-error-visibility.md`**.
@@ -0,0 +1,29 @@
1
+ ---
2
+ description: Application services must be transport-agnostic and return plain Python types
3
+ globs:
4
+ - core_framework/application/**/*_service.py
5
+ ---
6
+
7
+ # Application layer
8
+
9
+ Application services orchestrate use cases shared by API and workers. They stay transport-agnostic.
10
+
11
+ ## No HTTP concerns
12
+
13
+ - Do not import FastAPI/Starlette types, `HTTPException`, `RequestValidationError`, status codes, request/response classes, or background task types.
14
+ - Do not assume the caller is HTTP.
15
+ - Input shape validation belongs in API schemas/routers; services handle use-case orchestration.
16
+
17
+ ## Outcomes
18
+
19
+ - Return plain Python/domain values: `dict`, `list[dict]`, dataclasses, primitives, `None`, or empty collections.
20
+ - Do not return API/Pydantic `BaseModel` instances.
21
+ - Signal HTTP-meaningful failures with **`application.shared.exceptions`** or plain outcomes (`None`, empty), never typed domain exceptions. See **`error-boundary.mdc`**.
22
+
23
+ Use a domain dataclass when one domain row matches the response shape; use a `dict` when the payload is composed from several sources.
24
+
25
+ ## Function shape
26
+
27
+ - Use keyword-only arguments after `*` for application service functions and private helpers.
28
+ - Zero-argument functions are exempt.
29
+ - Use one-line docstrings only; see **`docstrings.mdc`**.
@@ -0,0 +1,15 @@
1
+ ---
2
+ description: Prefer typing.Final for module-level constants (not reassigned)
3
+ globs: core_framework/**/*.py
4
+ alwaysApply: false
5
+ ---
6
+
7
+ # Module-level constants and `Final`
8
+
9
+ When introducing or editing **module-level constants** (values that are fixed for the lifetime of the module and not meant to be reassigned):
10
+
11
+ - Annotate them with **`typing.Final`** and an explicit type, e.g. **`NAME: Final[int] = 42`** or **`_INTERNAL: Final[str] = "example"`**.
12
+ - Prefer **`FrozenSet`**, **`frozenset` literals**, **`MappingProxyType`**, or immutable collections for grouped constants when mutation must be prevented — e.g. **`ProfileUpdate.UPDATE_COLUMNS`** on domain update types.
13
+ - **`Final`** is for **assignment** semantics (no rebinding): it does not freeze mutable object contents unless the type/container is immutable.
14
+
15
+ Do not refactor unrelated legacy constants only to add **`Final`** unless you are already touching that symbol.
@@ -0,0 +1,36 @@
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
+ - Touch only what the task requires. Match existing style. Remove orphans your edits create.
12
+ - Define verifiable success criteria for non-trivial work.
13
+
14
+ ## Tech stack
15
+
16
+ - Python 3.14, Pydantic v2, PostgreSQL 18, orjson (not stdlib json).
17
+ - Absolute imports only (`from core_framework....`). Comma-style `except A, B:` is intentional.
18
+ - Prefer newer APIs (`asyncio.TaskGroup` over `gather`).
19
+
20
+ ## Layers
21
+
22
+ Dependencies point inward: API/worker → application → domain. Never reverse.
23
+
24
+ - **API/worker** — transport adapters; call application services.
25
+ - **Application** — orchestration shared by API + worker; no FastAPI types.
26
+ - **Domain** — models, repositories (Postgres only), services. No API/worker/application imports except wiring in `dependencies.py`.
27
+
28
+ Path-scoped rules under `.cursor/rules/` add detail (API, domains, docs, etc.). For FastAPI/Pydantic work in `core_framework/api/`, use the **fastapi** skill (`.cursor/skills/fastapi/`).
29
+
30
+ ## Host applications
31
+
32
+ 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.
33
+
34
+ ## Feature implementation
35
+
36
+ Greenfield features (DB → API → repository → service → tests): use the **implement-feature** skill — one layer per response unless the user says otherwise.
@@ -0,0 +1,23 @@
1
+ ---
2
+ description: Triggers are for audit/history only — never business logic
3
+ globs:
4
+ - alembic/**/alembic/versions/*.py
5
+ - docs/domains/**/*.md
6
+ alwaysApply: false
7
+ ---
8
+
9
+ # Database triggers
10
+
11
+ **Triggers are for audit/history tracking only.** Never implement business logic, validation policy, side effects, or state transitions in triggers.
12
+
13
+ ## Acceptable
14
+
15
+ - Immutable change history, actor/timestamp capture, read-only audit rows that do not block the original operation.
16
+
17
+ ## Not acceptable
18
+
19
+ - Validation that prevents writes, conditional workflows, notifications, cross-table business updates, derived calculations.
20
+
21
+ Enforce policy in domain services and application orchestration instead. When adding an audit trigger, update **`docs/platform/database-triggers.md`**.
22
+
23
+ Full rationale: **`docs/platform/conventions.md`** and **`docs/platform/architecture-decisions.md`**.
@@ -0,0 +1,29 @@
1
+ ---
2
+ description: Docstring depth by layer — one-line in application, full Args/Returns/Raises in domain and infrastructure
3
+ globs:
4
+ - core_framework/application/**/*.py
5
+ - core_framework/domains/**/*.py
6
+ - core_framework/infrastructure/**/*.py
7
+ ---
8
+
9
+ # Docstrings by layer
10
+
11
+ Docstring depth follows the layer boundary.
12
+
13
+ - **Application** (`core_framework/application/`): one short sentence. No `Args`, `Returns`, or `Raises` sections.
14
+ - **Domain** (`core_framework/domains/`): full docstrings on public service, repository, component, and port methods that implement or define behavior.
15
+ - **Infrastructure** (`core_framework/infrastructure/`): same as domain; document I/O side effects and failure modes.
16
+
17
+ ## Domain/infrastructure contract
18
+
19
+ Use `Args`, `Returns`, and `Raises` when they clarify the boundary. Repositories should document non-obvious query semantics (filters, empty results, strong vs normal reads).
20
+
21
+ ## When editing
22
+
23
+ - New functions follow the style for their layer.
24
+ - When changing an existing function, update only that function's docstring if it is out of style.
25
+ - Do not repo-wide migrate unrelated docstrings unless the task asks for it.
26
+
27
+ ## Out of scope
28
+
29
+ API routers/schemas rely on OpenAPI and Pydantic. Worker wrappers follow application style.
@@ -0,0 +1,44 @@
1
+ ---
2
+ description: Prevent caller-context leakage in domain layer naming
3
+ globs:
4
+ - core_framework/domains/**/*.py
5
+ - core_framework/domains/**/README.md
6
+ alwaysApply: false
7
+ ---
8
+
9
+ # Domain Caller-Context Boundary
10
+
11
+ Domain layer names must describe domain concepts and data semantics, not who calls them.
12
+
13
+ ## Do Not Encode Caller Context
14
+
15
+ - Avoid role/channel/adapter names in domain symbols: `Admin*`, `Public*`, `Authenticated*`, `Api*`, `Worker*`, `Http*`.
16
+ - Avoid method names like `*_for_admin`, `*_for_public`, `*_for_api`, `*_for_worker`.
17
+ - Avoid transport words in domain interfaces: `request`, `response`, `router`, `endpoint`, `status_code`.
18
+
19
+ ## Allowed Domain Semantics
20
+
21
+ - Domain names may still use role/status/visibility words when they describe the entity or filter itself, not the caller.
22
+ - Examples:
23
+ - `UserRole.ADMIN` ✅
24
+ - `select_admin_user_ids` when it means "users whose role is admin" ✅
25
+ - `PostVisibility.PUBLIC` ✅
26
+
27
+ ## Preferred Naming
28
+
29
+ - Use policy/data-shape naming:
30
+ - `select_posts_unfiltered` ✅
31
+ - `select_comments_unfiltered` ✅
32
+ - `PostWithMetadata` ✅
33
+ - Use constraint-oriented naming for variants:
34
+ - `tombstone_post` ✅
35
+ - `detach_post_authors_by_author_id` ✅
36
+ - Prefer naming by data shape or business rule, not persona:
37
+ - `select_post_with_metadata_by_id` ✅
38
+ - `retrieve_user_for_detail` ✅
39
+ - Keep caller-specific naming in API/application layers only.
40
+
41
+ ## Review Checklist
42
+
43
+ - If a domain model or method name implies caller identity, flag it as boundary leakage.
44
+ - Suggest neutral alternatives based on behavior, constraint, or data shape (not caller type).
@@ -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`**.
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 PostNotFoundException
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 details: **`error-boundary.mdc`**.
@@ -0,0 +1,32 @@
1
+ ---
2
+ description: Where to place input guards—API validation vs domain service vs repository vs database
3
+ globs:
4
+ - core_framework/domains/**/service.py
5
+ - core_framework/domains/**/repository.py
6
+ ---
7
+
8
+ # Domain input guards
9
+
10
+ Use layered checks:
11
+
12
+ - **API/Pydantic**: client contract, **422**, OpenAPI accuracy. See **`api-validation.mdc`**.
13
+ - **Domain service**: primary business preconditions for all callers (HTTP, workers, scripts).
14
+ - **Repository**: thin SQL/data access; only rare SQL-specific safety checks.
15
+ - **Database**: mandatory integrity failsafe, not the normal invalid-input UX path.
16
+
17
+ ## Service policy
18
+
19
+ - Enforce cheap, clear domain preconditions before persistence: empty batches, pagination bounds, non-negative counts, non-blank required strings, meaningless argument combinations.
20
+ - Prefer early return when safe behavior is obvious.
21
+ - Use **`DomainValidationError`** for caller mistakes that must not become 500; HTTP maps it to generic 400 per **`error-boundary.mdc`**.
22
+ - Typed domain exceptions remain internal control flow; application translates before HTTP.
23
+
24
+ Use shared helpers in **`core_framework.domains.utils`** (`require_non_blank*`, `validate_pagination_*`, `require_positive_int`) rather than repeating validation logic.
25
+
26
+ ## Repository policy
27
+
28
+ - Do not duplicate service guards in repositories.
29
+ - Do not use repositories as the main home for product rules.
30
+ - Keep CHECK/NOT NULL/FK/UNIQUE constraints where they express truth in the data model; service checks do not replace them.
31
+
32
+ When refactoring, move guards toward the service instead of growing repository-only validation.
@@ -0,0 +1,55 @@
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/**/*_service.py
6
+ - core_framework/api/**/router.py
7
+ - core_framework/domains/**/exceptions.py
8
+ ---
9
+
10
+ # Error boundary
11
+
12
+ Platform contract: **`docs/platform/client-error-visibility.md`**. Domain imports: **`domain-imports.mdc`**.
13
+
14
+ ## Layers
15
+
16
+ | Layer | Outward errors | HTTP |
17
+ |-------|----------------|------|
18
+ | **Application** | **`application.shared.exceptions`** | Handlers map type → status + `detail` |
19
+ | **Domain typed** | Internal — not imported by API/application | No typed handlers |
20
+ | **Domain `BaseXxxException`** | Handler catch-all only | **500** if leaked |
21
+ | **API** | Pydantic | **422** |
22
+
23
+ ## Application and domain
24
+
25
+ - Application **must not** import or raise typed domain exceptions. Signal via **`None`**, empty collections, or **`application.shared.exceptions`**.
26
+ - Typed domain exceptions inherit domain **`BaseXxxException`** → **`BaseDomainException`**. Export **only** **`BaseXxxException`** from domain **`__init__.py`**, not typed subclasses.
27
+ - **`DomainValidationError`** → dedicated **400** handler + **`GENERIC_BAD_REQUEST_DETAIL`**; do not put internal reason in HTTP **`detail`**.
28
+ - Leaked typed domain exception → **`BaseDomainException`** handler → **500** + **`GENERIC_INTERNAL_SERVER_ERROR_DETAIL`**.
29
+
30
+ ## Handler registration
31
+
32
+ - Use **`register_exception_handler`** from **`core_framework.core.exception_handlers.common`** — not raw **`app.add_exception_handler`** elsewhere.
33
+ - **`setup.py`**: application types (specific before any base), **`DomainValidationError`**, one **`BaseDomainException`** leak handler, then **`Exception`** unmapped.
34
+ - No per-domain handler modules for typed exceptions. Handlers translate only — no business logic or repository calls.
35
+ - Do not log **error** for expected application 4xx; **`DomainValidationError`** at **warning**/**info**.
36
+
37
+ ## Catalog constants
38
+
39
+ **`GENERIC_BAD_REQUEST_DETAIL`** (400), **`GENERIC_NOT_FOUND_DETAIL`** (404), **`GENERIC_FORBIDDEN_DETAIL`** (403), **`GENERIC_CONFLICT_DETAIL`** (409), ingest 413/415, **`GENERIC_INTERNAL_SERVER_ERROR_DETAIL`** (500).
40
+
41
+ ## Anti-enumeration (public routes)
42
+
43
+ - Read-by-id: missing / hidden / withheld → same status + **`GENERIC_NOT_FOUND_DETAIL`** where flow docs align.
44
+ - Idempotent writes on unknown ids → **204** without leaking existence. Empty list pages are OK.
45
+ - Admin/internal routes may differ when documented. Intentional existence-check endpoints are separate product surface.
46
+
47
+ ## Validation order
48
+
49
+ User-fixable input shape → API schemas (**422**). Domain backstops → **`DomainValidationError`** → generic **400**.
50
+
51
+ ## Logging
52
+
53
+ Do not **`logger.error`** at every domain **`raise`**.
54
+
55
+ 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.
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,46 @@
1
+ ---
2
+ description: Raise exceptions with inline message strings; do not assign msg solely for the raise on the next line.
3
+ globs: ["core_framework/**/*.py", "tests/**/*.py"]
4
+ ---
5
+
6
+ # Inline raise messages
7
+
8
+ Do **not** assign an exception message to a variable on the line immediately before `raise` when that variable exists only to pass the string into the exception.
9
+
10
+ ## Preferred
11
+
12
+ ```python
13
+ # ✅ Single-line message
14
+ raise ValueError("title must not be empty or whitespace-only")
15
+
16
+ # ✅ f-string
17
+ raise ValueError(f"resource must be one of: {allowed}")
18
+
19
+ # ✅ Long message — parenthesized string on raise (still no msg variable)
20
+ raise RuntimeError(
21
+ "Core runtime is not configured on app.state. "
22
+ "Build the app via init_app() or assign app.state.core_runtime during bootstrap."
23
+ )
24
+ ```
25
+
26
+ ## Avoid
27
+
28
+ ```python
29
+ # ❌ Two-line raise solely to hold the message
30
+ msg = "title must not be empty or whitespace-only"
31
+ raise ValueError(msg)
32
+
33
+ # ❌ Same for other exception types
34
+ msg = f"no alembic.ini for domain {domain!r}"
35
+ raise FileNotFoundError(msg)
36
+ ```
37
+
38
+ ## When a local message variable is OK
39
+
40
+ - The **same** message string is reused more than once before raising.
41
+ - The message is **built incrementally** across multiple statements (not a single literal/f-string assignment).
42
+
43
+ ## When editing
44
+
45
+ - Apply this style to **new** raises and to any `raise` you touch in the same function or validator.
46
+ - Do not repo-wide rewrite unrelated legacy raises unless the task asks for it.
@@ -0,0 +1,24 @@
1
+ ---
2
+ description: Enforce API, worker, application, and domain layer responsibilities
3
+ globs:
4
+ - core_framework/api/**/*.py
5
+ - core_framework/worker/**/*.py
6
+ - core_framework/application/**/*.py
7
+ - core_framework/domains/**/*.py
8
+ ---
9
+
10
+ # Layer boundaries
11
+
12
+ Dependencies point inward: **API/worker → application → domain**. Never reverse.
13
+
14
+ - **API**: HTTP adapter only; shared orchestration belongs in application.
15
+ - **Worker**: schedules/tasks/job handlers; call application services.
16
+ - **Application**: transport-agnostic orchestration; no FastAPI/Starlette types.
17
+ - **Domain**: business rules, models, repositories, services; no API/worker/application imports.
18
+
19
+ ## Cross-layer rules
20
+
21
+ - Worker code must not import `core_framework.domains` directly, except documented housekeeping cron handlers that call a configured domain facade.
22
+ - Domain code imports global infrastructure only in `dependencies.py`.
23
+ - Repositories are Postgres-only and must not query other domains' schemas. See **`repository-schema-isolation`**.
24
+ - Non-SQL I/O uses domain ports/components plus infrastructure adapters. See **`domain-services-and-adapters`**.
@@ -0,0 +1,35 @@
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
+ - Markdown tables of fields and types (`jsonb`, `varchar(26)`, etc.)
25
+ - Plain-text lifecycle diagrams (arrows, boxes)
26
+ - File/directory tree layouts (plain text or a neutral fence such as `text` if helpful)
27
+
28
+ ## Exceptions
29
+
30
+ - **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.
31
+ - **Design docs** under **`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).
32
+
33
+ ## Rationale
34
+
35
+ 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,47 @@
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 exports separate instances:
44
+ - `write_postgres`
45
+ - `read_postgres`
46
+ - Domain dependencies pass `(write, read, strong)` explicitly to repositories.
47
+ - Until a dedicated strong instance exists, use write instance for the strong argument intentionally.