core-framework 4.2.1__tar.gz → 4.3.0__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (1020) hide show
  1. {core_framework-4.2.1 → core_framework-4.3.0}/.cursor/rules/application-layer.mdc +6 -2
  2. {core_framework-4.2.1 → core_framework-4.3.0}/.cursor/rules/domain-services-and-adapters.mdc +6 -0
  3. {core_framework-4.2.1 → core_framework-4.3.0}/.cursor/rules/strong-reads.mdc +1 -0
  4. {core_framework-4.2.1 → core_framework-4.3.0}/.cursor/skills/implement-feature/SKILL.md +2 -0
  5. {core_framework-4.2.1 → core_framework-4.3.0}/CHANGELOG.md +19 -1
  6. {core_framework-4.2.1 → core_framework-4.3.0}/PKG-INFO +1 -1
  7. core_framework-4.3.0/alembic/entitlement/alembic/versions/244cc7430989_entitlement_standalone_grants.py +32 -0
  8. core_framework-4.3.0/alembic/entitlement/alembic/versions/8ef1f563ccb4_entitlement_paid_grant_nullable_expiry.py +30 -0
  9. core_framework-4.3.0/alembic/user/alembic/versions/d438cfba40c0_user_login_events_user_created_at_index.py +27 -0
  10. core_framework-4.3.0/core_framework/api/admin/entitlements/router.py +74 -0
  11. core_framework-4.3.0/core_framework/api/entitlements/dependencies.py +44 -0
  12. {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/api/entitlements/router.py +19 -3
  13. {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/api/entitlements/schemas.py +7 -0
  14. {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/api/users/authenticated/router.py +34 -0
  15. {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/api/users/authenticated/schemas.py +16 -6
  16. {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/application/email/registry.py +9 -5
  17. core_framework-4.3.0/core_framework/application/entitlement/core_user.py +24 -0
  18. {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/application/entitlement/grant_service.py +43 -13
  19. {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/application/entitlement/registry.py +60 -9
  20. core_framework-4.3.0/core_framework/application/entitlement/sync_service.py +154 -0
  21. {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/application/entitlement/webhook_service.py +57 -42
  22. {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/application/notifications/README.md +3 -3
  23. {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/application/shared/exceptions.py +24 -0
  24. {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/application/users/authenticated_service.py +18 -1
  25. {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/core/exception_handlers/application.py +30 -0
  26. core_framework-4.3.0/core_framework/domains/entitlement/README.md +23 -0
  27. {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/domains/entitlement/__init__.py +2 -0
  28. {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/domains/entitlement/models.py +13 -1
  29. core_framework-4.3.0/core_framework/domains/entitlement/repository.py +541 -0
  30. {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/domains/entitlement/service.py +50 -5
  31. {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/domains/notification/README.md +2 -2
  32. {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/domains/user/README.md +2 -1
  33. {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/domains/user/__init__.py +2 -0
  34. {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/domains/user/models.py +10 -0
  35. {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/domains/user/repository.py +87 -0
  36. {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/domains/user/service.py +62 -0
  37. {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/infrastructure/revenuecat/revenuecat_entitlement_adapter.py +11 -4
  38. {core_framework-4.2.1 → core_framework-4.3.0}/docs/design/README.md +38 -34
  39. {core_framework-4.2.1 → core_framework-4.3.0}/docs/design/account-removal-spine-design.md +18 -18
  40. core_framework-4.3.0/docs/design/entitlement-admin-sync-design.md +126 -0
  41. core_framework-4.3.0/docs/design/entitlement-admin-sync-implementation.md +227 -0
  42. {core_framework-4.2.1 → core_framework-4.3.0}/docs/design/entitlement-design.md +50 -48
  43. {core_framework-4.2.1 → core_framework-4.3.0}/docs/design/entitlement-implementation.md +6 -5
  44. {core_framework-4.2.1 → core_framework-4.3.0}/docs/design/preference-enhancement-design.md +2 -5
  45. {core_framework-4.2.1 → core_framework-4.3.0}/docs/design/preference-enhancement-implementation.md +1 -1
  46. {core_framework-4.2.1 → core_framework-4.3.0}/docs/design/rating-thread-owner-cue-design.md +4 -2
  47. core_framework-4.3.0/docs/design/standalone-tier-design.md +197 -0
  48. core_framework-4.3.0/docs/design/standalone-tier-implementation.md +273 -0
  49. {core_framework-4.2.1 → core_framework-4.3.0}/docs/design/transactional-email-design.md +5 -5
  50. {core_framework-4.2.1 → core_framework-4.3.0}/docs/domains/README.md +18 -18
  51. core_framework-4.3.0/docs/domains/entitlement/entitlements.md +294 -0
  52. {core_framework-4.2.1 → core_framework-4.3.0}/docs/domains/notifications/inbox-redesign-design.md +1 -1
  53. {core_framework-4.2.1 → core_framework-4.3.0}/docs/domains/notifications/notification_inbox.md +27 -7
  54. {core_framework-4.2.1 → core_framework-4.3.0}/docs/domains/users/follow.md +2 -2
  55. {core_framework-4.2.1 → core_framework-4.3.0}/docs/domains/users/friendship.md +5 -4
  56. {core_framework-4.2.1 → core_framework-4.3.0}/docs/domains/users/groups.md +3 -3
  57. core_framework-4.3.0/docs/domains/users/login-history-design.md +135 -0
  58. core_framework-4.3.0/docs/domains/users/login_history.md +73 -0
  59. {core_framework-4.2.1 → core_framework-4.3.0}/docs/domains/users/preferences.md +14 -9
  60. {core_framework-4.2.1 → core_framework-4.3.0}/docs/library/api.md +3 -1
  61. {core_framework-4.2.1 → core_framework-4.3.0}/docs/library/overview.md +1 -1
  62. {core_framework-4.2.1 → core_framework-4.3.0}/docs/library/package-api.md +22 -8
  63. {core_framework-4.2.1 → core_framework-4.3.0}/docs/platform/architecture-decisions.md +57 -2
  64. {core_framework-4.2.1 → core_framework-4.3.0}/docs/platform/client-error-visibility.md +11 -2
  65. {core_framework-4.2.1 → core_framework-4.3.0}/docs/platform/conventions.md +1 -1
  66. {core_framework-4.2.1 → core_framework-4.3.0}/docs/platform/glossary.md +15 -3
  67. {core_framework-4.2.1 → core_framework-4.3.0}/docs/platform/patch-update-typed-payload.md +2 -2
  68. {core_framework-4.2.1 → core_framework-4.3.0}/docs/todo.md +0 -6
  69. {core_framework-4.2.1 → core_framework-4.3.0}/pyproject.toml +1 -1
  70. core_framework-4.3.0/tests/integration/api/users/authenticated/preference_switches_integration_test.py +295 -0
  71. {core_framework-4.2.1 → core_framework-4.3.0}/tests/integration/api/users/authenticated/profile_media_upload_test.py +2 -0
  72. {core_framework-4.2.1 → core_framework-4.3.0}/tests/integration/api/users/authenticated/router_test.py +194 -0
  73. {core_framework-4.2.1 → core_framework-4.3.0}/uv.lock +1 -1
  74. core_framework-4.2.1/core_framework/api/admin/entitlements/router.py +0 -41
  75. core_framework-4.2.1/core_framework/api/entitlements/dependencies.py +0 -23
  76. core_framework-4.2.1/core_framework/domains/entitlement/README.md +0 -22
  77. core_framework-4.2.1/core_framework/domains/entitlement/repository.py +0 -289
  78. core_framework-4.2.1/docs/domains/entitlement/entitlements.md +0 -191
  79. {core_framework-4.2.1 → core_framework-4.3.0}/.agents/skills/building-pydantic-ai-agents +0 -0
  80. {core_framework-4.2.1 → core_framework-4.3.0}/.agents/skills/fastapi +0 -0
  81. {core_framework-4.2.1 → core_framework-4.3.0}/.agents/skills/library-skills/.library-skills.json +0 -0
  82. {core_framework-4.2.1 → core_framework-4.3.0}/.agents/skills/library-skills/SKILL.md +0 -0
  83. {core_framework-4.2.1 → core_framework-4.3.0}/.cursor/rules/alembic-migrations.mdc +0 -0
  84. {core_framework-4.2.1 → core_framework-4.3.0}/.cursor/rules/api-layer.mdc +0 -0
  85. {core_framework-4.2.1 → core_framework-4.3.0}/.cursor/rules/api-reference-docs.mdc +0 -0
  86. {core_framework-4.2.1 → core_framework-4.3.0}/.cursor/rules/api-validation.mdc +0 -0
  87. {core_framework-4.2.1 → core_framework-4.3.0}/.cursor/rules/constants-final.mdc +0 -0
  88. {core_framework-4.2.1 → core_framework-4.3.0}/.cursor/rules/constitution.mdc +0 -0
  89. {core_framework-4.2.1 → core_framework-4.3.0}/.cursor/rules/database-triggers.mdc +0 -0
  90. {core_framework-4.2.1 → core_framework-4.3.0}/.cursor/rules/docstrings.mdc +0 -0
  91. {core_framework-4.2.1 → core_framework-4.3.0}/.cursor/rules/domain-caller-context.mdc +0 -0
  92. {core_framework-4.2.1 → core_framework-4.3.0}/.cursor/rules/domain-imports.mdc +0 -0
  93. {core_framework-4.2.1 → core_framework-4.3.0}/.cursor/rules/domain-input-guards.mdc +0 -0
  94. {core_framework-4.2.1 → core_framework-4.3.0}/.cursor/rules/domain-repository-exceptions.mdc +0 -0
  95. {core_framework-4.2.1 → core_framework-4.3.0}/.cursor/rules/error-boundary.mdc +0 -0
  96. {core_framework-4.2.1 → core_framework-4.3.0}/.cursor/rules/flow-documentation.mdc +0 -0
  97. {core_framework-4.2.1 → core_framework-4.3.0}/.cursor/rules/ignore-analytics-warehouse.mdc +0 -0
  98. {core_framework-4.2.1 → core_framework-4.3.0}/.cursor/rules/inline-raise-messages.mdc +0 -0
  99. {core_framework-4.2.1 → core_framework-4.3.0}/.cursor/rules/integration-test-strategy.mdc +0 -0
  100. {core_framework-4.2.1 → core_framework-4.3.0}/.cursor/rules/layer-boundaries.mdc +0 -0
  101. {core_framework-4.2.1 → core_framework-4.3.0}/.cursor/rules/no-code-in-docs.mdc +0 -0
  102. {core_framework-4.2.1 → core_framework-4.3.0}/.cursor/rules/postgres-config-conventions.mdc +0 -0
  103. {core_framework-4.2.1 → core_framework-4.3.0}/.cursor/rules/repository-schema-isolation.mdc +0 -0
  104. {core_framework-4.2.1 → core_framework-4.3.0}/.cursor/rules/structured-logging.mdc +0 -0
  105. {core_framework-4.2.1 → core_framework-4.3.0}/.cursor/skills/add-config/SKILL.md +0 -0
  106. {core_framework-4.2.1 → core_framework-4.3.0}/.cursor/skills/add-domain/SKILL.md +0 -0
  107. {core_framework-4.2.1 → core_framework-4.3.0}/.cursor/skills/building-pydantic-ai-agents +0 -0
  108. {core_framework-4.2.1 → core_framework-4.3.0}/.cursor/skills/code-review/SKILL.md +0 -0
  109. {core_framework-4.2.1 → core_framework-4.3.0}/.cursor/skills/design-review/SKILL.md +0 -0
  110. {core_framework-4.2.1 → core_framework-4.3.0}/.cursor/skills/fastapi +0 -0
  111. {core_framework-4.2.1 → core_framework-4.3.0}/.cursor/skills/grill/SKILL.md +0 -0
  112. {core_framework-4.2.1 → core_framework-4.3.0}/.cursor/skills/recommend-features/SKILL.md +0 -0
  113. {core_framework-4.2.1 → core_framework-4.3.0}/.cursor/skills/sync-host-rules/SKILL.md +0 -0
  114. {core_framework-4.2.1 → core_framework-4.3.0}/.cursor/skills/write-flow-doc/SKILL.md +0 -0
  115. {core_framework-4.2.1 → core_framework-4.3.0}/.dockerignore +0 -0
  116. {core_framework-4.2.1 → core_framework-4.3.0}/.github/ci/package-lock.json +0 -0
  117. {core_framework-4.2.1 → core_framework-4.3.0}/.github/ci/package-smoke.sh +0 -0
  118. {core_framework-4.2.1 → core_framework-4.3.0}/.github/ci/package.json +0 -0
  119. {core_framework-4.2.1 → core_framework-4.3.0}/.github/ci/package_smoke.py +0 -0
  120. {core_framework-4.2.1 → core_framework-4.3.0}/.github/workflows/_deploy.yml +0 -0
  121. {core_framework-4.2.1 → core_framework-4.3.0}/.github/workflows/dev-ci-cd.yaml +0 -0
  122. {core_framework-4.2.1 → core_framework-4.3.0}/.github/workflows/manual-deployment.yaml +0 -0
  123. {core_framework-4.2.1 → core_framework-4.3.0}/.github/workflows/manual-observability-deployment.yaml +0 -0
  124. {core_framework-4.2.1 → core_framework-4.3.0}/.github/workflows/publish-pypi.yml +0 -0
  125. {core_framework-4.2.1 → core_framework-4.3.0}/.github/workflows/test.yaml +0 -0
  126. {core_framework-4.2.1 → core_framework-4.3.0}/.gitignore +0 -0
  127. {core_framework-4.2.1 → core_framework-4.3.0}/.pre-commit-config.yaml +0 -0
  128. {core_framework-4.2.1 → core_framework-4.3.0}/.python-version +0 -0
  129. {core_framework-4.2.1 → core_framework-4.3.0}/LICENSE +0 -0
  130. {core_framework-4.2.1 → core_framework-4.3.0}/README.md +0 -0
  131. {core_framework-4.2.1 → core_framework-4.3.0}/alembic/analytics/alembic/README +0 -0
  132. {core_framework-4.2.1 → core_framework-4.3.0}/alembic/analytics/alembic/env.py +0 -0
  133. {core_framework-4.2.1 → core_framework-4.3.0}/alembic/analytics/alembic/script.py.mako +0 -0
  134. {core_framework-4.2.1 → core_framework-4.3.0}/alembic/analytics/alembic/versions/2d61a5e88d76_analytics_utm_events_add_kind.py +0 -0
  135. {core_framework-4.2.1 → core_framework-4.3.0}/alembic/analytics/alembic/versions/585105e1149e_analytics_add_utm_events.py +0 -0
  136. {core_framework-4.2.1 → core_framework-4.3.0}/alembic/analytics/alembic/versions/5b9ac98bb150_analytics_daily_fact.py +0 -0
  137. {core_framework-4.2.1 → core_framework-4.3.0}/alembic/analytics/alembic/versions/7f2a9c1d4e8b_analytics_daily_fact_day_index.py +0 -0
  138. {core_framework-4.2.1 → core_framework-4.3.0}/alembic/analytics/alembic.ini +0 -0
  139. {core_framework-4.2.1 → core_framework-4.3.0}/alembic/comment/alembic/README +0 -0
  140. {core_framework-4.2.1 → core_framework-4.3.0}/alembic/comment/alembic/env.py +0 -0
  141. {core_framework-4.2.1 → core_framework-4.3.0}/alembic/comment/alembic/script.py.mako +0 -0
  142. {core_framework-4.2.1 → core_framework-4.3.0}/alembic/comment/alembic/versions/comment_add_comment_attachments.py +0 -0
  143. {core_framework-4.2.1 → core_framework-4.3.0}/alembic/comment/alembic/versions/comment_add_comment_create_idempotency.py +0 -0
  144. {core_framework-4.2.1 → core_framework-4.3.0}/alembic/comment/alembic/versions/comment_add_comment_create_idempotency_created_at_index.py +0 -0
  145. {core_framework-4.2.1 → core_framework-4.3.0}/alembic/comment/alembic/versions/comment_add_comment_mentions.py +0 -0
  146. {core_framework-4.2.1 → core_framework-4.3.0}/alembic/comment/alembic/versions/comment_subject_kind_varchar.py +0 -0
  147. {core_framework-4.2.1 → core_framework-4.3.0}/alembic/comment/alembic/versions/comment_tombstone_status_model.py +0 -0
  148. {core_framework-4.2.1 → core_framework-4.3.0}/alembic/comment/alembic/versions/v1_comment_init_baseline.py +0 -0
  149. {core_framework-4.2.1 → core_framework-4.3.0}/alembic/comment/alembic.ini +0 -0
  150. {core_framework-4.2.1 → core_framework-4.3.0}/alembic/entitlement/alembic/README +0 -0
  151. {core_framework-4.2.1 → core_framework-4.3.0}/alembic/entitlement/alembic/env.py +0 -0
  152. {core_framework-4.2.1 → core_framework-4.3.0}/alembic/entitlement/alembic/script.py.mako +0 -0
  153. {core_framework-4.2.1 → core_framework-4.3.0}/alembic/entitlement/alembic/versions/b7ed2400e94e_entitlement_schema.py +0 -0
  154. {core_framework-4.2.1 → core_framework-4.3.0}/alembic/entitlement/alembic.ini +0 -0
  155. {core_framework-4.2.1 → core_framework-4.3.0}/alembic/extension/alembic/README +0 -0
  156. {core_framework-4.2.1 → core_framework-4.3.0}/alembic/extension/alembic/env.py +0 -0
  157. {core_framework-4.2.1 → core_framework-4.3.0}/alembic/extension/alembic/script.py.mako +0 -0
  158. {core_framework-4.2.1 → core_framework-4.3.0}/alembic/extension/alembic/versions/v1_ext_init_baseline.py +0 -0
  159. {core_framework-4.2.1 → core_framework-4.3.0}/alembic/extension/alembic.ini +0 -0
  160. {core_framework-4.2.1 → core_framework-4.3.0}/alembic/media/alembic/README +0 -0
  161. {core_framework-4.2.1 → core_framework-4.3.0}/alembic/media/alembic/env.py +0 -0
  162. {core_framework-4.2.1 → core_framework-4.3.0}/alembic/media/alembic/script.py.mako +0 -0
  163. {core_framework-4.2.1 → core_framework-4.3.0}/alembic/media/alembic/versions/media_add_attachment_staging_registry.py +0 -0
  164. {core_framework-4.2.1 → core_framework-4.3.0}/alembic/media/alembic/versions/media_add_banner_staging_and_lease.py +0 -0
  165. {core_framework-4.2.1 → core_framework-4.3.0}/alembic/media/alembic/versions/media_attachment_staging_registry_published_at.py +0 -0
  166. {core_framework-4.2.1 → core_framework-4.3.0}/alembic/media/alembic/versions/v1_media_init_baseline.py +0 -0
  167. {core_framework-4.2.1 → core_framework-4.3.0}/alembic/media/alembic.ini +0 -0
  168. {core_framework-4.2.1 → core_framework-4.3.0}/alembic/moderation/alembic/README +0 -0
  169. {core_framework-4.2.1 → core_framework-4.3.0}/alembic/moderation/alembic/env.py +0 -0
  170. {core_framework-4.2.1 → core_framework-4.3.0}/alembic/moderation/alembic/script.py.mako +0 -0
  171. {core_framework-4.2.1 → core_framework-4.3.0}/alembic/moderation/alembic/versions/3027828c2c80_align_dead_outbox_keyset_index.py +0 -0
  172. {core_framework-4.2.1 → core_framework-4.3.0}/alembic/moderation/alembic/versions/5be85718122a_moderation_add_review_reports.py +0 -0
  173. {core_framework-4.2.1 → core_framework-4.3.0}/alembic/moderation/alembic/versions/moderation_add_event_outbox.py +0 -0
  174. {core_framework-4.2.1 → core_framework-4.3.0}/alembic/moderation/alembic/versions/moderation_add_event_outbox_dead_indexes.py +0 -0
  175. {core_framework-4.2.1 → core_framework-4.3.0}/alembic/moderation/alembic/versions/moderation_add_event_outbox_pending_created_at_index.py +0 -0
  176. {core_framework-4.2.1 → core_framework-4.3.0}/alembic/moderation/alembic/versions/v1_mod_init_baseline.py +0 -0
  177. {core_framework-4.2.1 → core_framework-4.3.0}/alembic/moderation/alembic.ini +0 -0
  178. {core_framework-4.2.1 → core_framework-4.3.0}/alembic/notification/alembic/README +0 -0
  179. {core_framework-4.2.1 → core_framework-4.3.0}/alembic/notification/alembic/env.py +0 -0
  180. {core_framework-4.2.1 → core_framework-4.3.0}/alembic/notification/alembic/script.py.mako +0 -0
  181. {core_framework-4.2.1 → core_framework-4.3.0}/alembic/notification/alembic/versions/2fdd68777706_notification_read_at_retention_index.py +0 -0
  182. {core_framework-4.2.1 → core_framework-4.3.0}/alembic/notification/alembic/versions/a5f29155815d_notification_add_friendship_types.py +0 -0
  183. {core_framework-4.2.1 → core_framework-4.3.0}/alembic/notification/alembic/versions/b1263ed1a303_notification_inbox_redesign_preview.py +0 -0
  184. {core_framework-4.2.1 → core_framework-4.3.0}/alembic/notification/alembic/versions/c6b9941065ec_notification_add_group_invite_type.py +0 -0
  185. {core_framework-4.2.1 → core_framework-4.3.0}/alembic/notification/alembic/versions/fbe8476b4437_notification_add_rating_owner_cue_labels.py +0 -0
  186. {core_framework-4.2.1 → core_framework-4.3.0}/alembic/notification/alembic/versions/v1_notif_init_baseline.py +0 -0
  187. {core_framework-4.2.1 → core_framework-4.3.0}/alembic/notification/alembic.ini +0 -0
  188. {core_framework-4.2.1 → core_framework-4.3.0}/alembic/post/alembic/README +0 -0
  189. {core_framework-4.2.1 → core_framework-4.3.0}/alembic/post/alembic/env.py +0 -0
  190. {core_framework-4.2.1 → core_framework-4.3.0}/alembic/post/alembic/script.py.mako +0 -0
  191. {core_framework-4.2.1 → core_framework-4.3.0}/alembic/post/alembic/versions/0a89b4c23746_post_stats_like_created_post_index.py +0 -0
  192. {core_framework-4.2.1 → core_framework-4.3.0}/alembic/post/alembic/versions/954f00734f36_post_add_post_discovery_rank.py +0 -0
  193. {core_framework-4.2.1 → core_framework-4.3.0}/alembic/post/alembic/versions/b3c61daef9b5_post_add_post_bookmarks.py +0 -0
  194. {core_framework-4.2.1 → core_framework-4.3.0}/alembic/post/alembic/versions/post_add_post_attachments.py +0 -0
  195. {core_framework-4.2.1 → core_framework-4.3.0}/alembic/post/alembic/versions/post_add_post_create_idempotency.py +0 -0
  196. {core_framework-4.2.1 → core_framework-4.3.0}/alembic/post/alembic/versions/post_add_post_create_idempotency_created_at_index.py +0 -0
  197. {core_framework-4.2.1 → core_framework-4.3.0}/alembic/post/alembic/versions/post_add_post_mentions.py +0 -0
  198. {core_framework-4.2.1 → core_framework-4.3.0}/alembic/post/alembic/versions/post_post_views_retention_high_water_mark.py +0 -0
  199. {core_framework-4.2.1 → core_framework-4.3.0}/alembic/post/alembic/versions/post_tombstone_status_model.py +0 -0
  200. {core_framework-4.2.1 → core_framework-4.3.0}/alembic/post/alembic/versions/v1_post_init_baseline.py +0 -0
  201. {core_framework-4.2.1 → core_framework-4.3.0}/alembic/post/alembic.ini +0 -0
  202. {core_framework-4.2.1 → core_framework-4.3.0}/alembic/rating/alembic/README +0 -0
  203. {core_framework-4.2.1 → core_framework-4.3.0}/alembic/rating/alembic/env.py +0 -0
  204. {core_framework-4.2.1 → core_framework-4.3.0}/alembic/rating/alembic/script.py.mako +0 -0
  205. {core_framework-4.2.1 → core_framework-4.3.0}/alembic/rating/alembic/versions/04182d734619_rating_list_indexes.py +0 -0
  206. {core_framework-4.2.1 → core_framework-4.3.0}/alembic/rating/alembic/versions/2ef924b0be4c_rating_schema.py +0 -0
  207. {core_framework-4.2.1 → core_framework-4.3.0}/alembic/rating/alembic.ini +0 -0
  208. {core_framework-4.2.1 → core_framework-4.3.0}/alembic/user/alembic/README +0 -0
  209. {core_framework-4.2.1 → core_framework-4.3.0}/alembic/user/alembic/env.py +0 -0
  210. {core_framework-4.2.1 → core_framework-4.3.0}/alembic/user/alembic/script.py.mako +0 -0
  211. {core_framework-4.2.1 → core_framework-4.3.0}/alembic/user/alembic/versions/089f4398f943_user_add_preference_switches.py +0 -0
  212. {core_framework-4.2.1 → core_framework-4.3.0}/alembic/user/alembic/versions/24ba262c4ef2_user_add_account_removal_started_at.py +0 -0
  213. {core_framework-4.2.1 → core_framework-4.3.0}/alembic/user/alembic/versions/2dc1d398a840_user_add_groups.py +0 -0
  214. {core_framework-4.2.1 → core_framework-4.3.0}/alembic/user/alembic/versions/44df70a45ba6_user_add_signup_events.py +0 -0
  215. {core_framework-4.2.1 → core_framework-4.3.0}/alembic/user/alembic/versions/7078e4313554_user_add_friendships.py +0 -0
  216. {core_framework-4.2.1 → core_framework-4.3.0}/alembic/user/alembic/versions/922eece707db_align_dead_outbox_keyset_index.py +0 -0
  217. {core_framework-4.2.1 → core_framework-4.3.0}/alembic/user/alembic/versions/user_add_avatar_ingest_sequences.py +0 -0
  218. {core_framework-4.2.1 → core_framework-4.3.0}/alembic/user/alembic/versions/user_add_banner_ingest_sequences.py +0 -0
  219. {core_framework-4.2.1 → core_framework-4.3.0}/alembic/user/alembic/versions/user_add_date_of_birth_to_profiles.py +0 -0
  220. {core_framework-4.2.1 → core_framework-4.3.0}/alembic/user/alembic/versions/user_add_event_outbox.py +0 -0
  221. {core_framework-4.2.1 → core_framework-4.3.0}/alembic/user/alembic/versions/user_add_event_outbox_dead_indexes.py +0 -0
  222. {core_framework-4.2.1 → core_framework-4.3.0}/alembic/user/alembic/versions/user_add_event_outbox_pending_created_at_index.py +0 -0
  223. {core_framework-4.2.1 → core_framework-4.3.0}/alembic/user/alembic/versions/user_reserve_sentinel_user_ids.py +0 -0
  224. {core_framework-4.2.1 → core_framework-4.3.0}/alembic/user/alembic/versions/v1_user_init_baseline.py +0 -0
  225. {core_framework-4.2.1 → core_framework-4.3.0}/alembic/user/alembic.ini +0 -0
  226. {core_framework-4.2.1 → core_framework-4.3.0}/config.toml +0 -0
  227. {core_framework-4.2.1 → core_framework-4.3.0}/config.toml.template +0 -0
  228. {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/__init__.py +0 -0
  229. {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/api/__init__.py +0 -0
  230. {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/api/admin/__init__.py +0 -0
  231. {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/api/admin/agent/router.py +0 -0
  232. {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/api/admin/agent/schemas.py +0 -0
  233. {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/api/admin/analytics/__init__.py +0 -0
  234. {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/api/admin/analytics/router.py +0 -0
  235. {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/api/admin/analytics/schemas.py +0 -0
  236. {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/api/admin/cache/__init__.py +0 -0
  237. {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/api/admin/cache/router.py +0 -0
  238. {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/api/admin/cache/schemas.py +0 -0
  239. {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/api/admin/comments/__init__.py +0 -0
  240. {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/api/admin/comments/router.py +0 -0
  241. {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/api/admin/comments/schemas.py +0 -0
  242. {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/api/admin/moderation/__init__.py +0 -0
  243. {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/api/admin/moderation/router.py +0 -0
  244. {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/api/admin/moderation/schemas.py +0 -0
  245. {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/api/admin/outbox/__init__.py +0 -0
  246. {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/api/admin/outbox/router.py +0 -0
  247. {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/api/admin/outbox/schemas.py +0 -0
  248. {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/api/admin/posts/__init__.py +0 -0
  249. {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/api/admin/posts/router.py +0 -0
  250. {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/api/admin/posts/schemas.py +0 -0
  251. {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/api/admin/ratings/router.py +0 -0
  252. {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/api/admin/ratings/schemas.py +0 -0
  253. {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/api/admin/router.py +0 -0
  254. {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/api/admin/users/__init__.py +0 -0
  255. {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/api/admin/users/router.py +0 -0
  256. {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/api/admin/users/schemas.py +0 -0
  257. {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/api/attachments/__init__.py +0 -0
  258. {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/api/attachments/router.py +0 -0
  259. {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/api/attachments/schemas.py +0 -0
  260. {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/api/auth/__init__.py +0 -0
  261. {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/api/auth/router.py +0 -0
  262. {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/api/auth/schemas.py +0 -0
  263. {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/api/comments/__init__.py +0 -0
  264. {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/api/comments/authenticated/__init__.py +0 -0
  265. {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/api/comments/authenticated/mappers.py +0 -0
  266. {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/api/comments/authenticated/router.py +0 -0
  267. {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/api/comments/authenticated/schemas.py +0 -0
  268. {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/api/comments/public/__init__.py +0 -0
  269. {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/api/comments/public/router.py +0 -0
  270. {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/api/comments/public/schemas.py +0 -0
  271. {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/api/comments/router.py +0 -0
  272. {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/api/comments/schemas.py +0 -0
  273. {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/api/dependencies.py +0 -0
  274. {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/api/events/__init__.py +0 -0
  275. {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/api/events/router.py +0 -0
  276. {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/api/events/schemas.py +0 -0
  277. {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/api/groups/router.py +0 -0
  278. {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/api/groups/schemas.py +0 -0
  279. {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/api/idempotency/__init__.py +0 -0
  280. {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/api/idempotency/dependencies.py +0 -0
  281. {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/api/ingest_guards.py +0 -0
  282. {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/api/notifications/__init__.py +0 -0
  283. {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/api/notifications/authenticated/__init__.py +0 -0
  284. {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/api/notifications/authenticated/router.py +0 -0
  285. {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/api/notifications/authenticated/schemas.py +0 -0
  286. {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/api/notifications/router.py +0 -0
  287. {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/api/pagination.py +0 -0
  288. {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/api/posts/__init__.py +0 -0
  289. {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/api/posts/authenticated/__init__.py +0 -0
  290. {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/api/posts/authenticated/mappers.py +0 -0
  291. {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/api/posts/authenticated/router.py +0 -0
  292. {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/api/posts/authenticated/schemas.py +0 -0
  293. {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/api/posts/public/__init__.py +0 -0
  294. {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/api/posts/public/router.py +0 -0
  295. {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/api/posts/public/schemas.py +0 -0
  296. {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/api/posts/router.py +0 -0
  297. {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/api/posts/schemas.py +0 -0
  298. {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/api/ratings/authenticated/router.py +0 -0
  299. {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/api/ratings/pagination.py +0 -0
  300. {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/api/ratings/public/router.py +0 -0
  301. {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/api/ratings/router.py +0 -0
  302. {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/api/ratings/schemas.py +0 -0
  303. {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/api/router.py +0 -0
  304. {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/api/schemas.py +0 -0
  305. {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/api/system/__init__.py +0 -0
  306. {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/api/system/router.py +0 -0
  307. {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/api/upload.py +0 -0
  308. {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/api/users/__init__.py +0 -0
  309. {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/api/users/authenticated/__init__.py +0 -0
  310. {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/api/users/authenticated/mappers.py +0 -0
  311. {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/api/users/public/__init__.py +0 -0
  312. {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/api/users/public/router.py +0 -0
  313. {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/api/users/public/schemas.py +0 -0
  314. {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/api/users/router.py +0 -0
  315. {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/api/users/shared/__init__.py +0 -0
  316. {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/api/users/shared/mappers.py +0 -0
  317. {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/api/users/shared/schemas.py +0 -0
  318. {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/application/__init__.py +0 -0
  319. {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/application/agent/probe.py +0 -0
  320. {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/application/analytics/__init__.py +0 -0
  321. {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/application/analytics/bucket_service.py +0 -0
  322. {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/application/analytics/prune_service.py +0 -0
  323. {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/application/analytics/read_service.py +0 -0
  324. {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/application/analytics/refresh_service.py +0 -0
  325. {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/application/analytics/registry.py +0 -0
  326. {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/application/analytics/sources/__init__.py +0 -0
  327. {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/application/analytics/sources/comment_created.py +0 -0
  328. {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/application/analytics/sources/post_created.py +0 -0
  329. {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/application/analytics/sources/post_viewed.py +0 -0
  330. {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/application/analytics/sources/user_registered.py +0 -0
  331. {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/application/auth/__init__.py +0 -0
  332. {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/application/auth/access_service.py +0 -0
  333. {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/application/auth/auth_service.py +0 -0
  334. {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/application/auth/models.py +0 -0
  335. {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/application/auth/token_verification.py +0 -0
  336. {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/application/bootstrap.py +0 -0
  337. {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/application/cache/__init__.py +0 -0
  338. {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/application/cache/invalidate_service.py +0 -0
  339. {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/application/cache/models.py +0 -0
  340. {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/application/comments/__init__.py +0 -0
  341. {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/application/comments/admin_service.py +0 -0
  342. {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/application/comments/aggregation_service.py +0 -0
  343. {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/application/comments/authenticated_service.py +0 -0
  344. {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/application/comments/cleanup_service.py +0 -0
  345. {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/application/comments/host_service.py +0 -0
  346. {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/application/comments/kind_registry.py +0 -0
  347. {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/application/comments/post_subject.py +0 -0
  348. {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/application/comments/public_service.py +0 -0
  349. {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/application/comments/rating_subject.py +0 -0
  350. {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/application/email/__init__.py +0 -0
  351. {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/application/email/account_deletion_scheduled.py +0 -0
  352. {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/application/email/enqueue.py +0 -0
  353. {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/application/email/send.py +0 -0
  354. {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/application/entitlement/signature.py +0 -0
  355. {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/application/events/README.md +0 -0
  356. {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/application/events/__init__.py +0 -0
  357. {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/application/events/event_service.py +0 -0
  358. {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/application/events/event_token.py +0 -0
  359. {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/application/events/models.py +0 -0
  360. {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/application/events/utm_capture_kinds.py +0 -0
  361. {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/application/groups/authenticated_service.py +0 -0
  362. {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/application/groups/cleanup_service.py +0 -0
  363. {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/application/groups/group_invite_link_token.py +0 -0
  364. {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/application/groups/strip_service.py +0 -0
  365. {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/application/media/README.md +0 -0
  366. {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/application/media/__init__.py +0 -0
  367. {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/application/media/attachment_read.py +0 -0
  368. {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/application/media/attachment_service.py +0 -0
  369. {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/application/media/avatar_service.py +0 -0
  370. {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/application/media/banner_service.py +0 -0
  371. {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/application/media/read_url_config.py +0 -0
  372. {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/application/moderation/__init__.py +0 -0
  373. {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/application/moderation/appeal_service.py +0 -0
  374. {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/application/moderation/moderator_service.py +0 -0
  375. {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/application/moderation/report_service.py +0 -0
  376. {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/application/moderation/restriction_fanout/__init__.py +0 -0
  377. {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/application/moderation/restriction_fanout/heals.py +0 -0
  378. {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/application/moderation/restriction_fanout/mirrors.py +0 -0
  379. {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/application/moderation/restriction_fanout/reactions.py +0 -0
  380. {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/application/moderation/restriction_fanout/registry.py +0 -0
  381. {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/application/moderation/restriction_fanout/runner.py +0 -0
  382. {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/application/moderation/scheduled_service.py +0 -0
  383. {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/application/moderation/user_service.py +0 -0
  384. {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/application/notifications/__init__.py +0 -0
  385. {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/application/notifications/enums.py +0 -0
  386. {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/application/notifications/friendship_notification_service.py +0 -0
  387. {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/application/notifications/group_invite_notification_service.py +0 -0
  388. {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/application/notifications/inbox_service.py +0 -0
  389. {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/application/notifications/inbox_type_switch.py +0 -0
  390. {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/application/notifications/mute_service.py +0 -0
  391. {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/application/notifications/notification_service.py +0 -0
  392. {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/application/notifications/preview.py +0 -0
  393. {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/application/notifications/prune_service.py +0 -0
  394. {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/application/notifications/wipe_service.py +0 -0
  395. {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/application/outbox/__init__.py +0 -0
  396. {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/application/outbox/block_mirrors.py +0 -0
  397. {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/application/outbox/events.py +0 -0
  398. {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/application/outbox/exceptions.py +0 -0
  399. {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/application/outbox/follow_mirrors.py +0 -0
  400. {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/application/outbox/handlers.py +0 -0
  401. {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/application/outbox/ops_service.py +0 -0
  402. {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/application/outbox/polling_service.py +0 -0
  403. {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/application/outbox/processing_service.py +0 -0
  404. {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/application/outbox/restriction_mirrors.py +0 -0
  405. {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/application/posts/__init__.py +0 -0
  406. {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/application/posts/admin_service.py +0 -0
  407. {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/application/posts/aggregation_service.py +0 -0
  408. {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/application/posts/authenticated_service.py +0 -0
  409. {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/application/posts/cleanup_service.py +0 -0
  410. {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/application/posts/public_service.py +0 -0
  411. {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/application/ratings/__init__.py +0 -0
  412. {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/application/ratings/admin_service.py +0 -0
  413. {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/application/ratings/aggregation_service.py +0 -0
  414. {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/application/ratings/authenticated_service.py +0 -0
  415. {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/application/ratings/kind_registry.py +0 -0
  416. {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/application/ratings/public_service.py +0 -0
  417. {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/application/ratings/purge_service.py +0 -0
  418. {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/application/ratings/serialization.py +0 -0
  419. {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/application/ratings/subject_existence.py +0 -0
  420. {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/application/shared/__init__.py +0 -0
  421. {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/application/shared/deletion_cleanup_ledger.py +0 -0
  422. {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/application/shared/enums.py +0 -0
  423. {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/application/shared/request_context.py +0 -0
  424. {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/application/shared/worker_jobs.py +0 -0
  425. {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/application/users/__init__.py +0 -0
  426. {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/application/users/account_removal/__init__.py +0 -0
  427. {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/application/users/account_removal/contributors.py +0 -0
  428. {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/application/users/account_removal/registry.py +0 -0
  429. {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/application/users/account_removal/runner.py +0 -0
  430. {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/application/users/admin_service.py +0 -0
  431. {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/application/users/aggregation_service.py +0 -0
  432. {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/application/users/deletion_audit.py +0 -0
  433. {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/application/users/enums.py +0 -0
  434. {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/application/users/identity_enrichment.py +0 -0
  435. {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/application/users/public_service.py +0 -0
  436. {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/application/users/scheduled_service.py +0 -0
  437. {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/application/users/user_deletion_service.py +0 -0
  438. {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/asgi.py +0 -0
  439. {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/bundled_alembic.py +0 -0
  440. {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/constants.py +0 -0
  441. {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/core/__init__.py +0 -0
  442. {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/core/cache.py +0 -0
  443. {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/core/context.py +0 -0
  444. {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/core/database.py +0 -0
  445. {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/core/exception_handlers/__init__.py +0 -0
  446. {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/core/exception_handlers/common.py +0 -0
  447. {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/core/exception_handlers/setup.py +0 -0
  448. {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/core/exceptions.py +0 -0
  449. {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/core/firebase.py +0 -0
  450. {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/core/http_client.py +0 -0
  451. {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/core/http_probes.py +0 -0
  452. {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/core/logging.py +0 -0
  453. {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/core/middleware.py +0 -0
  454. {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/core/observability.py +0 -0
  455. {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/core/pagination.py +0 -0
  456. {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/core/process.py +0 -0
  457. {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/core/rate_limit.py +0 -0
  458. {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/core/redis.py +0 -0
  459. {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/core/runtime.py +0 -0
  460. {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/core/settings.py +0 -0
  461. {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/domains/__init__.py +0 -0
  462. {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/domains/agent/README.md +0 -0
  463. {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/domains/agent/__init__.py +0 -0
  464. {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/domains/agent/dependencies.py +0 -0
  465. {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/domains/agent/models.py +0 -0
  466. {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/domains/analytics/README.md +0 -0
  467. {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/domains/analytics/__init__.py +0 -0
  468. {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/domains/analytics/constants.py +0 -0
  469. {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/domains/analytics/dependencies.py +0 -0
  470. {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/domains/analytics/exceptions.py +0 -0
  471. {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/domains/analytics/models.py +0 -0
  472. {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/domains/analytics/ports/__init__.py +0 -0
  473. {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/domains/analytics/ports/activity_source.py +0 -0
  474. {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/domains/analytics/repository.py +0 -0
  475. {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/domains/analytics/service.py +0 -0
  476. {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/domains/auth/README.md +0 -0
  477. {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/domains/auth/__init__.py +0 -0
  478. {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/domains/auth/dependencies.py +0 -0
  479. {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/domains/auth/exceptions.py +0 -0
  480. {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/domains/auth/models.py +0 -0
  481. {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/domains/auth/outcomes.py +0 -0
  482. {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/domains/auth/ports/__init__.py +0 -0
  483. {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/domains/auth/ports/auth.py +0 -0
  484. {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/domains/auth/service.py +0 -0
  485. {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/domains/comment/README.md +0 -0
  486. {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/domains/comment/__init__.py +0 -0
  487. {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/domains/comment/constants.py +0 -0
  488. {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/domains/comment/dependencies.py +0 -0
  489. {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/domains/comment/enums.py +0 -0
  490. {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/domains/comment/exceptions.py +0 -0
  491. {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/domains/comment/models.py +0 -0
  492. {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/domains/comment/outcomes.py +0 -0
  493. {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/domains/comment/ports/subject.py +0 -0
  494. {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/domains/comment/repository.py +0 -0
  495. {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/domains/comment/service.py +0 -0
  496. {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/domains/email/README.md +0 -0
  497. {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/domains/email/__init__.py +0 -0
  498. {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/domains/email/dependencies.py +0 -0
  499. {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/domains/email/exceptions.py +0 -0
  500. {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/domains/email/models.py +0 -0
  501. {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/domains/email/ports/send.py +0 -0
  502. {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/domains/email/service.py +0 -0
  503. {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/domains/entitlement/dependencies.py +0 -0
  504. {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/domains/entitlement/exceptions.py +0 -0
  505. {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/domains/entitlement/ports/revenuecat.py +0 -0
  506. {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/domains/exceptions.py +0 -0
  507. {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/domains/media/README.md +0 -0
  508. {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/domains/media/__init__.py +0 -0
  509. {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/domains/media/attachment/__init__.py +0 -0
  510. {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/domains/media/attachment/components/__init__.py +0 -0
  511. {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/domains/media/attachment/components/finals_publisher.py +0 -0
  512. {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/domains/media/attachment/components/staging.py +0 -0
  513. {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/domains/media/attachment/components/variant_encoder.py +0 -0
  514. {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/domains/media/attachment/constants.py +0 -0
  515. {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/domains/media/attachment/exceptions.py +0 -0
  516. {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/domains/media/attachment/models.py +0 -0
  517. {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/domains/media/attachment/ports/__init__.py +0 -0
  518. {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/domains/media/attachment/ports/finals_publisher.py +0 -0
  519. {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/domains/media/attachment/ports/staging.py +0 -0
  520. {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/domains/media/attachment/ports/variant_encoder.py +0 -0
  521. {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/domains/media/attachment/service.py +0 -0
  522. {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/domains/media/avatar/__init__.py +0 -0
  523. {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/domains/media/avatar/components/__init__.py +0 -0
  524. {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/domains/media/avatar/components/finals_publisher.py +0 -0
  525. {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/domains/media/avatar/components/staging.py +0 -0
  526. {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/domains/media/avatar/components/variant_encoder.py +0 -0
  527. {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/domains/media/avatar/constants.py +0 -0
  528. {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/domains/media/avatar/exceptions.py +0 -0
  529. {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/domains/media/avatar/models.py +0 -0
  530. {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/domains/media/avatar/ports/__init__.py +0 -0
  531. {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/domains/media/avatar/ports/finals_publisher.py +0 -0
  532. {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/domains/media/avatar/ports/staging.py +0 -0
  533. {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/domains/media/avatar/ports/variant_encoder.py +0 -0
  534. {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/domains/media/avatar/service.py +0 -0
  535. {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/domains/media/banner/__init__.py +0 -0
  536. {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/domains/media/banner/components/__init__.py +0 -0
  537. {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/domains/media/banner/components/finals_publisher.py +0 -0
  538. {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/domains/media/banner/components/staging.py +0 -0
  539. {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/domains/media/banner/components/variant_encoder.py +0 -0
  540. {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/domains/media/banner/constants.py +0 -0
  541. {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/domains/media/banner/exceptions.py +0 -0
  542. {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/domains/media/banner/models.py +0 -0
  543. {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/domains/media/banner/ports/__init__.py +0 -0
  544. {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/domains/media/banner/ports/finals_publisher.py +0 -0
  545. {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/domains/media/banner/ports/staging.py +0 -0
  546. {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/domains/media/banner/ports/variant_encoder.py +0 -0
  547. {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/domains/media/banner/service.py +0 -0
  548. {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/domains/media/dependencies.py +0 -0
  549. {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/domains/media/shared/__init__.py +0 -0
  550. {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/domains/media/shared/constants.py +0 -0
  551. {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/domains/media/shared/exceptions.py +0 -0
  552. {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/domains/media/shared/outcomes.py +0 -0
  553. {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/domains/media/shared/repository.py +0 -0
  554. {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/domains/media/shared/utils.py +0 -0
  555. {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/domains/moderation/README.md +0 -0
  556. {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/domains/moderation/__init__.py +0 -0
  557. {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/domains/moderation/dependencies.py +0 -0
  558. {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/domains/moderation/enums.py +0 -0
  559. {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/domains/moderation/exceptions.py +0 -0
  560. {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/domains/moderation/models.py +0 -0
  561. {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/domains/moderation/outbox_repository.py +0 -0
  562. {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/domains/moderation/outbox_service.py +0 -0
  563. {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/domains/moderation/outcomes.py +0 -0
  564. {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/domains/moderation/repository.py +0 -0
  565. {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/domains/moderation/service.py +0 -0
  566. {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/domains/notification/__init__.py +0 -0
  567. {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/domains/notification/dependencies.py +0 -0
  568. {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/domains/notification/enums.py +0 -0
  569. {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/domains/notification/exceptions.py +0 -0
  570. {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/domains/notification/models.py +0 -0
  571. {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/domains/notification/repository.py +0 -0
  572. {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/domains/notification/service.py +0 -0
  573. {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/domains/outbox/README.md +0 -0
  574. {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/domains/outbox/__init__.py +0 -0
  575. {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/domains/outbox/dependencies.py +0 -0
  576. {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/domains/outbox/exceptions.py +0 -0
  577. {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/domains/outbox/models.py +0 -0
  578. {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/domains/outbox/ports/__init__.py +0 -0
  579. {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/domains/outbox/ports/admin.py +0 -0
  580. {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/domains/outbox/ports/consumer.py +0 -0
  581. {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/domains/outbox/ports/producer.py +0 -0
  582. {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/domains/outbox/service.py +0 -0
  583. {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/domains/post/README.md +0 -0
  584. {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/domains/post/__init__.py +0 -0
  585. {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/domains/post/constants.py +0 -0
  586. {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/domains/post/dependencies.py +0 -0
  587. {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/domains/post/discovery_rank.py +0 -0
  588. {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/domains/post/enums.py +0 -0
  589. {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/domains/post/exceptions.py +0 -0
  590. {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/domains/post/models.py +0 -0
  591. {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/domains/post/outcomes.py +0 -0
  592. {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/domains/post/repository.py +0 -0
  593. {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/domains/post/service.py +0 -0
  594. {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/domains/rating/README.md +0 -0
  595. {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/domains/rating/__init__.py +0 -0
  596. {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/domains/rating/constants.py +0 -0
  597. {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/domains/rating/dependencies.py +0 -0
  598. {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/domains/rating/exceptions.py +0 -0
  599. {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/domains/rating/models.py +0 -0
  600. {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/domains/rating/outcomes.py +0 -0
  601. {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/domains/rating/ports/subject_existence.py +0 -0
  602. {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/domains/rating/repository.py +0 -0
  603. {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/domains/rating/service.py +0 -0
  604. {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/domains/repository_sql.py +0 -0
  605. {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/domains/user/constants.py +0 -0
  606. {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/domains/user/dependencies.py +0 -0
  607. {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/domains/user/enums.py +0 -0
  608. {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/domains/user/exceptions.py +0 -0
  609. {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/domains/user/group_repository.py +0 -0
  610. {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/domains/user/group_service.py +0 -0
  611. {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/domains/user/outbox_repository.py +0 -0
  612. {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/domains/user/outbox_service.py +0 -0
  613. {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/domains/user/outcomes.py +0 -0
  614. {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/domains/user/utils.py +0 -0
  615. {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/domains/utils.py +0 -0
  616. {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/infrastructure/__init__.py +0 -0
  617. {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/infrastructure/agent/anthropic_agent_adapter.py +0 -0
  618. {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/infrastructure/agent/openai_agent_adapter.py +0 -0
  619. {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/infrastructure/email/resend_email_adapter.py +0 -0
  620. {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/infrastructure/firebase/__init__.py +0 -0
  621. {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/infrastructure/firebase/firebase_auth_adapter.py +0 -0
  622. {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/infrastructure/media/__init__.py +0 -0
  623. {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/infrastructure/media/attachment_staging_display_geometry.py +0 -0
  624. {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/infrastructure/media/local_attachment_staging_adapter.py +0 -0
  625. {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/infrastructure/media/local_avatar_staging_adapter.py +0 -0
  626. {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/infrastructure/media/local_banner_staging_adapter.py +0 -0
  627. {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/infrastructure/media/pillow_attachment_variant_encoder_adapter.py +0 -0
  628. {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/infrastructure/media/pillow_avatar_variant_encoder_adapter.py +0 -0
  629. {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/infrastructure/media/pillow_banner_variant_encoder_adapter.py +0 -0
  630. {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/infrastructure/media/pillow_staging_image.py +0 -0
  631. {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/infrastructure/media/ssh_attachment_finals_publisher_adapter.py +0 -0
  632. {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/infrastructure/media/ssh_banner_finals_publisher_adapter.py +0 -0
  633. {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/infrastructure/media/ssh_finals_publisher_adapter.py +0 -0
  634. {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/infrastructure/media/staging_paths.py +0 -0
  635. {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/infrastructure/outbox/__init__.py +0 -0
  636. {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/infrastructure/outbox/outbox_consumer_adapter.py +0 -0
  637. {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/infrastructure/outbox/outbox_producer_adapter.py +0 -0
  638. {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/main.py +0 -0
  639. {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/migrate_cli.py +0 -0
  640. {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/py.typed +0 -0
  641. {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/testing/__init__.py +0 -0
  642. {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/testing/arq.py +0 -0
  643. {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/testing/auth.py +0 -0
  644. {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/testing/blockbuster.py +0 -0
  645. {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/testing/config.py +0 -0
  646. {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/testing/containers.py +0 -0
  647. {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/testing/firebase.py +0 -0
  648. {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/testing/firebase_identity_toolkit.py +0 -0
  649. {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/testing/hookspecs.py +0 -0
  650. {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/testing/httpx_test_client.py +0 -0
  651. {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/testing/media.py +0 -0
  652. {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/testing/migrations.py +0 -0
  653. {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/testing/plugin.py +0 -0
  654. {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/worker/__init__.py +0 -0
  655. {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/worker/main.py +0 -0
  656. {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/worker/schedules/__init__.py +0 -0
  657. {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/worker/schedules/analytics_refresh_cron.py +0 -0
  658. {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/worker/schedules/schedule_aggregate_comment_stats.py +0 -0
  659. {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/worker/schedules/schedule_aggregate_post_stats.py +0 -0
  660. {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/worker/schedules/schedule_aggregate_rating_stats.py +0 -0
  661. {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/worker/schedules/schedule_aggregate_rating_subject_stats.py +0 -0
  662. {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/worker/schedules/schedule_aggregate_user_stats.py +0 -0
  663. {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/worker/schedules/schedule_expired_account_deletions.py +0 -0
  664. {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/worker/schedules/schedule_expired_mute_lifts.py +0 -0
  665. {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/worker/schedules/schedule_poll_outbox.py +0 -0
  666. {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/worker/schedules/schedule_prune_analytics_daily_facts.py +0 -0
  667. {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/worker/schedules/schedule_prune_post_views.py +0 -0
  668. {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/worker/schedules/schedule_prune_read_notifications.py +0 -0
  669. {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/worker/schedules/schedule_purge_expired_create_idempotency_keys.py +0 -0
  670. {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/worker/schedules/schedule_purge_expired_group_invites.py +0 -0
  671. {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/worker/schedules/schedule_refresh_analytics.py +0 -0
  672. {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/worker/schedules/schedule_restriction_heals.py +0 -0
  673. {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/worker/schedules/schedule_sweep_stale_attachment_staging.py +0 -0
  674. {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/worker/schedules/schedule_sweep_stale_avatar_staging.py +0 -0
  675. {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/worker/schedules/schedule_sweep_stale_banner_staging.py +0 -0
  676. {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/worker/tasks/__init__.py +0 -0
  677. {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/worker/tasks/delete_attachment_finals.py +0 -0
  678. {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/worker/tasks/delete_superseded_avatar_finals.py +0 -0
  679. {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/worker/tasks/delete_superseded_banner_finals.py +0 -0
  680. {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/worker/tasks/process_account_deletion.py +0 -0
  681. {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/worker/tasks/process_account_deletion_scheduled_email.py +0 -0
  682. {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/worker/tasks/process_admin_user_deletion.py +0 -0
  683. {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/worker/tasks/process_aggregate_comment_stats.py +0 -0
  684. {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/worker/tasks/process_aggregate_post_stats.py +0 -0
  685. {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/worker/tasks/process_aggregate_rating_stats.py +0 -0
  686. {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/worker/tasks/process_aggregate_rating_subject_stats.py +0 -0
  687. {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/worker/tasks/process_aggregate_user_stats.py +0 -0
  688. {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/worker/tasks/process_attachment_asset_variants.py +0 -0
  689. {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/worker/tasks/process_banner_asset_variants.py +0 -0
  690. {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/worker/tasks/process_block_notification_wipe.py +0 -0
  691. {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/worker/tasks/process_cache_pattern_invalidation.py +0 -0
  692. {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/worker/tasks/process_comment_tombstone_cleanup.py +0 -0
  693. {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/worker/tasks/process_destructive_comment_delete.py +0 -0
  694. {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/worker/tasks/process_destructive_post_delete.py +0 -0
  695. {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/worker/tasks/process_friendship_pair_notification_wipe.py +0 -0
  696. {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/worker/tasks/process_group_invite_notification_wipe.py +0 -0
  697. {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/worker/tasks/process_media_asset_variants.py +0 -0
  698. {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/worker/tasks/process_mute_lift.py +0 -0
  699. {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/worker/tasks/process_outbox_row.py +0 -0
  700. {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/worker/tasks/process_post_private_notification_wipe.py +0 -0
  701. {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/worker/tasks/process_post_tombstone_cleanup.py +0 -0
  702. {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/worker/tasks/process_refresh_analytics_bucket.py +0 -0
  703. {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/worker/tasks/process_restriction_reactions.py +0 -0
  704. {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/worker/tasks/process_transactional_email.py +0 -0
  705. {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/worker/tasks/process_user_content_deletion.py +0 -0
  706. {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/worker/worker_context.py +0 -0
  707. {core_framework-4.2.1 → core_framework-4.3.0}/deploy/README.md +0 -0
  708. {core_framework-4.2.1 → core_framework-4.3.0}/deploy/app/docker-compose.dev.yaml +0 -0
  709. {core_framework-4.2.1 → core_framework-4.3.0}/deploy/app/docker-compose.yml +0 -0
  710. {core_framework-4.2.1 → core_framework-4.3.0}/deploy/app/dockerfile +0 -0
  711. {core_framework-4.2.1 → core_framework-4.3.0}/deploy/observability/.env.example +0 -0
  712. {core_framework-4.2.1 → core_framework-4.3.0}/deploy/observability/README.md +0 -0
  713. {core_framework-4.2.1 → core_framework-4.3.0}/deploy/observability/docker-compose.yml +0 -0
  714. {core_framework-4.2.1 → core_framework-4.3.0}/deploy/observability/grafana/dashboards/application/api-http.json +0 -0
  715. {core_framework-4.2.1 → core_framework-4.3.0}/deploy/observability/grafana/dashboards/application/worker-jobs.json +0 -0
  716. {core_framework-4.2.1 → core_framework-4.3.0}/deploy/observability/grafana/dashboards/infrastructure/node-exporter.json +0 -0
  717. {core_framework-4.2.1 → core_framework-4.3.0}/deploy/observability/grafana/dashboards/infrastructure/postgres-exporter.json +0 -0
  718. {core_framework-4.2.1 → core_framework-4.3.0}/deploy/observability/grafana/dashboards/infrastructure/redis-exporter.json +0 -0
  719. {core_framework-4.2.1 → core_framework-4.3.0}/deploy/observability/grafana/provisioning/dashboards/dashboards.yml +0 -0
  720. {core_framework-4.2.1 → core_framework-4.3.0}/deploy/observability/grafana/provisioning/datasources/datasources.yml +0 -0
  721. {core_framework-4.2.1 → core_framework-4.3.0}/deploy/observability/loki.yaml +0 -0
  722. {core_framework-4.2.1 → core_framework-4.3.0}/deploy/observability/otel-collector-config.yaml +0 -0
  723. {core_framework-4.2.1 → core_framework-4.3.0}/deploy/observability/prometheus.yml +0 -0
  724. {core_framework-4.2.1 → core_framework-4.3.0}/deploy/observability/targets/node/.gitkeep +0 -0
  725. {core_framework-4.2.1 → core_framework-4.3.0}/deploy/observability/targets/postgres/.gitkeep +0 -0
  726. {core_framework-4.2.1 → core_framework-4.3.0}/deploy/observability/targets/redis/.gitkeep +0 -0
  727. {core_framework-4.2.1 → core_framework-4.3.0}/deploy/observability/targets.default/node.yml +0 -0
  728. {core_framework-4.2.1 → core_framework-4.3.0}/deploy/observability/targets.default/postgres.yml +0 -0
  729. {core_framework-4.2.1 → core_framework-4.3.0}/deploy/observability/targets.default/redis.yml +0 -0
  730. {core_framework-4.2.1 → core_framework-4.3.0}/deploy/observability/targets.example/README.md +0 -0
  731. {core_framework-4.2.1 → core_framework-4.3.0}/deploy/observability/tempo.yaml +0 -0
  732. {core_framework-4.2.1 → core_framework-4.3.0}/docs/README.md +0 -0
  733. {core_framework-4.2.1 → core_framework-4.3.0}/docs/deployments/README.md +0 -0
  734. {core_framework-4.2.1 → core_framework-4.3.0}/docs/deployments/deploy-playbook.md +0 -0
  735. {core_framework-4.2.1 → core_framework-4.3.0}/docs/deployments/e2e-smoke-tests-design.md +0 -0
  736. {core_framework-4.2.1 → core_framework-4.3.0}/docs/deployments/edge-rate-limits.md +0 -0
  737. {core_framework-4.2.1 → core_framework-4.3.0}/docs/deployments/edge-upload-limits.md +0 -0
  738. {core_framework-4.2.1 → core_framework-4.3.0}/docs/deployments/examples/Caddyfile.example +0 -0
  739. {core_framework-4.2.1 → core_framework-4.3.0}/docs/deployments/examples/Caddyfile.observability.example +0 -0
  740. {core_framework-4.2.1 → core_framework-4.3.0}/docs/deployments/examples/image-server-known-hosts.example +0 -0
  741. {core_framework-4.2.1 → core_framework-4.3.0}/docs/deployments/guides/playbook/postgres-backup-playbook.md +0 -0
  742. {core_framework-4.2.1 → core_framework-4.3.0}/docs/deployments/guides/playbook/py-spy-playbook.md +0 -0
  743. {core_framework-4.2.1 → core_framework-4.3.0}/docs/deployments/guides/setup/app-server-deploy-ssh.md +0 -0
  744. {core_framework-4.2.1 → core_framework-4.3.0}/docs/deployments/guides/setup/caddy-setup.md +0 -0
  745. {core_framework-4.2.1 → core_framework-4.3.0}/docs/deployments/guides/setup/cloudflare-setup.md +0 -0
  746. {core_framework-4.2.1 → core_framework-4.3.0}/docs/deployments/guides/setup/image-server-ssh.md +0 -0
  747. {core_framework-4.2.1 → core_framework-4.3.0}/docs/deployments/guides/setup/observability-lgtm-setup.md +0 -0
  748. {core_framework-4.2.1 → core_framework-4.3.0}/docs/deployments/guides/setup/postgres-backup-setup.md +0 -0
  749. {core_framework-4.2.1 → core_framework-4.3.0}/docs/deployments/guides/setup/postgres-setup.md +0 -0
  750. {core_framework-4.2.1 → core_framework-4.3.0}/docs/deployments/guides/setup/py-spy-setup.md +0 -0
  751. {core_framework-4.2.1 → core_framework-4.3.0}/docs/deployments/guides/setup/redis-setup.md +0 -0
  752. {core_framework-4.2.1 → core_framework-4.3.0}/docs/deployments/guides/setup/ubuntu-server-setup.md +0 -0
  753. {core_framework-4.2.1 → core_framework-4.3.0}/docs/deployments/host-config-defaults-design.md +0 -0
  754. {core_framework-4.2.1 → core_framework-4.3.0}/docs/deployments/host-config-defaults-implementation.md +0 -0
  755. {core_framework-4.2.1 → core_framework-4.3.0}/docs/deployments/postgres-backup-design.md +0 -0
  756. {core_framework-4.2.1 → core_framework-4.3.0}/docs/deployments/release-playbook.md +0 -0
  757. {core_framework-4.2.1 → core_framework-4.3.0}/docs/design/account-removal-spine-implementation.md +0 -0
  758. {core_framework-4.2.1 → core_framework-4.3.0}/docs/design/analytics-rollup-design.md +0 -0
  759. {core_framework-4.2.1 → core_framework-4.3.0}/docs/design/analytics-warehouse-design.md +0 -0
  760. {core_framework-4.2.1 → core_framework-4.3.0}/docs/design/bookmark-implementation.md +0 -0
  761. {core_framework-4.2.1 → core_framework-4.3.0}/docs/design/cache-invalidation-design.md +0 -0
  762. {core_framework-4.2.1 → core_framework-4.3.0}/docs/design/comment-subject-kinds-design.md +0 -0
  763. {core_framework-4.2.1 → core_framework-4.3.0}/docs/design/create-idempotency-design.md +0 -0
  764. {core_framework-4.2.1 → core_framework-4.3.0}/docs/design/event-outbox-design.md +0 -0
  765. {core_framework-4.2.1 → core_framework-4.3.0}/docs/design/events-ingest-design.md +0 -0
  766. {core_framework-4.2.1 → core_framework-4.3.0}/docs/design/list-sort-design.md +0 -0
  767. {core_framework-4.2.1 → core_framework-4.3.0}/docs/design/list-sort-implementation.md +0 -0
  768. {core_framework-4.2.1 → core_framework-4.3.0}/docs/design/media-cpu-off-api-refactor.md +0 -0
  769. {core_framework-4.2.1 → core_framework-4.3.0}/docs/design/media-storage-topology.md +0 -0
  770. {core_framework-4.2.1 → core_framework-4.3.0}/docs/design/model-call-design.md +0 -0
  771. {core_framework-4.2.1 → core_framework-4.3.0}/docs/design/model-call-implementation.md +0 -0
  772. {core_framework-4.2.1 → core_framework-4.3.0}/docs/design/moderation-restriction-fanout-design.md +0 -0
  773. {core_framework-4.2.1 → core_framework-4.3.0}/docs/design/moderation-restriction-fanout-implementation.md +0 -0
  774. {core_framework-4.2.1 → core_framework-4.3.0}/docs/design/moderator-surfaces-design.md +0 -0
  775. {core_framework-4.2.1 → core_framework-4.3.0}/docs/design/moderator-surfaces-implementation.md +0 -0
  776. {core_framework-4.2.1 → core_framework-4.3.0}/docs/design/observability-lgtm-design.md +0 -0
  777. {core_framework-4.2.1 → core_framework-4.3.0}/docs/design/outbox-admin-ops-design.md +0 -0
  778. {core_framework-4.2.1 → core_framework-4.3.0}/docs/design/rating-implementation-plan.md +0 -0
  779. {core_framework-4.2.1 → core_framework-4.3.0}/docs/design/rating-thread-owner-cue-implementation.md +0 -0
  780. {core_framework-4.2.1 → core_framework-4.3.0}/docs/design/restriction-and-block-visibility-design.md +0 -0
  781. {core_framework-4.2.1 → core_framework-4.3.0}/docs/design/restriction-and-block-visibility-implementation.md +0 -0
  782. {core_framework-4.2.1 → core_framework-4.3.0}/docs/design/utm-events-design.md +0 -0
  783. {core_framework-4.2.1 → core_framework-4.3.0}/docs/domains/agent/model_call_probe.md +0 -0
  784. {core_framework-4.2.1 → core_framework-4.3.0}/docs/domains/analytics/admin_analytics_reads.md +0 -0
  785. {core_framework-4.2.1 → core_framework-4.3.0}/docs/domains/auth/access_control.md +0 -0
  786. {core_framework-4.2.1 → core_framework-4.3.0}/docs/domains/auth/registration.md +0 -0
  787. {core_framework-4.2.1 → core_framework-4.3.0}/docs/domains/cache/admin_cache_invalidation.md +0 -0
  788. {core_framework-4.2.1 → core_framework-4.3.0}/docs/domains/comments/README.md +0 -0
  789. {core_framework-4.2.1 → core_framework-4.3.0}/docs/domains/comments/admin_comments.md +0 -0
  790. {core_framework-4.2.1 → core_framework-4.3.0}/docs/domains/comments/comment_like.md +0 -0
  791. {core_framework-4.2.1 → core_framework-4.3.0}/docs/domains/comments/comment_report.md +0 -0
  792. {core_framework-4.2.1 → core_framework-4.3.0}/docs/domains/comments/comment_stats_aggregation.md +0 -0
  793. {core_framework-4.2.1 → core_framework-4.3.0}/docs/domains/comments/create_comment.md +0 -0
  794. {core_framework-4.2.1 → core_framework-4.3.0}/docs/domains/comments/delete_comment.md +0 -0
  795. {core_framework-4.2.1 → core_framework-4.3.0}/docs/domains/comments/edit_comment.md +0 -0
  796. {core_framework-4.2.1 → core_framework-4.3.0}/docs/domains/comments/retrieve_comments.md +0 -0
  797. {core_framework-4.2.1 → core_framework-4.3.0}/docs/domains/deletion/comments.md +0 -0
  798. {core_framework-4.2.1 → core_framework-4.3.0}/docs/domains/deletion/overview.md +0 -0
  799. {core_framework-4.2.1 → core_framework-4.3.0}/docs/domains/deletion/posts.md +0 -0
  800. {core_framework-4.2.1 → core_framework-4.3.0}/docs/domains/deletion/ratings.md +0 -0
  801. {core_framework-4.2.1 → core_framework-4.3.0}/docs/domains/deletion/users.md +0 -0
  802. {core_framework-4.2.1 → core_framework-4.3.0}/docs/domains/events/events.md +0 -0
  803. {core_framework-4.2.1 → core_framework-4.3.0}/docs/domains/media/README.md +0 -0
  804. {core_framework-4.2.1 → core_framework-4.3.0}/docs/domains/media/attachment_upload.md +0 -0
  805. {core_framework-4.2.1 → core_framework-4.3.0}/docs/domains/media/avatar-upload-design.md +0 -0
  806. {core_framework-4.2.1 → core_framework-4.3.0}/docs/domains/media/banner-upload-design.md +0 -0
  807. {core_framework-4.2.1 → core_framework-4.3.0}/docs/domains/media/post-comment-attachments-design.md +0 -0
  808. {core_framework-4.2.1 → core_framework-4.3.0}/docs/domains/media/upload-pipeline-design.md +0 -0
  809. {core_framework-4.2.1 → core_framework-4.3.0}/docs/domains/media/upload_pipeline.md +0 -0
  810. {core_framework-4.2.1 → core_framework-4.3.0}/docs/domains/mentions/mentions_in_content.md +0 -0
  811. {core_framework-4.2.1 → core_framework-4.3.0}/docs/domains/moderation/README.md +0 -0
  812. {core_framework-4.2.1 → core_framework-4.3.0}/docs/domains/moderation/appeals.md +0 -0
  813. {core_framework-4.2.1 → core_framework-4.3.0}/docs/domains/moderation/internal_notes.md +0 -0
  814. {core_framework-4.2.1 → core_framework-4.3.0}/docs/domains/moderation/moderator_actions.md +0 -0
  815. {core_framework-4.2.1 → core_framework-4.3.0}/docs/domains/moderation/reports.md +0 -0
  816. {core_framework-4.2.1 → core_framework-4.3.0}/docs/domains/moderation/restrictions.md +0 -0
  817. {core_framework-4.2.1 → core_framework-4.3.0}/docs/domains/notifications/inbox-hint-design.md +0 -0
  818. {core_framework-4.2.1 → core_framework-4.3.0}/docs/domains/notifications/inbox-hint-implementation.md +0 -0
  819. {core_framework-4.2.1 → core_framework-4.3.0}/docs/domains/outbox/admin_outbox_ops.md +0 -0
  820. {core_framework-4.2.1 → core_framework-4.3.0}/docs/domains/posts/README.md +0 -0
  821. {core_framework-4.2.1 → core_framework-4.3.0}/docs/domains/posts/admin_posts.md +0 -0
  822. {core_framework-4.2.1 → core_framework-4.3.0}/docs/domains/posts/author_context.md +0 -0
  823. {core_framework-4.2.1 → core_framework-4.3.0}/docs/domains/posts/bookmark-design.md +0 -0
  824. {core_framework-4.2.1 → core_framework-4.3.0}/docs/domains/posts/bookmark.md +0 -0
  825. {core_framework-4.2.1 → core_framework-4.3.0}/docs/domains/posts/create_post.md +0 -0
  826. {core_framework-4.2.1 → core_framework-4.3.0}/docs/domains/posts/delete_post.md +0 -0
  827. {core_framework-4.2.1 → core_framework-4.3.0}/docs/domains/posts/edit_post.md +0 -0
  828. {core_framework-4.2.1 → core_framework-4.3.0}/docs/domains/posts/hashtag_discovery.md +0 -0
  829. {core_framework-4.2.1 → core_framework-4.3.0}/docs/domains/posts/post_like.md +0 -0
  830. {core_framework-4.2.1 → core_framework-4.3.0}/docs/domains/posts/post_report.md +0 -0
  831. {core_framework-4.2.1 → core_framework-4.3.0}/docs/domains/posts/post_stats_aggregation.md +0 -0
  832. {core_framework-4.2.1 → core_framework-4.3.0}/docs/domains/posts/post_visibility.md +0 -0
  833. {core_framework-4.2.1 → core_framework-4.3.0}/docs/domains/posts/retrieve_posts.md +0 -0
  834. {core_framework-4.2.1 → core_framework-4.3.0}/docs/domains/ratings/README.md +0 -0
  835. {core_framework-4.2.1 → core_framework-4.3.0}/docs/domains/ratings/admin_ratings.md +0 -0
  836. {core_framework-4.2.1 → core_framework-4.3.0}/docs/domains/ratings/delete_rating.md +0 -0
  837. {core_framework-4.2.1 → core_framework-4.3.0}/docs/domains/ratings/edit_rating.md +0 -0
  838. {core_framework-4.2.1 → core_framework-4.3.0}/docs/domains/ratings/rating-design.md +0 -0
  839. {core_framework-4.2.1 → core_framework-4.3.0}/docs/domains/ratings/rating_report.md +0 -0
  840. {core_framework-4.2.1 → core_framework-4.3.0}/docs/domains/ratings/rating_stats_aggregation.md +0 -0
  841. {core_framework-4.2.1 → core_framework-4.3.0}/docs/domains/ratings/rating_upvote.md +0 -0
  842. {core_framework-4.2.1 → core_framework-4.3.0}/docs/domains/ratings/retrieve_ratings.md +0 -0
  843. {core_framework-4.2.1 → core_framework-4.3.0}/docs/domains/ratings/upsert_rating.md +0 -0
  844. {core_framework-4.2.1 → core_framework-4.3.0}/docs/domains/users/account.md +0 -0
  845. {core_framework-4.2.1 → core_framework-4.3.0}/docs/domains/users/account_deletion.md +0 -0
  846. {core_framework-4.2.1 → core_framework-4.3.0}/docs/domains/users/admin_users.md +0 -0
  847. {core_framework-4.2.1 → core_framework-4.3.0}/docs/domains/users/avatar.md +0 -0
  848. {core_framework-4.2.1 → core_framework-4.3.0}/docs/domains/users/banner.md +0 -0
  849. {core_framework-4.2.1 → core_framework-4.3.0}/docs/domains/users/blocks.md +0 -0
  850. {core_framework-4.2.1 → core_framework-4.3.0}/docs/domains/users/change_history.md +0 -0
  851. {core_framework-4.2.1 → core_framework-4.3.0}/docs/domains/users/check_username_exists.md +0 -0
  852. {core_framework-4.2.1 → core_framework-4.3.0}/docs/domains/users/follow-system-design.md +0 -0
  853. {core_framework-4.2.1 → core_framework-4.3.0}/docs/domains/users/friendship-system-design.md +0 -0
  854. {core_framework-4.2.1 → core_framework-4.3.0}/docs/domains/users/groups-system-design.md +0 -0
  855. {core_framework-4.2.1 → core_framework-4.3.0}/docs/domains/users/my_posts_and_comments.md +0 -0
  856. {core_framework-4.2.1 → core_framework-4.3.0}/docs/domains/users/profile.md +0 -0
  857. {core_framework-4.2.1 → core_framework-4.3.0}/docs/domains/users/public_profile.md +0 -0
  858. {core_framework-4.2.1 → core_framework-4.3.0}/docs/domains/users/user_removal.md +0 -0
  859. {core_framework-4.2.1 → core_framework-4.3.0}/docs/domains/users/user_stats_aggregation.md +0 -0
  860. {core_framework-4.2.1 → core_framework-4.3.0}/docs/domains/users/username_suggest.md +0 -0
  861. {core_framework-4.2.1 → core_framework-4.3.0}/docs/library/README.md +0 -0
  862. {core_framework-4.2.1 → core_framework-4.3.0}/docs/library/capability-wiring.md +0 -0
  863. {core_framework-4.2.1 → core_framework-4.3.0}/docs/library/core-framework-migration.md +0 -0
  864. {core_framework-4.2.1 → core_framework-4.3.0}/docs/library/testing-plugin-design.md +0 -0
  865. {core_framework-4.2.1 → core_framework-4.3.0}/docs/library/workers.md +0 -0
  866. {core_framework-4.2.1 → core_framework-4.3.0}/docs/platform/README.md +0 -0
  867. {core_framework-4.2.1 → core_framework-4.3.0}/docs/platform/database-triggers.md +0 -0
  868. {core_framework-4.2.1 → core_framework-4.3.0}/docs/platform/domain-services-and-adapters.md +0 -0
  869. {core_framework-4.2.1 → core_framework-4.3.0}/docs/platform/layers-and-boundaries.md +0 -0
  870. {core_framework-4.2.1 → core_framework-4.3.0}/docs/platform/response-composition-and-caching.md +0 -0
  871. {core_framework-4.2.1 → core_framework-4.3.0}/docs/reviews/README.md +0 -0
  872. {core_framework-4.2.1 → core_framework-4.3.0}/docs/reviews/log.md +0 -0
  873. {core_framework-4.2.1 → core_framework-4.3.0}/docs/reviews/review-playbook.md +0 -0
  874. {core_framework-4.2.1 → core_framework-4.3.0}/docs/reviews/slices.md +0 -0
  875. {core_framework-4.2.1 → core_framework-4.3.0}/docs/testing.md +0 -0
  876. {core_framework-4.2.1 → core_framework-4.3.0}/firebase_config.example.json +0 -0
  877. {core_framework-4.2.1 → core_framework-4.3.0}/makefile +0 -0
  878. {core_framework-4.2.1 → core_framework-4.3.0}/tach.toml +0 -0
  879. {core_framework-4.2.1 → core_framework-4.3.0}/tests/__init__.py +0 -0
  880. {core_framework-4.2.1 → core_framework-4.3.0}/tests/conftest.py +0 -0
  881. {core_framework-4.2.1 → core_framework-4.3.0}/tests/e2e/_auth.py +0 -0
  882. {core_framework-4.2.1 → core_framework-4.3.0}/tests/e2e/_canaries.py +0 -0
  883. {core_framework-4.2.1 → core_framework-4.3.0}/tests/e2e/_media.py +0 -0
  884. {core_framework-4.2.1 → core_framework-4.3.0}/tests/e2e/_settings.py +0 -0
  885. {core_framework-4.2.1 → core_framework-4.3.0}/tests/e2e/_upload_payloads.py +0 -0
  886. {core_framework-4.2.1 → core_framework-4.3.0}/tests/e2e/conftest.py +0 -0
  887. {core_framework-4.2.1 → core_framework-4.3.0}/tests/e2e/media/pipeline_test.py +0 -0
  888. {core_framework-4.2.1 → core_framework-4.3.0}/tests/e2e/smoke/agent_probe_test.py +0 -0
  889. {core_framework-4.2.1 → core_framework-4.3.0}/tests/e2e/smoke/canary_test.py +0 -0
  890. {core_framework-4.2.1 → core_framework-4.3.0}/tests/e2e/smoke/media_test.py +0 -0
  891. {core_framework-4.2.1 → core_framework-4.3.0}/tests/e2e/smoke/system_test.py +0 -0
  892. {core_framework-4.2.1 → core_framework-4.3.0}/tests/e2e/smoke/tls_host_test.py +0 -0
  893. {core_framework-4.2.1 → core_framework-4.3.0}/tests/integration/__init__.py +0 -0
  894. {core_framework-4.2.1 → core_framework-4.3.0}/tests/integration/_http_error_details.py +0 -0
  895. {core_framework-4.2.1 → core_framework-4.3.0}/tests/integration/_poll.py +0 -0
  896. {core_framework-4.2.1 → core_framework-4.3.0}/tests/integration/analytics/_helpers.py +0 -0
  897. {core_framework-4.2.1 → core_framework-4.3.0}/tests/integration/api/__init__.py +0 -0
  898. {core_framework-4.2.1 → core_framework-4.3.0}/tests/integration/api/_auth_helpers.py +0 -0
  899. {core_framework-4.2.1 → core_framework-4.3.0}/tests/integration/api/_destructive_delete_helpers.py +0 -0
  900. {core_framework-4.2.1 → core_framework-4.3.0}/tests/integration/api/_http_helpers.py +0 -0
  901. {core_framework-4.2.1 → core_framework-4.3.0}/tests/integration/api/_outbox_helpers.py +0 -0
  902. {core_framework-4.2.1 → core_framework-4.3.0}/tests/integration/api/_user_deletion_helpers.py +0 -0
  903. {core_framework-4.2.1 → core_framework-4.3.0}/tests/integration/api/_user_helpers.py +0 -0
  904. {core_framework-4.2.1 → core_framework-4.3.0}/tests/integration/api/admin/__init__.py +0 -0
  905. {core_framework-4.2.1 → core_framework-4.3.0}/tests/integration/api/admin/_auth_cases.py +0 -0
  906. {core_framework-4.2.1 → core_framework-4.3.0}/tests/integration/api/admin/analytics/__init__.py +0 -0
  907. {core_framework-4.2.1 → core_framework-4.3.0}/tests/integration/api/admin/analytics/router_test.py +0 -0
  908. {core_framework-4.2.1 → core_framework-4.3.0}/tests/integration/api/admin/cache/__init__.py +0 -0
  909. {core_framework-4.2.1 → core_framework-4.3.0}/tests/integration/api/admin/cache/router_test.py +0 -0
  910. {core_framework-4.2.1 → core_framework-4.3.0}/tests/integration/api/admin/comments/__init__.py +0 -0
  911. {core_framework-4.2.1 → core_framework-4.3.0}/tests/integration/api/admin/comments/router_test.py +0 -0
  912. {core_framework-4.2.1 → core_framework-4.3.0}/tests/integration/api/admin/moderation/__init__.py +0 -0
  913. {core_framework-4.2.1 → core_framework-4.3.0}/tests/integration/api/admin/moderation/router_test.py +0 -0
  914. {core_framework-4.2.1 → core_framework-4.3.0}/tests/integration/api/admin/moderator_surfaces_test.py +0 -0
  915. {core_framework-4.2.1 → core_framework-4.3.0}/tests/integration/api/admin/outbox/__init__.py +0 -0
  916. {core_framework-4.2.1 → core_framework-4.3.0}/tests/integration/api/admin/outbox/router_test.py +0 -0
  917. {core_framework-4.2.1 → core_framework-4.3.0}/tests/integration/api/admin/posts/__init__.py +0 -0
  918. {core_framework-4.2.1 → core_framework-4.3.0}/tests/integration/api/admin/posts/router_test.py +0 -0
  919. {core_framework-4.2.1 → core_framework-4.3.0}/tests/integration/api/admin/users/__init__.py +0 -0
  920. {core_framework-4.2.1 → core_framework-4.3.0}/tests/integration/api/admin/users/router_test.py +0 -0
  921. {core_framework-4.2.1 → core_framework-4.3.0}/tests/integration/api/attachments/_helpers.py +0 -0
  922. {core_framework-4.2.1 → core_framework-4.3.0}/tests/integration/api/attachments/attachment_upload_test.py +0 -0
  923. {core_framework-4.2.1 → core_framework-4.3.0}/tests/integration/api/attachments/conftest.py +0 -0
  924. {core_framework-4.2.1 → core_framework-4.3.0}/tests/integration/api/auth/__init__.py +0 -0
  925. {core_framework-4.2.1 → core_framework-4.3.0}/tests/integration/api/auth/router_test.py +0 -0
  926. {core_framework-4.2.1 → core_framework-4.3.0}/tests/integration/api/comments/__init__.py +0 -0
  927. {core_framework-4.2.1 → core_framework-4.3.0}/tests/integration/api/comments/authenticated/__init__.py +0 -0
  928. {core_framework-4.2.1 → core_framework-4.3.0}/tests/integration/api/comments/authenticated/comment_writes_integration_test.py +0 -0
  929. {core_framework-4.2.1 → core_framework-4.3.0}/tests/integration/api/comments/comment_attachments_integration_test.py +0 -0
  930. {core_framework-4.2.1 → core_framework-4.3.0}/tests/integration/api/comments/comment_kind_registry_integration_test.py +0 -0
  931. {core_framework-4.2.1 → core_framework-4.3.0}/tests/integration/api/comments/public/__init__.py +0 -0
  932. {core_framework-4.2.1 → core_framework-4.3.0}/tests/integration/api/comments/public/router_test.py +0 -0
  933. {core_framework-4.2.1 → core_framework-4.3.0}/tests/integration/api/create_idempotency_integration_test.py +0 -0
  934. {core_framework-4.2.1 → core_framework-4.3.0}/tests/integration/api/events/router_test.py +0 -0
  935. {core_framework-4.2.1 → core_framework-4.3.0}/tests/integration/api/groups/groups_integration_test.py +0 -0
  936. {core_framework-4.2.1 → core_framework-4.3.0}/tests/integration/api/list_sort_integration_test.py +0 -0
  937. {core_framework-4.2.1 → core_framework-4.3.0}/tests/integration/api/media/ingest_contract_test.py +0 -0
  938. {core_framework-4.2.1 → core_framework-4.3.0}/tests/integration/api/mentions/mentions_integration_test.py +0 -0
  939. {core_framework-4.2.1 → core_framework-4.3.0}/tests/integration/api/notifications/__init__.py +0 -0
  940. {core_framework-4.2.1 → core_framework-4.3.0}/tests/integration/api/notifications/inbox_redesign_integration_test.py +0 -0
  941. {core_framework-4.2.1 → core_framework-4.3.0}/tests/integration/api/notifications/router_test.py +0 -0
  942. {core_framework-4.2.1 → core_framework-4.3.0}/tests/integration/api/posts/__init__.py +0 -0
  943. {core_framework-4.2.1 → core_framework-4.3.0}/tests/integration/api/posts/authenticated/post_writes_integration_test.py +0 -0
  944. {core_framework-4.2.1 → core_framework-4.3.0}/tests/integration/api/posts/bookmark_integration_test.py +0 -0
  945. {core_framework-4.2.1 → core_framework-4.3.0}/tests/integration/api/posts/comment_count_aggregation_test.py +0 -0
  946. {core_framework-4.2.1 → core_framework-4.3.0}/tests/integration/api/posts/followers_visibility_test.py +0 -0
  947. {core_framework-4.2.1 → core_framework-4.3.0}/tests/integration/api/posts/post_attachments_integration_test.py +0 -0
  948. {core_framework-4.2.1 → core_framework-4.3.0}/tests/integration/api/posts/post_deletion_integration_test.py +0 -0
  949. {core_framework-4.2.1 → core_framework-4.3.0}/tests/integration/api/posts/post_stats_dirty_marking_test.py +0 -0
  950. {core_framework-4.2.1 → core_framework-4.3.0}/tests/integration/api/posts/public/__init__.py +0 -0
  951. {core_framework-4.2.1 → core_framework-4.3.0}/tests/integration/api/posts/public/router_test.py +0 -0
  952. {core_framework-4.2.1 → core_framework-4.3.0}/tests/integration/api/public_read_by_id_unavailable_detail_test.py +0 -0
  953. {core_framework-4.2.1 → core_framework-4.3.0}/tests/integration/api/rate_limit_test.py +0 -0
  954. {core_framework-4.2.1 → core_framework-4.3.0}/tests/integration/api/ratings/__init__.py +0 -0
  955. {core_framework-4.2.1 → core_framework-4.3.0}/tests/integration/api/ratings/_helpers.py +0 -0
  956. {core_framework-4.2.1 → core_framework-4.3.0}/tests/integration/api/ratings/conftest.py +0 -0
  957. {core_framework-4.2.1 → core_framework-4.3.0}/tests/integration/api/ratings/ratings_integration_test.py +0 -0
  958. {core_framework-4.2.1 → core_framework-4.3.0}/tests/integration/api/ratings/ratings_visibility_integration_test.py +0 -0
  959. {core_framework-4.2.1 → core_framework-4.3.0}/tests/integration/api/restriction_visibility_integration_test.py +0 -0
  960. {core_framework-4.2.1 → core_framework-4.3.0}/tests/integration/api/system/__init__.py +0 -0
  961. {core_framework-4.2.1 → core_framework-4.3.0}/tests/integration/api/system/router_test.py +0 -0
  962. {core_framework-4.2.1 → core_framework-4.3.0}/tests/integration/api/users/__init__.py +0 -0
  963. {core_framework-4.2.1 → core_framework-4.3.0}/tests/integration/api/users/account_deletion_email_test.py +0 -0
  964. {core_framework-4.2.1 → core_framework-4.3.0}/tests/integration/api/users/authenticated/__init__.py +0 -0
  965. {core_framework-4.2.1 → core_framework-4.3.0}/tests/integration/api/users/authenticated/friendship_integration_test.py +0 -0
  966. {core_framework-4.2.1 → core_framework-4.3.0}/tests/integration/api/users/deletion_audit_integration_test.py +0 -0
  967. {core_framework-4.2.1 → core_framework-4.3.0}/tests/integration/api/users/public/__init__.py +0 -0
  968. {core_framework-4.2.1 → core_framework-4.3.0}/tests/integration/api/users/public/router_test.py +0 -0
  969. {core_framework-4.2.1 → core_framework-4.3.0}/tests/integration/api/users/user_deletion_integration_test.py +0 -0
  970. {core_framework-4.2.1 → core_framework-4.3.0}/tests/integration/conftest.py +0 -0
  971. {core_framework-4.2.1 → core_framework-4.3.0}/tests/integration/worker/__init__.py +0 -0
  972. {core_framework-4.2.1 → core_framework-4.3.0}/tests/integration/worker/_aggregate_stats_helpers.py +0 -0
  973. {core_framework-4.2.1 → core_framework-4.3.0}/tests/integration/worker/_arq_helpers.py +0 -0
  974. {core_framework-4.2.1 → core_framework-4.3.0}/tests/integration/worker/_media_upload_helpers.py +0 -0
  975. {core_framework-4.2.1 → core_framework-4.3.0}/tests/integration/worker/account_deletion_test.py +0 -0
  976. {core_framework-4.2.1 → core_framework-4.3.0}/tests/integration/worker/aggregate_comment_stats_test.py +0 -0
  977. {core_framework-4.2.1 → core_framework-4.3.0}/tests/integration/worker/aggregate_post_stats_test.py +0 -0
  978. {core_framework-4.2.1 → core_framework-4.3.0}/tests/integration/worker/aggregate_user_stats_test.py +0 -0
  979. {core_framework-4.2.1 → core_framework-4.3.0}/tests/integration/worker/analytics_prune_test.py +0 -0
  980. {core_framework-4.2.1 → core_framework-4.3.0}/tests/integration/worker/analytics_refresh_test.py +0 -0
  981. {core_framework-4.2.1 → core_framework-4.3.0}/tests/integration/worker/attachment_upload_test.py +0 -0
  982. {core_framework-4.2.1 → core_framework-4.3.0}/tests/integration/worker/conftest.py +0 -0
  983. {core_framework-4.2.1 → core_framework-4.3.0}/tests/integration/worker/create_idempotency_retention_test.py +0 -0
  984. {core_framework-4.2.1 → core_framework-4.3.0}/tests/integration/worker/moderation_outbox_test.py +0 -0
  985. {core_framework-4.2.1 → core_framework-4.3.0}/tests/integration/worker/mute_lift_test.py +0 -0
  986. {core_framework-4.2.1 → core_framework-4.3.0}/tests/integration/worker/profile_media_upload_test.py +0 -0
  987. {core_framework-4.2.1 → core_framework-4.3.0}/tests/integration/worker/read_notifications_retention_test.py +0 -0
  988. {core_framework-4.2.1 → core_framework-4.3.0}/tests/integration/worker/restriction_fanout_test.py +0 -0
  989. {core_framework-4.2.1 → core_framework-4.3.0}/tests/integration/worker/stale_staging_sweep_test.py +0 -0
  990. {core_framework-4.2.1 → core_framework-4.3.0}/tests/integration/worker/user_outbox_test.py +0 -0
  991. {core_framework-4.2.1 → core_framework-4.3.0}/tests/unit/__init__.py +0 -0
  992. {core_framework-4.2.1 → core_framework-4.3.0}/tests/unit/api/comments/authenticated/comment_request_schemas_test.py +0 -0
  993. {core_framework-4.2.1 → core_framework-4.3.0}/tests/unit/api/dedupe_preserving_order_test.py +0 -0
  994. {core_framework-4.2.1 → core_framework-4.3.0}/tests/unit/api/posts/authenticated/post_update_mapper_test.py +0 -0
  995. {core_framework-4.2.1 → core_framework-4.3.0}/tests/unit/api/ratings/review_pagination_test.py +0 -0
  996. {core_framework-4.2.1 → core_framework-4.3.0}/tests/unit/api/users/profile_update_mapper_test.py +0 -0
  997. {core_framework-4.2.1 → core_framework-4.3.0}/tests/unit/application/comments/__init__.py +0 -0
  998. {core_framework-4.2.1 → core_framework-4.3.0}/tests/unit/application/comments/kind_registry_test.py +0 -0
  999. {core_framework-4.2.1 → core_framework-4.3.0}/tests/unit/application/email/account_deletion_scheduled_test.py +0 -0
  1000. {core_framework-4.2.1 → core_framework-4.3.0}/tests/unit/application/events/event_service_test.py +0 -0
  1001. {core_framework-4.2.1 → core_framework-4.3.0}/tests/unit/application/moderation/restriction_fanout_registry_test.py +0 -0
  1002. {core_framework-4.2.1 → core_framework-4.3.0}/tests/unit/application/notifications/preview_test.py +0 -0
  1003. {core_framework-4.2.1 → core_framework-4.3.0}/tests/unit/application/ratings/kind_registry_test.py +0 -0
  1004. {core_framework-4.2.1 → core_framework-4.3.0}/tests/unit/application/shared/request_context_test.py +0 -0
  1005. {core_framework-4.2.1 → core_framework-4.3.0}/tests/unit/application/users/account_removal_registry_test.py +0 -0
  1006. {core_framework-4.2.1 → core_framework-4.3.0}/tests/unit/application/users/account_removal_runner_test.py +0 -0
  1007. {core_framework-4.2.1 → core_framework-4.3.0}/tests/unit/application/users/deletion_audit_test.py +0 -0
  1008. {core_framework-4.2.1 → core_framework-4.3.0}/tests/unit/core/bundled_alembic_test.py +0 -0
  1009. {core_framework-4.2.1 → core_framework-4.3.0}/tests/unit/core/migrate_cli_test.py +0 -0
  1010. {core_framework-4.2.1 → core_framework-4.3.0}/tests/unit/core/pagination_test.py +0 -0
  1011. {core_framework-4.2.1 → core_framework-4.3.0}/tests/unit/docs/_api_reference.py +0 -0
  1012. {core_framework-4.2.1 → core_framework-4.3.0}/tests/unit/docs/api_routes_test.py +0 -0
  1013. {core_framework-4.2.1 → core_framework-4.3.0}/tests/unit/domains/__init__.py +0 -0
  1014. {core_framework-4.2.1 → core_framework-4.3.0}/tests/unit/domains/comment/__init__.py +0 -0
  1015. {core_framework-4.2.1 → core_framework-4.3.0}/tests/unit/domains/post/models_test.py +0 -0
  1016. {core_framework-4.2.1 → core_framework-4.3.0}/tests/unit/domains/user/service_test.py +0 -0
  1017. {core_framework-4.2.1 → core_framework-4.3.0}/tests/unit/infrastructure/__init__.py +0 -0
  1018. {core_framework-4.2.1 → core_framework-4.3.0}/tests/unit/infrastructure/media/__init__.py +0 -0
  1019. {core_framework-4.2.1 → core_framework-4.3.0}/tests/unit/infrastructure/media/ssh_finals_publisher_adapter_test.py +0 -0
  1020. {core_framework-4.2.1 → core_framework-4.3.0}/tests/unit/worker/tasks_registration_test.py +0 -0
@@ -17,10 +17,14 @@ Application services orchestrate use cases shared by API and workers. They stay
17
17
  ## Outcomes
18
18
 
19
19
  - Return plain Python/domain values: `dict`, `list[dict]`, dataclasses, primitives, `None`, or empty collections.
20
- - Do not return API/Pydantic `BaseModel` instances.
20
+ - Do not return API/Pydantic `BaseModel` instances. Pydantic stays in `core_framework/api/`.
21
21
  - Signal HTTP-meaningful failures with **`application.shared.exceptions`** or plain outcomes (`None`, empty), never typed domain exceptions. Full boundary contract: **`error-boundary.mdc`**.
22
22
 
23
- Use a domain dataclass when one domain row matches the response shape; use a `dict` when the payload is composed from several sources.
23
+ A fixed set of fields that crosses a layer is a dataclass: a domain row, an outcome, or a `*Update` body. Partial writes take that `*Update` type. See `docs/platform/patch-update-typed-payload.md`.
24
+
25
+ - Return a domain dataclass when one domain row matches the result.
26
+ - Return a `dict` when the value is a mapping: a payload assembled from several sources, an id-to-row lookup, or an open bag (outbox payload, action metadata).
27
+ - Job and worker arguments stay JSON-friendly primitives: strings, numbers, booleans, `None`, lists, and dicts.
24
28
 
25
29
  ## Function shape
26
30
 
@@ -21,6 +21,12 @@ See **`docs/platform/domain-services-and-adapters.md`** for the full model. Appl
21
21
  - **Repositories** remain **Postgres-only** (SQL in repository + row mapping).
22
22
  - **Non-SQL I/O** uses **ports**, **components**, and **adapters**—not `*Repository`.
23
23
 
24
+ ## Records and mappings
25
+
26
+ - Domain rows, outcomes, and `*Update` bodies are dataclasses. Partial writes take `*Update`; column assignments come from `iter_column_updates()`. See `docs/platform/patch-update-typed-payload.md`.
27
+ - A `dict` in the domain is a mapping: an id-to-row lookup, or an open bag such as an outbox payload or action metadata.
28
+ - Composed application return values and job arguments: **`application-layer.mdc`**.
29
+
24
30
  ## Multiple services per domain
25
31
 
26
32
  - Facade **`*Service`** is wired in `dependencies`; internal **`*Component`** classes wrap ports.
@@ -12,6 +12,7 @@ globs:
12
12
  ## Policy
13
13
 
14
14
  - **Read-after-write** in the same HTTP request or worker job → **strong** read (required). Refetch with `strong_read_database`, `*_strong` repository methods, or service accessors that call them.
15
+ - A **later request** after a create uses a **normal** read. Trust the replica to catch up. A miss or a stale row in that window is accepted. Do not strong-read that request only because an earlier request created the row. See **`docs/platform/architecture-decisions.md`** → *A later request after create uses the replica (Accepted)*.
15
16
  - **Decision-critical guards** where stale data can cause incorrect branching → **strong** read (required). These are reads performed to decide a branch (for example pre-write existence, role, or state checks that determine whether a write runs or which outcome is returned), even when there is no immediate prior write in the flow. See the "Read Consistency (Strong vs Normal Reads)" ADR.
16
17
  - **Accepted exception:** **`check_caller_identity`** / **`check_not_banned`** (alias) / **`get_user_detail`** (`USER_DETAIL_V2` cache + normal reads) — ban, deleted-user, and account-removal-in-progress visibility are eventually consistent by design. The removal-started fence rides that cache; do not strong-read it on every gated request. See **`docs/platform/architecture-decisions.md`** → *Ban / identity gate via cached `USER_DETAIL` is eventually consistent*. Do not flag as a strong-read defect unless that ADR is updated.
17
18
  - **Accepted exception:** account-removal media **owner listing** of avatar/banner/attachment staging-registry rows uses the **read replica**. Replica lag or swallowed per-blob staging deletes can leave orphan staging after a successful spine. See **`docs/platform/architecture-decisions.md`** → *Account-removal staging leftovers (Accepted)*. Do not flag as a must-succeed or strong-read defect unless that ADR is updated.
@@ -43,6 +43,7 @@ After the user accepts the API layer (or if there was no API layer):
43
43
 
44
44
  - Implement the **Repository** for the domain layer (Postgres only).
45
45
  - Include the **domain model** if data is retrieved from the database.
46
+ - Domain rows, outcomes, and `*Update` bodies are dataclasses. A `dict` in the domain is a mapping or an open bag. Follow **`domain-services-and-adapters`** (records and mappings).
46
47
  - If the feature needs non-SQL I/O (filesystem, HTTP, SSH), add **ports** in the domain and **adapter implementations** under `core_framework/infrastructure/<domain>/` per `docs/platform/domain-services-and-adapters.md` — not in the repository.
47
48
  - Wait for the user to review and accept before proceeding.
48
49
 
@@ -52,6 +53,7 @@ After the user accepts the repository (and any ports/adapters):
52
53
 
53
54
  - Implement **domain service(s)** (persistence and any port-backed collaborators); wire in `dependencies.py`.
54
55
  - Implement the **application** layer (orchestration across domains and transports — no permanent home for raw I/O libraries).
56
+ - Follow **`application-layer`** for dataclass vs `dict`: a fixed field set that crosses a layer is a dataclass; a mapping, a composed payload, or an open bag is a `dict`; job arguments stay JSON-friendly primitives.
55
57
  - Wire everything together (replace 501 with real logic).
56
58
  - Wait for the user to review and accept before proceeding.
57
59
 
@@ -4,6 +4,23 @@ Notable changes to **core-framework** (import **`core_framework`**). Format foll
4
4
 
5
5
  ## [Unreleased]
6
6
 
7
+ ## [4.3.0] - 2026-10-21
8
+
9
+ ### Added
10
+
11
+ - **Paid grant with no expiry:** `paid_grants.expires_at` may be null. Null means the grant has no end, and the tier gate treats it as active. When several active items map to one tier and any of them has no expiry, the row's expiry is null. Otherwise the row keeps the latest expiry. The row is deleted when the active list omits that tier.
12
+ - **Standalone tiers:** a one-time hold with a stable string id, outside the numbered ladder. The webhook replace writes it in the same pass as ordered paid rows and deletes it when the active list omits it. The row stores no expiry. After configure, call **`register_standalone_tier`** on the API and the worker. **`require_standalone_tier`** gates a host route on that id. Core ships no such route. **`GET /users/me/entitlements`** adds **`standalone_items`** (always present; empty when the caller holds none). Account removal deletes standalone rows with the other grant rows. Delivery rows stay.
13
+ - **Admin entitlement sync:** `POST /admin/users/{target_user_id}/entitlements/sync` replaces one user's ordered paid rows and standalone rows from RevenueCat. No body. An **admin** calls it. A **moderator** receives **403**. The route stays mounted while entitlements are off and then returns **404** after the identity gate, without calling RevenueCat. A held lock is **409** **Sync in progress**. An unknown entitlement id is **409** **Unknown entitlement**. An unmapped lookup key is **409** **Unmapped entitlement**. A failed fetch is **503**. A successful replace sets that user's cursor to the later of the stored cursor and the fetch start. Complimentary rows stay. There is no moderator-action row and no delivery row.
14
+ - **Login telemetry list:** `GET /users/me/login-history` returns the caller's stored login rows, newest first: **`created_at`**, **`country_code`**, **`client_type`**, **`browser_name`**, and **`os_name`**. Writes stay on `POST /events` with `type: login`.
15
+
16
+ ### Changed
17
+
18
+ - **Preferences:** an inbox type switch on `PATCH /users/me/preferences` must be a JSON boolean. `1`, `0`, and `null` are **422**. `theme` and `language` still clear with **`null`**.
19
+
20
+ ### Database
21
+
22
+ - Run **`cf-alembic`** before API and worker start. **entitlement** applies **`8ef1f563ccb4`** (`paid_grants.expires_at` nullable) and **`244cc7430989`** (`standalone_grants`). **user** applies **`d438cfba40c0`** (`idx_user_login_events_user_created_at` on `(user_id, created_at desc, id desc)`).
23
+
7
24
  ## [4.2.1] - 2026-10-10
8
25
 
9
26
  ### Changed
@@ -819,4 +836,5 @@ First **SemVer-stable** release per **`docs/library/package-api.md`**.
819
836
  [4.1.0]: https://github.com/NepNepFFXIV/core-framework/compare/v4.0.1...v4.1.0
820
837
  [4.2.0]: https://github.com/NepNepFFXIV/core-framework/compare/v4.1.0...v4.2.0
821
838
  [4.2.1]: https://github.com/NepNepFFXIV/core-framework/compare/v4.2.0...v4.2.1
822
- [unreleased]: https://github.com/NepNepFFXIV/core-framework/compare/v4.2.1...HEAD
839
+ [4.3.0]: https://github.com/NepNepFFXIV/core-framework/compare/v4.2.1...v4.3.0
840
+ [unreleased]: https://github.com/NepNepFFXIV/core-framework/compare/v4.3.0...HEAD
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.5
2
2
  Name: core-framework
3
- Version: 4.2.1
3
+ Version: 4.3.0
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
@@ -0,0 +1,32 @@
1
+ """create standalone grants
2
+
3
+ Revision ID: 244cc7430989
4
+ Revises: 8ef1f563ccb4
5
+ Create Date: 2026-10-18 06:26:00.000000
6
+
7
+ """
8
+
9
+ from collections.abc import Sequence
10
+
11
+ from alembic import op
12
+
13
+ revision: str = "244cc7430989"
14
+ down_revision: str | Sequence[str] | None = "8ef1f563ccb4"
15
+ branch_labels: str | Sequence[str] | None = None
16
+ depends_on: str | Sequence[str] | None = None
17
+
18
+
19
+ def upgrade() -> None:
20
+ op.execute("""
21
+ create table standalone_grants (
22
+ user_id varchar(128) not null,
23
+ standalone_id varchar(64) not null,
24
+ synced_at timestamptz not null,
25
+ primary key (user_id, standalone_id),
26
+ constraint standalone_grants_standalone_id_not_blank check (length(trim(standalone_id)) > 0)
27
+ );
28
+ """)
29
+
30
+
31
+ def downgrade() -> None:
32
+ op.execute("drop table standalone_grants;")
@@ -0,0 +1,30 @@
1
+ """allow a paid grant to omit expires_at
2
+
3
+ Revision ID: 8ef1f563ccb4
4
+ Revises: b7ed2400e94e
5
+ Create Date: 2026-10-18 05:50:00.000000
6
+
7
+ """
8
+
9
+ from collections.abc import Sequence
10
+
11
+ from alembic import op
12
+
13
+ revision: str = "8ef1f563ccb4"
14
+ down_revision: str | Sequence[str] | None = "b7ed2400e94e"
15
+ branch_labels: str | Sequence[str] | None = None
16
+ depends_on: str | Sequence[str] | None = None
17
+
18
+
19
+ def upgrade() -> None:
20
+ op.execute("""
21
+ alter table paid_grants
22
+ alter column expires_at drop not null;
23
+ """)
24
+
25
+
26
+ def downgrade() -> None:
27
+ op.execute("""
28
+ alter table paid_grants
29
+ alter column expires_at set not null;
30
+ """)
@@ -0,0 +1,27 @@
1
+ """index user login telemetry by user, newest first
2
+
3
+ Revision ID: d438cfba40c0
4
+ Revises: 089f4398f943
5
+ Create Date: 2026-10-13 05:44:00.000000
6
+
7
+ """
8
+
9
+ from collections.abc import Sequence
10
+
11
+ from alembic import op
12
+
13
+ revision: str = "d438cfba40c0"
14
+ down_revision: str | Sequence[str] | None = "089f4398f943"
15
+ branch_labels: str | Sequence[str] | None = None
16
+ depends_on: str | Sequence[str] | None = None
17
+
18
+
19
+ def upgrade() -> None:
20
+ op.execute("""
21
+ create index if not exists idx_user_login_events_user_created_at
22
+ on user_login_events (user_id, created_at desc, id desc);
23
+ """)
24
+
25
+
26
+ def downgrade() -> None:
27
+ op.execute("drop index if exists idx_user_login_events_user_created_at;")
@@ -0,0 +1,74 @@
1
+ from typing import Annotated, Any
2
+
3
+ from fastapi import APIRouter, Depends, HTTPException, Path, status
4
+
5
+ from core_framework.api.dependencies import RequiredUserID, check_admin_role
6
+ from core_framework.api.entitlements.schemas import (
7
+ EntitlementItemResponse,
8
+ EntitlementsResponse,
9
+ StandaloneEntitlementItemResponse,
10
+ )
11
+ from core_framework.api.users.shared.schemas import validate_user_id
12
+ from core_framework.application.entitlement.grant_service import grant_complimentary_tier, remove_complimentary_tier
13
+ from core_framework.application.entitlement.registry import entitlements_enabled
14
+ from core_framework.application.entitlement.sync_service import sync_user_paid_entitlements
15
+ from core_framework.core.exception_handlers.common import GENERIC_NOT_FOUND_DETAIL
16
+
17
+ router = APIRouter(
18
+ prefix="/users",
19
+ tags=["entitlements - admin"],
20
+ dependencies=[Depends(check_admin_role)],
21
+ )
22
+
23
+
24
+ @router.put("/{target_user_id}/entitlements/{tier_id}", status_code=status.HTTP_204_NO_CONTENT)
25
+ async def put_complimentary_entitlement(
26
+ actor_id: RequiredUserID,
27
+ target_user_id: str,
28
+ tier_id: Annotated[int, Path(ge=1)],
29
+ ) -> None:
30
+ validated_target_user_id = validate_user_id(user_id=target_user_id)
31
+ await grant_complimentary_tier(
32
+ actor_id=actor_id,
33
+ target_user_id=validated_target_user_id,
34
+ tier_id=tier_id,
35
+ )
36
+
37
+
38
+ @router.delete("/{target_user_id}/entitlements/{tier_id}", status_code=status.HTTP_204_NO_CONTENT)
39
+ async def delete_complimentary_entitlement(
40
+ actor_id: RequiredUserID,
41
+ target_user_id: str,
42
+ tier_id: Annotated[int, Path(ge=1)],
43
+ ) -> None:
44
+ validated_target_user_id = validate_user_id(user_id=target_user_id)
45
+ await remove_complimentary_tier(
46
+ actor_id=actor_id,
47
+ target_user_id=validated_target_user_id,
48
+ tier_id=tier_id,
49
+ )
50
+
51
+
52
+ @router.post("/{target_user_id}/entitlements/sync", response_model=EntitlementsResponse)
53
+ async def sync_user_entitlements(actor_id: RequiredUserID, target_user_id: str) -> Any:
54
+ if not entitlements_enabled():
55
+ raise HTTPException(status_code=status.HTTP_404_NOT_FOUND, detail=GENERIC_NOT_FOUND_DETAIL)
56
+ validated_target_user_id = validate_user_id(user_id=target_user_id)
57
+ items, standalone_items = await sync_user_paid_entitlements(
58
+ actor_id=actor_id,
59
+ target_user_id=validated_target_user_id,
60
+ )
61
+ return EntitlementsResponse(
62
+ items=[
63
+ EntitlementItemResponse(tier_id=item.tier_id, identifier=item.identifier, expires_at=item.expires_at)
64
+ for item in items
65
+ ],
66
+ standalone_items=[
67
+ StandaloneEntitlementItemResponse(
68
+ standalone_id=item.standalone_id,
69
+ identifier=item.identifier,
70
+ expires_at=item.expires_at,
71
+ )
72
+ for item in standalone_items
73
+ ],
74
+ )
@@ -0,0 +1,44 @@
1
+ from typing import Annotated
2
+
3
+ from fastapi import Depends
4
+
5
+ from core_framework.api.dependencies import RequiredUserID, check_caller_identity
6
+ from core_framework.application.entitlement.grant_service import require_caller_standalone_tier, require_caller_tier
7
+ from core_framework.application.entitlement.registry import note_standalone_gate, note_tier_gate
8
+
9
+
10
+ def require_tier(tier_id: int):
11
+ """Route dependency for one tier id. Allows the route while entitlements are off."""
12
+ if tier_id < 1:
13
+ raise ValueError("tier_id must be at least 1")
14
+ note_tier_gate(tier_id)
15
+
16
+ async def gate(
17
+ user_id: RequiredUserID,
18
+ _: Annotated[None, Depends(check_caller_identity)],
19
+ ) -> None:
20
+ del _
21
+ await require_caller_tier(user_id=user_id, tier_id=tier_id)
22
+
23
+ return gate
24
+
25
+
26
+ def require_standalone_tier(standalone_id: str):
27
+ """Route dependency for one standalone id. Allows the route while entitlements are off."""
28
+ cleaned_id = standalone_id.strip()
29
+ if not cleaned_id:
30
+ raise ValueError("standalone tier id must be non-blank")
31
+ if "\r" in cleaned_id or "\n" in cleaned_id:
32
+ raise ValueError("standalone tier id must not contain a carriage return or line feed")
33
+ if len(cleaned_id) > 64:
34
+ raise ValueError("standalone tier id must be at most 64 characters")
35
+ note_standalone_gate(cleaned_id)
36
+
37
+ async def gate(
38
+ user_id: RequiredUserID,
39
+ _: Annotated[None, Depends(check_caller_identity)],
40
+ ) -> None:
41
+ del _
42
+ await require_caller_standalone_tier(user_id=user_id, standalone_id=cleaned_id)
43
+
44
+ return gate
@@ -3,8 +3,15 @@ from typing import Any
3
3
  from fastapi import APIRouter, Depends, Request
4
4
 
5
5
  from core_framework.api.dependencies import RequiredUserID, check_caller_identity
6
- from core_framework.api.entitlements.schemas import EntitlementItemResponse, EntitlementsResponse
7
- from core_framework.application.entitlement.grant_service import list_caller_entitlements
6
+ from core_framework.api.entitlements.schemas import (
7
+ EntitlementItemResponse,
8
+ EntitlementsResponse,
9
+ StandaloneEntitlementItemResponse,
10
+ )
11
+ from core_framework.application.entitlement.grant_service import (
12
+ list_caller_entitlements,
13
+ list_caller_standalone_entitlements,
14
+ )
8
15
  from core_framework.application.entitlement.webhook_service import handle_revenuecat_webhook
9
16
 
10
17
  webhook_router = APIRouter(tags=["entitlements"])
@@ -25,9 +32,18 @@ async def post_revenuecat_webhook(request: Request) -> None:
25
32
  )
26
33
  async def get_my_entitlements(user_id: RequiredUserID) -> Any:
27
34
  items = await list_caller_entitlements(user_id=user_id)
35
+ standalone_items = await list_caller_standalone_entitlements(user_id=user_id)
28
36
  return EntitlementsResponse(
29
37
  items=[
30
38
  EntitlementItemResponse(tier_id=item.tier_id, identifier=item.identifier, expires_at=item.expires_at)
31
39
  for item in items
32
- ]
40
+ ],
41
+ standalone_items=[
42
+ StandaloneEntitlementItemResponse(
43
+ standalone_id=item.standalone_id,
44
+ identifier=item.identifier,
45
+ expires_at=item.expires_at,
46
+ )
47
+ for item in standalone_items
48
+ ],
33
49
  )
@@ -9,5 +9,12 @@ class EntitlementItemResponse(BaseModel):
9
9
  expires_at: datetime | None
10
10
 
11
11
 
12
+ class StandaloneEntitlementItemResponse(BaseModel):
13
+ standalone_id: str = Field(min_length=1, max_length=64)
14
+ identifier: str = Field(min_length=1)
15
+ expires_at: datetime | None
16
+
17
+
12
18
  class EntitlementsResponse(BaseModel):
13
19
  items: list[EntitlementItemResponse]
20
+ standalone_items: list[StandaloneEntitlementItemResponse]
@@ -34,6 +34,7 @@ from core_framework.api.users.authenticated.schemas import (
34
34
  BlockedUserResponse,
35
35
  FollowUserResponse,
36
36
  FriendUserResponse,
37
+ LoginHistoryItemResponse,
37
38
  MyAppealsResponse,
38
39
  PreferencesResponse,
39
40
  PreferencesUpdateRequest,
@@ -79,6 +80,7 @@ from core_framework.application.users.authenticated_service import (
79
80
  retrieve_my_followers,
80
81
  retrieve_my_following,
81
82
  retrieve_my_friends,
83
+ retrieve_my_login_telemetry,
82
84
  retrieve_my_preferences,
83
85
  retrieve_my_profile,
84
86
  retrieve_my_username_suggestions,
@@ -93,6 +95,7 @@ from core_framework.application.users.authenticated_service import (
93
95
  )
94
96
  from core_framework.application.users.user_deletion_service import accept_delete_my_content
95
97
  from core_framework.core import RateLimitKey
98
+ from core_framework.core.exceptions import InvalidPageTokenError
96
99
  from core_framework.domains.media import (
97
100
  AVATAR_INGEST_MAX_BYTES,
98
101
  AVATAR_INGEST_UPLOAD_CHUNK_BYTES,
@@ -333,6 +336,37 @@ async def get_my_ratings(
333
336
  )
334
337
 
335
338
 
339
+ @router.get(
340
+ "/me/login-history",
341
+ response_model=PaginationResponse[LoginHistoryItemResponse],
342
+ dependencies=[Depends(check_caller_identity)],
343
+ )
344
+ async def get_my_login_history(
345
+ request: Request,
346
+ user_id: RequiredUserID,
347
+ pagination_params: Annotated[TokenCursorQueryParams, Depends()],
348
+ ) -> Any:
349
+ cursor_id: int | None = None
350
+ if pagination_params.cursor_string_id is not None:
351
+ try:
352
+ cursor_id = int(pagination_params.cursor_string_id)
353
+ except ValueError:
354
+ raise InvalidPageTokenError() from None
355
+ if cursor_id < 1 or cursor_id > 2**63 - 1:
356
+ raise InvalidPageTokenError()
357
+ items = await retrieve_my_login_telemetry(
358
+ user_id=user_id,
359
+ cursor_created_at=pagination_params.cursor if cursor_id is not None else None,
360
+ cursor_id=cursor_id,
361
+ limit=pagination_params.limit,
362
+ )
363
+ return paginate_datetime_id_cursor(
364
+ request=request,
365
+ items=items,
366
+ pagination_params=pagination_params,
367
+ )
368
+
369
+
336
370
  @router.get(
337
371
  "/me/preferences",
338
372
  response_model=PreferencesResponse,
@@ -49,6 +49,14 @@ class FriendUserResponse(BaseModel):
49
49
  accepted_at: datetime
50
50
 
51
51
 
52
+ class LoginHistoryItemResponse(BaseModel):
53
+ created_at: datetime
54
+ country_code: str | None
55
+ client_type: str | None
56
+ browser_name: str | None
57
+ os_name: str | None
58
+
59
+
52
60
  class ProfileResponse(AvatarMixin, BannerMixin):
53
61
  display_name: DisplayName | None
54
62
  bio: Bio | None
@@ -111,6 +119,8 @@ class PreferencesResponse(BaseModel):
111
119
  group_invites: bool = True
112
120
 
113
121
 
122
+ _StrictBool = Annotated[bool, Field(strict=True)]
123
+
114
124
  _SWITCH_FIELDS: Final[frozenset[str]] = frozenset(
115
125
  {"comments", "replies", "mentions", "follows", "friend_requests", "group_invites"}
116
126
  )
@@ -119,12 +129,12 @@ _SWITCH_FIELDS: Final[frozenset[str]] = frozenset(
119
129
  class PreferencesUpdateRequest(BasePatchRequest):
120
130
  theme: Theme | None = None
121
131
  language: Annotated[str | None, Field(default=None, max_length=10)]
122
- comments: bool | None = None
123
- replies: bool | None = None
124
- mentions: bool | None = None
125
- follows: bool | None = None
126
- friend_requests: bool | None = None
127
- group_invites: bool | None = None
132
+ comments: _StrictBool | None = None
133
+ replies: _StrictBool | None = None
134
+ mentions: _StrictBool | None = None
135
+ follows: _StrictBool | None = None
136
+ friend_requests: _StrictBool | None = None
137
+ group_invites: _StrictBool | None = None
128
138
 
129
139
  @model_validator(mode="after")
130
140
  def reject_null_switches(self) -> PreferencesUpdateRequest:
@@ -78,25 +78,29 @@ def render_entitlement_grant_refused(context: Mapping[str, Any]) -> tuple[str, s
78
78
  lookup_key = context.get("lookup_key")
79
79
  lookup_line = f"Lookup key: {lookup_key}\n" if lookup_key is not None else ""
80
80
  lookup_html = f"<p>Lookup key: {escape(str(lookup_key))}</p>" if lookup_key is not None else ""
81
- subject = "Entitlement grant refused"
81
+ subject = "Entitlement grant refused: ordered tier map or standalone map"
82
82
  plain_text_body = (
83
- "A paid grant was refused and needs attention.\n\n"
83
+ "An entitlement grant was refused and needs attention. "
84
+ "Paid rows and standalone rows were left unchanged.\n\n"
84
85
  f"Reason: {reason}\n"
85
86
  f"Entitlement id: {entitlement_id}\n"
86
87
  f"{lookup_line}"
87
88
  f"User id: {user_id}\n"
88
89
  f"Event id: {event_id}\n\n"
89
- "Fix the tier map or the RevenueCat entitlement, restart the API after an entitlement change, "
90
+ "Fix the ordered tier map or the standalone map, or the RevenueCat entitlement, "
91
+ "restart the API after an entitlement change, "
90
92
  "and resend this event from the RevenueCat dashboard.\n"
91
93
  )
92
94
  html_body = (
93
- "<p>A paid grant was refused and needs attention.</p>"
95
+ "<p>An entitlement grant was refused and needs attention. "
96
+ "Paid rows and standalone rows were left unchanged.</p>"
94
97
  f"<p>Reason: {escape(reason)}</p>"
95
98
  f"<p>Entitlement id: {escape(entitlement_id)}</p>"
96
99
  f"{lookup_html}"
97
100
  f"<p>User id: {escape(user_id)}</p>"
98
101
  f"<p>Event id: {escape(event_id)}</p>"
99
- "<p>Fix the tier map or the RevenueCat entitlement, restart the API after an entitlement change, "
102
+ "<p>Fix the ordered tier map or the standalone map, or the RevenueCat entitlement, "
103
+ "restart the API after an entitlement change, "
100
104
  "and resend this event from the RevenueCat dashboard.</p>"
101
105
  )
102
106
  return subject, html_body, plain_text_body
@@ -0,0 +1,24 @@
1
+ import asyncpg
2
+
3
+ import core_framework.domains.user.dependencies as user_deps
4
+ from core_framework.domains.user import RESERVED_USER_IDS, UserIdentity
5
+
6
+
7
+ async def is_core_user(*, user_id: str) -> bool:
8
+ """Return whether this id is a core user whose account removal has not started."""
9
+ if user_id in RESERVED_USER_IDS:
10
+ return False
11
+ identity = await user_deps.user_service.retrieve_user_identity_strong(user_id=user_id)
12
+ if identity == UserIdentity.DEFAULT:
13
+ return False
14
+ return not await user_deps.user_service.retrieve_account_removal_in_progress_strong(user_id=user_id)
15
+
16
+
17
+ async def is_core_user_on_connection(*, connection: asyncpg.Connection, user_id: str) -> bool:
18
+ """Return whether this id is a core user on a primary session already checked out."""
19
+ if user_id in RESERVED_USER_IDS:
20
+ return False
21
+ return await user_deps.user_service.retrieve_user_removal_not_started_on_connection(
22
+ connection=connection,
23
+ user_id=user_id,
24
+ )
@@ -3,15 +3,19 @@ from datetime import UTC, datetime
3
3
 
4
4
  import core_framework.domains.entitlement.dependencies as entitlement_deps
5
5
  import core_framework.domains.moderation.dependencies as moderation_deps
6
- import core_framework.domains.user.dependencies as user_deps
7
- from core_framework.application.entitlement.registry import entitlements_enabled, tier_identifier, tier_is_registered
6
+ from core_framework.application.entitlement.core_user import is_core_user
7
+ from core_framework.application.entitlement.registry import (
8
+ entitlements_enabled,
9
+ standalone_identifier,
10
+ tier_identifier,
11
+ tier_is_registered,
12
+ )
8
13
  from core_framework.application.shared.exceptions import (
9
14
  EntitlementRequiredException,
10
15
  UnprocessableEntityException,
11
16
  UserNotFoundException,
12
17
  )
13
18
  from core_framework.domains.moderation import ModerationActionType
14
- from core_framework.domains.user import RESERVED_USER_IDS, UserIdentity
15
19
 
16
20
 
17
21
  @dataclass(frozen=True, slots=True, kw_only=True)
@@ -21,6 +25,13 @@ class CallerEntitlement:
21
25
  expires_at: datetime | None
22
26
 
23
27
 
28
+ @dataclass(frozen=True, slots=True, kw_only=True)
29
+ class CallerStandaloneEntitlement:
30
+ standalone_id: str
31
+ identifier: str
32
+ expires_at: datetime | None
33
+
34
+
24
35
  async def list_caller_entitlements(*, user_id: str) -> list[CallerEntitlement]:
25
36
  """Return this caller's active tiers with each tier's identifier."""
26
37
  tiers = await entitlement_deps.entitlement_service.list_active_tiers(user_id=user_id)
@@ -33,6 +44,18 @@ async def list_caller_entitlements(*, user_id: str) -> list[CallerEntitlement]:
33
44
  return items
34
45
 
35
46
 
47
+ async def list_caller_standalone_entitlements(*, user_id: str) -> list[CallerStandaloneEntitlement]:
48
+ """Return this caller's standalone holds with each id's lookup key."""
49
+ standalone_ids = await entitlement_deps.entitlement_service.list_standalone_ids(user_id=user_id)
50
+ items: list[CallerStandaloneEntitlement] = []
51
+ for standalone_id in standalone_ids:
52
+ identifier = standalone_identifier(standalone_id)
53
+ if identifier is None:
54
+ continue
55
+ items.append(CallerStandaloneEntitlement(standalone_id=standalone_id, identifier=identifier, expires_at=None))
56
+ return items
57
+
58
+
36
59
  async def caller_holds_tier(*, user_id: str, tier_id: int) -> bool:
37
60
  """Return whether the caller holds an active tier at or above the gate. Off means yes."""
38
61
  if not entitlements_enabled():
@@ -47,11 +70,27 @@ async def require_caller_tier(*, user_id: str, tier_id: int) -> None:
47
70
  raise EntitlementRequiredException()
48
71
 
49
72
 
73
+ async def caller_holds_standalone_tier(*, user_id: str, standalone_id: str) -> bool:
74
+ """Return whether the caller holds that standalone id. Off means yes."""
75
+ if not entitlements_enabled():
76
+ return True
77
+ return await entitlement_deps.entitlement_service.standalone_grant_exists(
78
+ user_id=user_id,
79
+ standalone_id=standalone_id,
80
+ )
81
+
82
+
83
+ async def require_caller_standalone_tier(*, user_id: str, standalone_id: str) -> None:
84
+ """Raise when entitlements are on and the caller does not hold that standalone id."""
85
+ if not await caller_holds_standalone_tier(user_id=user_id, standalone_id=standalone_id):
86
+ raise EntitlementRequiredException()
87
+
88
+
50
89
  async def grant_complimentary_tier(*, actor_id: str, target_user_id: str, tier_id: int) -> None:
51
90
  """Grant a complimentary tier. Unknown tier is 422. A missing or removing target is 404."""
52
91
  if not tier_is_registered(tier_id):
53
92
  raise UnprocessableEntityException()
54
- if not await _is_core_user(user_id=target_user_id):
93
+ if not await is_core_user(user_id=target_user_id):
55
94
  raise UserNotFoundException()
56
95
  inserted = await entitlement_deps.entitlement_service.insert_complimentary_grant(
57
96
  user_id=target_user_id,
@@ -85,12 +124,3 @@ async def remove_complimentary_tier(*, actor_id: str, target_user_id: str, tier_
85
124
  target_user_id=target_user_id,
86
125
  action_metadata={"tier_id": tier_id},
87
126
  )
88
-
89
-
90
- async def _is_core_user(*, user_id: str) -> bool:
91
- if user_id in RESERVED_USER_IDS:
92
- return False
93
- identity = await user_deps.user_service.retrieve_user_identity_strong(user_id=user_id)
94
- if identity == UserIdentity.DEFAULT:
95
- return False
96
- return not await user_deps.user_service.retrieve_account_removal_in_progress_strong(user_id=user_id)