core-framework 4.0.0__tar.gz → 4.0.1__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 (946) hide show
  1. {core_framework-4.0.0 → core_framework-4.0.1}/CHANGELOG.md +18 -4
  2. {core_framework-4.0.0 → core_framework-4.0.1}/PKG-INFO +4 -4
  3. {core_framework-4.0.0 → core_framework-4.0.1}/config.toml +1 -0
  4. {core_framework-4.0.0 → core_framework-4.0.1}/config.toml.template +1 -0
  5. {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/api/admin/outbox/schemas.py +1 -1
  6. {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/api/admin/users/schemas.py +1 -1
  7. {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/api/comments/schemas.py +16 -2
  8. {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/api/system/router.py +28 -29
  9. {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/application/auth/access_service.py +8 -1
  10. {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/application/comments/admin_service.py +4 -12
  11. {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/application/comments/aggregation_service.py +1 -13
  12. {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/application/comments/cleanup_service.py +17 -3
  13. {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/application/comments/post_subject.py +1 -1
  14. {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/application/comments/rating_subject.py +1 -1
  15. {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/application/email/send.py +5 -1
  16. {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/application/notifications/notification_service.py +2 -2
  17. {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/application/outbox/handlers.py +4 -0
  18. {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/application/posts/admin_service.py +2 -10
  19. {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/application/posts/cleanup_service.py +16 -2
  20. {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/application/posts/public_service.py +27 -5
  21. {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/application/ratings/authenticated_service.py +2 -2
  22. {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/application/ratings/purge_service.py +6 -10
  23. {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/application/shared/worker_jobs.py +1 -1
  24. {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/application/users/account_removal/contributors.py +22 -2
  25. {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/application/users/authenticated_service.py +3 -2
  26. {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/application/users/public_service.py +1 -1
  27. {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/application/users/user_deletion_service.py +10 -10
  28. {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/core/middleware.py +2 -2
  29. {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/core/settings.py +6 -0
  30. {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/domains/comment/README.md +2 -2
  31. {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/domains/comment/__init__.py +2 -0
  32. {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/domains/comment/constants.py +1 -0
  33. {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/domains/comment/service.py +128 -19
  34. {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/domains/moderation/README.md +1 -1
  35. {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/domains/moderation/__init__.py +2 -0
  36. {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/domains/moderation/models.py +6 -0
  37. {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/domains/moderation/repository.py +12 -4
  38. {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/domains/moderation/service.py +6 -2
  39. {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/domains/notification/README.md +1 -1
  40. {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/domains/outbox/models.py +1 -1
  41. {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/domains/post/README.md +1 -1
  42. {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/domains/post/repository.py +36 -45
  43. {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/domains/rating/README.md +0 -2
  44. {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/domains/rating/repository.py +12 -1
  45. {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/domains/rating/service.py +1 -1
  46. {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/domains/user/group_repository.py +8 -2
  47. {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/domains/user/repository.py +5 -1
  48. {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/domains/user/service.py +9 -2
  49. {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/testing/auth.py +2 -1
  50. {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/testing/config.py +5 -1
  51. {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/testing/containers.py +17 -4
  52. {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/testing/firebase.py +70 -27
  53. {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/testing/migrations.py +4 -4
  54. {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/testing/plugin.py +10 -4
  55. {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/worker/tasks/process_account_deletion_scheduled_email.py +5 -1
  56. {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/worker/tasks/process_comment_tombstone_cleanup.py +3 -0
  57. {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/worker/tasks/process_post_tombstone_cleanup.py +3 -0
  58. {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/worker/tasks/process_transactional_email.py +1 -1
  59. {core_framework-4.0.0 → core_framework-4.0.1}/docs/deployments/e2e-smoke-tests-design.md +1 -1
  60. {core_framework-4.0.0 → core_framework-4.0.1}/docs/deployments/edge-upload-limits.md +1 -1
  61. {core_framework-4.0.0 → core_framework-4.0.1}/docs/deployments/examples/Caddyfile.example +6 -5
  62. {core_framework-4.0.0 → core_framework-4.0.1}/docs/deployments/guides/playbook/postgres-backup-playbook.md +4 -4
  63. {core_framework-4.0.0 → core_framework-4.0.1}/docs/deployments/guides/setup/image-server-ssh.md +11 -9
  64. {core_framework-4.0.0 → core_framework-4.0.1}/docs/design/README.md +3 -2
  65. {core_framework-4.0.0 → core_framework-4.0.1}/docs/design/account-removal-spine-design.md +29 -21
  66. {core_framework-4.0.0 → core_framework-4.0.1}/docs/design/account-removal-spine-implementation.md +10 -7
  67. {core_framework-4.0.0 → core_framework-4.0.1}/docs/design/comment-subject-kinds-design.md +1 -1
  68. {core_framework-4.0.0 → core_framework-4.0.1}/docs/design/create-idempotency-design.md +1 -0
  69. {core_framework-4.0.0 → core_framework-4.0.1}/docs/design/event-outbox-design.md +1 -1
  70. {core_framework-4.0.0 → core_framework-4.0.1}/docs/design/outbox-admin-ops-design.md +1 -0
  71. {core_framework-4.0.0/docs/domains/ratings → core_framework-4.0.1/docs/design}/rating-implementation-plan.md +28 -28
  72. {core_framework-4.0.0 → core_framework-4.0.1}/docs/design/transactional-email-design.md +4 -4
  73. {core_framework-4.0.0 → core_framework-4.0.1}/docs/domains/README.md +1 -1
  74. {core_framework-4.0.0 → core_framework-4.0.1}/docs/domains/auth/access_control.md +2 -2
  75. {core_framework-4.0.0 → core_framework-4.0.1}/docs/domains/comments/README.md +1 -1
  76. {core_framework-4.0.0 → core_framework-4.0.1}/docs/domains/comments/admin_comments.md +2 -4
  77. {core_framework-4.0.0 → core_framework-4.0.1}/docs/domains/comments/create_comment.md +12 -15
  78. {core_framework-4.0.0 → core_framework-4.0.1}/docs/domains/comments/retrieve_comments.md +3 -3
  79. {core_framework-4.0.0 → core_framework-4.0.1}/docs/domains/deletion/comments.md +3 -3
  80. {core_framework-4.0.0 → core_framework-4.0.1}/docs/domains/deletion/posts.md +1 -2
  81. {core_framework-4.0.0 → core_framework-4.0.1}/docs/domains/deletion/users.md +31 -27
  82. {core_framework-4.0.0 → core_framework-4.0.1}/docs/domains/mentions/mentions_in_content.md +1 -1
  83. {core_framework-4.0.0 → core_framework-4.0.1}/docs/domains/moderation/moderator_actions.md +1 -0
  84. {core_framework-4.0.0 → core_framework-4.0.1}/docs/domains/notifications/inbox-redesign-design.md +39 -37
  85. {core_framework-4.0.0 → core_framework-4.0.1}/docs/domains/posts/admin_posts.md +2 -3
  86. {core_framework-4.0.0 → core_framework-4.0.1}/docs/domains/posts/retrieve_posts.md +3 -3
  87. {core_framework-4.0.0 → core_framework-4.0.1}/docs/domains/ratings/README.md +0 -2
  88. {core_framework-4.0.0 → core_framework-4.0.1}/docs/domains/ratings/admin_ratings.md +0 -2
  89. {core_framework-4.0.0 → core_framework-4.0.1}/docs/domains/ratings/delete_rating.md +1 -3
  90. {core_framework-4.0.0 → core_framework-4.0.1}/docs/domains/ratings/edit_rating.md +0 -2
  91. {core_framework-4.0.0 → core_framework-4.0.1}/docs/domains/ratings/rating-design.md +106 -167
  92. {core_framework-4.0.0 → core_framework-4.0.1}/docs/domains/ratings/rating_report.md +0 -2
  93. {core_framework-4.0.0 → core_framework-4.0.1}/docs/domains/ratings/rating_stats_aggregation.md +7 -9
  94. {core_framework-4.0.0 → core_framework-4.0.1}/docs/domains/ratings/rating_upvote.md +0 -2
  95. {core_framework-4.0.0 → core_framework-4.0.1}/docs/domains/ratings/retrieve_ratings.md +1 -3
  96. {core_framework-4.0.0 → core_framework-4.0.1}/docs/domains/ratings/upsert_rating.md +0 -2
  97. {core_framework-4.0.0 → core_framework-4.0.1}/docs/domains/users/account_deletion.md +3 -1
  98. {core_framework-4.0.0 → core_framework-4.0.1}/docs/domains/users/blocks.md +0 -2
  99. {core_framework-4.0.0 → core_framework-4.0.1}/docs/domains/users/change_history.md +2 -2
  100. {core_framework-4.0.0 → core_framework-4.0.1}/docs/domains/users/follow-system-design.md +14 -11
  101. {core_framework-4.0.0 → core_framework-4.0.1}/docs/domains/users/follow.md +2 -2
  102. {core_framework-4.0.0 → core_framework-4.0.1}/docs/domains/users/friendship.md +5 -7
  103. {core_framework-4.0.0 → core_framework-4.0.1}/docs/domains/users/groups-system-design.md +23 -19
  104. {core_framework-4.0.0 → core_framework-4.0.1}/docs/domains/users/groups.md +0 -2
  105. {core_framework-4.0.0 → core_framework-4.0.1}/docs/domains/users/preferences.md +1 -2
  106. {core_framework-4.0.0 → core_framework-4.0.1}/docs/domains/users/profile.md +0 -2
  107. {core_framework-4.0.0 → core_framework-4.0.1}/docs/domains/users/public_profile.md +0 -2
  108. {core_framework-4.0.0 → core_framework-4.0.1}/docs/domains/users/user_removal.md +1 -1
  109. {core_framework-4.0.0 → core_framework-4.0.1}/docs/domains/users/user_stats_aggregation.md +0 -2
  110. {core_framework-4.0.0 → core_framework-4.0.1}/docs/library/overview.md +2 -1
  111. {core_framework-4.0.0 → core_framework-4.0.1}/docs/library/package-api.md +29 -10
  112. {core_framework-4.0.0 → core_framework-4.0.1}/docs/library/testing-plugin-design.md +37 -35
  113. {core_framework-4.0.0 → core_framework-4.0.1}/docs/library/workers.md +37 -35
  114. {core_framework-4.0.0 → core_framework-4.0.1}/docs/platform/architecture-decisions.md +45 -4
  115. {core_framework-4.0.0 → core_framework-4.0.1}/docs/reviews/log.md +14 -0
  116. {core_framework-4.0.0 → core_framework-4.0.1}/docs/reviews/review-playbook.md +36 -31
  117. {core_framework-4.0.0 → core_framework-4.0.1}/docs/reviews/slices.md +35 -22
  118. {core_framework-4.0.0 → core_framework-4.0.1}/docs/testing.md +40 -37
  119. core_framework-4.0.1/docs/todo.md +17 -0
  120. {core_framework-4.0.0 → core_framework-4.0.1}/pyproject.toml +9 -9
  121. {core_framework-4.0.0 → core_framework-4.0.1}/tests/integration/api/_http_helpers.py +23 -0
  122. {core_framework-4.0.0 → core_framework-4.0.1}/tests/integration/api/admin/comments/router_test.py +3 -0
  123. {core_framework-4.0.0 → core_framework-4.0.1}/tests/integration/api/posts/post_deletion_integration_test.py +2 -0
  124. {core_framework-4.0.0 → core_framework-4.0.1}/tests/integration/worker/create_idempotency_retention_test.py +120 -21
  125. {core_framework-4.0.0 → core_framework-4.0.1}/uv.lock +221 -205
  126. core_framework-4.0.0/docs/todo.md +0 -9
  127. {core_framework-4.0.0 → core_framework-4.0.1}/.agents/skills/fastapi +0 -0
  128. {core_framework-4.0.0 → core_framework-4.0.1}/.agents/skills/library-skills/.library-skills.json +0 -0
  129. {core_framework-4.0.0 → core_framework-4.0.1}/.agents/skills/library-skills/SKILL.md +0 -0
  130. {core_framework-4.0.0 → core_framework-4.0.1}/.cursor/rules/alembic-migrations.mdc +0 -0
  131. {core_framework-4.0.0 → core_framework-4.0.1}/.cursor/rules/api-layer.mdc +0 -0
  132. {core_framework-4.0.0 → core_framework-4.0.1}/.cursor/rules/api-reference-docs.mdc +0 -0
  133. {core_framework-4.0.0 → core_framework-4.0.1}/.cursor/rules/api-validation.mdc +0 -0
  134. {core_framework-4.0.0 → core_framework-4.0.1}/.cursor/rules/application-layer.mdc +0 -0
  135. {core_framework-4.0.0 → core_framework-4.0.1}/.cursor/rules/constants-final.mdc +0 -0
  136. {core_framework-4.0.0 → core_framework-4.0.1}/.cursor/rules/constitution.mdc +0 -0
  137. {core_framework-4.0.0 → core_framework-4.0.1}/.cursor/rules/database-triggers.mdc +0 -0
  138. {core_framework-4.0.0 → core_framework-4.0.1}/.cursor/rules/docstrings.mdc +0 -0
  139. {core_framework-4.0.0 → core_framework-4.0.1}/.cursor/rules/domain-caller-context.mdc +0 -0
  140. {core_framework-4.0.0 → core_framework-4.0.1}/.cursor/rules/domain-imports.mdc +0 -0
  141. {core_framework-4.0.0 → core_framework-4.0.1}/.cursor/rules/domain-input-guards.mdc +0 -0
  142. {core_framework-4.0.0 → core_framework-4.0.1}/.cursor/rules/domain-repository-exceptions.mdc +0 -0
  143. {core_framework-4.0.0 → core_framework-4.0.1}/.cursor/rules/domain-services-and-adapters.mdc +0 -0
  144. {core_framework-4.0.0 → core_framework-4.0.1}/.cursor/rules/error-boundary.mdc +0 -0
  145. {core_framework-4.0.0 → core_framework-4.0.1}/.cursor/rules/flow-documentation.mdc +0 -0
  146. {core_framework-4.0.0 → core_framework-4.0.1}/.cursor/rules/ignore-analytics-warehouse.mdc +0 -0
  147. {core_framework-4.0.0 → core_framework-4.0.1}/.cursor/rules/inline-raise-messages.mdc +0 -0
  148. {core_framework-4.0.0 → core_framework-4.0.1}/.cursor/rules/integration-test-strategy.mdc +0 -0
  149. {core_framework-4.0.0 → core_framework-4.0.1}/.cursor/rules/layer-boundaries.mdc +0 -0
  150. {core_framework-4.0.0 → core_framework-4.0.1}/.cursor/rules/no-code-in-docs.mdc +0 -0
  151. {core_framework-4.0.0 → core_framework-4.0.1}/.cursor/rules/postgres-config-conventions.mdc +0 -0
  152. {core_framework-4.0.0 → core_framework-4.0.1}/.cursor/rules/repository-schema-isolation.mdc +0 -0
  153. {core_framework-4.0.0 → core_framework-4.0.1}/.cursor/rules/strong-reads.mdc +0 -0
  154. {core_framework-4.0.0 → core_framework-4.0.1}/.cursor/rules/structured-logging.mdc +0 -0
  155. {core_framework-4.0.0 → core_framework-4.0.1}/.cursor/skills/add-config/SKILL.md +0 -0
  156. {core_framework-4.0.0 → core_framework-4.0.1}/.cursor/skills/add-domain/SKILL.md +0 -0
  157. {core_framework-4.0.0 → core_framework-4.0.1}/.cursor/skills/code-review/SKILL.md +0 -0
  158. {core_framework-4.0.0 → core_framework-4.0.1}/.cursor/skills/design-review/SKILL.md +0 -0
  159. {core_framework-4.0.0 → core_framework-4.0.1}/.cursor/skills/fastapi +0 -0
  160. {core_framework-4.0.0 → core_framework-4.0.1}/.cursor/skills/grill/SKILL.md +0 -0
  161. {core_framework-4.0.0 → core_framework-4.0.1}/.cursor/skills/implement-feature/SKILL.md +0 -0
  162. {core_framework-4.0.0 → core_framework-4.0.1}/.cursor/skills/recommend-features/SKILL.md +0 -0
  163. {core_framework-4.0.0 → core_framework-4.0.1}/.cursor/skills/sync-host-rules/SKILL.md +0 -0
  164. {core_framework-4.0.0 → core_framework-4.0.1}/.cursor/skills/write-flow-doc/SKILL.md +0 -0
  165. {core_framework-4.0.0 → core_framework-4.0.1}/.dockerignore +0 -0
  166. {core_framework-4.0.0 → core_framework-4.0.1}/.github/ci/package-lock.json +0 -0
  167. {core_framework-4.0.0 → core_framework-4.0.1}/.github/ci/package-smoke.sh +0 -0
  168. {core_framework-4.0.0 → core_framework-4.0.1}/.github/ci/package.json +0 -0
  169. {core_framework-4.0.0 → core_framework-4.0.1}/.github/ci/package_smoke.py +0 -0
  170. {core_framework-4.0.0 → core_framework-4.0.1}/.github/workflows/_deploy.yml +0 -0
  171. {core_framework-4.0.0 → core_framework-4.0.1}/.github/workflows/dev-ci-cd.yaml +0 -0
  172. {core_framework-4.0.0 → core_framework-4.0.1}/.github/workflows/manual-deployment.yaml +0 -0
  173. {core_framework-4.0.0 → core_framework-4.0.1}/.github/workflows/manual-observability-deployment.yaml +0 -0
  174. {core_framework-4.0.0 → core_framework-4.0.1}/.github/workflows/publish-pypi.yml +0 -0
  175. {core_framework-4.0.0 → core_framework-4.0.1}/.github/workflows/test.yaml +0 -0
  176. {core_framework-4.0.0 → core_framework-4.0.1}/.gitignore +0 -0
  177. {core_framework-4.0.0 → core_framework-4.0.1}/.pre-commit-config.yaml +0 -0
  178. {core_framework-4.0.0 → core_framework-4.0.1}/.python-version +0 -0
  179. {core_framework-4.0.0 → core_framework-4.0.1}/LICENSE +0 -0
  180. {core_framework-4.0.0 → core_framework-4.0.1}/README.md +0 -0
  181. {core_framework-4.0.0 → core_framework-4.0.1}/alembic/analytics/alembic/README +0 -0
  182. {core_framework-4.0.0 → core_framework-4.0.1}/alembic/analytics/alembic/env.py +0 -0
  183. {core_framework-4.0.0 → core_framework-4.0.1}/alembic/analytics/alembic/script.py.mako +0 -0
  184. {core_framework-4.0.0 → core_framework-4.0.1}/alembic/analytics/alembic/versions/2d61a5e88d76_analytics_utm_events_add_kind.py +0 -0
  185. {core_framework-4.0.0 → core_framework-4.0.1}/alembic/analytics/alembic/versions/585105e1149e_analytics_add_utm_events.py +0 -0
  186. {core_framework-4.0.0 → core_framework-4.0.1}/alembic/analytics/alembic/versions/5b9ac98bb150_analytics_daily_fact.py +0 -0
  187. {core_framework-4.0.0 → core_framework-4.0.1}/alembic/analytics/alembic/versions/7f2a9c1d4e8b_analytics_daily_fact_day_index.py +0 -0
  188. {core_framework-4.0.0 → core_framework-4.0.1}/alembic/analytics/alembic.ini +0 -0
  189. {core_framework-4.0.0 → core_framework-4.0.1}/alembic/comment/alembic/README +0 -0
  190. {core_framework-4.0.0 → core_framework-4.0.1}/alembic/comment/alembic/env.py +0 -0
  191. {core_framework-4.0.0 → core_framework-4.0.1}/alembic/comment/alembic/script.py.mako +0 -0
  192. {core_framework-4.0.0 → core_framework-4.0.1}/alembic/comment/alembic/versions/comment_add_comment_attachments.py +0 -0
  193. {core_framework-4.0.0 → core_framework-4.0.1}/alembic/comment/alembic/versions/comment_add_comment_create_idempotency.py +0 -0
  194. {core_framework-4.0.0 → core_framework-4.0.1}/alembic/comment/alembic/versions/comment_add_comment_create_idempotency_created_at_index.py +0 -0
  195. {core_framework-4.0.0 → core_framework-4.0.1}/alembic/comment/alembic/versions/comment_add_comment_mentions.py +0 -0
  196. {core_framework-4.0.0 → core_framework-4.0.1}/alembic/comment/alembic/versions/comment_subject_kind_varchar.py +0 -0
  197. {core_framework-4.0.0 → core_framework-4.0.1}/alembic/comment/alembic/versions/comment_tombstone_status_model.py +0 -0
  198. {core_framework-4.0.0 → core_framework-4.0.1}/alembic/comment/alembic/versions/v1_comment_init_baseline.py +0 -0
  199. {core_framework-4.0.0 → core_framework-4.0.1}/alembic/comment/alembic.ini +0 -0
  200. {core_framework-4.0.0 → core_framework-4.0.1}/alembic/extension/alembic/README +0 -0
  201. {core_framework-4.0.0 → core_framework-4.0.1}/alembic/extension/alembic/env.py +0 -0
  202. {core_framework-4.0.0 → core_framework-4.0.1}/alembic/extension/alembic/script.py.mako +0 -0
  203. {core_framework-4.0.0 → core_framework-4.0.1}/alembic/extension/alembic/versions/v1_ext_init_baseline.py +0 -0
  204. {core_framework-4.0.0 → core_framework-4.0.1}/alembic/extension/alembic.ini +0 -0
  205. {core_framework-4.0.0 → core_framework-4.0.1}/alembic/media/alembic/README +0 -0
  206. {core_framework-4.0.0 → core_framework-4.0.1}/alembic/media/alembic/env.py +0 -0
  207. {core_framework-4.0.0 → core_framework-4.0.1}/alembic/media/alembic/script.py.mako +0 -0
  208. {core_framework-4.0.0 → core_framework-4.0.1}/alembic/media/alembic/versions/media_add_attachment_staging_registry.py +0 -0
  209. {core_framework-4.0.0 → core_framework-4.0.1}/alembic/media/alembic/versions/media_add_banner_staging_and_lease.py +0 -0
  210. {core_framework-4.0.0 → core_framework-4.0.1}/alembic/media/alembic/versions/media_attachment_staging_registry_published_at.py +0 -0
  211. {core_framework-4.0.0 → core_framework-4.0.1}/alembic/media/alembic/versions/v1_media_init_baseline.py +0 -0
  212. {core_framework-4.0.0 → core_framework-4.0.1}/alembic/media/alembic.ini +0 -0
  213. {core_framework-4.0.0 → core_framework-4.0.1}/alembic/moderation/alembic/README +0 -0
  214. {core_framework-4.0.0 → core_framework-4.0.1}/alembic/moderation/alembic/env.py +0 -0
  215. {core_framework-4.0.0 → core_framework-4.0.1}/alembic/moderation/alembic/script.py.mako +0 -0
  216. {core_framework-4.0.0 → core_framework-4.0.1}/alembic/moderation/alembic/versions/3027828c2c80_align_dead_outbox_keyset_index.py +0 -0
  217. {core_framework-4.0.0 → core_framework-4.0.1}/alembic/moderation/alembic/versions/5be85718122a_moderation_add_review_reports.py +0 -0
  218. {core_framework-4.0.0 → core_framework-4.0.1}/alembic/moderation/alembic/versions/moderation_add_event_outbox.py +0 -0
  219. {core_framework-4.0.0 → core_framework-4.0.1}/alembic/moderation/alembic/versions/moderation_add_event_outbox_dead_indexes.py +0 -0
  220. {core_framework-4.0.0 → core_framework-4.0.1}/alembic/moderation/alembic/versions/moderation_add_event_outbox_pending_created_at_index.py +0 -0
  221. {core_framework-4.0.0 → core_framework-4.0.1}/alembic/moderation/alembic/versions/v1_mod_init_baseline.py +0 -0
  222. {core_framework-4.0.0 → core_framework-4.0.1}/alembic/moderation/alembic.ini +0 -0
  223. {core_framework-4.0.0 → core_framework-4.0.1}/alembic/notification/alembic/README +0 -0
  224. {core_framework-4.0.0 → core_framework-4.0.1}/alembic/notification/alembic/env.py +0 -0
  225. {core_framework-4.0.0 → core_framework-4.0.1}/alembic/notification/alembic/script.py.mako +0 -0
  226. {core_framework-4.0.0 → core_framework-4.0.1}/alembic/notification/alembic/versions/2fdd68777706_notification_read_at_retention_index.py +0 -0
  227. {core_framework-4.0.0 → core_framework-4.0.1}/alembic/notification/alembic/versions/a5f29155815d_notification_add_friendship_types.py +0 -0
  228. {core_framework-4.0.0 → core_framework-4.0.1}/alembic/notification/alembic/versions/b1263ed1a303_notification_inbox_redesign_preview.py +0 -0
  229. {core_framework-4.0.0 → core_framework-4.0.1}/alembic/notification/alembic/versions/c6b9941065ec_notification_add_group_invite_type.py +0 -0
  230. {core_framework-4.0.0 → core_framework-4.0.1}/alembic/notification/alembic/versions/fbe8476b4437_notification_add_rating_owner_cue_labels.py +0 -0
  231. {core_framework-4.0.0 → core_framework-4.0.1}/alembic/notification/alembic/versions/v1_notif_init_baseline.py +0 -0
  232. {core_framework-4.0.0 → core_framework-4.0.1}/alembic/notification/alembic.ini +0 -0
  233. {core_framework-4.0.0 → core_framework-4.0.1}/alembic/post/alembic/README +0 -0
  234. {core_framework-4.0.0 → core_framework-4.0.1}/alembic/post/alembic/env.py +0 -0
  235. {core_framework-4.0.0 → core_framework-4.0.1}/alembic/post/alembic/script.py.mako +0 -0
  236. {core_framework-4.0.0 → core_framework-4.0.1}/alembic/post/alembic/versions/post_add_post_attachments.py +0 -0
  237. {core_framework-4.0.0 → core_framework-4.0.1}/alembic/post/alembic/versions/post_add_post_create_idempotency.py +0 -0
  238. {core_framework-4.0.0 → core_framework-4.0.1}/alembic/post/alembic/versions/post_add_post_create_idempotency_created_at_index.py +0 -0
  239. {core_framework-4.0.0 → core_framework-4.0.1}/alembic/post/alembic/versions/post_add_post_mentions.py +0 -0
  240. {core_framework-4.0.0 → core_framework-4.0.1}/alembic/post/alembic/versions/post_post_views_retention_high_water_mark.py +0 -0
  241. {core_framework-4.0.0 → core_framework-4.0.1}/alembic/post/alembic/versions/post_tombstone_status_model.py +0 -0
  242. {core_framework-4.0.0 → core_framework-4.0.1}/alembic/post/alembic/versions/v1_post_init_baseline.py +0 -0
  243. {core_framework-4.0.0 → core_framework-4.0.1}/alembic/post/alembic.ini +0 -0
  244. {core_framework-4.0.0 → core_framework-4.0.1}/alembic/rating/alembic/README +0 -0
  245. {core_framework-4.0.0 → core_framework-4.0.1}/alembic/rating/alembic/env.py +0 -0
  246. {core_framework-4.0.0 → core_framework-4.0.1}/alembic/rating/alembic/script.py.mako +0 -0
  247. {core_framework-4.0.0 → core_framework-4.0.1}/alembic/rating/alembic/versions/04182d734619_rating_list_indexes.py +0 -0
  248. {core_framework-4.0.0 → core_framework-4.0.1}/alembic/rating/alembic/versions/2ef924b0be4c_rating_schema.py +0 -0
  249. {core_framework-4.0.0 → core_framework-4.0.1}/alembic/rating/alembic.ini +0 -0
  250. {core_framework-4.0.0 → core_framework-4.0.1}/alembic/user/alembic/README +0 -0
  251. {core_framework-4.0.0 → core_framework-4.0.1}/alembic/user/alembic/env.py +0 -0
  252. {core_framework-4.0.0 → core_framework-4.0.1}/alembic/user/alembic/script.py.mako +0 -0
  253. {core_framework-4.0.0 → core_framework-4.0.1}/alembic/user/alembic/versions/24ba262c4ef2_user_add_account_removal_started_at.py +0 -0
  254. {core_framework-4.0.0 → core_framework-4.0.1}/alembic/user/alembic/versions/2dc1d398a840_user_add_groups.py +0 -0
  255. {core_framework-4.0.0 → core_framework-4.0.1}/alembic/user/alembic/versions/44df70a45ba6_user_add_signup_events.py +0 -0
  256. {core_framework-4.0.0 → core_framework-4.0.1}/alembic/user/alembic/versions/7078e4313554_user_add_friendships.py +0 -0
  257. {core_framework-4.0.0 → core_framework-4.0.1}/alembic/user/alembic/versions/922eece707db_align_dead_outbox_keyset_index.py +0 -0
  258. {core_framework-4.0.0 → core_framework-4.0.1}/alembic/user/alembic/versions/user_add_avatar_ingest_sequences.py +0 -0
  259. {core_framework-4.0.0 → core_framework-4.0.1}/alembic/user/alembic/versions/user_add_banner_ingest_sequences.py +0 -0
  260. {core_framework-4.0.0 → core_framework-4.0.1}/alembic/user/alembic/versions/user_add_date_of_birth_to_profiles.py +0 -0
  261. {core_framework-4.0.0 → core_framework-4.0.1}/alembic/user/alembic/versions/user_add_event_outbox.py +0 -0
  262. {core_framework-4.0.0 → core_framework-4.0.1}/alembic/user/alembic/versions/user_add_event_outbox_dead_indexes.py +0 -0
  263. {core_framework-4.0.0 → core_framework-4.0.1}/alembic/user/alembic/versions/user_add_event_outbox_pending_created_at_index.py +0 -0
  264. {core_framework-4.0.0 → core_framework-4.0.1}/alembic/user/alembic/versions/user_reserve_sentinel_user_ids.py +0 -0
  265. {core_framework-4.0.0 → core_framework-4.0.1}/alembic/user/alembic/versions/v1_user_init_baseline.py +0 -0
  266. {core_framework-4.0.0 → core_framework-4.0.1}/alembic/user/alembic.ini +0 -0
  267. {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/__init__.py +0 -0
  268. {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/api/__init__.py +0 -0
  269. {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/api/admin/__init__.py +0 -0
  270. {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/api/admin/analytics/__init__.py +0 -0
  271. {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/api/admin/analytics/router.py +0 -0
  272. {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/api/admin/analytics/schemas.py +0 -0
  273. {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/api/admin/cache/__init__.py +0 -0
  274. {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/api/admin/cache/router.py +0 -0
  275. {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/api/admin/cache/schemas.py +0 -0
  276. {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/api/admin/comments/__init__.py +0 -0
  277. {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/api/admin/comments/router.py +0 -0
  278. {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/api/admin/comments/schemas.py +0 -0
  279. {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/api/admin/moderation/__init__.py +0 -0
  280. {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/api/admin/moderation/router.py +0 -0
  281. {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/api/admin/moderation/schemas.py +0 -0
  282. {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/api/admin/outbox/__init__.py +0 -0
  283. {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/api/admin/outbox/router.py +0 -0
  284. {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/api/admin/posts/__init__.py +0 -0
  285. {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/api/admin/posts/router.py +0 -0
  286. {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/api/admin/posts/schemas.py +0 -0
  287. {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/api/admin/ratings/router.py +0 -0
  288. {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/api/admin/ratings/schemas.py +0 -0
  289. {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/api/admin/router.py +0 -0
  290. {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/api/admin/users/__init__.py +0 -0
  291. {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/api/admin/users/router.py +0 -0
  292. {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/api/attachments/__init__.py +0 -0
  293. {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/api/attachments/router.py +0 -0
  294. {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/api/attachments/schemas.py +0 -0
  295. {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/api/auth/__init__.py +0 -0
  296. {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/api/auth/router.py +0 -0
  297. {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/api/auth/schemas.py +0 -0
  298. {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/api/comments/__init__.py +0 -0
  299. {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/api/comments/authenticated/__init__.py +0 -0
  300. {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/api/comments/authenticated/mappers.py +0 -0
  301. {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/api/comments/authenticated/router.py +0 -0
  302. {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/api/comments/authenticated/schemas.py +0 -0
  303. {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/api/comments/public/__init__.py +0 -0
  304. {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/api/comments/public/router.py +0 -0
  305. {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/api/comments/public/schemas.py +0 -0
  306. {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/api/comments/router.py +0 -0
  307. {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/api/dependencies.py +0 -0
  308. {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/api/events/__init__.py +0 -0
  309. {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/api/events/router.py +0 -0
  310. {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/api/events/schemas.py +0 -0
  311. {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/api/groups/router.py +0 -0
  312. {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/api/groups/schemas.py +0 -0
  313. {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/api/idempotency/__init__.py +0 -0
  314. {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/api/idempotency/dependencies.py +0 -0
  315. {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/api/ingest_guards.py +0 -0
  316. {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/api/notifications/__init__.py +0 -0
  317. {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/api/notifications/authenticated/__init__.py +0 -0
  318. {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/api/notifications/authenticated/router.py +0 -0
  319. {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/api/notifications/authenticated/schemas.py +0 -0
  320. {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/api/notifications/router.py +0 -0
  321. {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/api/pagination.py +0 -0
  322. {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/api/posts/__init__.py +0 -0
  323. {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/api/posts/authenticated/__init__.py +0 -0
  324. {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/api/posts/authenticated/mappers.py +0 -0
  325. {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/api/posts/authenticated/router.py +0 -0
  326. {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/api/posts/authenticated/schemas.py +0 -0
  327. {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/api/posts/public/__init__.py +0 -0
  328. {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/api/posts/public/router.py +0 -0
  329. {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/api/posts/public/schemas.py +0 -0
  330. {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/api/posts/router.py +0 -0
  331. {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/api/posts/schemas.py +0 -0
  332. {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/api/ratings/authenticated/router.py +0 -0
  333. {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/api/ratings/pagination.py +0 -0
  334. {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/api/ratings/public/router.py +0 -0
  335. {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/api/ratings/router.py +0 -0
  336. {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/api/ratings/schemas.py +0 -0
  337. {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/api/router.py +0 -0
  338. {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/api/schemas.py +0 -0
  339. {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/api/system/__init__.py +0 -0
  340. {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/api/upload.py +0 -0
  341. {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/api/users/__init__.py +0 -0
  342. {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/api/users/authenticated/__init__.py +0 -0
  343. {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/api/users/authenticated/mappers.py +0 -0
  344. {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/api/users/authenticated/router.py +0 -0
  345. {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/api/users/authenticated/schemas.py +0 -0
  346. {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/api/users/public/__init__.py +0 -0
  347. {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/api/users/public/router.py +0 -0
  348. {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/api/users/public/schemas.py +0 -0
  349. {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/api/users/router.py +0 -0
  350. {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/api/users/shared/__init__.py +0 -0
  351. {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/api/users/shared/mappers.py +0 -0
  352. {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/api/users/shared/schemas.py +0 -0
  353. {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/application/__init__.py +0 -0
  354. {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/application/analytics/__init__.py +0 -0
  355. {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/application/analytics/bucket_service.py +0 -0
  356. {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/application/analytics/prune_service.py +0 -0
  357. {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/application/analytics/read_service.py +0 -0
  358. {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/application/analytics/refresh_service.py +0 -0
  359. {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/application/analytics/registry.py +0 -0
  360. {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/application/analytics/sources/__init__.py +0 -0
  361. {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/application/analytics/sources/comment_created.py +0 -0
  362. {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/application/analytics/sources/post_created.py +0 -0
  363. {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/application/analytics/sources/post_viewed.py +0 -0
  364. {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/application/analytics/sources/user_registered.py +0 -0
  365. {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/application/auth/__init__.py +0 -0
  366. {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/application/auth/auth_service.py +0 -0
  367. {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/application/auth/models.py +0 -0
  368. {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/application/auth/token_verification.py +0 -0
  369. {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/application/bootstrap.py +0 -0
  370. {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/application/cache/__init__.py +0 -0
  371. {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/application/cache/invalidate_service.py +0 -0
  372. {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/application/cache/models.py +0 -0
  373. {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/application/comments/__init__.py +0 -0
  374. {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/application/comments/authenticated_service.py +0 -0
  375. {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/application/comments/host_service.py +0 -0
  376. {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/application/comments/kind_registry.py +0 -0
  377. {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/application/comments/public_service.py +0 -0
  378. {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/application/email/__init__.py +0 -0
  379. {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/application/email/account_deletion_scheduled.py +0 -0
  380. {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/application/email/enqueue.py +0 -0
  381. {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/application/email/registry.py +0 -0
  382. {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/application/events/README.md +0 -0
  383. {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/application/events/__init__.py +0 -0
  384. {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/application/events/event_service.py +0 -0
  385. {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/application/events/event_token.py +0 -0
  386. {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/application/events/models.py +0 -0
  387. {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/application/events/utm_capture_kinds.py +0 -0
  388. {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/application/groups/authenticated_service.py +0 -0
  389. {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/application/groups/cleanup_service.py +0 -0
  390. {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/application/groups/group_invite_link_token.py +0 -0
  391. {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/application/groups/strip_service.py +0 -0
  392. {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/application/media/README.md +0 -0
  393. {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/application/media/__init__.py +0 -0
  394. {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/application/media/attachment_read.py +0 -0
  395. {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/application/media/attachment_service.py +0 -0
  396. {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/application/media/avatar_service.py +0 -0
  397. {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/application/media/banner_service.py +0 -0
  398. {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/application/media/read_url_config.py +0 -0
  399. {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/application/moderation/__init__.py +0 -0
  400. {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/application/moderation/appeal_service.py +0 -0
  401. {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/application/moderation/moderator_service.py +0 -0
  402. {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/application/moderation/report_service.py +0 -0
  403. {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/application/moderation/restriction_fanout/__init__.py +0 -0
  404. {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/application/moderation/restriction_fanout/heals.py +0 -0
  405. {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/application/moderation/restriction_fanout/mirrors.py +0 -0
  406. {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/application/moderation/restriction_fanout/reactions.py +0 -0
  407. {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/application/moderation/restriction_fanout/registry.py +0 -0
  408. {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/application/moderation/restriction_fanout/runner.py +0 -0
  409. {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/application/moderation/scheduled_service.py +0 -0
  410. {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/application/moderation/user_service.py +0 -0
  411. {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/application/notifications/README.md +0 -0
  412. {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/application/notifications/__init__.py +0 -0
  413. {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/application/notifications/enums.py +0 -0
  414. {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/application/notifications/friendship_notification_service.py +0 -0
  415. {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/application/notifications/group_invite_notification_service.py +0 -0
  416. {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/application/notifications/inbox_service.py +0 -0
  417. {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/application/notifications/mute_service.py +0 -0
  418. {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/application/notifications/preview.py +0 -0
  419. {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/application/notifications/prune_service.py +0 -0
  420. {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/application/notifications/wipe_service.py +0 -0
  421. {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/application/outbox/__init__.py +0 -0
  422. {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/application/outbox/block_mirrors.py +0 -0
  423. {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/application/outbox/events.py +0 -0
  424. {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/application/outbox/exceptions.py +0 -0
  425. {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/application/outbox/follow_mirrors.py +0 -0
  426. {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/application/outbox/ops_service.py +0 -0
  427. {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/application/outbox/polling_service.py +0 -0
  428. {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/application/outbox/processing_service.py +0 -0
  429. {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/application/outbox/restriction_mirrors.py +0 -0
  430. {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/application/posts/__init__.py +0 -0
  431. {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/application/posts/aggregation_service.py +0 -0
  432. {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/application/posts/authenticated_service.py +0 -0
  433. {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/application/ratings/__init__.py +0 -0
  434. {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/application/ratings/admin_service.py +0 -0
  435. {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/application/ratings/aggregation_service.py +0 -0
  436. {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/application/ratings/kind_registry.py +0 -0
  437. {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/application/ratings/public_service.py +0 -0
  438. {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/application/ratings/serialization.py +0 -0
  439. {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/application/ratings/subject_existence.py +0 -0
  440. {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/application/shared/__init__.py +0 -0
  441. {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/application/shared/deletion_cleanup_ledger.py +0 -0
  442. {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/application/shared/enums.py +0 -0
  443. {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/application/shared/exceptions.py +0 -0
  444. {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/application/shared/request_context.py +0 -0
  445. {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/application/users/__init__.py +0 -0
  446. {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/application/users/account_removal/__init__.py +0 -0
  447. {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/application/users/account_removal/registry.py +0 -0
  448. {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/application/users/account_removal/runner.py +0 -0
  449. {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/application/users/admin_service.py +0 -0
  450. {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/application/users/aggregation_service.py +0 -0
  451. {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/application/users/deletion_audit.py +0 -0
  452. {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/application/users/enums.py +0 -0
  453. {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/application/users/identity_enrichment.py +0 -0
  454. {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/application/users/scheduled_service.py +0 -0
  455. {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/asgi.py +0 -0
  456. {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/bundled_alembic.py +0 -0
  457. {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/constants.py +0 -0
  458. {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/core/__init__.py +0 -0
  459. {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/core/cache.py +0 -0
  460. {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/core/context.py +0 -0
  461. {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/core/database.py +0 -0
  462. {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/core/exception_handlers/__init__.py +0 -0
  463. {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/core/exception_handlers/application.py +0 -0
  464. {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/core/exception_handlers/common.py +0 -0
  465. {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/core/exception_handlers/setup.py +0 -0
  466. {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/core/exceptions.py +0 -0
  467. {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/core/firebase.py +0 -0
  468. {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/core/http_client.py +0 -0
  469. {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/core/http_probes.py +0 -0
  470. {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/core/logging.py +0 -0
  471. {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/core/observability.py +0 -0
  472. {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/core/pagination.py +0 -0
  473. {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/core/process.py +0 -0
  474. {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/core/rate_limit.py +0 -0
  475. {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/core/redis.py +0 -0
  476. {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/core/runtime.py +0 -0
  477. {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/domains/__init__.py +0 -0
  478. {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/domains/analytics/README.md +0 -0
  479. {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/domains/analytics/__init__.py +0 -0
  480. {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/domains/analytics/constants.py +0 -0
  481. {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/domains/analytics/dependencies.py +0 -0
  482. {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/domains/analytics/exceptions.py +0 -0
  483. {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/domains/analytics/models.py +0 -0
  484. {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/domains/analytics/ports/__init__.py +0 -0
  485. {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/domains/analytics/ports/activity_source.py +0 -0
  486. {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/domains/analytics/repository.py +0 -0
  487. {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/domains/analytics/service.py +0 -0
  488. {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/domains/auth/README.md +0 -0
  489. {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/domains/auth/__init__.py +0 -0
  490. {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/domains/auth/dependencies.py +0 -0
  491. {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/domains/auth/exceptions.py +0 -0
  492. {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/domains/auth/models.py +0 -0
  493. {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/domains/auth/outcomes.py +0 -0
  494. {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/domains/auth/ports/__init__.py +0 -0
  495. {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/domains/auth/ports/auth.py +0 -0
  496. {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/domains/auth/service.py +0 -0
  497. {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/domains/comment/dependencies.py +0 -0
  498. {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/domains/comment/enums.py +0 -0
  499. {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/domains/comment/exceptions.py +0 -0
  500. {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/domains/comment/models.py +0 -0
  501. {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/domains/comment/outcomes.py +0 -0
  502. {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/domains/comment/ports/subject.py +0 -0
  503. {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/domains/comment/repository.py +0 -0
  504. {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/domains/email/README.md +0 -0
  505. {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/domains/email/__init__.py +0 -0
  506. {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/domains/email/dependencies.py +0 -0
  507. {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/domains/email/exceptions.py +0 -0
  508. {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/domains/email/models.py +0 -0
  509. {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/domains/email/ports/send.py +0 -0
  510. {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/domains/email/service.py +0 -0
  511. {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/domains/exceptions.py +0 -0
  512. {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/domains/media/README.md +0 -0
  513. {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/domains/media/__init__.py +0 -0
  514. {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/domains/media/attachment/__init__.py +0 -0
  515. {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/domains/media/attachment/components/__init__.py +0 -0
  516. {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/domains/media/attachment/components/finals_publisher.py +0 -0
  517. {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/domains/media/attachment/components/staging.py +0 -0
  518. {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/domains/media/attachment/components/variant_encoder.py +0 -0
  519. {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/domains/media/attachment/constants.py +0 -0
  520. {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/domains/media/attachment/exceptions.py +0 -0
  521. {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/domains/media/attachment/models.py +0 -0
  522. {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/domains/media/attachment/ports/__init__.py +0 -0
  523. {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/domains/media/attachment/ports/finals_publisher.py +0 -0
  524. {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/domains/media/attachment/ports/staging.py +0 -0
  525. {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/domains/media/attachment/ports/variant_encoder.py +0 -0
  526. {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/domains/media/attachment/service.py +0 -0
  527. {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/domains/media/avatar/__init__.py +0 -0
  528. {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/domains/media/avatar/components/__init__.py +0 -0
  529. {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/domains/media/avatar/components/finals_publisher.py +0 -0
  530. {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/domains/media/avatar/components/staging.py +0 -0
  531. {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/domains/media/avatar/components/variant_encoder.py +0 -0
  532. {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/domains/media/avatar/constants.py +0 -0
  533. {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/domains/media/avatar/exceptions.py +0 -0
  534. {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/domains/media/avatar/models.py +0 -0
  535. {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/domains/media/avatar/ports/__init__.py +0 -0
  536. {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/domains/media/avatar/ports/finals_publisher.py +0 -0
  537. {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/domains/media/avatar/ports/staging.py +0 -0
  538. {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/domains/media/avatar/ports/variant_encoder.py +0 -0
  539. {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/domains/media/avatar/service.py +0 -0
  540. {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/domains/media/banner/__init__.py +0 -0
  541. {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/domains/media/banner/components/__init__.py +0 -0
  542. {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/domains/media/banner/components/finals_publisher.py +0 -0
  543. {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/domains/media/banner/components/staging.py +0 -0
  544. {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/domains/media/banner/components/variant_encoder.py +0 -0
  545. {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/domains/media/banner/constants.py +0 -0
  546. {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/domains/media/banner/exceptions.py +0 -0
  547. {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/domains/media/banner/models.py +0 -0
  548. {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/domains/media/banner/ports/__init__.py +0 -0
  549. {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/domains/media/banner/ports/finals_publisher.py +0 -0
  550. {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/domains/media/banner/ports/staging.py +0 -0
  551. {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/domains/media/banner/ports/variant_encoder.py +0 -0
  552. {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/domains/media/banner/service.py +0 -0
  553. {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/domains/media/dependencies.py +0 -0
  554. {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/domains/media/shared/__init__.py +0 -0
  555. {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/domains/media/shared/constants.py +0 -0
  556. {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/domains/media/shared/exceptions.py +0 -0
  557. {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/domains/media/shared/outcomes.py +0 -0
  558. {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/domains/media/shared/repository.py +0 -0
  559. {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/domains/media/shared/utils.py +0 -0
  560. {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/domains/moderation/dependencies.py +0 -0
  561. {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/domains/moderation/enums.py +0 -0
  562. {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/domains/moderation/exceptions.py +0 -0
  563. {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/domains/moderation/outbox_repository.py +0 -0
  564. {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/domains/moderation/outbox_service.py +0 -0
  565. {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/domains/moderation/outcomes.py +0 -0
  566. {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/domains/notification/__init__.py +0 -0
  567. {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/domains/notification/dependencies.py +0 -0
  568. {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/domains/notification/enums.py +0 -0
  569. {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/domains/notification/exceptions.py +0 -0
  570. {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/domains/notification/models.py +0 -0
  571. {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/domains/notification/repository.py +0 -0
  572. {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/domains/notification/service.py +0 -0
  573. {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/domains/outbox/README.md +0 -0
  574. {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/domains/outbox/__init__.py +0 -0
  575. {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/domains/outbox/dependencies.py +0 -0
  576. {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/domains/outbox/exceptions.py +0 -0
  577. {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/domains/outbox/ports/__init__.py +0 -0
  578. {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/domains/outbox/ports/admin.py +0 -0
  579. {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/domains/outbox/ports/consumer.py +0 -0
  580. {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/domains/outbox/ports/producer.py +0 -0
  581. {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/domains/outbox/service.py +0 -0
  582. {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/domains/post/__init__.py +0 -0
  583. {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/domains/post/constants.py +0 -0
  584. {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/domains/post/dependencies.py +0 -0
  585. {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/domains/post/enums.py +0 -0
  586. {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/domains/post/exceptions.py +0 -0
  587. {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/domains/post/models.py +0 -0
  588. {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/domains/post/outcomes.py +0 -0
  589. {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/domains/post/service.py +0 -0
  590. {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/domains/rating/__init__.py +0 -0
  591. {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/domains/rating/constants.py +0 -0
  592. {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/domains/rating/dependencies.py +0 -0
  593. {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/domains/rating/exceptions.py +0 -0
  594. {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/domains/rating/models.py +0 -0
  595. {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/domains/rating/outcomes.py +0 -0
  596. {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/domains/rating/ports/subject_existence.py +0 -0
  597. {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/domains/repository_sql.py +0 -0
  598. {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/domains/user/README.md +0 -0
  599. {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/domains/user/__init__.py +0 -0
  600. {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/domains/user/constants.py +0 -0
  601. {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/domains/user/dependencies.py +0 -0
  602. {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/domains/user/enums.py +0 -0
  603. {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/domains/user/exceptions.py +0 -0
  604. {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/domains/user/group_service.py +0 -0
  605. {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/domains/user/models.py +0 -0
  606. {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/domains/user/outbox_repository.py +0 -0
  607. {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/domains/user/outbox_service.py +0 -0
  608. {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/domains/user/outcomes.py +0 -0
  609. {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/domains/user/utils.py +0 -0
  610. {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/domains/utils.py +0 -0
  611. {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/infrastructure/__init__.py +0 -0
  612. {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/infrastructure/email/resend_email_adapter.py +0 -0
  613. {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/infrastructure/firebase/__init__.py +0 -0
  614. {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/infrastructure/firebase/firebase_auth_adapter.py +0 -0
  615. {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/infrastructure/media/__init__.py +0 -0
  616. {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/infrastructure/media/attachment_staging_display_geometry.py +0 -0
  617. {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/infrastructure/media/local_attachment_staging_adapter.py +0 -0
  618. {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/infrastructure/media/local_avatar_staging_adapter.py +0 -0
  619. {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/infrastructure/media/local_banner_staging_adapter.py +0 -0
  620. {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/infrastructure/media/pillow_attachment_variant_encoder_adapter.py +0 -0
  621. {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/infrastructure/media/pillow_avatar_variant_encoder_adapter.py +0 -0
  622. {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/infrastructure/media/pillow_banner_variant_encoder_adapter.py +0 -0
  623. {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/infrastructure/media/pillow_staging_image.py +0 -0
  624. {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/infrastructure/media/ssh_attachment_finals_publisher_adapter.py +0 -0
  625. {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/infrastructure/media/ssh_banner_finals_publisher_adapter.py +0 -0
  626. {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/infrastructure/media/ssh_finals_publisher_adapter.py +0 -0
  627. {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/infrastructure/media/staging_paths.py +0 -0
  628. {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/infrastructure/outbox/__init__.py +0 -0
  629. {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/infrastructure/outbox/outbox_consumer_adapter.py +0 -0
  630. {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/infrastructure/outbox/outbox_producer_adapter.py +0 -0
  631. {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/main.py +0 -0
  632. {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/migrate_cli.py +0 -0
  633. {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/py.typed +0 -0
  634. {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/testing/__init__.py +0 -0
  635. {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/testing/arq.py +0 -0
  636. {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/testing/blockbuster.py +0 -0
  637. {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/testing/firebase_identity_toolkit.py +0 -0
  638. {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/testing/hookspecs.py +0 -0
  639. {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/testing/httpx_test_client.py +0 -0
  640. {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/testing/media.py +0 -0
  641. {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/worker/__init__.py +0 -0
  642. {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/worker/main.py +0 -0
  643. {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/worker/schedules/__init__.py +0 -0
  644. {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/worker/schedules/analytics_refresh_cron.py +0 -0
  645. {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/worker/schedules/schedule_aggregate_comment_stats.py +0 -0
  646. {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/worker/schedules/schedule_aggregate_post_stats.py +0 -0
  647. {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/worker/schedules/schedule_aggregate_rating_stats.py +0 -0
  648. {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/worker/schedules/schedule_aggregate_rating_subject_stats.py +0 -0
  649. {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/worker/schedules/schedule_aggregate_user_stats.py +0 -0
  650. {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/worker/schedules/schedule_expired_account_deletions.py +0 -0
  651. {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/worker/schedules/schedule_expired_mute_lifts.py +0 -0
  652. {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/worker/schedules/schedule_poll_outbox.py +0 -0
  653. {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/worker/schedules/schedule_prune_analytics_daily_facts.py +0 -0
  654. {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/worker/schedules/schedule_prune_post_views.py +0 -0
  655. {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/worker/schedules/schedule_prune_read_notifications.py +0 -0
  656. {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/worker/schedules/schedule_purge_expired_create_idempotency_keys.py +0 -0
  657. {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/worker/schedules/schedule_purge_expired_group_invites.py +0 -0
  658. {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/worker/schedules/schedule_refresh_analytics.py +0 -0
  659. {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/worker/schedules/schedule_restriction_heals.py +0 -0
  660. {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/worker/schedules/schedule_sweep_stale_attachment_staging.py +0 -0
  661. {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/worker/schedules/schedule_sweep_stale_avatar_staging.py +0 -0
  662. {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/worker/schedules/schedule_sweep_stale_banner_staging.py +0 -0
  663. {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/worker/tasks/__init__.py +0 -0
  664. {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/worker/tasks/delete_attachment_finals.py +0 -0
  665. {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/worker/tasks/delete_superseded_avatar_finals.py +0 -0
  666. {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/worker/tasks/delete_superseded_banner_finals.py +0 -0
  667. {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/worker/tasks/process_account_deletion.py +0 -0
  668. {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/worker/tasks/process_admin_user_deletion.py +0 -0
  669. {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/worker/tasks/process_aggregate_comment_stats.py +0 -0
  670. {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/worker/tasks/process_aggregate_post_stats.py +0 -0
  671. {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/worker/tasks/process_aggregate_rating_stats.py +0 -0
  672. {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/worker/tasks/process_aggregate_rating_subject_stats.py +0 -0
  673. {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/worker/tasks/process_aggregate_user_stats.py +0 -0
  674. {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/worker/tasks/process_attachment_asset_variants.py +0 -0
  675. {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/worker/tasks/process_banner_asset_variants.py +0 -0
  676. {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/worker/tasks/process_block_notification_wipe.py +0 -0
  677. {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/worker/tasks/process_cache_pattern_invalidation.py +0 -0
  678. {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/worker/tasks/process_destructive_comment_delete.py +0 -0
  679. {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/worker/tasks/process_destructive_post_delete.py +0 -0
  680. {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/worker/tasks/process_friendship_pair_notification_wipe.py +0 -0
  681. {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/worker/tasks/process_group_invite_notification_wipe.py +0 -0
  682. {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/worker/tasks/process_media_asset_variants.py +0 -0
  683. {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/worker/tasks/process_mute_lift.py +0 -0
  684. {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/worker/tasks/process_outbox_row.py +0 -0
  685. {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/worker/tasks/process_post_private_notification_wipe.py +0 -0
  686. {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/worker/tasks/process_refresh_analytics_bucket.py +0 -0
  687. {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/worker/tasks/process_restriction_reactions.py +0 -0
  688. {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/worker/tasks/process_user_content_deletion.py +0 -0
  689. {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/worker/worker_context.py +0 -0
  690. {core_framework-4.0.0 → core_framework-4.0.1}/deploy/README.md +0 -0
  691. {core_framework-4.0.0 → core_framework-4.0.1}/deploy/app/docker-compose.dev.yaml +0 -0
  692. {core_framework-4.0.0 → core_framework-4.0.1}/deploy/app/docker-compose.yml +0 -0
  693. {core_framework-4.0.0 → core_framework-4.0.1}/deploy/app/dockerfile +0 -0
  694. {core_framework-4.0.0 → core_framework-4.0.1}/deploy/observability/.env.example +0 -0
  695. {core_framework-4.0.0 → core_framework-4.0.1}/deploy/observability/README.md +0 -0
  696. {core_framework-4.0.0 → core_framework-4.0.1}/deploy/observability/docker-compose.yml +0 -0
  697. {core_framework-4.0.0 → core_framework-4.0.1}/deploy/observability/grafana/dashboards/application/api-http.json +0 -0
  698. {core_framework-4.0.0 → core_framework-4.0.1}/deploy/observability/grafana/dashboards/application/worker-jobs.json +0 -0
  699. {core_framework-4.0.0 → core_framework-4.0.1}/deploy/observability/grafana/dashboards/infrastructure/node-exporter.json +0 -0
  700. {core_framework-4.0.0 → core_framework-4.0.1}/deploy/observability/grafana/dashboards/infrastructure/postgres-exporter.json +0 -0
  701. {core_framework-4.0.0 → core_framework-4.0.1}/deploy/observability/grafana/dashboards/infrastructure/redis-exporter.json +0 -0
  702. {core_framework-4.0.0 → core_framework-4.0.1}/deploy/observability/grafana/provisioning/dashboards/dashboards.yml +0 -0
  703. {core_framework-4.0.0 → core_framework-4.0.1}/deploy/observability/grafana/provisioning/datasources/datasources.yml +0 -0
  704. {core_framework-4.0.0 → core_framework-4.0.1}/deploy/observability/loki.yaml +0 -0
  705. {core_framework-4.0.0 → core_framework-4.0.1}/deploy/observability/otel-collector-config.yaml +0 -0
  706. {core_framework-4.0.0 → core_framework-4.0.1}/deploy/observability/prometheus.yml +0 -0
  707. {core_framework-4.0.0 → core_framework-4.0.1}/deploy/observability/targets/node/.gitkeep +0 -0
  708. {core_framework-4.0.0 → core_framework-4.0.1}/deploy/observability/targets/postgres/.gitkeep +0 -0
  709. {core_framework-4.0.0 → core_framework-4.0.1}/deploy/observability/targets/redis/.gitkeep +0 -0
  710. {core_framework-4.0.0 → core_framework-4.0.1}/deploy/observability/targets.default/node.yml +0 -0
  711. {core_framework-4.0.0 → core_framework-4.0.1}/deploy/observability/targets.default/postgres.yml +0 -0
  712. {core_framework-4.0.0 → core_framework-4.0.1}/deploy/observability/targets.default/redis.yml +0 -0
  713. {core_framework-4.0.0 → core_framework-4.0.1}/deploy/observability/targets.example/README.md +0 -0
  714. {core_framework-4.0.0 → core_framework-4.0.1}/deploy/observability/tempo.yaml +0 -0
  715. {core_framework-4.0.0 → core_framework-4.0.1}/docs/README.md +0 -0
  716. {core_framework-4.0.0 → core_framework-4.0.1}/docs/deployments/README.md +0 -0
  717. {core_framework-4.0.0 → core_framework-4.0.1}/docs/deployments/deploy-playbook.md +0 -0
  718. {core_framework-4.0.0 → core_framework-4.0.1}/docs/deployments/edge-rate-limits.md +0 -0
  719. {core_framework-4.0.0 → core_framework-4.0.1}/docs/deployments/examples/Caddyfile.observability.example +0 -0
  720. {core_framework-4.0.0 → core_framework-4.0.1}/docs/deployments/examples/image-server-known-hosts.example +0 -0
  721. {core_framework-4.0.0 → core_framework-4.0.1}/docs/deployments/guides/playbook/py-spy-playbook.md +0 -0
  722. {core_framework-4.0.0 → core_framework-4.0.1}/docs/deployments/guides/setup/app-server-deploy-ssh.md +0 -0
  723. {core_framework-4.0.0 → core_framework-4.0.1}/docs/deployments/guides/setup/caddy-setup.md +0 -0
  724. {core_framework-4.0.0 → core_framework-4.0.1}/docs/deployments/guides/setup/cloudflare-setup.md +0 -0
  725. {core_framework-4.0.0 → core_framework-4.0.1}/docs/deployments/guides/setup/observability-lgtm-setup.md +0 -0
  726. {core_framework-4.0.0 → core_framework-4.0.1}/docs/deployments/guides/setup/postgres-backup-setup.md +0 -0
  727. {core_framework-4.0.0 → core_framework-4.0.1}/docs/deployments/guides/setup/postgres-setup.md +0 -0
  728. {core_framework-4.0.0 → core_framework-4.0.1}/docs/deployments/guides/setup/py-spy-setup.md +0 -0
  729. {core_framework-4.0.0 → core_framework-4.0.1}/docs/deployments/guides/setup/redis-setup.md +0 -0
  730. {core_framework-4.0.0 → core_framework-4.0.1}/docs/deployments/guides/setup/ubuntu-server-setup.md +0 -0
  731. {core_framework-4.0.0 → core_framework-4.0.1}/docs/deployments/host-config-defaults-design.md +0 -0
  732. {core_framework-4.0.0 → core_framework-4.0.1}/docs/deployments/host-config-defaults-implementation.md +0 -0
  733. {core_framework-4.0.0 → core_framework-4.0.1}/docs/deployments/postgres-backup-design.md +0 -0
  734. {core_framework-4.0.0 → core_framework-4.0.1}/docs/deployments/release-playbook.md +0 -0
  735. {core_framework-4.0.0 → core_framework-4.0.1}/docs/design/analytics-rollup-design.md +0 -0
  736. {core_framework-4.0.0 → core_framework-4.0.1}/docs/design/analytics-warehouse-design.md +0 -0
  737. {core_framework-4.0.0 → core_framework-4.0.1}/docs/design/cache-invalidation-design.md +0 -0
  738. {core_framework-4.0.0 → core_framework-4.0.1}/docs/design/events-ingest-design.md +0 -0
  739. {core_framework-4.0.0 → core_framework-4.0.1}/docs/design/media-cpu-off-api-refactor.md +0 -0
  740. {core_framework-4.0.0 → core_framework-4.0.1}/docs/design/media-storage-topology.md +0 -0
  741. {core_framework-4.0.0 → core_framework-4.0.1}/docs/design/moderation-restriction-fanout-design.md +0 -0
  742. {core_framework-4.0.0 → core_framework-4.0.1}/docs/design/moderation-restriction-fanout-implementation.md +0 -0
  743. {core_framework-4.0.0 → core_framework-4.0.1}/docs/design/moderator-surfaces-design.md +0 -0
  744. {core_framework-4.0.0 → core_framework-4.0.1}/docs/design/moderator-surfaces-implementation.md +0 -0
  745. {core_framework-4.0.0 → core_framework-4.0.1}/docs/design/observability-lgtm-design.md +0 -0
  746. {core_framework-4.0.0 → core_framework-4.0.1}/docs/design/rating-thread-owner-cue-design.md +0 -0
  747. {core_framework-4.0.0 → core_framework-4.0.1}/docs/design/rating-thread-owner-cue-implementation.md +0 -0
  748. {core_framework-4.0.0 → core_framework-4.0.1}/docs/design/restriction-and-block-visibility-design.md +0 -0
  749. {core_framework-4.0.0 → core_framework-4.0.1}/docs/design/restriction-and-block-visibility-implementation.md +0 -0
  750. {core_framework-4.0.0 → core_framework-4.0.1}/docs/design/utm-events-design.md +0 -0
  751. {core_framework-4.0.0 → core_framework-4.0.1}/docs/domains/analytics/admin_analytics_reads.md +0 -0
  752. {core_framework-4.0.0 → core_framework-4.0.1}/docs/domains/auth/registration.md +0 -0
  753. {core_framework-4.0.0 → core_framework-4.0.1}/docs/domains/cache/admin_cache_invalidation.md +0 -0
  754. {core_framework-4.0.0 → core_framework-4.0.1}/docs/domains/comments/comment_like.md +0 -0
  755. {core_framework-4.0.0 → core_framework-4.0.1}/docs/domains/comments/comment_report.md +0 -0
  756. {core_framework-4.0.0 → core_framework-4.0.1}/docs/domains/comments/comment_stats_aggregation.md +0 -0
  757. {core_framework-4.0.0 → core_framework-4.0.1}/docs/domains/comments/delete_comment.md +0 -0
  758. {core_framework-4.0.0 → core_framework-4.0.1}/docs/domains/comments/edit_comment.md +0 -0
  759. {core_framework-4.0.0 → core_framework-4.0.1}/docs/domains/deletion/overview.md +0 -0
  760. {core_framework-4.0.0 → core_framework-4.0.1}/docs/domains/deletion/ratings.md +0 -0
  761. {core_framework-4.0.0 → core_framework-4.0.1}/docs/domains/events/events.md +0 -0
  762. {core_framework-4.0.0 → core_framework-4.0.1}/docs/domains/media/README.md +0 -0
  763. {core_framework-4.0.0 → core_framework-4.0.1}/docs/domains/media/attachment_upload.md +0 -0
  764. {core_framework-4.0.0 → core_framework-4.0.1}/docs/domains/media/avatar-upload-design.md +0 -0
  765. {core_framework-4.0.0 → core_framework-4.0.1}/docs/domains/media/banner-upload-design.md +0 -0
  766. {core_framework-4.0.0 → core_framework-4.0.1}/docs/domains/media/post-comment-attachments-design.md +0 -0
  767. {core_framework-4.0.0 → core_framework-4.0.1}/docs/domains/media/upload-pipeline-design.md +0 -0
  768. {core_framework-4.0.0 → core_framework-4.0.1}/docs/domains/media/upload_pipeline.md +0 -0
  769. {core_framework-4.0.0 → core_framework-4.0.1}/docs/domains/moderation/README.md +0 -0
  770. {core_framework-4.0.0 → core_framework-4.0.1}/docs/domains/moderation/appeals.md +0 -0
  771. {core_framework-4.0.0 → core_framework-4.0.1}/docs/domains/moderation/internal_notes.md +0 -0
  772. {core_framework-4.0.0 → core_framework-4.0.1}/docs/domains/moderation/reports.md +0 -0
  773. {core_framework-4.0.0 → core_framework-4.0.1}/docs/domains/moderation/restrictions.md +0 -0
  774. {core_framework-4.0.0 → core_framework-4.0.1}/docs/domains/notifications/notification_inbox.md +0 -0
  775. {core_framework-4.0.0 → core_framework-4.0.1}/docs/domains/outbox/admin_outbox_ops.md +0 -0
  776. {core_framework-4.0.0 → core_framework-4.0.1}/docs/domains/posts/README.md +0 -0
  777. {core_framework-4.0.0 → core_framework-4.0.1}/docs/domains/posts/author_context.md +0 -0
  778. {core_framework-4.0.0 → core_framework-4.0.1}/docs/domains/posts/create_post.md +0 -0
  779. {core_framework-4.0.0 → core_framework-4.0.1}/docs/domains/posts/delete_post.md +0 -0
  780. {core_framework-4.0.0 → core_framework-4.0.1}/docs/domains/posts/edit_post.md +0 -0
  781. {core_framework-4.0.0 → core_framework-4.0.1}/docs/domains/posts/hashtag_discovery.md +0 -0
  782. {core_framework-4.0.0 → core_framework-4.0.1}/docs/domains/posts/post_like.md +0 -0
  783. {core_framework-4.0.0 → core_framework-4.0.1}/docs/domains/posts/post_report.md +0 -0
  784. {core_framework-4.0.0 → core_framework-4.0.1}/docs/domains/posts/post_stats_aggregation.md +0 -0
  785. {core_framework-4.0.0 → core_framework-4.0.1}/docs/domains/posts/post_visibility.md +0 -0
  786. {core_framework-4.0.0 → core_framework-4.0.1}/docs/domains/users/account.md +0 -0
  787. {core_framework-4.0.0 → core_framework-4.0.1}/docs/domains/users/admin_users.md +0 -0
  788. {core_framework-4.0.0 → core_framework-4.0.1}/docs/domains/users/avatar.md +0 -0
  789. {core_framework-4.0.0 → core_framework-4.0.1}/docs/domains/users/banner.md +0 -0
  790. {core_framework-4.0.0 → core_framework-4.0.1}/docs/domains/users/check_username_exists.md +0 -0
  791. {core_framework-4.0.0 → core_framework-4.0.1}/docs/domains/users/friendship-system-design.md +0 -0
  792. {core_framework-4.0.0 → core_framework-4.0.1}/docs/domains/users/my_posts_and_comments.md +0 -0
  793. {core_framework-4.0.0 → core_framework-4.0.1}/docs/domains/users/username_suggest.md +0 -0
  794. {core_framework-4.0.0 → core_framework-4.0.1}/docs/library/README.md +0 -0
  795. {core_framework-4.0.0 → core_framework-4.0.1}/docs/library/api.md +0 -0
  796. {core_framework-4.0.0 → core_framework-4.0.1}/docs/library/capability-wiring.md +0 -0
  797. {core_framework-4.0.0 → core_framework-4.0.1}/docs/library/core-framework-migration.md +0 -0
  798. {core_framework-4.0.0 → core_framework-4.0.1}/docs/platform/README.md +0 -0
  799. {core_framework-4.0.0 → core_framework-4.0.1}/docs/platform/client-error-visibility.md +0 -0
  800. {core_framework-4.0.0 → core_framework-4.0.1}/docs/platform/conventions.md +0 -0
  801. {core_framework-4.0.0 → core_framework-4.0.1}/docs/platform/database-triggers.md +0 -0
  802. {core_framework-4.0.0 → core_framework-4.0.1}/docs/platform/domain-services-and-adapters.md +0 -0
  803. {core_framework-4.0.0 → core_framework-4.0.1}/docs/platform/glossary.md +0 -0
  804. {core_framework-4.0.0 → core_framework-4.0.1}/docs/platform/layers-and-boundaries.md +0 -0
  805. {core_framework-4.0.0 → core_framework-4.0.1}/docs/platform/patch-update-typed-payload.md +0 -0
  806. {core_framework-4.0.0 → core_framework-4.0.1}/docs/platform/response-composition-and-caching.md +0 -0
  807. {core_framework-4.0.0 → core_framework-4.0.1}/docs/reviews/README.md +0 -0
  808. {core_framework-4.0.0 → core_framework-4.0.1}/firebase_config.example.json +0 -0
  809. {core_framework-4.0.0 → core_framework-4.0.1}/makefile +0 -0
  810. {core_framework-4.0.0 → core_framework-4.0.1}/tach.toml +0 -0
  811. {core_framework-4.0.0 → core_framework-4.0.1}/tests/__init__.py +0 -0
  812. {core_framework-4.0.0 → core_framework-4.0.1}/tests/conftest.py +0 -0
  813. {core_framework-4.0.0 → core_framework-4.0.1}/tests/e2e/_auth.py +0 -0
  814. {core_framework-4.0.0 → core_framework-4.0.1}/tests/e2e/_canaries.py +0 -0
  815. {core_framework-4.0.0 → core_framework-4.0.1}/tests/e2e/_media.py +0 -0
  816. {core_framework-4.0.0 → core_framework-4.0.1}/tests/e2e/_settings.py +0 -0
  817. {core_framework-4.0.0 → core_framework-4.0.1}/tests/e2e/_upload_payloads.py +0 -0
  818. {core_framework-4.0.0 → core_framework-4.0.1}/tests/e2e/conftest.py +0 -0
  819. {core_framework-4.0.0 → core_framework-4.0.1}/tests/e2e/media/pipeline_test.py +0 -0
  820. {core_framework-4.0.0 → core_framework-4.0.1}/tests/e2e/smoke/canary_test.py +0 -0
  821. {core_framework-4.0.0 → core_framework-4.0.1}/tests/e2e/smoke/media_test.py +0 -0
  822. {core_framework-4.0.0 → core_framework-4.0.1}/tests/e2e/smoke/system_test.py +0 -0
  823. {core_framework-4.0.0 → core_framework-4.0.1}/tests/e2e/smoke/tls_host_test.py +0 -0
  824. {core_framework-4.0.0 → core_framework-4.0.1}/tests/integration/__init__.py +0 -0
  825. {core_framework-4.0.0 → core_framework-4.0.1}/tests/integration/_http_error_details.py +0 -0
  826. {core_framework-4.0.0 → core_framework-4.0.1}/tests/integration/_poll.py +0 -0
  827. {core_framework-4.0.0 → core_framework-4.0.1}/tests/integration/analytics/_helpers.py +0 -0
  828. {core_framework-4.0.0 → core_framework-4.0.1}/tests/integration/api/__init__.py +0 -0
  829. {core_framework-4.0.0 → core_framework-4.0.1}/tests/integration/api/_auth_helpers.py +0 -0
  830. {core_framework-4.0.0 → core_framework-4.0.1}/tests/integration/api/_destructive_delete_helpers.py +0 -0
  831. {core_framework-4.0.0 → core_framework-4.0.1}/tests/integration/api/_outbox_helpers.py +0 -0
  832. {core_framework-4.0.0 → core_framework-4.0.1}/tests/integration/api/_user_deletion_helpers.py +0 -0
  833. {core_framework-4.0.0 → core_framework-4.0.1}/tests/integration/api/_user_helpers.py +0 -0
  834. {core_framework-4.0.0 → core_framework-4.0.1}/tests/integration/api/admin/__init__.py +0 -0
  835. {core_framework-4.0.0 → core_framework-4.0.1}/tests/integration/api/admin/_auth_cases.py +0 -0
  836. {core_framework-4.0.0 → core_framework-4.0.1}/tests/integration/api/admin/analytics/__init__.py +0 -0
  837. {core_framework-4.0.0 → core_framework-4.0.1}/tests/integration/api/admin/analytics/router_test.py +0 -0
  838. {core_framework-4.0.0 → core_framework-4.0.1}/tests/integration/api/admin/cache/__init__.py +0 -0
  839. {core_framework-4.0.0 → core_framework-4.0.1}/tests/integration/api/admin/cache/router_test.py +0 -0
  840. {core_framework-4.0.0 → core_framework-4.0.1}/tests/integration/api/admin/comments/__init__.py +0 -0
  841. {core_framework-4.0.0 → core_framework-4.0.1}/tests/integration/api/admin/moderation/__init__.py +0 -0
  842. {core_framework-4.0.0 → core_framework-4.0.1}/tests/integration/api/admin/moderation/router_test.py +0 -0
  843. {core_framework-4.0.0 → core_framework-4.0.1}/tests/integration/api/admin/moderator_surfaces_test.py +0 -0
  844. {core_framework-4.0.0 → core_framework-4.0.1}/tests/integration/api/admin/outbox/__init__.py +0 -0
  845. {core_framework-4.0.0 → core_framework-4.0.1}/tests/integration/api/admin/outbox/router_test.py +0 -0
  846. {core_framework-4.0.0 → core_framework-4.0.1}/tests/integration/api/admin/posts/__init__.py +0 -0
  847. {core_framework-4.0.0 → core_framework-4.0.1}/tests/integration/api/admin/posts/router_test.py +0 -0
  848. {core_framework-4.0.0 → core_framework-4.0.1}/tests/integration/api/admin/users/__init__.py +0 -0
  849. {core_framework-4.0.0 → core_framework-4.0.1}/tests/integration/api/admin/users/router_test.py +0 -0
  850. {core_framework-4.0.0 → core_framework-4.0.1}/tests/integration/api/attachments/_helpers.py +0 -0
  851. {core_framework-4.0.0 → core_framework-4.0.1}/tests/integration/api/attachments/attachment_upload_test.py +0 -0
  852. {core_framework-4.0.0 → core_framework-4.0.1}/tests/integration/api/attachments/conftest.py +0 -0
  853. {core_framework-4.0.0 → core_framework-4.0.1}/tests/integration/api/auth/__init__.py +0 -0
  854. {core_framework-4.0.0 → core_framework-4.0.1}/tests/integration/api/auth/router_test.py +0 -0
  855. {core_framework-4.0.0 → core_framework-4.0.1}/tests/integration/api/comments/__init__.py +0 -0
  856. {core_framework-4.0.0 → core_framework-4.0.1}/tests/integration/api/comments/authenticated/__init__.py +0 -0
  857. {core_framework-4.0.0 → core_framework-4.0.1}/tests/integration/api/comments/authenticated/comment_writes_integration_test.py +0 -0
  858. {core_framework-4.0.0 → core_framework-4.0.1}/tests/integration/api/comments/comment_attachments_integration_test.py +0 -0
  859. {core_framework-4.0.0 → core_framework-4.0.1}/tests/integration/api/comments/comment_kind_registry_integration_test.py +0 -0
  860. {core_framework-4.0.0 → core_framework-4.0.1}/tests/integration/api/comments/public/__init__.py +0 -0
  861. {core_framework-4.0.0 → core_framework-4.0.1}/tests/integration/api/comments/public/router_test.py +0 -0
  862. {core_framework-4.0.0 → core_framework-4.0.1}/tests/integration/api/create_idempotency_integration_test.py +0 -0
  863. {core_framework-4.0.0 → core_framework-4.0.1}/tests/integration/api/events/router_test.py +0 -0
  864. {core_framework-4.0.0 → core_framework-4.0.1}/tests/integration/api/groups/groups_integration_test.py +0 -0
  865. {core_framework-4.0.0 → core_framework-4.0.1}/tests/integration/api/media/ingest_contract_test.py +0 -0
  866. {core_framework-4.0.0 → core_framework-4.0.1}/tests/integration/api/mentions/mentions_integration_test.py +0 -0
  867. {core_framework-4.0.0 → core_framework-4.0.1}/tests/integration/api/notifications/__init__.py +0 -0
  868. {core_framework-4.0.0 → core_framework-4.0.1}/tests/integration/api/notifications/inbox_redesign_integration_test.py +0 -0
  869. {core_framework-4.0.0 → core_framework-4.0.1}/tests/integration/api/notifications/router_test.py +0 -0
  870. {core_framework-4.0.0 → core_framework-4.0.1}/tests/integration/api/posts/__init__.py +0 -0
  871. {core_framework-4.0.0 → core_framework-4.0.1}/tests/integration/api/posts/authenticated/post_writes_integration_test.py +0 -0
  872. {core_framework-4.0.0 → core_framework-4.0.1}/tests/integration/api/posts/comment_count_aggregation_test.py +0 -0
  873. {core_framework-4.0.0 → core_framework-4.0.1}/tests/integration/api/posts/followers_visibility_test.py +0 -0
  874. {core_framework-4.0.0 → core_framework-4.0.1}/tests/integration/api/posts/post_attachments_integration_test.py +0 -0
  875. {core_framework-4.0.0 → core_framework-4.0.1}/tests/integration/api/posts/post_stats_dirty_marking_test.py +0 -0
  876. {core_framework-4.0.0 → core_framework-4.0.1}/tests/integration/api/posts/public/__init__.py +0 -0
  877. {core_framework-4.0.0 → core_framework-4.0.1}/tests/integration/api/posts/public/router_test.py +0 -0
  878. {core_framework-4.0.0 → core_framework-4.0.1}/tests/integration/api/public_read_by_id_unavailable_detail_test.py +0 -0
  879. {core_framework-4.0.0 → core_framework-4.0.1}/tests/integration/api/rate_limit_test.py +0 -0
  880. {core_framework-4.0.0 → core_framework-4.0.1}/tests/integration/api/ratings/__init__.py +0 -0
  881. {core_framework-4.0.0 → core_framework-4.0.1}/tests/integration/api/ratings/_helpers.py +0 -0
  882. {core_framework-4.0.0 → core_framework-4.0.1}/tests/integration/api/ratings/conftest.py +0 -0
  883. {core_framework-4.0.0 → core_framework-4.0.1}/tests/integration/api/ratings/ratings_integration_test.py +0 -0
  884. {core_framework-4.0.0 → core_framework-4.0.1}/tests/integration/api/ratings/ratings_visibility_integration_test.py +0 -0
  885. {core_framework-4.0.0 → core_framework-4.0.1}/tests/integration/api/restriction_visibility_integration_test.py +0 -0
  886. {core_framework-4.0.0 → core_framework-4.0.1}/tests/integration/api/system/__init__.py +0 -0
  887. {core_framework-4.0.0 → core_framework-4.0.1}/tests/integration/api/system/router_test.py +0 -0
  888. {core_framework-4.0.0 → core_framework-4.0.1}/tests/integration/api/users/__init__.py +0 -0
  889. {core_framework-4.0.0 → core_framework-4.0.1}/tests/integration/api/users/account_deletion_email_test.py +0 -0
  890. {core_framework-4.0.0 → core_framework-4.0.1}/tests/integration/api/users/authenticated/__init__.py +0 -0
  891. {core_framework-4.0.0 → core_framework-4.0.1}/tests/integration/api/users/authenticated/friendship_integration_test.py +0 -0
  892. {core_framework-4.0.0 → core_framework-4.0.1}/tests/integration/api/users/authenticated/profile_media_upload_test.py +0 -0
  893. {core_framework-4.0.0 → core_framework-4.0.1}/tests/integration/api/users/authenticated/router_test.py +0 -0
  894. {core_framework-4.0.0 → core_framework-4.0.1}/tests/integration/api/users/deletion_audit_integration_test.py +0 -0
  895. {core_framework-4.0.0 → core_framework-4.0.1}/tests/integration/api/users/public/__init__.py +0 -0
  896. {core_framework-4.0.0 → core_framework-4.0.1}/tests/integration/api/users/public/router_test.py +0 -0
  897. {core_framework-4.0.0 → core_framework-4.0.1}/tests/integration/api/users/user_deletion_integration_test.py +0 -0
  898. {core_framework-4.0.0 → core_framework-4.0.1}/tests/integration/conftest.py +0 -0
  899. {core_framework-4.0.0 → core_framework-4.0.1}/tests/integration/worker/__init__.py +0 -0
  900. {core_framework-4.0.0 → core_framework-4.0.1}/tests/integration/worker/_aggregate_stats_helpers.py +0 -0
  901. {core_framework-4.0.0 → core_framework-4.0.1}/tests/integration/worker/_arq_helpers.py +0 -0
  902. {core_framework-4.0.0 → core_framework-4.0.1}/tests/integration/worker/_media_upload_helpers.py +0 -0
  903. {core_framework-4.0.0 → core_framework-4.0.1}/tests/integration/worker/account_deletion_test.py +0 -0
  904. {core_framework-4.0.0 → core_framework-4.0.1}/tests/integration/worker/aggregate_comment_stats_test.py +0 -0
  905. {core_framework-4.0.0 → core_framework-4.0.1}/tests/integration/worker/aggregate_post_stats_test.py +0 -0
  906. {core_framework-4.0.0 → core_framework-4.0.1}/tests/integration/worker/aggregate_user_stats_test.py +0 -0
  907. {core_framework-4.0.0 → core_framework-4.0.1}/tests/integration/worker/analytics_prune_test.py +0 -0
  908. {core_framework-4.0.0 → core_framework-4.0.1}/tests/integration/worker/analytics_refresh_test.py +0 -0
  909. {core_framework-4.0.0 → core_framework-4.0.1}/tests/integration/worker/attachment_upload_test.py +0 -0
  910. {core_framework-4.0.0 → core_framework-4.0.1}/tests/integration/worker/conftest.py +0 -0
  911. {core_framework-4.0.0 → core_framework-4.0.1}/tests/integration/worker/moderation_outbox_test.py +0 -0
  912. {core_framework-4.0.0 → core_framework-4.0.1}/tests/integration/worker/mute_lift_test.py +0 -0
  913. {core_framework-4.0.0 → core_framework-4.0.1}/tests/integration/worker/profile_media_upload_test.py +0 -0
  914. {core_framework-4.0.0 → core_framework-4.0.1}/tests/integration/worker/read_notifications_retention_test.py +0 -0
  915. {core_framework-4.0.0 → core_framework-4.0.1}/tests/integration/worker/restriction_fanout_test.py +0 -0
  916. {core_framework-4.0.0 → core_framework-4.0.1}/tests/integration/worker/stale_staging_sweep_test.py +0 -0
  917. {core_framework-4.0.0 → core_framework-4.0.1}/tests/integration/worker/user_outbox_test.py +0 -0
  918. {core_framework-4.0.0 → core_framework-4.0.1}/tests/unit/__init__.py +0 -0
  919. {core_framework-4.0.0 → core_framework-4.0.1}/tests/unit/api/comments/authenticated/comment_request_schemas_test.py +0 -0
  920. {core_framework-4.0.0 → core_framework-4.0.1}/tests/unit/api/dedupe_preserving_order_test.py +0 -0
  921. {core_framework-4.0.0 → core_framework-4.0.1}/tests/unit/api/posts/authenticated/post_update_mapper_test.py +0 -0
  922. {core_framework-4.0.0 → core_framework-4.0.1}/tests/unit/api/users/profile_update_mapper_test.py +0 -0
  923. {core_framework-4.0.0 → core_framework-4.0.1}/tests/unit/application/comments/__init__.py +0 -0
  924. {core_framework-4.0.0 → core_framework-4.0.1}/tests/unit/application/comments/kind_registry_test.py +0 -0
  925. {core_framework-4.0.0 → core_framework-4.0.1}/tests/unit/application/email/account_deletion_scheduled_test.py +0 -0
  926. {core_framework-4.0.0 → core_framework-4.0.1}/tests/unit/application/events/event_service_test.py +0 -0
  927. {core_framework-4.0.0 → core_framework-4.0.1}/tests/unit/application/moderation/restriction_fanout_registry_test.py +0 -0
  928. {core_framework-4.0.0 → core_framework-4.0.1}/tests/unit/application/notifications/preview_test.py +0 -0
  929. {core_framework-4.0.0 → core_framework-4.0.1}/tests/unit/application/ratings/kind_registry_test.py +0 -0
  930. {core_framework-4.0.0 → core_framework-4.0.1}/tests/unit/application/shared/request_context_test.py +0 -0
  931. {core_framework-4.0.0 → core_framework-4.0.1}/tests/unit/application/users/account_removal_registry_test.py +0 -0
  932. {core_framework-4.0.0 → core_framework-4.0.1}/tests/unit/application/users/account_removal_runner_test.py +0 -0
  933. {core_framework-4.0.0 → core_framework-4.0.1}/tests/unit/application/users/deletion_audit_test.py +0 -0
  934. {core_framework-4.0.0 → core_framework-4.0.1}/tests/unit/core/bundled_alembic_test.py +0 -0
  935. {core_framework-4.0.0 → core_framework-4.0.1}/tests/unit/core/migrate_cli_test.py +0 -0
  936. {core_framework-4.0.0 → core_framework-4.0.1}/tests/unit/core/pagination_test.py +0 -0
  937. {core_framework-4.0.0 → core_framework-4.0.1}/tests/unit/docs/_api_reference.py +0 -0
  938. {core_framework-4.0.0 → core_framework-4.0.1}/tests/unit/docs/api_routes_test.py +0 -0
  939. {core_framework-4.0.0 → core_framework-4.0.1}/tests/unit/domains/__init__.py +0 -0
  940. {core_framework-4.0.0 → core_framework-4.0.1}/tests/unit/domains/comment/__init__.py +0 -0
  941. {core_framework-4.0.0 → core_framework-4.0.1}/tests/unit/domains/post/models_test.py +0 -0
  942. {core_framework-4.0.0 → core_framework-4.0.1}/tests/unit/domains/user/service_test.py +0 -0
  943. {core_framework-4.0.0 → core_framework-4.0.1}/tests/unit/infrastructure/__init__.py +0 -0
  944. {core_framework-4.0.0 → core_framework-4.0.1}/tests/unit/infrastructure/media/__init__.py +0 -0
  945. {core_framework-4.0.0 → core_framework-4.0.1}/tests/unit/infrastructure/media/ssh_finals_publisher_adapter_test.py +0 -0
  946. {core_framework-4.0.0 → core_framework-4.0.1}/tests/unit/worker/tasks_registration_test.py +0 -0
@@ -4,6 +4,19 @@ Notable changes to **core-framework** (import **`core_framework`**). Format foll
4
4
 
5
5
  ## [Unreleased]
6
6
 
7
+ ## [4.0.1] - 2026-09-17
8
+
9
+ ### Fixed
10
+
11
+ - **Testing plugin:** start-on-demand Auth emulator raises **`RuntimeError`** when the **`firebase`** CLI is missing (not a raw **`FileNotFoundError`**); the timeout message distinguishes spawn-from-CLI vs a port that is open but not serving Auth. See **`docs/testing.md`**.
12
+ - **Testing plugin:** bundled Alembic uses the patched Testcontainers Settings instance when the host **`settings_loader`** is a host subclass cache, not **`core_framework.core.settings.load_default_settings`**. See **`docs/testing.md`**.
13
+ - **Testing plugin:** a returned **`TestConfig`** always sets **`FIREBASE_AUTH_EMULATOR_HOST`**, so **`client`** lifespan **`init_firebase`** does not require **`firebase_config.json`**. Auth fixtures and the emulator process still require **`firebase_project_id="test"`**. Session **`client`** uses base URL **`http://test`**. See **`docs/testing.md`**.
14
+
15
+ ### Changed
16
+
17
+ - **Host enqueue:** **`enqueue_job`** accepts a host task name string (**`job_name: WorkerJobName | str`**), matching **`enqueue_from_worker`**. See **`docs/library/package-api.md`**.
18
+ - **CORS:** Default **`allowed_headers`** includes **`If-None-Match`**. CORS **`expose_headers`** includes **`ETag`** (with **`Retry-After`** and **`X-Request-ID`**). Hosts that overlay **`[cors].allowed_headers`** must include **`If-None-Match`** (an overlay replaces the default list).
19
+
7
20
  ## [4.0.0] - 2026-09-12
8
21
 
9
22
  ### Breaking
@@ -90,7 +103,7 @@ Notable changes to **core-framework** (import **`core_framework`**). Format foll
90
103
  - **Prometheus same-host scrape default:** Manual Observability Deployment omit/empty/comment-only **`PROMETHEUS_TARGETS_{NODE,POSTGRES,REDIS}`** writes **`host.docker.internal`** / **`instance: app`** from **`deploy/observability/targets.default/`** (`:9100` / `:9187` / `:9121`). A leftover empty variable is not “no scrapes” — set **`[]`** for no targets. Overlay YAML for extra hosts. Manual install copies those defaults into **`targets/{node,postgres,redis}/hosts.yml`**. See **`docs/deployments/deploy-playbook.md`** and **`docs/deployments/guides/setup/observability-lgtm-setup.md`**.
91
104
  - **Host config defaults:** Settings Field defaults (deploy-template literals) and **zone fill** / **trusted-host fill** / **cors-origin fill** / **e2e-origin fill** / **publish-parent fill** so a load with only the Settings-required set succeeds. Empty product host / publish root no longer fail-closed. Empty **`public_path_prefix`** takes the Field default (see **Breaking**). A host bump applies Field defaults for omitted keys; **zone fill**, **trusted-host fill**, and **cors-origin fill** need **`public_zone`** in a Settings source; deleting GitHub constants requires omitting those keys from *the host’s* template (a bump does not rewrite the host workflow). **development** blank/omitted **`OPENAPI_URL`** → **`/openapi.json`** (`/docs`); **`OPENAPI_URL=off`** disables OpenAPI in any environment; **`APP_DEBUG`** stays **false** everywhere unless overlaid; **production** stays OpenAPI **off**. Omit **`ALLOWED_HOSTS`** with **`PUBLIC_ZONE`** set → **`localhost`**, **`127.0.0.1`**, **`api.{zone}`** (plus **`test`** outside production). Omit **`[cors]`** or **`CORS_ALLOWED_ORIGINS`** with **`PUBLIC_ZONE`** set → **`https://{zone}`**, **`https://www.{zone}`** (plus **`http://localhost:3000`**, **`http://127.0.0.1:3000`** outside production; production fill never adds a loopback origin). Omit **`WRITE_POSTGRES_HOST`** / **`REDIS_HOST`** → **`127.0.0.1`**. Omit **`WRITE_POSTGRES_DB`** → **`postgres`**. Write Postgres **user** stays required. Omit **`E2E_API_BASE_URL`** / **`E2E_MEDIA_BASE_URL`** / **`E2E_ALLOWED_ORIGIN`** on **development** smoke with **`PUBLIC_ZONE`** set → **`https://api.{zone}`**, **`https://media.{zone}`**, **`https://{zone}`**. See **`docs/library/package-api.md`**, **`docs/deployments/deploy-playbook.md`**, and **`docs/deployments/host-config-defaults-design.md`**.
92
105
  - **Product identity gate name:** **`check_caller_identity`** is the product identity gate (empty identity and account-removal **403** on every method; ban **403** on mutates only). **`check_not_banned`** remains as an alias of the same callable. Host admin routes still use **`check_admin_identity`**. See **`docs/library/package-api.md`**.
93
- - **User service pair-block and ban reads removed:** **`user_deps.user_service.retrieve_block_exists_between`**, **`retrieve_block_exists_between_strong`**, and **`retrieve_restriction_lookup_is_banned`** are gone (no core caller after see went one-way). Hosts that AND availability before Compare / friends-only unlock use **`retrieve_restriction_lookup_is_muted_or_banned`** (mirror-eventual) per user; viewer-blocked-target is **`retrieve_block_exists_strong`**. See **`docs/library/package-api.md`**.
106
+ - **User service pair-block and ban reads removed:** **`user_deps.user_service.retrieve_block_exists_between`**, **`retrieve_block_exists_between_strong`**, and **`retrieve_restriction_lookup_is_banned`** are gone (no core caller after see went one-way). Hosts that AND availability before friends-only unlock use **`retrieve_restriction_lookup_is_muted_or_banned`** (mirror-eventual) per user; viewer-blocked-target is **`retrieve_block_exists_strong`**. See **`docs/library/package-api.md`**.
94
107
  - **Worker composition imports:** Importing **`build_worker_settings_kwargs`**, **`CORE_FRAMEWORK_QUEUE_NAME`**, or **`create_worker_settings_for_shared_runtime`** no longer constructs **`Settings`**. Accessing **`WorkerSettings`** (including **`arq core_framework.worker.main.WorkerSettings`**) still calls **`load_default_settings()`** to populate ARQ class attributes. See **`docs/library/package-api.md`**.
95
108
  - **Restriction-change fan-out:** Restriction writes still use the same HTTP routes. Lookup mirrors stay must-converge on the moderation outbox (Barrier 1). When mute/ban/unrestrict **truth** actually changes, the outbox handler enqueues Barrier 2 **after** mirrors land (`process_restriction_reactions`, job id `restriction_reactions:{user_id}:{commit_token}:{trigger}`, `keep_result=0`). Groups strip is must-converge on entered-banned, with an hourly heal (`schedule_restriction_heals` at **:00 UTC**) that re-enqueues leftover banned ∩ still-in-groups (`commit_token` `heal`; heal skips actor wipe). Actor inbox wipe is best-effort inline in producer Barrier 2. Repeat-ban / mirror-repair / warn-insert stay mirrors-only (`trigger` `none`). Producers write payload version **2**; other versions dead-letter. Hosts register **`register_restriction_mirror`** / **`register_restriction_reaction`** / **`register_restriction_heal`** after configure, on **API and worker** (worker is load-bearing). Mute/ban no longer produce or register `process_ban_user_side_effects` / `process_actor_notification_wipe`. User-detail invalidation stays on the command path. Ban does not revoke refresh tokens. See **`docs/design/moderation-restriction-fanout-design.md`**, **`docs/library/package-api.md`**, and **`docs/library/workers.md`**.
96
109
  - **Account-removal analytics carve-out:** Raw `utm_events.user_id` / `request_context.viewer_id` and `post_views.request_context.viewer_id` are not spine contributors. They age out by retention/rollup; aggregate counts stay. See **`docs/design/account-removal-spine-design.md`** decision **#8**.
@@ -344,7 +357,7 @@ Notable changes to **core-framework** (import **`core_framework`**). Format foll
344
357
  ### Breaking
345
358
 
346
359
  - **Breaking (clients — events ingest):** Traffic source for request context uses the **`client-referrer`** header instead of browser **`Referer`**. Clients should send an explicit referrer URL (for example captured from `document.referrer` on first load).
347
- - **Breaking (clients — events ingest):** Rename event type **`view`** → **`impression`** on `POST /events`. Clients and hosts must send `type: "impression"` for subject-impression batches (post views, calculator opens, etc.). Core enum: **`EventType.IMPRESSION`** (replaces **`EventType.VIEW`**). Host handlers registered on `"view"` must re-register on **`"impression"`** (for example Henry calculator view ingest).
360
+ - **Breaking (clients — events ingest):** Rename event type **`view`** → **`impression`** on `POST /events`. Clients and hosts must send `type: "impression"` for subject-impression batches (post views, host-owned subject impressions, etc.). Core enum: **`EventType.IMPRESSION`** (replaces **`EventType.VIEW`**). Host handlers registered on `"view"` must re-register on **`"impression"`**.
348
361
  - **Breaking (hosts — imports):** Rename **`EVENT_TOKEN_MAX_AGE_VIEW_SECONDS`** → **`EVENT_TOKEN_MAX_AGE_SECONDS`** in **`core_framework.application.events.event_token`** (behavior unchanged; token max-age remains 600s for all event types).
349
362
 
350
363
  ### Migration
@@ -412,7 +425,7 @@ Transactional outbox (block, follow, restriction), post views retention, and inc
412
425
  - Run **`cf-alembic`** so the **`user`** migration stream applies **`user_add_event_outbox`** (`"user".event_outbox`).
413
426
  - Hosts that only run the API (no worker) still need **`[outbox]`** in config because **`Settings`** requires it; the API does not connect that pool.
414
427
  - **Breaking (hosts — migration):** When upgrading to a release that includes restriction outbox (Phase 3), run **`cf-alembic`** so the **`moderation`** migration stream applies **`moderation_add_event_outbox`** (`moderation.event_outbox`). The worker must run **`schedule_poll_moderation_outbox`** (registered in core worker schedules) for durable restriction mirror fanout.
415
- - **Breaking (hosts — config):** Add **`[retention]`** with **`post_views_retention_days`** (default **90**). Deploy variable **`RETENTION_POST_VIEWS_DAYS`**. Hosts that subclass **`Settings`** may extend **`RetentionConfig`** with additional retention keys (for example calculator views on Henry).
428
+ - **Breaking (hosts — config):** Add **`[retention]`** with **`post_views_retention_days`** (default **90**). Deploy variable **`RETENTION_POST_VIEWS_DAYS`**. Hosts that subclass **`Settings`** may extend **`RetentionConfig`** with additional retention keys (for example a host-owned view table).
416
429
  - **Breaking (hosts — migration):** When upgrading to a release that includes post views retention, run **`cf-alembic`** so the **`post`** migration stream applies **`post_post_views_retention_high_water_mark`** (`post_stats.view_count_aggregated_up_to`, **`post_views`** retention indexes, backfill). The worker must run **`schedule_prune_post_views`** (registered in core worker schedules) for age-based **`post_views`** pruning.
417
430
 
418
431
  ## [2.1.0] - 2026-06-25
@@ -770,4 +783,5 @@ First **SemVer-stable** release per **`docs/library/package-api.md`**.
770
783
  [3.2.0]: https://github.com/NepNepFFXIV/core-framework/compare/v3.1.0...v3.2.0
771
784
  [3.3.0]: https://github.com/NepNepFFXIV/core-framework/compare/v3.2.0...v3.3.0
772
785
  [4.0.0]: https://github.com/NepNepFFXIV/core-framework/compare/v3.3.0...v4.0.0
773
- [unreleased]: https://github.com/NepNepFFXIV/core-framework/compare/v4.0.0...HEAD
786
+ [4.0.1]: https://github.com/NepNepFFXIV/core-framework/compare/v4.0.0...v4.0.1
787
+ [unreleased]: https://github.com/NepNepFFXIV/core-framework/compare/v4.0.1...HEAD
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.5
2
2
  Name: core-framework
3
- Version: 4.0.0
3
+ Version: 4.0.1
4
4
  Summary: Core framework package (import as core_framework)
5
5
  Project-URL: Homepage, https://github.com/NepNepFFXIV/core-framework
6
6
  Project-URL: Repository, https://github.com/NepNepFFXIV/core-framework
@@ -8,7 +8,7 @@ License-Expression: MIT
8
8
  License-File: LICENSE
9
9
  Requires-Python: >=3.14
10
10
  Requires-Dist: aiofiles>=25.1.0
11
- Requires-Dist: alembic>=1.19.1
11
+ Requires-Dist: alembic>=1.20.0
12
12
  Requires-Dist: arq>=0.28.0
13
13
  Requires-Dist: asyncer>=0.0.18
14
14
  Requires-Dist: asyncpg>=0.31.0
@@ -30,11 +30,11 @@ Requires-Dist: opentelemetry-instrumentation-redis<0.66,>=0.65b0
30
30
  Requires-Dist: opentelemetry-sdk<1.45,>=1.44.0
31
31
  Requires-Dist: opentelemetry-semantic-conventions<0.66,>=0.65b0
32
32
  Requires-Dist: orjson>=3.12.0
33
- Requires-Dist: pillow-heif>=1.5.0
33
+ Requires-Dist: pillow-heif>=1.7.0
34
34
  Requires-Dist: pillow>=12.3.0
35
35
  Requires-Dist: pyinstrument>=5.1.3
36
36
  Requires-Dist: python-ulid>=4.0.1
37
- Requires-Dist: resend[async]>=2.37.0
37
+ Requires-Dist: resend[async]>=2.44.0
38
38
  Requires-Dist: structlog>=26.1.0
39
39
  Requires-Dist: tenacity>=9.1.4
40
40
  Provides-Extra: testing
@@ -80,6 +80,7 @@ allowed_headers = [
80
80
  "Authorization",
81
81
  "Content-Type",
82
82
  "Idempotency-Key",
83
+ "If-None-Match",
83
84
  "Profiling-Key",
84
85
  "Client-Referrer",
85
86
  ]
@@ -68,6 +68,7 @@ allowed_headers = [
68
68
  "Authorization",
69
69
  "Content-Type",
70
70
  "Idempotency-Key",
71
+ "If-None-Match",
71
72
  "Profiling-Key",
72
73
  "Client-Referrer",
73
74
  ]
@@ -56,5 +56,5 @@ class OutboxDeadRowResponse(BaseModel):
56
56
  failure_count: int
57
57
  last_error: str | None
58
58
  payload_version: int
59
- payload: dict[str, Any]
59
+ payload: Any
60
60
  created_at: datetime
@@ -123,7 +123,7 @@ class UserDetailResponse(BaseModel):
123
123
  class UserChangeHistoryItem(BaseModel):
124
124
  user_id: UserID
125
125
  actor: UserReference
126
- entity_type: str
126
+ entity_type: Literal["users", "user_profiles", "user_deletions"]
127
127
  field: str
128
128
  old_value: str | None
129
129
  new_value: str | None
@@ -2,7 +2,12 @@ from typing import Annotated
2
2
 
3
3
  from pydantic import AfterValidator, Field
4
4
 
5
- from core_framework.domains.comment import MAX_CONTENT_LENGTH, SUBJECT_KIND_MAX_LENGTH, SUBJECT_KIND_PATTERN
5
+ from core_framework.domains.comment import (
6
+ MAX_CONTENT_LENGTH,
7
+ SUBJECT_ID_MAX_LENGTH,
8
+ SUBJECT_KIND_MAX_LENGTH,
9
+ SUBJECT_KIND_PATTERN,
10
+ )
6
11
 
7
12
 
8
13
  def _validate_comment_content_not_blank(v: str) -> str:
@@ -23,7 +28,16 @@ CommentSubjectKind = Annotated[
23
28
  Field(min_length=1, max_length=SUBJECT_KIND_MAX_LENGTH, pattern=SUBJECT_KIND_PATTERN),
24
29
  ]
25
30
 
31
+
32
+ def _validate_comment_subject_id_not_blank(v: str) -> str:
33
+ stripped = v.strip()
34
+ if not stripped:
35
+ raise ValueError("must not be blank")
36
+ return stripped
37
+
38
+
26
39
  CommentSubjectId = Annotated[
27
40
  str,
28
- Field(min_length=1, max_length=128),
41
+ Field(min_length=1, max_length=SUBJECT_ID_MAX_LENGTH),
42
+ AfterValidator(_validate_comment_subject_id_not_blank),
29
43
  ]
@@ -1,8 +1,10 @@
1
- from asyncio import TaskGroup
1
+ from asyncio import TaskGroup, timeout
2
+ from collections.abc import Awaitable
2
3
  from typing import Final
3
4
 
4
5
  from cashews import cache
5
6
  from fastapi import APIRouter, Request, Response, status
7
+ from structlog import get_logger
6
8
 
7
9
  from core_framework.core.runtime import CoreRuntime
8
10
 
@@ -12,6 +14,9 @@ router = APIRouter(
12
14
 
13
15
  OK_STATUS: Final[str] = "OK"
14
16
  ERROR_STATUS: Final[str] = "ERROR"
17
+ PROBE_TIMEOUT_SECONDS: Final[float] = 2.0
18
+
19
+ logger = get_logger(__name__)
15
20
 
16
21
 
17
22
  def _get_runtime(request: Request) -> CoreRuntime:
@@ -24,40 +29,34 @@ def _get_runtime(request: Request) -> CoreRuntime:
24
29
  )
25
30
 
26
31
 
27
- async def _probe_write_postgres(runtime: CoreRuntime) -> str:
32
+ async def _run_probe(name: str, probe: Awaitable[object]) -> str:
28
33
  try:
29
- async with runtime.write_postgres.get_connection() as connection:
30
- await connection.fetchval("select 1")
34
+ async with timeout(PROBE_TIMEOUT_SECONDS):
35
+ await probe
31
36
  except Exception:
37
+ logger.exception("Readiness probe failed", dependency=name)
32
38
  return ERROR_STATUS
33
39
  return OK_STATUS
34
40
 
35
41
 
36
- async def _probe_read_postgres(runtime: CoreRuntime) -> str:
37
- try:
38
- async with runtime.read_postgres.get_connection() as connection:
39
- await connection.fetchval("select 1")
40
- except Exception:
41
- return ERROR_STATUS
42
- return OK_STATUS
42
+ async def _probe_write_postgres(runtime: CoreRuntime) -> None:
43
+ async with runtime.write_postgres.get_connection() as connection:
44
+ await connection.fetchval("select 1")
43
45
 
44
46
 
45
- async def _probe_cashews_cache() -> str:
46
- try:
47
- if not cache.is_setup() or not cache.is_init:
48
- return ERROR_STATUS
49
- await cache.ping()
50
- except Exception:
51
- return ERROR_STATUS
52
- return OK_STATUS
47
+ async def _probe_read_postgres(runtime: CoreRuntime) -> None:
48
+ async with runtime.read_postgres.get_connection() as connection:
49
+ await connection.fetchval("select 1")
53
50
 
54
51
 
55
- async def _probe_redis_queue(runtime: CoreRuntime) -> str:
56
- try:
57
- await runtime.redis_queue.redis_queue.ping()
58
- except Exception:
59
- return ERROR_STATUS
60
- return OK_STATUS
52
+ async def _probe_cashews_cache() -> None:
53
+ if not cache.is_setup() or not cache.is_init:
54
+ raise RuntimeError("Cashews backend is not ready")
55
+ await cache.ping()
56
+
57
+
58
+ async def _probe_redis_queue(runtime: CoreRuntime) -> None:
59
+ await runtime.redis_queue.redis_queue.ping()
61
60
 
62
61
 
63
62
  @router.get("/health")
@@ -70,10 +69,10 @@ async def readiness_check(request: Request, response: Response) -> dict[str, str
70
69
  runtime = _get_runtime(request)
71
70
 
72
71
  async with TaskGroup() as tg:
73
- write_task = tg.create_task(_probe_write_postgres(runtime))
74
- read_task = tg.create_task(_probe_read_postgres(runtime))
75
- cashews_task = tg.create_task(_probe_cashews_cache())
76
- queue_task = tg.create_task(_probe_redis_queue(runtime))
72
+ write_task = tg.create_task(_run_probe("write_postgres", _probe_write_postgres(runtime)))
73
+ read_task = tg.create_task(_run_probe("read_postgres", _probe_read_postgres(runtime)))
74
+ cashews_task = tg.create_task(_run_probe("cashews_cache", _probe_cashews_cache()))
75
+ queue_task = tg.create_task(_run_probe("redis_queue", _probe_redis_queue(runtime)))
77
76
 
78
77
  write_postgres_status = write_task.result()
79
78
  read_postgres_status = read_task.result()
@@ -6,7 +6,8 @@ import core_framework.domains.moderation.dependencies as moderation_deps
6
6
  import core_framework.domains.user.dependencies as user_deps
7
7
  from core_framework.application.auth.models import UserDetail
8
8
  from core_framework.core import CacheKey
9
- from core_framework.domains.user import UserIdentity
9
+ from core_framework.domains.moderation import UserModeration
10
+ from core_framework.domains.user import RESERVED_USER_IDS, UserIdentity
10
11
 
11
12
 
12
13
  @cache.early(
@@ -17,6 +18,12 @@ from core_framework.domains.user import UserIdentity
17
18
  )
18
19
  async def get_user_detail(*, user_id: str) -> UserDetail:
19
20
  """Return cached identity, moderation, and account-removal fence."""
21
+ if user_id in RESERVED_USER_IDS:
22
+ return UserDetail(
23
+ identity=UserIdentity.DEFAULT,
24
+ moderation=UserModeration.DEFAULT,
25
+ account_removal_in_progress=False,
26
+ )
20
27
  async with asyncio.TaskGroup() as tg:
21
28
  identity_task = tg.create_task(user_deps.user_service.retrieve_user_identity_mapping(user_ids={user_id}))
22
29
  moderation_task = tg.create_task(
@@ -156,7 +156,7 @@ async def retrieve_admin_comments(
156
156
 
157
157
 
158
158
  async def tombstone_comment_for_moderator(*, actor_id: str, comment_id: str) -> None:
159
- """Tombstone a comment as ``tombstoned_by_moderator`` and record one audit event."""
159
+ """Tombstone a comment as ``tombstoned_by_moderator`` and enqueue cleanup."""
160
160
  impact = await comment_deps.comment_service.tombstone_comment(
161
161
  comment_id=comment_id,
162
162
  tombstone_status=CommentStatus.TOMBSTONED_BY_MODERATOR,
@@ -164,15 +164,7 @@ async def tombstone_comment_for_moderator(*, actor_id: str, comment_id: str) ->
164
164
  if impact is None:
165
165
  raise ContentNotFoundException()
166
166
 
167
- await enqueue_comment_tombstone_cleanup(impact=impact)
168
- await moderation_deps.moderation_service.record_moderation_action(
169
- actor_id=actor_id,
170
- action_type=ModerationActionType.TOMBSTONE_COMMENT,
171
- action_metadata={
172
- "comment_id": comment_id,
173
- "author_id": impact.author_id_before_tombstone,
174
- },
175
- )
167
+ await enqueue_comment_tombstone_cleanup(impact=impact, actor_id=actor_id)
176
168
  stats_impact = CommentStatsImpact(
177
169
  comment_id=impact.comment_id,
178
170
  subject_kind=impact.subject_kind,
@@ -395,7 +387,7 @@ async def run_destructive_comment_delete(
395
387
  subject_id=impact.subject_id,
396
388
  parent_comment_id=impact.parent_comment_id,
397
389
  )
398
- elif precollected_comment_ids or precollected_attachment_asset_ids:
390
+ else:
399
391
  if resolved_subject_kind is None or resolved_subject_id is None:
400
392
  logger.error(
401
393
  "Destructive comment delete missing subject context; finalizing without stats",
@@ -404,7 +396,7 @@ async def run_destructive_comment_delete(
404
396
  attachment_asset_count=len(precollected_attachment_asset_ids),
405
397
  )
406
398
  await finalize_deleted_comments_cleanup(
407
- deleted_comment_ids=precollected_comment_ids,
399
+ deleted_comment_ids=precollected_comment_ids | {comment_id},
408
400
  attachment_asset_ids=precollected_attachment_asset_ids,
409
401
  )
410
402
  else:
@@ -1,14 +1,10 @@
1
1
  from asyncio import TaskGroup
2
2
 
3
- from structlog import get_logger
4
-
5
3
  import core_framework.domains.comment.dependencies as comment_deps
6
4
  import core_framework.domains.moderation.dependencies as moderation_deps
7
5
  from core_framework.application.comments.kind_registry import get_comment_kind_subject
8
6
  from core_framework.domains.comment import CommentStatsImpact
9
7
 
10
- logger = get_logger(__name__)
11
-
12
8
 
13
9
  async def aggregate_comment_stats(*, comment_id: str) -> None:
14
10
  """Recompute and persist aggregate stats for a comment."""
@@ -46,12 +42,4 @@ async def mark_parent_stats_dirty_for_comment_impact(*, impact: CommentStatsImpa
46
42
  port = get_comment_kind_subject(kind=impact.subject_kind)
47
43
  if port is None:
48
44
  return
49
- try:
50
- await port.mark_parent_stats_dirty(subject_id=impact.subject_id)
51
- except Exception:
52
- logger.exception(
53
- "Failed to mark parent stats dirty",
54
- comment_id=impact.comment_id,
55
- subject_kind=impact.subject_kind,
56
- subject_id=impact.subject_id,
57
- )
45
+ await port.mark_parent_stats_dirty(subject_id=impact.subject_id)
@@ -17,6 +17,7 @@ from core_framework.domains.comment import (
17
17
  CommentStatus,
18
18
  CommentTombstoneImpact,
19
19
  )
20
+ from core_framework.domains.moderation import ModerationActionType
20
21
 
21
22
  logger = get_logger(__name__)
22
23
 
@@ -56,8 +57,10 @@ async def run_comment_tombstone_cleanup(
56
57
  parent_comment_id: str | None,
57
58
  tombstone_status: str,
58
59
  attachment_asset_ids: list[str],
60
+ actor_id: str | None = None,
61
+ worker_job_id: str | None = None,
59
62
  ) -> None:
60
- """Rebuild tombstone impact from ARQ primitives and run finalize cleanup."""
63
+ """Rebuild tombstone impact from ARQ primitives, run finalize cleanup, and audit when queued by a moderator."""
61
64
  await finalize_comment_tombstone_cleanup(
62
65
  impact=CommentTombstoneImpact(
63
66
  comment_id=comment_id,
@@ -69,9 +72,19 @@ async def run_comment_tombstone_cleanup(
69
72
  attachment_asset_ids=tuple(attachment_asset_ids),
70
73
  )
71
74
  )
75
+ if actor_id is not None:
76
+ await moderation_deps.moderation_service.record_moderation_action_for_job(
77
+ job_id=worker_job_id,
78
+ actor_id=actor_id,
79
+ action_type=ModerationActionType.TOMBSTONE_COMMENT,
80
+ action_metadata={
81
+ "comment_id": comment_id,
82
+ "author_id": author_id_before_tombstone,
83
+ },
84
+ )
72
85
 
73
86
 
74
- async def enqueue_comment_tombstone_cleanup(*, impact: CommentTombstoneImpact) -> None:
87
+ async def enqueue_comment_tombstone_cleanup(*, impact: CommentTombstoneImpact, actor_id: str | None = None) -> None:
75
88
  """Best-effort enqueue of comment tombstone cross-domain cleanup."""
76
89
  job_id = f"comment_tombstone_cleanup:{impact.comment_id}"
77
90
  try:
@@ -84,6 +97,7 @@ async def enqueue_comment_tombstone_cleanup(*, impact: CommentTombstoneImpact) -
84
97
  parent_comment_id=impact.parent_comment_id,
85
98
  tombstone_status=impact.tombstone_status.value,
86
99
  attachment_asset_ids=list(impact.attachment_asset_ids),
100
+ actor_id=actor_id,
87
101
  _job_id=job_id,
88
102
  )
89
103
  if job is None:
@@ -157,7 +171,7 @@ async def finalize_deleted_comments_cleanup(
157
171
  async def finalize_comment_destructive_delete_cleanup(*, impact: CommentDestructiveDeleteImpact) -> None:
158
172
  """Run cross-domain cleanup after comment-schema destructive deletion completes."""
159
173
  await finalize_deleted_comments_cleanup(
160
- deleted_comment_ids=impact.deleted_comment_ids,
174
+ deleted_comment_ids=impact.deleted_comment_ids | {impact.root_comment_id},
161
175
  attachment_asset_ids=impact.attachment_asset_ids,
162
176
  )
163
177
 
@@ -32,7 +32,7 @@ class PostCommentSubjectPort:
32
32
 
33
33
  async def resolve_inbox_recipients(self, *, subject_id: str, mention_user_ids: set[str]) -> CommentInboxRecipients:
34
34
  """Return the post author as owner and mention candidates allowed by post visibility."""
35
- post = await post_deps.post_service.retrieve_post_with_metadata_by_id_if_exists_strong(post_id=subject_id)
35
+ post = await post_deps.post_service.retrieve_post_with_metadata_by_id_if_exists(post_id=subject_id)
36
36
  if post is None or post.visibility is PostVisibility.PRIVATE:
37
37
  return CommentInboxRecipients(owner_user_ids=frozenset(), mention_user_ids=frozenset())
38
38
  mention_user_ids = set(mention_user_ids)
@@ -33,7 +33,7 @@ class RatingCommentSubjectPort:
33
33
 
34
34
  async def resolve_inbox_recipients(self, *, subject_id: str, mention_user_ids: set[str]) -> CommentInboxRecipients:
35
35
  """Return the rating author as owner and pass mention candidates through."""
36
- rating = await rating_deps.rating_service.retrieve_rating_by_id_strong(rating_id=subject_id)
36
+ rating = await rating_deps.rating_service.retrieve_rating_by_id(rating_id=subject_id)
37
37
  if rating is None:
38
38
  return CommentInboxRecipients(owner_user_ids=frozenset(), mention_user_ids=frozenset())
39
39
  return CommentInboxRecipients(
@@ -40,7 +40,11 @@ async def render_and_send_transactional_email(
40
40
  try:
41
41
  subject, html_body, plain_text_body = renderer(context)
42
42
  except Exception:
43
- logger.exception("Transactional email render failed", kind=kind)
43
+ logger.exception(
44
+ "Transactional email render failed",
45
+ reason="renderer_exception",
46
+ kind=kind,
47
+ )
44
48
  raise
45
49
 
46
50
  await email_service.send(
@@ -30,7 +30,7 @@ async def _existing_mention_recipient_ids(*, mention_user_ids: list[str], author
30
30
  candidate_recipient_ids = set(mention_user_ids) - {author_id} - RESERVED_USER_IDS
31
31
  if not candidate_recipient_ids:
32
32
  return set()
33
- identity_mapping = await user_deps.user_service.retrieve_user_identity_mapping_strong(
33
+ identity_mapping = await user_deps.user_service.retrieve_user_identity_mapping(
34
34
  user_ids=candidate_recipient_ids,
35
35
  )
36
36
  return {uid for uid in candidate_recipient_ids if uid in identity_mapping}
@@ -150,7 +150,7 @@ async def _handle_new_reply_notifications(
150
150
  parent_comment_id: str,
151
151
  content: str | None,
152
152
  ) -> None:
153
- parent = await comment_deps.comment_service.retrieve_comment_with_metadata_by_id_if_exists_strong(
153
+ parent = await comment_deps.comment_service.retrieve_comment_with_metadata_by_id_if_exists(
154
154
  comment_id=parent_comment_id,
155
155
  )
156
156
  if parent is None:
@@ -31,6 +31,10 @@ type OutboxEventHandler = Callable[..., Awaitable[None]]
31
31
 
32
32
  def _require_payload_strings(*, row: OutboxRow, keys: tuple[str, ...]) -> dict[str, str]:
33
33
  """Extract required payload strings, dead-lettering invalid payload shape (decision #22)."""
34
+ if not isinstance(row.payload, dict):
35
+ raise NonRetryableOutboxHandlerError(
36
+ f"invalid payload shape {type(row.payload).__name__} for event {row.event_name!r}"
37
+ )
34
38
  invalid = [key for key in keys if not isinstance(row.payload.get(key), str) or not row.payload[key].strip()]
35
39
  if invalid:
36
40
  raise NonRetryableOutboxHandlerError(f"invalid required payload keys {invalid!r} for event {row.event_name!r}")
@@ -147,7 +147,7 @@ async def retrieve_post_by_id(*, post_id: str) -> dict[str, Any]:
147
147
 
148
148
 
149
149
  async def tombstone_post_for_moderator(*, actor_id: str, post_id: str) -> None:
150
- """Tombstone a post as ``tombstoned_by_moderator`` and record one audit event."""
150
+ """Tombstone a post as ``tombstoned_by_moderator`` and enqueue cleanup."""
151
151
  impact = await post_deps.post_service.tombstone_post(
152
152
  post_id=post_id,
153
153
  tombstone_status=PostStatus.TOMBSTONED_BY_MODERATOR,
@@ -155,15 +155,7 @@ async def tombstone_post_for_moderator(*, actor_id: str, post_id: str) -> None:
155
155
  if impact is None:
156
156
  raise ContentNotFoundException()
157
157
 
158
- await enqueue_post_tombstone_cleanup(impact=impact)
159
- await moderation_deps.moderation_service.record_moderation_action(
160
- actor_id=actor_id,
161
- action_type=ModerationActionType.TOMBSTONE_POST,
162
- action_metadata={
163
- "post_id": post_id,
164
- "author_id": impact.author_id_before_tombstone,
165
- },
166
- )
158
+ await enqueue_post_tombstone_cleanup(impact=impact, actor_id=actor_id)
167
159
 
168
160
 
169
161
  async def accept_destructive_post_delete(*, actor_id: str, post_id: str) -> None:
@@ -10,6 +10,7 @@ import core_framework.domains.notification.dependencies as notification_deps
10
10
  import core_framework.domains.post.dependencies as post_deps
11
11
  from core_framework.application.shared import worker_jobs
12
12
  from core_framework.application.shared.enums import WorkerJobName
13
+ from core_framework.domains.moderation import ModerationActionType
13
14
  from core_framework.domains.post import (
14
15
  PostAuthorDestructiveDeleteImpact,
15
16
  PostAuthorTombstoneImpact,
@@ -54,8 +55,10 @@ async def run_post_tombstone_cleanup(
54
55
  author_id_before_tombstone: str,
55
56
  tombstone_status: str,
56
57
  attachment_asset_ids: list[str],
58
+ actor_id: str | None = None,
59
+ worker_job_id: str | None = None,
57
60
  ) -> None:
58
- """Rebuild tombstone impact from ARQ primitives and run finalize cleanup."""
61
+ """Rebuild tombstone impact from ARQ primitives, run finalize cleanup, and audit when queued by a moderator."""
59
62
  await finalize_post_tombstone_cleanup(
60
63
  impact=PostTombstoneImpact(
61
64
  post_id=post_id,
@@ -64,9 +67,19 @@ async def run_post_tombstone_cleanup(
64
67
  attachment_asset_ids=tuple(attachment_asset_ids),
65
68
  )
66
69
  )
70
+ if actor_id is not None:
71
+ await moderation_deps.moderation_service.record_moderation_action_for_job(
72
+ job_id=worker_job_id,
73
+ actor_id=actor_id,
74
+ action_type=ModerationActionType.TOMBSTONE_POST,
75
+ action_metadata={
76
+ "post_id": post_id,
77
+ "author_id": author_id_before_tombstone,
78
+ },
79
+ )
67
80
 
68
81
 
69
- async def enqueue_post_tombstone_cleanup(*, impact: PostTombstoneImpact) -> None:
82
+ async def enqueue_post_tombstone_cleanup(*, impact: PostTombstoneImpact, actor_id: str | None = None) -> None:
70
83
  """Best-effort enqueue of post tombstone cross-domain cleanup."""
71
84
  job_id = f"post_tombstone_cleanup:{impact.post_id}"
72
85
  try:
@@ -76,6 +89,7 @@ async def enqueue_post_tombstone_cleanup(*, impact: PostTombstoneImpact) -> None
76
89
  author_id_before_tombstone=impact.author_id_before_tombstone,
77
90
  tombstone_status=impact.tombstone_status.value,
78
91
  attachment_asset_ids=list(impact.attachment_asset_ids),
92
+ actor_id=actor_id,
79
93
  _job_id=job_id,
80
94
  )
81
95
  if job is None:
@@ -19,7 +19,7 @@ from core_framework.domains.post import (
19
19
  PostStatus,
20
20
  PostWithMetadata,
21
21
  )
22
- from core_framework.domains.user import UserIdentity
22
+ from core_framework.domains.user import RESERVED_USER_IDS, UserIdentity
23
23
 
24
24
 
25
25
  def _mentioned_user_ids_for_posts(
@@ -82,6 +82,11 @@ def _serialize_post(
82
82
  stats = post_stats_mapping[post.id]
83
83
  hashtags = hashtags_mapping[post.id]
84
84
  author_identity = user_identity_mapping[post.author_id]
85
+ if author_identity == UserIdentity.DEFAULT:
86
+ author_identity = UserIdentity.REDACTED_AUTHOR
87
+ author_id = UserIdentity.REDACTED_AUTHOR.user_id
88
+ else:
89
+ author_id = post.author_id
85
90
  is_tombstone = post.status.is_tombstone
86
91
  viewer_context = None
87
92
  if not is_tombstone and liked_ids is not None and reported_ids is not None:
@@ -99,7 +104,7 @@ def _serialize_post(
99
104
  return {
100
105
  "id": post.id,
101
106
  "author": {
102
- "user_id": post.author_id,
107
+ "user_id": author_id,
103
108
  "username": author_identity.username,
104
109
  "display_name": author_identity.display_name,
105
110
  },
@@ -139,9 +144,24 @@ async def _hydrate_posts(*, posts: list[PostWithMetadata], viewer_id: str | None
139
144
  """Batch-load stats, tags, attachments, identities, and viewer/author context for public post payloads."""
140
145
  if not posts:
141
146
  return []
142
- post_ids = {post.id for post in posts}
143
147
  author_ids = {post.author_id for post in posts}
144
- owned_post_ids = {p.id for p in posts if viewer_id is not None and p.author_id == viewer_id}
148
+ active_posts = [post for post in posts if not post.status.is_tombstone]
149
+ if not active_posts:
150
+ user_identity_mapping = await user_deps.user_service.retrieve_user_identity_mapping(user_ids=author_ids)
151
+ return [
152
+ _serialize_post(
153
+ post=post,
154
+ post_stats_mapping=defaultdict(lambda: PostStats.DEFAULT),
155
+ hashtags_mapping=defaultdict(list),
156
+ mentions_mapping=defaultdict(list),
157
+ attachments_mapping=defaultdict(list),
158
+ user_identity_mapping=user_identity_mapping,
159
+ viewer_id=viewer_id,
160
+ )
161
+ for post in posts
162
+ ]
163
+ post_ids = {post.id for post in active_posts}
164
+ owned_post_ids = {p.id for p in active_posts if viewer_id is not None and p.author_id == viewer_id}
145
165
  async with TaskGroup() as tg:
146
166
  liked_reported_task = tg.create_task(_retrieve_viewer_context_ids(viewer_id=viewer_id, post_ids=post_ids))
147
167
  stats_task = tg.create_task(post_deps.post_service.retrieve_post_stats_mapping(post_ids=post_ids))
@@ -159,7 +179,7 @@ async def _hydrate_posts(*, posts: list[PostWithMetadata], viewer_id: str | None
159
179
  )
160
180
  liked_ids, reported_ids = liked_reported_task.result()
161
181
  mentions_mapping = mentions_task.result()
162
- mention_user_ids = _mentioned_user_ids_for_posts(posts=posts, mentions_mapping=mentions_mapping)
182
+ mention_user_ids = _mentioned_user_ids_for_posts(posts=active_posts, mentions_mapping=mentions_mapping)
163
183
  user_identity_mapping = await user_deps.user_service.retrieve_user_identity_mapping(
164
184
  user_ids=author_ids | mention_user_ids
165
185
  )
@@ -220,6 +240,8 @@ async def retrieve_posts_by_user_id(
220
240
  limit: int,
221
241
  ) -> list[dict[str, Any]]:
222
242
  """Return a paginated profile feed for ``user_id`` visible to ``viewer_id``."""
243
+ if user_id in RESERVED_USER_IDS:
244
+ return []
223
245
  posts = await post_deps.post_service.retrieve_posts_by_user_id(
224
246
  user_id=user_id,
225
247
  cursor=cursor,
@@ -24,11 +24,11 @@ async def upsert_my_rating(
24
24
  body=body,
25
25
  )
26
26
  if rating.body is None:
27
- dropped_upvotes = await rating_deps.rating_service.remove_rating_upvotes_for_rating(rating_id=rating.id)
27
+ await rating_deps.rating_service.remove_rating_upvotes_for_rating(rating_id=rating.id)
28
28
  dropped_reports = await moderation_deps.moderation_service.remove_review_reports_by_target_ids(
29
29
  target_ids={rating.id},
30
30
  )
31
- if dropped_upvotes or dropped_reports:
31
+ if dropped_reports:
32
32
  await rating_deps.rating_service.insert_rating_stats_dirty(rating_id=rating.id)
33
33
 
34
34