core-framework 3.2.0__tar.gz → 4.0.0__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- core_framework-4.0.0/.cursor/rules/alembic-migrations.mdc +61 -0
- core_framework-4.0.0/.cursor/rules/constitution.mdc +50 -0
- core_framework-4.0.0/.cursor/rules/domain-imports.mdc +44 -0
- core_framework-4.0.0/.cursor/rules/error-boundary.mdc +56 -0
- core_framework-4.0.0/.cursor/rules/flow-documentation.mdc +15 -0
- core_framework-4.0.0/.cursor/rules/ignore-analytics-warehouse.mdc +21 -0
- core_framework-4.0.0/.cursor/rules/integration-test-strategy.mdc +30 -0
- core_framework-4.0.0/.cursor/rules/no-code-in-docs.mdc +36 -0
- core_framework-4.0.0/.cursor/rules/postgres-config-conventions.mdc +57 -0
- core_framework-4.0.0/.cursor/rules/repository-schema-isolation.mdc +89 -0
- core_framework-4.0.0/.cursor/rules/strong-reads.mdc +39 -0
- core_framework-4.0.0/.cursor/skills/code-review/SKILL.md +85 -0
- core_framework-4.0.0/.cursor/skills/design-review/SKILL.md +59 -0
- core_framework-4.0.0/.cursor/skills/grill/SKILL.md +75 -0
- core_framework-4.0.0/.cursor/skills/implement-feature/SKILL.md +109 -0
- core_framework-4.0.0/.cursor/skills/write-flow-doc/SKILL.md +84 -0
- core_framework-4.0.0/.github/ci/package-smoke.sh +13 -0
- core_framework-4.0.0/.github/ci/package_smoke.py +306 -0
- core_framework-4.0.0/.github/workflows/_deploy.yml +245 -0
- core_framework-4.0.0/.github/workflows/dev-ci-cd.yaml +178 -0
- core_framework-4.0.0/.github/workflows/manual-deployment.yaml +53 -0
- core_framework-4.0.0/.github/workflows/manual-observability-deployment.yaml +268 -0
- core_framework-4.0.0/.github/workflows/test.yaml +129 -0
- core_framework-4.0.0/CHANGELOG.md +773 -0
- core_framework-4.0.0/PKG-INFO +144 -0
- core_framework-4.0.0/README.md +97 -0
- core_framework-4.0.0/alembic/comment/alembic/versions/comment_subject_kind_varchar.py +42 -0
- core_framework-4.0.0/alembic/moderation/alembic/versions/3027828c2c80_align_dead_outbox_keyset_index.py +34 -0
- core_framework-4.0.0/alembic/moderation/alembic/versions/5be85718122a_moderation_add_review_reports.py +55 -0
- core_framework-4.0.0/alembic/notification/alembic/versions/a5f29155815d_notification_add_friendship_types.py +28 -0
- core_framework-4.0.0/alembic/notification/alembic/versions/b1263ed1a303_notification_inbox_redesign_preview.py +47 -0
- core_framework-4.0.0/alembic/notification/alembic/versions/c6b9941065ec_notification_add_group_invite_type.py +28 -0
- core_framework-4.0.0/alembic/notification/alembic/versions/fbe8476b4437_notification_add_rating_owner_cue_labels.py +29 -0
- core_framework-4.0.0/alembic/rating/alembic/env.py +74 -0
- core_framework-4.0.0/alembic/rating/alembic/versions/04182d734619_rating_list_indexes.py +38 -0
- core_framework-4.0.0/alembic/rating/alembic/versions/2ef924b0be4c_rating_schema.py +150 -0
- core_framework-4.0.0/alembic/rating/alembic.ini +52 -0
- core_framework-4.0.0/alembic/user/alembic/README +1 -0
- core_framework-4.0.0/alembic/user/alembic/script.py.mako +28 -0
- core_framework-4.0.0/alembic/user/alembic/versions/24ba262c4ef2_user_add_account_removal_started_at.py +30 -0
- core_framework-4.0.0/alembic/user/alembic/versions/2dc1d398a840_user_add_groups.py +120 -0
- core_framework-4.0.0/alembic/user/alembic/versions/7078e4313554_user_add_friendships.py +78 -0
- core_framework-4.0.0/alembic/user/alembic/versions/922eece707db_align_dead_outbox_keyset_index.py +34 -0
- core_framework-4.0.0/config.toml +148 -0
- core_framework-4.0.0/config.toml.template +136 -0
- core_framework-4.0.0/core_framework/api/admin/analytics/router.py +46 -0
- core_framework-4.0.0/core_framework/api/admin/analytics/schemas.py +59 -0
- core_framework-4.0.0/core_framework/api/admin/cache/router.py +27 -0
- core_framework-4.0.0/core_framework/api/admin/cache/schemas.py +91 -0
- core_framework-4.0.0/core_framework/api/admin/comments/router.py +69 -0
- core_framework-4.0.0/core_framework/api/admin/comments/schemas.py +45 -0
- core_framework-4.0.0/core_framework/api/admin/moderation/router.py +222 -0
- core_framework-4.0.0/core_framework/api/admin/moderation/schemas.py +120 -0
- core_framework-4.0.0/core_framework/api/admin/outbox/router.py +63 -0
- core_framework-4.0.0/core_framework/api/admin/posts/router.py +62 -0
- core_framework-4.0.0/core_framework/api/admin/posts/schemas.py +32 -0
- core_framework-4.0.0/core_framework/api/admin/ratings/router.py +46 -0
- core_framework-4.0.0/core_framework/api/admin/ratings/schemas.py +25 -0
- core_framework-4.0.0/core_framework/api/admin/router.py +25 -0
- core_framework-4.0.0/core_framework/api/admin/users/router.py +206 -0
- core_framework-4.0.0/core_framework/api/admin/users/schemas.py +137 -0
- core_framework-4.0.0/core_framework/api/attachments/router.py +45 -0
- core_framework-4.0.0/core_framework/api/attachments/schemas.py +48 -0
- core_framework-4.0.0/core_framework/api/auth/router.py +26 -0
- core_framework-4.0.0/core_framework/api/auth/schemas.py +15 -0
- core_framework-4.0.0/core_framework/api/comments/authenticated/mappers.py +21 -0
- core_framework-4.0.0/core_framework/api/comments/authenticated/router.py +145 -0
- core_framework-4.0.0/core_framework/api/comments/authenticated/schemas.py +78 -0
- core_framework-4.0.0/core_framework/api/comments/public/router.py +121 -0
- core_framework-4.0.0/core_framework/api/comments/public/schemas.py +44 -0
- core_framework-4.0.0/core_framework/api/comments/schemas.py +29 -0
- core_framework-4.0.0/core_framework/api/dependencies.py +209 -0
- core_framework-4.0.0/core_framework/api/events/router.py +56 -0
- core_framework-4.0.0/core_framework/api/groups/router.py +207 -0
- core_framework-4.0.0/core_framework/api/groups/schemas.py +69 -0
- core_framework-4.0.0/core_framework/api/notifications/authenticated/router.py +78 -0
- core_framework-4.0.0/core_framework/api/notifications/authenticated/schemas.py +141 -0
- core_framework-4.0.0/core_framework/api/pagination.py +239 -0
- core_framework-4.0.0/core_framework/api/posts/authenticated/mappers.py +23 -0
- core_framework-4.0.0/core_framework/api/posts/authenticated/router.py +116 -0
- core_framework-4.0.0/core_framework/api/posts/authenticated/schemas.py +77 -0
- core_framework-4.0.0/core_framework/api/posts/public/router.py +110 -0
- core_framework-4.0.0/core_framework/api/posts/schemas.py +37 -0
- core_framework-4.0.0/core_framework/api/ratings/authenticated/router.py +99 -0
- core_framework-4.0.0/core_framework/api/ratings/pagination.py +37 -0
- core_framework-4.0.0/core_framework/api/ratings/public/router.py +79 -0
- core_framework-4.0.0/core_framework/api/ratings/router.py +9 -0
- core_framework-4.0.0/core_framework/api/ratings/schemas.py +125 -0
- core_framework-4.0.0/core_framework/api/router.py +27 -0
- core_framework-4.0.0/core_framework/api/schemas.py +24 -0
- core_framework-4.0.0/core_framework/api/users/authenticated/router.py +748 -0
- core_framework-4.0.0/core_framework/api/users/authenticated/schemas.py +110 -0
- core_framework-4.0.0/core_framework/api/users/public/router.py +66 -0
- core_framework-4.0.0/core_framework/api/users/public/schemas.py +35 -0
- core_framework-4.0.0/core_framework/api/users/shared/mappers.py +18 -0
- core_framework-4.0.0/core_framework/api/users/shared/schemas.py +205 -0
- core_framework-4.0.0/core_framework/application/analytics/bucket_service.py +77 -0
- core_framework-4.0.0/core_framework/application/analytics/read_service.py +74 -0
- core_framework-4.0.0/core_framework/application/analytics/refresh_service.py +62 -0
- core_framework-4.0.0/core_framework/application/auth/access_service.py +31 -0
- core_framework-4.0.0/core_framework/application/auth/auth_service.py +53 -0
- core_framework-4.0.0/core_framework/application/auth/models.py +13 -0
- core_framework-4.0.0/core_framework/application/auth/token_verification.py +32 -0
- core_framework-4.0.0/core_framework/application/bootstrap.py +73 -0
- core_framework-4.0.0/core_framework/application/comments/__init__.py +13 -0
- core_framework-4.0.0/core_framework/application/comments/admin_service.py +592 -0
- core_framework-4.0.0/core_framework/application/comments/aggregation_service.py +57 -0
- core_framework-4.0.0/core_framework/application/comments/authenticated_service.py +271 -0
- core_framework-4.0.0/core_framework/application/comments/cleanup_service.py +170 -0
- core_framework-4.0.0/core_framework/application/comments/host_service.py +40 -0
- core_framework-4.0.0/core_framework/application/comments/kind_registry.py +35 -0
- core_framework-4.0.0/core_framework/application/comments/post_subject.py +89 -0
- core_framework-4.0.0/core_framework/application/comments/public_service.py +382 -0
- core_framework-4.0.0/core_framework/application/comments/rating_subject.py +67 -0
- core_framework-4.0.0/core_framework/application/email/__init__.py +13 -0
- core_framework-4.0.0/core_framework/application/email/account_deletion_scheduled.py +77 -0
- core_framework-4.0.0/core_framework/application/events/README.md +33 -0
- core_framework-4.0.0/core_framework/application/events/event_service.py +207 -0
- core_framework-4.0.0/core_framework/application/groups/authenticated_service.py +291 -0
- core_framework-4.0.0/core_framework/application/groups/cleanup_service.py +52 -0
- core_framework-4.0.0/core_framework/application/groups/group_invite_link_token.py +68 -0
- core_framework-4.0.0/core_framework/application/groups/strip_service.py +71 -0
- core_framework-4.0.0/core_framework/application/media/README.md +28 -0
- core_framework-4.0.0/core_framework/application/media/attachment_service.py +524 -0
- core_framework-4.0.0/core_framework/application/media/avatar_service.py +189 -0
- core_framework-4.0.0/core_framework/application/media/banner_service.py +185 -0
- core_framework-4.0.0/core_framework/application/moderation/appeal_service.py +98 -0
- core_framework-4.0.0/core_framework/application/moderation/moderator_service.py +41 -0
- core_framework-4.0.0/core_framework/application/moderation/report_service.py +210 -0
- core_framework-4.0.0/core_framework/application/moderation/restriction_fanout/__init__.py +17 -0
- core_framework-4.0.0/core_framework/application/moderation/restriction_fanout/heals.py +48 -0
- core_framework-4.0.0/core_framework/application/moderation/restriction_fanout/mirrors.py +50 -0
- core_framework-4.0.0/core_framework/application/moderation/restriction_fanout/reactions.py +12 -0
- core_framework-4.0.0/core_framework/application/moderation/restriction_fanout/registry.py +182 -0
- core_framework-4.0.0/core_framework/application/moderation/restriction_fanout/runner.py +154 -0
- core_framework-4.0.0/core_framework/application/moderation/user_service.py +168 -0
- core_framework-4.0.0/core_framework/application/notifications/README.md +25 -0
- core_framework-4.0.0/core_framework/application/notifications/enums.py +15 -0
- core_framework-4.0.0/core_framework/application/notifications/friendship_notification_service.py +68 -0
- core_framework-4.0.0/core_framework/application/notifications/group_invite_notification_service.py +54 -0
- core_framework-4.0.0/core_framework/application/notifications/inbox_service.py +148 -0
- core_framework-4.0.0/core_framework/application/notifications/mute_service.py +40 -0
- core_framework-4.0.0/core_framework/application/notifications/notification_service.py +252 -0
- core_framework-4.0.0/core_framework/application/notifications/preview.py +12 -0
- core_framework-4.0.0/core_framework/application/notifications/wipe_service.py +78 -0
- core_framework-4.0.0/core_framework/application/outbox/block_mirrors.py +67 -0
- core_framework-4.0.0/core_framework/application/outbox/events.py +133 -0
- core_framework-4.0.0/core_framework/application/outbox/handlers.py +137 -0
- core_framework-4.0.0/core_framework/application/outbox/ops_service.py +74 -0
- core_framework-4.0.0/core_framework/application/outbox/processing_service.py +105 -0
- core_framework-4.0.0/core_framework/application/outbox/restriction_mirrors.py +61 -0
- core_framework-4.0.0/core_framework/application/posts/admin_service.py +389 -0
- core_framework-4.0.0/core_framework/application/posts/aggregation_service.py +59 -0
- core_framework-4.0.0/core_framework/application/posts/authenticated_service.py +153 -0
- core_framework-4.0.0/core_framework/application/posts/cleanup_service.py +182 -0
- core_framework-4.0.0/core_framework/application/posts/public_service.py +264 -0
- core_framework-4.0.0/core_framework/application/ratings/__init__.py +9 -0
- core_framework-4.0.0/core_framework/application/ratings/admin_service.py +56 -0
- core_framework-4.0.0/core_framework/application/ratings/aggregation_service.py +52 -0
- core_framework-4.0.0/core_framework/application/ratings/authenticated_service.py +107 -0
- core_framework-4.0.0/core_framework/application/ratings/kind_registry.py +39 -0
- core_framework-4.0.0/core_framework/application/ratings/public_service.py +140 -0
- core_framework-4.0.0/core_framework/application/ratings/purge_service.py +53 -0
- core_framework-4.0.0/core_framework/application/ratings/serialization.py +134 -0
- core_framework-4.0.0/core_framework/application/ratings/subject_existence.py +33 -0
- core_framework-4.0.0/core_framework/application/shared/deletion_cleanup_ledger.py +60 -0
- core_framework-4.0.0/core_framework/application/shared/enums.py +51 -0
- core_framework-4.0.0/core_framework/application/shared/exceptions.py +100 -0
- core_framework-4.0.0/core_framework/application/shared/worker_jobs.py +63 -0
- core_framework-4.0.0/core_framework/application/users/account_removal/__init__.py +11 -0
- core_framework-4.0.0/core_framework/application/users/account_removal/contributors.py +96 -0
- core_framework-4.0.0/core_framework/application/users/account_removal/registry.py +99 -0
- core_framework-4.0.0/core_framework/application/users/account_removal/runner.py +122 -0
- core_framework-4.0.0/core_framework/application/users/admin_service.py +257 -0
- core_framework-4.0.0/core_framework/application/users/aggregation_service.py +22 -0
- core_framework-4.0.0/core_framework/application/users/authenticated_service.py +616 -0
- core_framework-4.0.0/core_framework/application/users/identity_enrichment.py +28 -0
- core_framework-4.0.0/core_framework/application/users/public_service.py +195 -0
- core_framework-4.0.0/core_framework/application/users/scheduled_service.py +6 -0
- core_framework-4.0.0/core_framework/application/users/user_deletion_service.py +693 -0
- core_framework-4.0.0/core_framework/bundled_alembic.py +45 -0
- core_framework-4.0.0/core_framework/constants.py +29 -0
- core_framework-4.0.0/core_framework/core/__init__.py +45 -0
- core_framework-4.0.0/core_framework/core/cache.py +229 -0
- core_framework-4.0.0/core_framework/core/exception_handlers/application.py +152 -0
- core_framework-4.0.0/core_framework/core/exception_handlers/common.py +78 -0
- core_framework-4.0.0/core_framework/core/exception_handlers/setup.py +46 -0
- core_framework-4.0.0/core_framework/core/middleware.py +160 -0
- core_framework-4.0.0/core_framework/core/observability.py +649 -0
- core_framework-4.0.0/core_framework/core/pagination.py +123 -0
- core_framework-4.0.0/core_framework/core/rate_limit.py +340 -0
- core_framework-4.0.0/core_framework/core/settings.py +922 -0
- core_framework-4.0.0/core_framework/domains/analytics/README.md +25 -0
- core_framework-4.0.0/core_framework/domains/analytics/__init__.py +24 -0
- core_framework-4.0.0/core_framework/domains/analytics/constants.py +22 -0
- core_framework-4.0.0/core_framework/domains/analytics/repository.py +261 -0
- core_framework-4.0.0/core_framework/domains/analytics/service.py +306 -0
- core_framework-4.0.0/core_framework/domains/auth/README.md +78 -0
- core_framework-4.0.0/core_framework/domains/auth/__init__.py +18 -0
- core_framework-4.0.0/core_framework/domains/auth/dependencies.py +28 -0
- core_framework-4.0.0/core_framework/domains/auth/exceptions.py +14 -0
- core_framework-4.0.0/core_framework/domains/auth/models.py +31 -0
- core_framework-4.0.0/core_framework/domains/auth/outcomes.py +24 -0
- core_framework-4.0.0/core_framework/domains/auth/ports/auth.py +73 -0
- core_framework-4.0.0/core_framework/domains/auth/service.py +188 -0
- core_framework-4.0.0/core_framework/domains/comment/README.md +271 -0
- core_framework-4.0.0/core_framework/domains/comment/__init__.py +76 -0
- core_framework-4.0.0/core_framework/domains/comment/constants.py +13 -0
- core_framework-4.0.0/core_framework/domains/comment/enums.py +28 -0
- core_framework-4.0.0/core_framework/domains/comment/exceptions.py +30 -0
- core_framework-4.0.0/core_framework/domains/comment/models.py +223 -0
- core_framework-4.0.0/core_framework/domains/comment/outcomes.py +25 -0
- core_framework-4.0.0/core_framework/domains/comment/ports/subject.py +88 -0
- core_framework-4.0.0/core_framework/domains/comment/repository.py +2523 -0
- core_framework-4.0.0/core_framework/domains/comment/service.py +980 -0
- core_framework-4.0.0/core_framework/domains/email/dependencies.py +101 -0
- core_framework-4.0.0/core_framework/domains/email/models.py +3 -0
- core_framework-4.0.0/core_framework/domains/media/README.md +34 -0
- core_framework-4.0.0/core_framework/domains/media/__init__.py +57 -0
- core_framework-4.0.0/core_framework/domains/media/attachment/components/staging.py +165 -0
- core_framework-4.0.0/core_framework/domains/media/attachment/components/variant_encoder.py +28 -0
- core_framework-4.0.0/core_framework/domains/media/attachment/constants.py +39 -0
- core_framework-4.0.0/core_framework/domains/media/attachment/models.py +29 -0
- core_framework-4.0.0/core_framework/domains/media/attachment/ports/variant_encoder.py +26 -0
- core_framework-4.0.0/core_framework/domains/media/attachment/service.py +459 -0
- core_framework-4.0.0/core_framework/domains/media/avatar/service.py +343 -0
- core_framework-4.0.0/core_framework/domains/media/banner/service.py +338 -0
- core_framework-4.0.0/core_framework/domains/media/dependencies.py +314 -0
- core_framework-4.0.0/core_framework/domains/media/shared/outcomes.py +17 -0
- core_framework-4.0.0/core_framework/domains/media/shared/repository.py +812 -0
- core_framework-4.0.0/core_framework/domains/moderation/README.md +164 -0
- core_framework-4.0.0/core_framework/domains/moderation/dependencies.py +91 -0
- core_framework-4.0.0/core_framework/domains/moderation/enums.py +68 -0
- core_framework-4.0.0/core_framework/domains/moderation/outbox_repository.py +190 -0
- core_framework-4.0.0/core_framework/domains/moderation/outbox_service.py +53 -0
- core_framework-4.0.0/core_framework/domains/moderation/repository.py +1686 -0
- core_framework-4.0.0/core_framework/domains/moderation/service.py +1053 -0
- core_framework-4.0.0/core_framework/domains/notification/README.md +144 -0
- core_framework-4.0.0/core_framework/domains/notification/__init__.py +15 -0
- core_framework-4.0.0/core_framework/domains/notification/enums.py +26 -0
- core_framework-4.0.0/core_framework/domains/notification/models.py +18 -0
- core_framework-4.0.0/core_framework/domains/notification/repository.py +941 -0
- core_framework-4.0.0/core_framework/domains/notification/service.py +489 -0
- core_framework-4.0.0/core_framework/domains/outbox/README.md +69 -0
- core_framework-4.0.0/core_framework/domains/outbox/__init__.py +23 -0
- core_framework-4.0.0/core_framework/domains/outbox/ports/admin.py +36 -0
- core_framework-4.0.0/core_framework/domains/outbox/service.py +63 -0
- core_framework-4.0.0/core_framework/domains/post/README.md +216 -0
- core_framework-4.0.0/core_framework/domains/post/__init__.py +44 -0
- core_framework-4.0.0/core_framework/domains/post/constants.py +8 -0
- core_framework-4.0.0/core_framework/domains/post/enums.py +35 -0
- core_framework-4.0.0/core_framework/domains/post/exceptions.py +20 -0
- core_framework-4.0.0/core_framework/domains/post/models.py +217 -0
- core_framework-4.0.0/core_framework/domains/post/repository.py +2175 -0
- core_framework-4.0.0/core_framework/domains/post/service.py +990 -0
- core_framework-4.0.0/core_framework/domains/rating/README.md +81 -0
- core_framework-4.0.0/core_framework/domains/rating/__init__.py +31 -0
- core_framework-4.0.0/core_framework/domains/rating/constants.py +10 -0
- core_framework-4.0.0/core_framework/domains/rating/dependencies.py +61 -0
- core_framework-4.0.0/core_framework/domains/rating/exceptions.py +5 -0
- core_framework-4.0.0/core_framework/domains/rating/models.py +52 -0
- core_framework-4.0.0/core_framework/domains/rating/outcomes.py +13 -0
- core_framework-4.0.0/core_framework/domains/rating/ports/subject_existence.py +18 -0
- core_framework-4.0.0/core_framework/domains/rating/repository.py +1365 -0
- core_framework-4.0.0/core_framework/domains/rating/service.py +901 -0
- core_framework-4.0.0/core_framework/domains/repository_sql.py +90 -0
- core_framework-4.0.0/core_framework/domains/user/README.md +140 -0
- core_framework-4.0.0/core_framework/domains/user/__init__.py +95 -0
- core_framework-4.0.0/core_framework/domains/user/constants.py +38 -0
- core_framework-4.0.0/core_framework/domains/user/dependencies.py +132 -0
- core_framework-4.0.0/core_framework/domains/user/enums.py +24 -0
- core_framework-4.0.0/core_framework/domains/user/group_repository.py +1708 -0
- core_framework-4.0.0/core_framework/domains/user/group_service.py +572 -0
- core_framework-4.0.0/core_framework/domains/user/models.py +412 -0
- core_framework-4.0.0/core_framework/domains/user/outbox_repository.py +189 -0
- core_framework-4.0.0/core_framework/domains/user/outbox_service.py +53 -0
- core_framework-4.0.0/core_framework/domains/user/outcomes.py +72 -0
- core_framework-4.0.0/core_framework/domains/user/repository.py +2341 -0
- core_framework-4.0.0/core_framework/domains/user/service.py +1248 -0
- core_framework-4.0.0/core_framework/domains/utils.py +244 -0
- core_framework-4.0.0/core_framework/infrastructure/firebase/firebase_auth_adapter.py +156 -0
- core_framework-4.0.0/core_framework/infrastructure/media/attachment_staging_display_geometry.py +45 -0
- core_framework-4.0.0/core_framework/infrastructure/media/pillow_attachment_variant_encoder_adapter.py +164 -0
- core_framework-4.0.0/core_framework/main.py +69 -0
- core_framework-4.0.0/core_framework/testing/__init__.py +19 -0
- core_framework-4.0.0/core_framework/testing/arq.py +141 -0
- core_framework-4.0.0/core_framework/testing/auth.py +351 -0
- core_framework-4.0.0/core_framework/testing/blockbuster.py +38 -0
- core_framework-4.0.0/core_framework/testing/config.py +48 -0
- core_framework-4.0.0/core_framework/testing/containers.py +101 -0
- core_framework-4.0.0/core_framework/testing/hookspecs.py +16 -0
- core_framework-4.0.0/core_framework/testing/media.py +271 -0
- core_framework-4.0.0/core_framework/testing/plugin.py +250 -0
- core_framework-4.0.0/core_framework/worker/main.py +172 -0
- core_framework-4.0.0/core_framework/worker/schedules/__init__.py +172 -0
- core_framework-4.0.0/core_framework/worker/schedules/schedule_aggregate_rating_stats.py +43 -0
- core_framework-4.0.0/core_framework/worker/schedules/schedule_aggregate_rating_subject_stats.py +65 -0
- core_framework-4.0.0/core_framework/worker/schedules/schedule_expired_account_deletions.py +37 -0
- core_framework-4.0.0/core_framework/worker/schedules/schedule_expired_mute_lifts.py +36 -0
- core_framework-4.0.0/core_framework/worker/schedules/schedule_purge_expired_create_idempotency_keys.py +25 -0
- core_framework-4.0.0/core_framework/worker/schedules/schedule_purge_expired_group_invites.py +18 -0
- core_framework-4.0.0/core_framework/worker/schedules/schedule_refresh_analytics.py +15 -0
- core_framework-4.0.0/core_framework/worker/schedules/schedule_restriction_heals.py +15 -0
- core_framework-4.0.0/core_framework/worker/tasks/__init__.py +166 -0
- core_framework-4.0.0/core_framework/worker/tasks/process_account_deletion.py +21 -0
- core_framework-4.0.0/core_framework/worker/tasks/process_aggregate_rating_stats.py +19 -0
- core_framework-4.0.0/core_framework/worker/tasks/process_aggregate_rating_subject_stats.py +30 -0
- core_framework-4.0.0/core_framework/worker/tasks/process_block_notification_wipe.py +35 -0
- core_framework-4.0.0/core_framework/worker/tasks/process_cache_pattern_invalidation.py +19 -0
- core_framework-4.0.0/core_framework/worker/tasks/process_comment_tombstone_cleanup.py +33 -0
- core_framework-4.0.0/core_framework/worker/tasks/process_destructive_comment_delete.py +38 -0
- core_framework-4.0.0/core_framework/worker/tasks/process_destructive_post_delete.py +34 -0
- core_framework-4.0.0/core_framework/worker/tasks/process_friendship_pair_notification_wipe.py +35 -0
- core_framework-4.0.0/core_framework/worker/tasks/process_group_invite_notification_wipe.py +26 -0
- core_framework-4.0.0/core_framework/worker/tasks/process_post_private_notification_wipe.py +26 -0
- core_framework-4.0.0/core_framework/worker/tasks/process_post_tombstone_cleanup.py +27 -0
- core_framework-4.0.0/core_framework/worker/tasks/process_restriction_reactions.py +44 -0
- core_framework-4.0.0/core_framework/worker/tasks/process_user_content_deletion.py +18 -0
- core_framework-4.0.0/deploy/app/docker-compose.yml +62 -0
- core_framework-4.0.0/deploy/observability/README.md +11 -0
- core_framework-4.0.0/deploy/observability/docker-compose.yml +153 -0
- core_framework-4.0.0/deploy/observability/prometheus.yml +40 -0
- core_framework-4.0.0/deploy/observability/targets.default/node.yml +6 -0
- core_framework-4.0.0/deploy/observability/targets.default/postgres.yml +6 -0
- core_framework-4.0.0/deploy/observability/targets.default/redis.yml +6 -0
- core_framework-4.0.0/deploy/observability/targets.example/README.md +25 -0
- core_framework-4.0.0/docs/README.md +49 -0
- core_framework-4.0.0/docs/deployments/README.md +58 -0
- core_framework-4.0.0/docs/deployments/deploy-playbook.md +199 -0
- core_framework-4.0.0/docs/deployments/e2e-smoke-tests-design.md +352 -0
- core_framework-4.0.0/docs/deployments/edge-rate-limits.md +114 -0
- core_framework-4.0.0/docs/deployments/guides/playbook/postgres-backup-playbook.md +302 -0
- core_framework-4.0.0/docs/deployments/guides/setup/app-server-deploy-ssh.md +72 -0
- core_framework-4.0.0/docs/deployments/guides/setup/caddy-setup.md +67 -0
- core_framework-4.0.0/docs/deployments/guides/setup/cloudflare-setup.md +129 -0
- core_framework-4.0.0/docs/deployments/guides/setup/image-server-ssh.md +99 -0
- core_framework-4.0.0/docs/deployments/guides/setup/observability-lgtm-setup.md +204 -0
- core_framework-4.0.0/docs/deployments/guides/setup/postgres-backup-setup.md +322 -0
- core_framework-4.0.0/docs/deployments/guides/setup/postgres-setup.md +163 -0
- core_framework-4.0.0/docs/deployments/guides/setup/redis-setup.md +119 -0
- core_framework-4.0.0/docs/deployments/guides/setup/ubuntu-server-setup.md +179 -0
- core_framework-4.0.0/docs/deployments/host-config-defaults-design.md +836 -0
- core_framework-4.0.0/docs/deployments/host-config-defaults-implementation.md +251 -0
- core_framework-4.0.0/docs/deployments/postgres-backup-design.md +175 -0
- core_framework-4.0.0/docs/deployments/release-playbook.md +92 -0
- core_framework-4.0.0/docs/design/README.md +55 -0
- core_framework-4.0.0/docs/design/account-removal-spine-design.md +428 -0
- core_framework-4.0.0/docs/design/account-removal-spine-implementation.md +265 -0
- core_framework-4.0.0/docs/design/analytics-rollup-design.md +1007 -0
- core_framework-4.0.0/docs/design/analytics-warehouse-design.md +686 -0
- core_framework-4.0.0/docs/design/cache-invalidation-design.md +151 -0
- core_framework-4.0.0/docs/design/comment-subject-kinds-design.md +589 -0
- core_framework-4.0.0/docs/design/create-idempotency-design.md +365 -0
- core_framework-4.0.0/docs/design/event-outbox-design.md +664 -0
- core_framework-4.0.0/docs/design/events-ingest-design.md +229 -0
- core_framework-4.0.0/docs/design/media-cpu-off-api-refactor.md +134 -0
- core_framework-4.0.0/docs/design/media-storage-topology.md +141 -0
- core_framework-4.0.0/docs/design/moderation-restriction-fanout-design.md +464 -0
- core_framework-4.0.0/docs/design/moderation-restriction-fanout-implementation.md +266 -0
- core_framework-4.0.0/docs/design/moderator-surfaces-design.md +303 -0
- core_framework-4.0.0/docs/design/moderator-surfaces-implementation.md +242 -0
- core_framework-4.0.0/docs/design/observability-lgtm-design.md +594 -0
- core_framework-4.0.0/docs/design/outbox-admin-ops-design.md +339 -0
- core_framework-4.0.0/docs/design/rating-thread-owner-cue-design.md +382 -0
- core_framework-4.0.0/docs/design/rating-thread-owner-cue-implementation.md +235 -0
- core_framework-4.0.0/docs/design/restriction-and-block-visibility-design.md +383 -0
- core_framework-4.0.0/docs/design/restriction-and-block-visibility-implementation.md +212 -0
- core_framework-4.0.0/docs/design/transactional-email-design.md +620 -0
- core_framework-4.0.0/docs/design/utm-events-design.md +275 -0
- core_framework-4.0.0/docs/domains/README.md +24 -0
- core_framework-4.0.0/docs/domains/analytics/admin_analytics_reads.md +130 -0
- core_framework-4.0.0/docs/domains/auth/access_control.md +131 -0
- core_framework-4.0.0/docs/domains/auth/registration.md +66 -0
- core_framework-4.0.0/docs/domains/cache/admin_cache_invalidation.md +180 -0
- core_framework-4.0.0/docs/domains/comments/README.md +38 -0
- core_framework-4.0.0/docs/domains/comments/admin_comments.md +221 -0
- core_framework-4.0.0/docs/domains/comments/comment_like.md +99 -0
- core_framework-4.0.0/docs/domains/comments/comment_report.md +119 -0
- core_framework-4.0.0/docs/domains/comments/comment_stats_aggregation.md +68 -0
- core_framework-4.0.0/docs/domains/comments/create_comment.md +200 -0
- core_framework-4.0.0/docs/domains/comments/delete_comment.md +65 -0
- core_framework-4.0.0/docs/domains/comments/edit_comment.md +72 -0
- core_framework-4.0.0/docs/domains/comments/retrieve_comments.md +260 -0
- core_framework-4.0.0/docs/domains/deletion/comments.md +300 -0
- core_framework-4.0.0/docs/domains/deletion/overview.md +209 -0
- core_framework-4.0.0/docs/domains/deletion/posts.md +312 -0
- core_framework-4.0.0/docs/domains/deletion/ratings.md +42 -0
- core_framework-4.0.0/docs/domains/deletion/users.md +530 -0
- core_framework-4.0.0/docs/domains/events/events.md +258 -0
- core_framework-4.0.0/docs/domains/media/README.md +36 -0
- core_framework-4.0.0/docs/domains/media/attachment_upload.md +102 -0
- core_framework-4.0.0/docs/domains/media/avatar-upload-design.md +110 -0
- core_framework-4.0.0/docs/domains/media/banner-upload-design.md +150 -0
- core_framework-4.0.0/docs/domains/media/post-comment-attachments-design.md +521 -0
- core_framework-4.0.0/docs/domains/media/upload-pipeline-design.md +468 -0
- core_framework-4.0.0/docs/domains/media/upload_pipeline.md +104 -0
- core_framework-4.0.0/docs/domains/mentions/mentions_in_content.md +239 -0
- core_framework-4.0.0/docs/domains/moderation/README.md +32 -0
- core_framework-4.0.0/docs/domains/moderation/appeals.md +272 -0
- core_framework-4.0.0/docs/domains/moderation/internal_notes.md +158 -0
- core_framework-4.0.0/docs/domains/moderation/moderator_actions.md +75 -0
- core_framework-4.0.0/docs/domains/moderation/reports.md +231 -0
- core_framework-4.0.0/docs/domains/moderation/restrictions.md +369 -0
- core_framework-4.0.0/docs/domains/notifications/inbox-redesign-design.md +1342 -0
- core_framework-4.0.0/docs/domains/notifications/notification_inbox.md +434 -0
- core_framework-4.0.0/docs/domains/outbox/admin_outbox_ops.md +185 -0
- core_framework-4.0.0/docs/domains/posts/admin_posts.md +188 -0
- core_framework-4.0.0/docs/domains/posts/author_context.md +92 -0
- core_framework-4.0.0/docs/domains/posts/create_post.md +124 -0
- core_framework-4.0.0/docs/domains/posts/delete_post.md +62 -0
- core_framework-4.0.0/docs/domains/posts/edit_post.md +82 -0
- core_framework-4.0.0/docs/domains/posts/hashtag_discovery.md +63 -0
- core_framework-4.0.0/docs/domains/posts/post_like.md +99 -0
- core_framework-4.0.0/docs/domains/posts/post_report.md +105 -0
- core_framework-4.0.0/docs/domains/posts/post_stats_aggregation.md +86 -0
- core_framework-4.0.0/docs/domains/posts/post_visibility.md +83 -0
- core_framework-4.0.0/docs/domains/posts/retrieve_posts.md +193 -0
- core_framework-4.0.0/docs/domains/ratings/README.md +37 -0
- core_framework-4.0.0/docs/domains/ratings/admin_ratings.md +127 -0
- core_framework-4.0.0/docs/domains/ratings/delete_rating.md +61 -0
- core_framework-4.0.0/docs/domains/ratings/edit_rating.md +68 -0
- core_framework-4.0.0/docs/domains/ratings/rating-design.md +564 -0
- core_framework-4.0.0/docs/domains/ratings/rating-implementation-plan.md +677 -0
- core_framework-4.0.0/docs/domains/ratings/rating_report.md +101 -0
- core_framework-4.0.0/docs/domains/ratings/rating_stats_aggregation.md +70 -0
- core_framework-4.0.0/docs/domains/ratings/rating_upvote.md +96 -0
- core_framework-4.0.0/docs/domains/ratings/retrieve_ratings.md +186 -0
- core_framework-4.0.0/docs/domains/ratings/upsert_rating.md +75 -0
- core_framework-4.0.0/docs/domains/users/account.md +106 -0
- core_framework-4.0.0/docs/domains/users/account_deletion.md +174 -0
- core_framework-4.0.0/docs/domains/users/admin_users.md +202 -0
- core_framework-4.0.0/docs/domains/users/avatar.md +89 -0
- core_framework-4.0.0/docs/domains/users/banner.md +77 -0
- core_framework-4.0.0/docs/domains/users/blocks.md +138 -0
- core_framework-4.0.0/docs/domains/users/change_history.md +127 -0
- core_framework-4.0.0/docs/domains/users/check_username_exists.md +60 -0
- core_framework-4.0.0/docs/domains/users/follow-system-design.md +464 -0
- core_framework-4.0.0/docs/domains/users/follow.md +270 -0
- core_framework-4.0.0/docs/domains/users/friendship-system-design.md +1144 -0
- core_framework-4.0.0/docs/domains/users/friendship.md +411 -0
- core_framework-4.0.0/docs/domains/users/groups-system-design.md +1014 -0
- core_framework-4.0.0/docs/domains/users/groups.md +509 -0
- core_framework-4.0.0/docs/domains/users/my_posts_and_comments.md +154 -0
- core_framework-4.0.0/docs/domains/users/preferences.md +87 -0
- core_framework-4.0.0/docs/domains/users/profile.md +221 -0
- core_framework-4.0.0/docs/domains/users/public_profile.md +104 -0
- core_framework-4.0.0/docs/domains/users/user_removal.md +93 -0
- core_framework-4.0.0/docs/domains/users/user_stats_aggregation.md +84 -0
- core_framework-4.0.0/docs/domains/users/username_suggest.md +15 -0
- core_framework-4.0.0/docs/library/README.md +15 -0
- core_framework-4.0.0/docs/library/api.md +275 -0
- core_framework-4.0.0/docs/library/capability-wiring.md +357 -0
- core_framework-4.0.0/docs/library/core-framework-migration.md +247 -0
- core_framework-4.0.0/docs/library/overview.md +56 -0
- core_framework-4.0.0/docs/library/package-api.md +1195 -0
- core_framework-4.0.0/docs/library/testing-plugin-design.md +255 -0
- core_framework-4.0.0/docs/library/workers.md +151 -0
- core_framework-4.0.0/docs/platform/README.md +20 -0
- core_framework-4.0.0/docs/platform/architecture-decisions.md +855 -0
- core_framework-4.0.0/docs/platform/client-error-visibility.md +281 -0
- core_framework-4.0.0/docs/platform/conventions.md +108 -0
- core_framework-4.0.0/docs/platform/domain-services-and-adapters.md +73 -0
- core_framework-4.0.0/docs/platform/glossary.md +190 -0
- core_framework-4.0.0/docs/platform/layers-and-boundaries.md +47 -0
- core_framework-4.0.0/docs/platform/patch-update-typed-payload.md +194 -0
- core_framework-4.0.0/docs/platform/response-composition-and-caching.md +188 -0
- core_framework-4.0.0/docs/reviews/README.md +16 -0
- core_framework-4.0.0/docs/reviews/log.md +77 -0
- core_framework-4.0.0/docs/reviews/review-playbook.md +257 -0
- core_framework-4.0.0/docs/reviews/slices.md +337 -0
- core_framework-4.0.0/docs/testing.md +167 -0
- core_framework-4.0.0/docs/todo.md +9 -0
- core_framework-4.0.0/pyproject.toml +156 -0
- core_framework-4.0.0/tach.toml +191 -0
- core_framework-4.0.0/tests/conftest.py +52 -0
- core_framework-4.0.0/tests/e2e/_canaries.py +237 -0
- core_framework-4.0.0/tests/e2e/_settings.py +41 -0
- core_framework-4.0.0/tests/e2e/_upload_payloads.py +22 -0
- core_framework-4.0.0/tests/integration/_http_error_details.py +23 -0
- core_framework-4.0.0/tests/integration/_poll.py +23 -0
- core_framework-4.0.0/tests/integration/api/_auth_helpers.py +37 -0
- core_framework-4.0.0/tests/integration/api/_destructive_delete_helpers.py +108 -0
- core_framework-4.0.0/tests/integration/api/_http_helpers.py +100 -0
- core_framework-4.0.0/tests/integration/api/_user_deletion_helpers.py +63 -0
- core_framework-4.0.0/tests/integration/api/_user_helpers.py +63 -0
- core_framework-4.0.0/tests/integration/api/admin/_auth_cases.py +139 -0
- core_framework-4.0.0/tests/integration/api/admin/analytics/router_test.py +266 -0
- core_framework-4.0.0/tests/integration/api/admin/cache/router_test.py +310 -0
- core_framework-4.0.0/tests/integration/api/admin/comments/router_test.py +745 -0
- core_framework-4.0.0/tests/integration/api/admin/moderation/router_test.py +2468 -0
- core_framework-4.0.0/tests/integration/api/admin/moderator_surfaces_test.py +555 -0
- core_framework-4.0.0/tests/integration/api/admin/outbox/router_test.py +340 -0
- core_framework-4.0.0/tests/integration/api/admin/posts/router_test.py +476 -0
- core_framework-4.0.0/tests/integration/api/admin/users/router_test.py +1450 -0
- core_framework-4.0.0/tests/integration/api/attachments/_helpers.py +289 -0
- core_framework-4.0.0/tests/integration/api/attachments/attachment_upload_test.py +31 -0
- core_framework-4.0.0/tests/integration/api/attachments/conftest.py +14 -0
- core_framework-4.0.0/tests/integration/api/auth/router_test.py +55 -0
- core_framework-4.0.0/tests/integration/api/comments/authenticated/comment_writes_integration_test.py +668 -0
- core_framework-4.0.0/tests/integration/api/comments/comment_attachments_integration_test.py +572 -0
- core_framework-4.0.0/tests/integration/api/comments/comment_kind_registry_integration_test.py +266 -0
- core_framework-4.0.0/tests/integration/api/comments/public/router_test.py +508 -0
- core_framework-4.0.0/tests/integration/api/create_idempotency_integration_test.py +486 -0
- core_framework-4.0.0/tests/integration/api/events/router_test.py +710 -0
- core_framework-4.0.0/tests/integration/api/groups/groups_integration_test.py +1028 -0
- core_framework-4.0.0/tests/integration/api/notifications/inbox_redesign_integration_test.py +596 -0
- core_framework-4.0.0/tests/integration/api/notifications/router_test.py +532 -0
- core_framework-4.0.0/tests/integration/api/posts/authenticated/post_writes_integration_test.py +547 -0
- core_framework-4.0.0/tests/integration/api/posts/followers_visibility_test.py +144 -0
- core_framework-4.0.0/tests/integration/api/posts/post_attachments_integration_test.py +663 -0
- core_framework-4.0.0/tests/integration/api/posts/post_deletion_integration_test.py +639 -0
- core_framework-4.0.0/tests/integration/api/posts/post_stats_dirty_marking_test.py +212 -0
- core_framework-4.0.0/tests/integration/api/posts/public/router_test.py +724 -0
- core_framework-4.0.0/tests/integration/api/rate_limit_test.py +367 -0
- core_framework-4.0.0/tests/integration/api/ratings/_helpers.py +81 -0
- core_framework-4.0.0/tests/integration/api/ratings/conftest.py +8 -0
- core_framework-4.0.0/tests/integration/api/ratings/ratings_integration_test.py +352 -0
- core_framework-4.0.0/tests/integration/api/ratings/ratings_visibility_integration_test.py +273 -0
- core_framework-4.0.0/tests/integration/api/restriction_visibility_integration_test.py +410 -0
- core_framework-4.0.0/tests/integration/api/users/account_deletion_email_test.py +145 -0
- core_framework-4.0.0/tests/integration/api/users/authenticated/friendship_integration_test.py +1022 -0
- core_framework-4.0.0/tests/integration/api/users/authenticated/profile_media_upload_test.py +187 -0
- core_framework-4.0.0/tests/integration/api/users/authenticated/router_test.py +1110 -0
- core_framework-4.0.0/tests/integration/api/users/deletion_audit_integration_test.py +187 -0
- core_framework-4.0.0/tests/integration/api/users/public/router_test.py +363 -0
- core_framework-4.0.0/tests/integration/api/users/user_deletion_integration_test.py +371 -0
- core_framework-4.0.0/tests/integration/conftest.py +14 -0
- core_framework-4.0.0/tests/integration/worker/_aggregate_stats_helpers.py +57 -0
- core_framework-4.0.0/tests/integration/worker/_arq_helpers.py +148 -0
- core_framework-4.0.0/tests/integration/worker/_media_upload_helpers.py +84 -0
- core_framework-4.0.0/tests/integration/worker/account_deletion_test.py +431 -0
- core_framework-4.0.0/tests/integration/worker/aggregate_comment_stats_test.py +328 -0
- core_framework-4.0.0/tests/integration/worker/aggregate_post_stats_test.py +219 -0
- core_framework-4.0.0/tests/integration/worker/aggregate_user_stats_test.py +140 -0
- core_framework-4.0.0/tests/integration/worker/analytics_refresh_test.py +108 -0
- core_framework-4.0.0/tests/integration/worker/conftest.py +29 -0
- core_framework-4.0.0/tests/integration/worker/create_idempotency_retention_test.py +277 -0
- core_framework-4.0.0/tests/integration/worker/moderation_outbox_test.py +313 -0
- core_framework-4.0.0/tests/integration/worker/mute_lift_test.py +174 -0
- core_framework-4.0.0/tests/integration/worker/profile_media_upload_test.py +458 -0
- core_framework-4.0.0/tests/integration/worker/restriction_fanout_test.py +464 -0
- core_framework-4.0.0/tests/integration/worker/user_outbox_test.py +370 -0
- core_framework-4.0.0/tests/unit/api/comments/authenticated/comment_request_schemas_test.py +60 -0
- core_framework-4.0.0/tests/unit/api/users/profile_update_mapper_test.py +22 -0
- core_framework-4.0.0/tests/unit/application/comments/kind_registry_test.py +77 -0
- core_framework-4.0.0/tests/unit/application/email/account_deletion_scheduled_test.py +229 -0
- core_framework-4.0.0/tests/unit/application/events/event_service_test.py +166 -0
- core_framework-4.0.0/tests/unit/application/moderation/restriction_fanout_registry_test.py +119 -0
- core_framework-4.0.0/tests/unit/application/notifications/preview_test.py +19 -0
- core_framework-4.0.0/tests/unit/application/ratings/kind_registry_test.py +41 -0
- core_framework-4.0.0/tests/unit/application/users/account_removal_registry_test.py +70 -0
- core_framework-4.0.0/tests/unit/application/users/account_removal_runner_test.py +136 -0
- core_framework-4.0.0/tests/unit/core/pagination_test.py +468 -0
- core_framework-4.0.0/tests/unit/domains/user/service_test.py +216 -0
- core_framework-4.0.0/tests/unit/worker/tasks_registration_test.py +23 -0
- core_framework-4.0.0/uv.lock +2778 -0
- core_framework-3.2.0/.cursor/rules/alembic-migrations.mdc +0 -60
- core_framework-3.2.0/.cursor/rules/constitution.mdc +0 -47
- core_framework-3.2.0/.cursor/rules/domain-imports.mdc +0 -44
- core_framework-3.2.0/.cursor/rules/error-boundary.mdc +0 -56
- core_framework-3.2.0/.cursor/rules/flow-documentation.mdc +0 -15
- core_framework-3.2.0/.cursor/rules/integration-test-strategy.mdc +0 -29
- core_framework-3.2.0/.cursor/rules/no-code-in-docs.mdc +0 -35
- core_framework-3.2.0/.cursor/rules/postgres-config-conventions.mdc +0 -56
- core_framework-3.2.0/.cursor/rules/repository-schema-isolation.mdc +0 -85
- core_framework-3.2.0/.cursor/rules/strong-reads.mdc +0 -37
- core_framework-3.2.0/.cursor/skills/code-review/SKILL.md +0 -35
- core_framework-3.2.0/.cursor/skills/implement-feature/SKILL.md +0 -93
- core_framework-3.2.0/.cursor/skills/write-flow-doc/SKILL.md +0 -79
- core_framework-3.2.0/.github/workflows/_deploy.yml +0 -238
- core_framework-3.2.0/.github/workflows/dev-ci-cd.yaml +0 -235
- core_framework-3.2.0/.github/workflows/manual-deployment.yaml +0 -52
- core_framework-3.2.0/.github/workflows/manual-observability-deployment.yaml +0 -225
- core_framework-3.2.0/.github/workflows/test.yaml +0 -187
- core_framework-3.2.0/CHANGELOG.md +0 -606
- core_framework-3.2.0/PKG-INFO +0 -145
- core_framework-3.2.0/README.md +0 -99
- core_framework-3.2.0/config.toml +0 -147
- core_framework-3.2.0/config.toml.template +0 -131
- core_framework-3.2.0/core_framework/api/admin/analytics/router.py +0 -44
- core_framework-3.2.0/core_framework/api/admin/analytics/schemas.py +0 -59
- core_framework-3.2.0/core_framework/api/admin/cache/router.py +0 -26
- core_framework-3.2.0/core_framework/api/admin/cache/schemas.py +0 -91
- core_framework-3.2.0/core_framework/api/admin/comments/router.py +0 -68
- core_framework-3.2.0/core_framework/api/admin/comments/schemas.py +0 -49
- core_framework-3.2.0/core_framework/api/admin/moderation/router.py +0 -211
- core_framework-3.2.0/core_framework/api/admin/moderation/schemas.py +0 -105
- core_framework-3.2.0/core_framework/api/admin/outbox/router.py +0 -61
- core_framework-3.2.0/core_framework/api/admin/posts/router.py +0 -58
- core_framework-3.2.0/core_framework/api/admin/posts/schemas.py +0 -31
- core_framework-3.2.0/core_framework/api/admin/router.py +0 -23
- core_framework-3.2.0/core_framework/api/admin/users/router.py +0 -189
- core_framework-3.2.0/core_framework/api/admin/users/schemas.py +0 -136
- core_framework-3.2.0/core_framework/api/attachments/router.py +0 -43
- core_framework-3.2.0/core_framework/api/attachments/schemas.py +0 -48
- core_framework-3.2.0/core_framework/api/auth/router.py +0 -21
- core_framework-3.2.0/core_framework/api/auth/schemas.py +0 -15
- core_framework-3.2.0/core_framework/api/comments/authenticated/mappers.py +0 -17
- core_framework-3.2.0/core_framework/api/comments/authenticated/router.py +0 -143
- core_framework-3.2.0/core_framework/api/comments/authenticated/schemas.py +0 -79
- core_framework-3.2.0/core_framework/api/comments/public/router.py +0 -100
- core_framework-3.2.0/core_framework/api/comments/public/schemas.py +0 -42
- core_framework-3.2.0/core_framework/api/comments/schemas.py +0 -19
- core_framework-3.2.0/core_framework/api/constants.py +0 -3
- core_framework-3.2.0/core_framework/api/dependencies.py +0 -145
- core_framework-3.2.0/core_framework/api/events/router.py +0 -48
- core_framework-3.2.0/core_framework/api/notifications/authenticated/router.py +0 -78
- core_framework-3.2.0/core_framework/api/notifications/authenticated/schemas.py +0 -104
- core_framework-3.2.0/core_framework/api/posts/authenticated/mappers.py +0 -19
- core_framework-3.2.0/core_framework/api/posts/authenticated/router.py +0 -111
- core_framework-3.2.0/core_framework/api/posts/authenticated/schemas.py +0 -77
- core_framework-3.2.0/core_framework/api/posts/public/router.py +0 -109
- core_framework-3.2.0/core_framework/api/posts/schemas.py +0 -35
- core_framework-3.2.0/core_framework/api/router.py +0 -23
- core_framework-3.2.0/core_framework/api/schemas.py +0 -13
- core_framework-3.2.0/core_framework/api/users/authenticated/router.py +0 -542
- core_framework-3.2.0/core_framework/api/users/authenticated/schemas.py +0 -101
- core_framework-3.2.0/core_framework/api/users/mappers.py +0 -16
- core_framework-3.2.0/core_framework/api/users/public/router.py +0 -28
- core_framework-3.2.0/core_framework/api/users/public/schemas.py +0 -33
- core_framework-3.2.0/core_framework/api/users/shared/schemas.py +0 -204
- core_framework-3.2.0/core_framework/application/analytics/bucket_service.py +0 -43
- core_framework-3.2.0/core_framework/application/analytics/read_service.py +0 -74
- core_framework-3.2.0/core_framework/application/analytics/refresh_service.py +0 -54
- core_framework-3.2.0/core_framework/application/auth/access_service.py +0 -29
- core_framework-3.2.0/core_framework/application/auth/auth_service.py +0 -26
- core_framework-3.2.0/core_framework/application/auth/models.py +0 -12
- core_framework-3.2.0/core_framework/application/auth/token_verification.py +0 -29
- core_framework-3.2.0/core_framework/application/bootstrap.py +0 -61
- core_framework-3.2.0/core_framework/application/comments/admin_service.py +0 -307
- core_framework-3.2.0/core_framework/application/comments/aggregation_service.py +0 -43
- core_framework-3.2.0/core_framework/application/comments/authenticated_service.py +0 -234
- core_framework-3.2.0/core_framework/application/comments/cleanup_service.py +0 -109
- core_framework-3.2.0/core_framework/application/comments/public_service.py +0 -339
- core_framework-3.2.0/core_framework/application/email/__init__.py +0 -29
- core_framework-3.2.0/core_framework/application/email/account_deletion_scheduled.py +0 -77
- core_framework-3.2.0/core_framework/application/events/README.md +0 -31
- core_framework-3.2.0/core_framework/application/events/event_service.py +0 -148
- core_framework-3.2.0/core_framework/application/media/README.md +0 -19
- core_framework-3.2.0/core_framework/application/media/attachment_service.py +0 -503
- core_framework-3.2.0/core_framework/application/media/avatar_service.py +0 -168
- core_framework-3.2.0/core_framework/application/media/banner_service.py +0 -164
- core_framework-3.2.0/core_framework/application/moderation/appeal_service.py +0 -112
- core_framework-3.2.0/core_framework/application/moderation/moderator_service.py +0 -42
- core_framework-3.2.0/core_framework/application/moderation/report_service.py +0 -203
- core_framework-3.2.0/core_framework/application/moderation/user_service.py +0 -218
- core_framework-3.2.0/core_framework/application/notifications/README.md +0 -16
- core_framework-3.2.0/core_framework/application/notifications/enums.py +0 -11
- core_framework-3.2.0/core_framework/application/notifications/inbox_service.py +0 -239
- core_framework-3.2.0/core_framework/application/notifications/mute_service.py +0 -34
- core_framework-3.2.0/core_framework/application/notifications/notification_service.py +0 -170
- core_framework-3.2.0/core_framework/application/outbox/block_mirrors.py +0 -54
- core_framework-3.2.0/core_framework/application/outbox/events.py +0 -122
- core_framework-3.2.0/core_framework/application/outbox/handlers.py +0 -115
- core_framework-3.2.0/core_framework/application/outbox/ops_service.py +0 -72
- core_framework-3.2.0/core_framework/application/outbox/processing_service.py +0 -94
- core_framework-3.2.0/core_framework/application/outbox/restriction_mirrors.py +0 -46
- core_framework-3.2.0/core_framework/application/posts/admin_service.py +0 -173
- core_framework-3.2.0/core_framework/application/posts/aggregation_service.py +0 -55
- core_framework-3.2.0/core_framework/application/posts/authenticated_service.py +0 -130
- core_framework-3.2.0/core_framework/application/posts/cleanup_service.py +0 -127
- core_framework-3.2.0/core_framework/application/posts/public_service.py +0 -365
- core_framework-3.2.0/core_framework/application/shared/enums.py +0 -42
- core_framework-3.2.0/core_framework/application/shared/exceptions.py +0 -92
- core_framework-3.2.0/core_framework/application/shared/worker_jobs.py +0 -62
- core_framework-3.2.0/core_framework/application/users/admin_service.py +0 -308
- core_framework-3.2.0/core_framework/application/users/aggregation_service.py +0 -21
- core_framework-3.2.0/core_framework/application/users/authenticated_service.py +0 -388
- core_framework-3.2.0/core_framework/application/users/public_service.py +0 -162
- core_framework-3.2.0/core_framework/application/users/scheduled_service.py +0 -6
- core_framework-3.2.0/core_framework/application/users/user_deletion_service.py +0 -268
- core_framework-3.2.0/core_framework/bundled_alembic.py +0 -44
- core_framework-3.2.0/core_framework/constants.py +0 -15
- core_framework-3.2.0/core_framework/core/__init__.py +0 -33
- core_framework-3.2.0/core_framework/core/cache.py +0 -193
- core_framework-3.2.0/core_framework/core/exception_handlers/application.py +0 -131
- core_framework-3.2.0/core_framework/core/exception_handlers/common.py +0 -68
- core_framework-3.2.0/core_framework/core/exception_handlers/setup.py +0 -36
- core_framework-3.2.0/core_framework/core/middleware.py +0 -160
- core_framework-3.2.0/core_framework/core/observability.py +0 -648
- core_framework-3.2.0/core_framework/core/pagination.py +0 -198
- core_framework-3.2.0/core_framework/core/settings.py +0 -555
- core_framework-3.2.0/core_framework/domains/analytics/README.md +0 -42
- core_framework-3.2.0/core_framework/domains/analytics/__init__.py +0 -22
- core_framework-3.2.0/core_framework/domains/analytics/constants.py +0 -19
- core_framework-3.2.0/core_framework/domains/analytics/repository.py +0 -260
- core_framework-3.2.0/core_framework/domains/analytics/service.py +0 -300
- core_framework-3.2.0/core_framework/domains/auth/README.md +0 -68
- core_framework-3.2.0/core_framework/domains/auth/__init__.py +0 -8
- core_framework-3.2.0/core_framework/domains/auth/dependencies.py +0 -28
- core_framework-3.2.0/core_framework/domains/auth/exceptions.py +0 -10
- core_framework-3.2.0/core_framework/domains/auth/models.py +0 -31
- core_framework-3.2.0/core_framework/domains/auth/ports/auth.py +0 -54
- core_framework-3.2.0/core_framework/domains/auth/service.py +0 -58
- core_framework-3.2.0/core_framework/domains/comment/README.md +0 -262
- core_framework-3.2.0/core_framework/domains/comment/__init__.py +0 -51
- core_framework-3.2.0/core_framework/domains/comment/constants.py +0 -8
- core_framework-3.2.0/core_framework/domains/comment/enums.py +0 -32
- core_framework-3.2.0/core_framework/domains/comment/exceptions.py +0 -30
- core_framework-3.2.0/core_framework/domains/comment/models.py +0 -225
- core_framework-3.2.0/core_framework/domains/comment/outcomes.py +0 -19
- core_framework-3.2.0/core_framework/domains/comment/repository.py +0 -2400
- core_framework-3.2.0/core_framework/domains/comment/service.py +0 -946
- core_framework-3.2.0/core_framework/domains/email/dependencies.py +0 -91
- core_framework-3.2.0/core_framework/domains/email/models.py +0 -3
- core_framework-3.2.0/core_framework/domains/media/README.md +0 -30
- core_framework-3.2.0/core_framework/domains/media/__init__.py +0 -59
- core_framework-3.2.0/core_framework/domains/media/attachment/components/staging.py +0 -166
- core_framework-3.2.0/core_framework/domains/media/attachment/components/variant_encoder.py +0 -48
- core_framework-3.2.0/core_framework/domains/media/attachment/constants.py +0 -41
- core_framework-3.2.0/core_framework/domains/media/attachment/models.py +0 -27
- core_framework-3.2.0/core_framework/domains/media/attachment/ports/variant_encoder.py +0 -42
- core_framework-3.2.0/core_framework/domains/media/attachment/service.py +0 -501
- core_framework-3.2.0/core_framework/domains/media/avatar/service.py +0 -340
- core_framework-3.2.0/core_framework/domains/media/banner/service.py +0 -335
- core_framework-3.2.0/core_framework/domains/media/dependencies.py +0 -332
- core_framework-3.2.0/core_framework/domains/media/shared/outcomes.py +0 -21
- core_framework-3.2.0/core_framework/domains/media/shared/repository.py +0 -806
- core_framework-3.2.0/core_framework/domains/media/shared/service.py +0 -8
- core_framework-3.2.0/core_framework/domains/moderation/README.md +0 -140
- core_framework-3.2.0/core_framework/domains/moderation/dependencies.py +0 -90
- core_framework-3.2.0/core_framework/domains/moderation/enums.py +0 -66
- core_framework-3.2.0/core_framework/domains/moderation/outbox_repository.py +0 -187
- core_framework-3.2.0/core_framework/domains/moderation/outbox_service.py +0 -52
- core_framework-3.2.0/core_framework/domains/moderation/repository.py +0 -1308
- core_framework-3.2.0/core_framework/domains/moderation/service.py +0 -884
- core_framework-3.2.0/core_framework/domains/notification/README.md +0 -156
- core_framework-3.2.0/core_framework/domains/notification/__init__.py +0 -16
- core_framework-3.2.0/core_framework/domains/notification/enums.py +0 -19
- core_framework-3.2.0/core_framework/domains/notification/models.py +0 -24
- core_framework-3.2.0/core_framework/domains/notification/repository.py +0 -629
- core_framework-3.2.0/core_framework/domains/notification/service.py +0 -301
- core_framework-3.2.0/core_framework/domains/outbox/README.md +0 -69
- core_framework-3.2.0/core_framework/domains/outbox/__init__.py +0 -19
- core_framework-3.2.0/core_framework/domains/outbox/ports/admin.py +0 -35
- core_framework-3.2.0/core_framework/domains/outbox/service.py +0 -62
- core_framework-3.2.0/core_framework/domains/post/README.md +0 -208
- core_framework-3.2.0/core_framework/domains/post/__init__.py +0 -42
- core_framework-3.2.0/core_framework/domains/post/constants.py +0 -9
- core_framework-3.2.0/core_framework/domains/post/enums.py +0 -40
- core_framework-3.2.0/core_framework/domains/post/exceptions.py +0 -20
- core_framework-3.2.0/core_framework/domains/post/models.py +0 -209
- core_framework-3.2.0/core_framework/domains/post/repository.py +0 -2255
- core_framework-3.2.0/core_framework/domains/post/service.py +0 -935
- core_framework-3.2.0/core_framework/domains/repository_sql.py +0 -44
- core_framework-3.2.0/core_framework/domains/user/README.md +0 -105
- core_framework-3.2.0/core_framework/domains/user/__init__.py +0 -57
- core_framework-3.2.0/core_framework/domains/user/constants.py +0 -19
- core_framework-3.2.0/core_framework/domains/user/dependencies.py +0 -90
- core_framework-3.2.0/core_framework/domains/user/enums.py +0 -19
- core_framework-3.2.0/core_framework/domains/user/models.py +0 -348
- core_framework-3.2.0/core_framework/domains/user/outbox_repository.py +0 -186
- core_framework-3.2.0/core_framework/domains/user/outbox_service.py +0 -52
- core_framework-3.2.0/core_framework/domains/user/outcomes.py +0 -31
- core_framework-3.2.0/core_framework/domains/user/repository.py +0 -1745
- core_framework-3.2.0/core_framework/domains/user/service.py +0 -999
- core_framework-3.2.0/core_framework/domains/utils.py +0 -241
- core_framework-3.2.0/core_framework/infrastructure/firebase/firebase_auth_adapter.py +0 -114
- core_framework-3.2.0/core_framework/infrastructure/media/attachment_staging_display_geometry.py +0 -71
- core_framework-3.2.0/core_framework/infrastructure/media/pillow_attachment_variant_encoder_adapter.py +0 -194
- core_framework-3.2.0/core_framework/main.py +0 -69
- core_framework-3.2.0/core_framework/testing/__init__.py +0 -7
- core_framework-3.2.0/core_framework/testing/arq.py +0 -121
- core_framework-3.2.0/core_framework/testing/auth.py +0 -304
- core_framework-3.2.0/core_framework/testing/config.py +0 -44
- core_framework-3.2.0/core_framework/testing/containers.py +0 -77
- core_framework-3.2.0/core_framework/testing/hookspecs.py +0 -14
- core_framework-3.2.0/core_framework/testing/media.py +0 -271
- core_framework-3.2.0/core_framework/testing/plugin.py +0 -218
- core_framework-3.2.0/core_framework/worker/main.py +0 -136
- core_framework-3.2.0/core_framework/worker/schedules/__init__.py +0 -138
- core_framework-3.2.0/core_framework/worker/schedules/schedule_expired_account_deletions.py +0 -37
- core_framework-3.2.0/core_framework/worker/schedules/schedule_expired_mute_lifts.py +0 -34
- core_framework-3.2.0/core_framework/worker/schedules/schedule_purge_expired_create_idempotency_keys.py +0 -17
- core_framework-3.2.0/core_framework/worker/schedules/schedule_refresh_analytics.py +0 -7
- core_framework-3.2.0/core_framework/worker/tasks/__init__.py +0 -77
- core_framework-3.2.0/core_framework/worker/tasks/process_account_deletion.py +0 -21
- core_framework-3.2.0/core_framework/worker/tasks/process_cache_pattern_invalidation.py +0 -31
- core_framework-3.2.0/core_framework/worker/tasks/process_destructive_comment_delete.py +0 -15
- core_framework-3.2.0/core_framework/worker/tasks/process_destructive_post_delete.py +0 -15
- core_framework-3.2.0/core_framework/worker/tasks/process_user_content_deletion.py +0 -15
- core_framework-3.2.0/deploy/app/docker-compose.yml +0 -47
- core_framework-3.2.0/deploy/observability/README.md +0 -11
- core_framework-3.2.0/deploy/observability/docker-compose.yml +0 -153
- core_framework-3.2.0/deploy/observability/prometheus.yml +0 -39
- core_framework-3.2.0/deploy/observability/targets.example/README.md +0 -19
- core_framework-3.2.0/deploy/observability/targets.example/node.yml.example +0 -9
- core_framework-3.2.0/deploy/observability/targets.example/postgres.yml.example +0 -5
- core_framework-3.2.0/deploy/observability/targets.example/redis.yml.example +0 -6
- core_framework-3.2.0/docs/README.md +0 -48
- core_framework-3.2.0/docs/deployments/README.md +0 -56
- core_framework-3.2.0/docs/deployments/deploy-playbook.md +0 -246
- core_framework-3.2.0/docs/deployments/e2e-smoke-tests-design.md +0 -353
- core_framework-3.2.0/docs/deployments/edge-rate-limits.md +0 -63
- core_framework-3.2.0/docs/deployments/guides/playbook/postgres-backup-playbook.md +0 -303
- core_framework-3.2.0/docs/deployments/guides/setup/app-server-deploy-ssh.md +0 -72
- core_framework-3.2.0/docs/deployments/guides/setup/caddy-setup.md +0 -57
- core_framework-3.2.0/docs/deployments/guides/setup/cloudflare-setup.md +0 -129
- core_framework-3.2.0/docs/deployments/guides/setup/image-server-ssh.md +0 -99
- core_framework-3.2.0/docs/deployments/guides/setup/observability-lgtm-setup.md +0 -204
- core_framework-3.2.0/docs/deployments/guides/setup/postgres-backup-setup.md +0 -323
- core_framework-3.2.0/docs/deployments/guides/setup/postgres-setup.md +0 -165
- core_framework-3.2.0/docs/deployments/guides/setup/redis-setup.md +0 -117
- core_framework-3.2.0/docs/deployments/guides/setup/ubuntu-server-setup.md +0 -179
- core_framework-3.2.0/docs/deployments/postgres-backup-design.md +0 -176
- core_framework-3.2.0/docs/deployments/release-playbook.md +0 -84
- core_framework-3.2.0/docs/design/README.md +0 -32
- core_framework-3.2.0/docs/design/analytics-rollup-design.md +0 -985
- core_framework-3.2.0/docs/design/cache-invalidation-design.md +0 -148
- core_framework-3.2.0/docs/design/create-idempotency-design.md +0 -282
- core_framework-3.2.0/docs/design/event-outbox-design.md +0 -603
- core_framework-3.2.0/docs/design/events-ingest-design.md +0 -228
- core_framework-3.2.0/docs/design/media-storage-topology.md +0 -141
- core_framework-3.2.0/docs/design/observability-lgtm-design.md +0 -591
- core_framework-3.2.0/docs/design/outbox-admin-ops-design.md +0 -337
- core_framework-3.2.0/docs/design/transactional-email-design.md +0 -616
- core_framework-3.2.0/docs/design/utm-events-design.md +0 -272
- core_framework-3.2.0/docs/domains/README.md +0 -23
- core_framework-3.2.0/docs/domains/analytics/admin_analytics_reads.md +0 -135
- core_framework-3.2.0/docs/domains/auth/access_control.md +0 -70
- core_framework-3.2.0/docs/domains/auth/registration.md +0 -60
- core_framework-3.2.0/docs/domains/cache/admin_cache_invalidation.md +0 -182
- core_framework-3.2.0/docs/domains/comments/README.md +0 -31
- core_framework-3.2.0/docs/domains/comments/admin_comments.md +0 -218
- core_framework-3.2.0/docs/domains/comments/comment_like.md +0 -96
- core_framework-3.2.0/docs/domains/comments/comment_report.md +0 -118
- core_framework-3.2.0/docs/domains/comments/comment_stats_aggregation.md +0 -69
- core_framework-3.2.0/docs/domains/comments/create_comment.md +0 -174
- core_framework-3.2.0/docs/domains/comments/delete_comment.md +0 -67
- core_framework-3.2.0/docs/domains/comments/edit_comment.md +0 -74
- core_framework-3.2.0/docs/domains/comments/retrieve_comments.md +0 -228
- core_framework-3.2.0/docs/domains/deletion/comments.md +0 -289
- core_framework-3.2.0/docs/domains/deletion/overview.md +0 -202
- core_framework-3.2.0/docs/domains/deletion/posts.md +0 -312
- core_framework-3.2.0/docs/domains/deletion/users.md +0 -501
- core_framework-3.2.0/docs/domains/events/events.md +0 -245
- core_framework-3.2.0/docs/domains/media/README.md +0 -36
- core_framework-3.2.0/docs/domains/media/attachment_upload.md +0 -75
- core_framework-3.2.0/docs/domains/media/avatar-upload-design.md +0 -110
- core_framework-3.2.0/docs/domains/media/banner-upload-design.md +0 -150
- core_framework-3.2.0/docs/domains/media/post-comment-attachments-design.md +0 -521
- core_framework-3.2.0/docs/domains/media/upload-pipeline-design.md +0 -468
- core_framework-3.2.0/docs/domains/media/upload_pipeline.md +0 -110
- core_framework-3.2.0/docs/domains/mentions/mentions_in_content.md +0 -238
- core_framework-3.2.0/docs/domains/moderation/README.md +0 -28
- core_framework-3.2.0/docs/domains/moderation/appeals.md +0 -245
- core_framework-3.2.0/docs/domains/moderation/internal_notes.md +0 -159
- core_framework-3.2.0/docs/domains/moderation/moderator_actions.md +0 -70
- core_framework-3.2.0/docs/domains/moderation/reports.md +0 -186
- core_framework-3.2.0/docs/domains/moderation/restrictions.md +0 -250
- core_framework-3.2.0/docs/domains/notifications/notification_inbox.md +0 -384
- core_framework-3.2.0/docs/domains/outbox/admin_outbox_ops.md +0 -187
- core_framework-3.2.0/docs/domains/posts/admin_posts.md +0 -214
- core_framework-3.2.0/docs/domains/posts/author_context.md +0 -92
- core_framework-3.2.0/docs/domains/posts/create_post.md +0 -121
- core_framework-3.2.0/docs/domains/posts/delete_post.md +0 -64
- core_framework-3.2.0/docs/domains/posts/edit_post.md +0 -80
- core_framework-3.2.0/docs/domains/posts/hashtag_discovery.md +0 -61
- core_framework-3.2.0/docs/domains/posts/post_like.md +0 -95
- core_framework-3.2.0/docs/domains/posts/post_report.md +0 -105
- core_framework-3.2.0/docs/domains/posts/post_stats_aggregation.md +0 -90
- core_framework-3.2.0/docs/domains/posts/post_visibility.md +0 -83
- core_framework-3.2.0/docs/domains/posts/retrieve_posts.md +0 -190
- core_framework-3.2.0/docs/domains/users/account.md +0 -106
- core_framework-3.2.0/docs/domains/users/account_deletion.md +0 -128
- core_framework-3.2.0/docs/domains/users/admin_users.md +0 -166
- core_framework-3.2.0/docs/domains/users/avatar.md +0 -92
- core_framework-3.2.0/docs/domains/users/banner.md +0 -78
- core_framework-3.2.0/docs/domains/users/blocks.md +0 -125
- core_framework-3.2.0/docs/domains/users/change_history.md +0 -133
- core_framework-3.2.0/docs/domains/users/check_username_exists.md +0 -57
- core_framework-3.2.0/docs/domains/users/follow-system-design.md +0 -424
- core_framework-3.2.0/docs/domains/users/follow.md +0 -222
- core_framework-3.2.0/docs/domains/users/my_posts_and_comments.md +0 -113
- core_framework-3.2.0/docs/domains/users/preferences.md +0 -87
- core_framework-3.2.0/docs/domains/users/profile.md +0 -204
- core_framework-3.2.0/docs/domains/users/public_profile.md +0 -99
- core_framework-3.2.0/docs/domains/users/user_removal.md +0 -86
- core_framework-3.2.0/docs/domains/users/user_stats_aggregation.md +0 -80
- core_framework-3.2.0/docs/library/README.md +0 -15
- core_framework-3.2.0/docs/library/api.md +0 -212
- core_framework-3.2.0/docs/library/capability-wiring.md +0 -170
- core_framework-3.2.0/docs/library/core-framework-migration.md +0 -253
- core_framework-3.2.0/docs/library/overview.md +0 -55
- core_framework-3.2.0/docs/library/package-api.md +0 -622
- core_framework-3.2.0/docs/library/testing-plugin-design.md +0 -317
- core_framework-3.2.0/docs/library/workers.md +0 -105
- core_framework-3.2.0/docs/platform/README.md +0 -18
- core_framework-3.2.0/docs/platform/architecture-decisions.md +0 -555
- core_framework-3.2.0/docs/platform/client-error-visibility.md +0 -274
- core_framework-3.2.0/docs/platform/conventions.md +0 -101
- core_framework-3.2.0/docs/platform/domain-services-and-adapters.md +0 -71
- core_framework-3.2.0/docs/platform/layers-and-boundaries.md +0 -46
- core_framework-3.2.0/docs/platform/patch-update-typed-payload.md +0 -191
- core_framework-3.2.0/docs/reviews/README.md +0 -11
- core_framework-3.2.0/docs/reviews/log.md +0 -12
- core_framework-3.2.0/docs/reviews/review-playbook.md +0 -192
- core_framework-3.2.0/docs/reviews/slices.md +0 -301
- core_framework-3.2.0/docs/testing.md +0 -150
- core_framework-3.2.0/docs/todo.md +0 -5
- core_framework-3.2.0/pyproject.toml +0 -155
- core_framework-3.2.0/tach.toml +0 -184
- core_framework-3.2.0/tests/conftest.py +0 -49
- core_framework-3.2.0/tests/e2e/_canaries.py +0 -140
- core_framework-3.2.0/tests/e2e/_settings.py +0 -40
- core_framework-3.2.0/tests/e2e/_upload_payloads.py +0 -18
- core_framework-3.2.0/tests/integration/_http_error_details.py +0 -19
- core_framework-3.2.0/tests/integration/api/_auth_helpers.py +0 -6
- core_framework-3.2.0/tests/integration/api/_destructive_delete_helpers.py +0 -51
- core_framework-3.2.0/tests/integration/api/_http_helpers.py +0 -95
- core_framework-3.2.0/tests/integration/api/_user_deletion_helpers.py +0 -63
- core_framework-3.2.0/tests/integration/api/_user_helpers.py +0 -26
- core_framework-3.2.0/tests/integration/api/admin/_auth_cases.py +0 -53
- core_framework-3.2.0/tests/integration/api/admin/analytics/router_test.py +0 -263
- core_framework-3.2.0/tests/integration/api/admin/cache/router_test.py +0 -307
- core_framework-3.2.0/tests/integration/api/admin/comments/router_test.py +0 -735
- core_framework-3.2.0/tests/integration/api/admin/moderation/_auth_cases.py +0 -30
- core_framework-3.2.0/tests/integration/api/admin/moderation/router_test.py +0 -2545
- core_framework-3.2.0/tests/integration/api/admin/outbox/router_test.py +0 -337
- core_framework-3.2.0/tests/integration/api/admin/posts/router_test.py +0 -472
- core_framework-3.2.0/tests/integration/api/admin/users/router_test.py +0 -1464
- core_framework-3.2.0/tests/integration/api/attachments/_helpers.py +0 -210
- core_framework-3.2.0/tests/integration/api/attachments/attachment_upload_test.py +0 -29
- core_framework-3.2.0/tests/integration/api/auth/router_test.py +0 -52
- core_framework-3.2.0/tests/integration/api/comments/authenticated/comment_writes_integration_test.py +0 -663
- core_framework-3.2.0/tests/integration/api/comments/comment_attachments_integration_test.py +0 -576
- core_framework-3.2.0/tests/integration/api/comments/public/router_test.py +0 -514
- core_framework-3.2.0/tests/integration/api/create_idempotency_integration_test.py +0 -486
- core_framework-3.2.0/tests/integration/api/events/router_test.py +0 -758
- core_framework-3.2.0/tests/integration/api/notifications/router_test.py +0 -538
- core_framework-3.2.0/tests/integration/api/posts/authenticated/post_writes_integration_test.py +0 -311
- core_framework-3.2.0/tests/integration/api/posts/followers_visibility_test.py +0 -144
- core_framework-3.2.0/tests/integration/api/posts/post_attachments_integration_test.py +0 -660
- core_framework-3.2.0/tests/integration/api/posts/post_deletion_integration_test.py +0 -624
- core_framework-3.2.0/tests/integration/api/posts/post_stats_dirty_marking_test.py +0 -212
- core_framework-3.2.0/tests/integration/api/posts/public/router_test.py +0 -1015
- core_framework-3.2.0/tests/integration/api/users/account_deletion_email_test.py +0 -145
- core_framework-3.2.0/tests/integration/api/users/authenticated/avatar_upload_test.py +0 -112
- core_framework-3.2.0/tests/integration/api/users/authenticated/banner_upload_test.py +0 -112
- core_framework-3.2.0/tests/integration/api/users/authenticated/router_test.py +0 -1100
- core_framework-3.2.0/tests/integration/api/users/deletion_audit_integration_test.py +0 -187
- core_framework-3.2.0/tests/integration/api/users/public/router_test.py +0 -334
- core_framework-3.2.0/tests/integration/api/users/user_deletion_integration_test.py +0 -371
- core_framework-3.2.0/tests/integration/worker/_media_upload_helpers.py +0 -84
- core_framework-3.2.0/tests/integration/worker/account_deletion_test.py +0 -385
- core_framework-3.2.0/tests/integration/worker/aggregate_comment_stats_test.py +0 -354
- core_framework-3.2.0/tests/integration/worker/aggregate_post_stats_test.py +0 -257
- core_framework-3.2.0/tests/integration/worker/aggregate_user_stats_test.py +0 -123
- core_framework-3.2.0/tests/integration/worker/analytics_refresh_test.py +0 -108
- core_framework-3.2.0/tests/integration/worker/avatar_upload_test.py +0 -370
- core_framework-3.2.0/tests/integration/worker/banner_upload_test.py +0 -367
- core_framework-3.2.0/tests/integration/worker/conftest.py +0 -21
- core_framework-3.2.0/tests/integration/worker/create_idempotency_retention_test.py +0 -280
- core_framework-3.2.0/tests/integration/worker/moderation_outbox_test.py +0 -313
- core_framework-3.2.0/tests/integration/worker/mute_lift_test.py +0 -166
- core_framework-3.2.0/tests/integration/worker/user_outbox_test.py +0 -370
- core_framework-3.2.0/tests/integration/worker/utils_test.py +0 -116
- core_framework-3.2.0/tests/unit/api/comments/authenticated/comment_request_schemas_test.py +0 -60
- core_framework-3.2.0/tests/unit/api/users/profile_update_mapper_test.py +0 -22
- core_framework-3.2.0/tests/unit/application/email/account_deletion_scheduled_test.py +0 -219
- core_framework-3.2.0/tests/unit/application/events/event_service_test.py +0 -149
- core_framework-3.2.0/tests/unit/application/notifications/inbox_service_test.py +0 -111
- core_framework-3.2.0/tests/unit/core/pagination_test.py +0 -582
- core_framework-3.2.0/tests/unit/domains/user/service_test.py +0 -228
- core_framework-3.2.0/uv.lock +0 -2607
- {core_framework-3.2.0 → core_framework-4.0.0}/.agents/skills/fastapi +0 -0
- {core_framework-3.2.0 → core_framework-4.0.0}/.agents/skills/library-skills/.library-skills.json +0 -0
- {core_framework-3.2.0 → core_framework-4.0.0}/.agents/skills/library-skills/SKILL.md +0 -0
- {core_framework-3.2.0 → core_framework-4.0.0}/.cursor/rules/api-layer.mdc +0 -0
- {core_framework-3.2.0 → core_framework-4.0.0}/.cursor/rules/api-reference-docs.mdc +0 -0
- {core_framework-3.2.0 → core_framework-4.0.0}/.cursor/rules/api-validation.mdc +0 -0
- {core_framework-3.2.0 → core_framework-4.0.0}/.cursor/rules/application-layer.mdc +0 -0
- {core_framework-3.2.0 → core_framework-4.0.0}/.cursor/rules/constants-final.mdc +0 -0
- {core_framework-3.2.0 → core_framework-4.0.0}/.cursor/rules/database-triggers.mdc +0 -0
- {core_framework-3.2.0 → core_framework-4.0.0}/.cursor/rules/docstrings.mdc +0 -0
- {core_framework-3.2.0 → core_framework-4.0.0}/.cursor/rules/domain-caller-context.mdc +0 -0
- {core_framework-3.2.0 → core_framework-4.0.0}/.cursor/rules/domain-input-guards.mdc +0 -0
- {core_framework-3.2.0 → core_framework-4.0.0}/.cursor/rules/domain-repository-exceptions.mdc +0 -0
- {core_framework-3.2.0 → core_framework-4.0.0}/.cursor/rules/domain-services-and-adapters.mdc +0 -0
- {core_framework-3.2.0 → core_framework-4.0.0}/.cursor/rules/inline-raise-messages.mdc +0 -0
- {core_framework-3.2.0 → core_framework-4.0.0}/.cursor/rules/layer-boundaries.mdc +0 -0
- {core_framework-3.2.0 → core_framework-4.0.0}/.cursor/rules/structured-logging.mdc +0 -0
- {core_framework-3.2.0 → core_framework-4.0.0}/.cursor/skills/add-config/SKILL.md +0 -0
- {core_framework-3.2.0 → core_framework-4.0.0}/.cursor/skills/add-domain/SKILL.md +0 -0
- {core_framework-3.2.0 → core_framework-4.0.0}/.cursor/skills/fastapi +0 -0
- {core_framework-3.2.0 → core_framework-4.0.0}/.cursor/skills/recommend-features/SKILL.md +0 -0
- {core_framework-3.2.0 → core_framework-4.0.0}/.cursor/skills/sync-host-rules/SKILL.md +0 -0
- {core_framework-3.2.0 → core_framework-4.0.0}/.dockerignore +0 -0
- {core_framework-3.2.0 → core_framework-4.0.0}/.github/ci/package-lock.json +0 -0
- {core_framework-3.2.0 → core_framework-4.0.0}/.github/ci/package.json +0 -0
- {core_framework-3.2.0 → core_framework-4.0.0}/.github/workflows/publish-pypi.yml +0 -0
- {core_framework-3.2.0 → core_framework-4.0.0}/.gitignore +0 -0
- {core_framework-3.2.0 → core_framework-4.0.0}/.pre-commit-config.yaml +0 -0
- {core_framework-3.2.0 → core_framework-4.0.0}/.python-version +0 -0
- {core_framework-3.2.0 → core_framework-4.0.0}/LICENSE +0 -0
- {core_framework-3.2.0 → core_framework-4.0.0}/alembic/analytics/alembic/README +0 -0
- {core_framework-3.2.0 → core_framework-4.0.0}/alembic/analytics/alembic/env.py +0 -0
- {core_framework-3.2.0 → core_framework-4.0.0}/alembic/analytics/alembic/script.py.mako +0 -0
- {core_framework-3.2.0 → core_framework-4.0.0}/alembic/analytics/alembic/versions/2d61a5e88d76_analytics_utm_events_add_kind.py +0 -0
- {core_framework-3.2.0 → core_framework-4.0.0}/alembic/analytics/alembic/versions/585105e1149e_analytics_add_utm_events.py +0 -0
- {core_framework-3.2.0 → core_framework-4.0.0}/alembic/analytics/alembic/versions/5b9ac98bb150_analytics_daily_fact.py +0 -0
- {core_framework-3.2.0 → core_framework-4.0.0}/alembic/analytics/alembic/versions/7f2a9c1d4e8b_analytics_daily_fact_day_index.py +0 -0
- {core_framework-3.2.0 → core_framework-4.0.0}/alembic/analytics/alembic.ini +0 -0
- {core_framework-3.2.0 → core_framework-4.0.0}/alembic/comment/alembic/README +0 -0
- {core_framework-3.2.0 → core_framework-4.0.0}/alembic/comment/alembic/env.py +0 -0
- {core_framework-3.2.0 → core_framework-4.0.0}/alembic/comment/alembic/script.py.mako +0 -0
- {core_framework-3.2.0 → core_framework-4.0.0}/alembic/comment/alembic/versions/comment_add_comment_attachments.py +0 -0
- {core_framework-3.2.0 → core_framework-4.0.0}/alembic/comment/alembic/versions/comment_add_comment_create_idempotency.py +0 -0
- {core_framework-3.2.0 → core_framework-4.0.0}/alembic/comment/alembic/versions/comment_add_comment_create_idempotency_created_at_index.py +0 -0
- {core_framework-3.2.0 → core_framework-4.0.0}/alembic/comment/alembic/versions/comment_add_comment_mentions.py +0 -0
- {core_framework-3.2.0 → core_framework-4.0.0}/alembic/comment/alembic/versions/comment_tombstone_status_model.py +0 -0
- {core_framework-3.2.0 → core_framework-4.0.0}/alembic/comment/alembic/versions/v1_comment_init_baseline.py +0 -0
- {core_framework-3.2.0 → core_framework-4.0.0}/alembic/comment/alembic.ini +0 -0
- {core_framework-3.2.0 → core_framework-4.0.0}/alembic/extension/alembic/README +0 -0
- {core_framework-3.2.0 → core_framework-4.0.0}/alembic/extension/alembic/env.py +0 -0
- {core_framework-3.2.0 → core_framework-4.0.0}/alembic/extension/alembic/script.py.mako +0 -0
- {core_framework-3.2.0 → core_framework-4.0.0}/alembic/extension/alembic/versions/v1_ext_init_baseline.py +0 -0
- {core_framework-3.2.0 → core_framework-4.0.0}/alembic/extension/alembic.ini +0 -0
- {core_framework-3.2.0 → core_framework-4.0.0}/alembic/media/alembic/README +0 -0
- {core_framework-3.2.0 → core_framework-4.0.0}/alembic/media/alembic/env.py +0 -0
- {core_framework-3.2.0 → core_framework-4.0.0}/alembic/media/alembic/script.py.mako +0 -0
- {core_framework-3.2.0 → core_framework-4.0.0}/alembic/media/alembic/versions/media_add_attachment_staging_registry.py +0 -0
- {core_framework-3.2.0 → core_framework-4.0.0}/alembic/media/alembic/versions/media_add_banner_staging_and_lease.py +0 -0
- {core_framework-3.2.0 → core_framework-4.0.0}/alembic/media/alembic/versions/media_attachment_staging_registry_published_at.py +0 -0
- {core_framework-3.2.0 → core_framework-4.0.0}/alembic/media/alembic/versions/v1_media_init_baseline.py +0 -0
- {core_framework-3.2.0 → core_framework-4.0.0}/alembic/media/alembic.ini +0 -0
- {core_framework-3.2.0 → core_framework-4.0.0}/alembic/moderation/alembic/README +0 -0
- {core_framework-3.2.0 → core_framework-4.0.0}/alembic/moderation/alembic/env.py +0 -0
- {core_framework-3.2.0 → core_framework-4.0.0}/alembic/moderation/alembic/script.py.mako +0 -0
- {core_framework-3.2.0 → core_framework-4.0.0}/alembic/moderation/alembic/versions/moderation_add_event_outbox.py +0 -0
- {core_framework-3.2.0 → core_framework-4.0.0}/alembic/moderation/alembic/versions/moderation_add_event_outbox_dead_indexes.py +0 -0
- {core_framework-3.2.0 → core_framework-4.0.0}/alembic/moderation/alembic/versions/moderation_add_event_outbox_pending_created_at_index.py +0 -0
- {core_framework-3.2.0 → core_framework-4.0.0}/alembic/moderation/alembic/versions/v1_mod_init_baseline.py +0 -0
- {core_framework-3.2.0 → core_framework-4.0.0}/alembic/moderation/alembic.ini +0 -0
- {core_framework-3.2.0 → core_framework-4.0.0}/alembic/notification/alembic/README +0 -0
- {core_framework-3.2.0 → core_framework-4.0.0}/alembic/notification/alembic/env.py +0 -0
- {core_framework-3.2.0 → core_framework-4.0.0}/alembic/notification/alembic/script.py.mako +0 -0
- {core_framework-3.2.0 → core_framework-4.0.0}/alembic/notification/alembic/versions/2fdd68777706_notification_read_at_retention_index.py +0 -0
- {core_framework-3.2.0 → core_framework-4.0.0}/alembic/notification/alembic/versions/v1_notif_init_baseline.py +0 -0
- {core_framework-3.2.0 → core_framework-4.0.0}/alembic/notification/alembic.ini +0 -0
- {core_framework-3.2.0 → core_framework-4.0.0}/alembic/post/alembic/README +0 -0
- {core_framework-3.2.0 → core_framework-4.0.0}/alembic/post/alembic/env.py +0 -0
- {core_framework-3.2.0 → core_framework-4.0.0}/alembic/post/alembic/script.py.mako +0 -0
- {core_framework-3.2.0 → core_framework-4.0.0}/alembic/post/alembic/versions/post_add_post_attachments.py +0 -0
- {core_framework-3.2.0 → core_framework-4.0.0}/alembic/post/alembic/versions/post_add_post_create_idempotency.py +0 -0
- {core_framework-3.2.0 → core_framework-4.0.0}/alembic/post/alembic/versions/post_add_post_create_idempotency_created_at_index.py +0 -0
- {core_framework-3.2.0 → core_framework-4.0.0}/alembic/post/alembic/versions/post_add_post_mentions.py +0 -0
- {core_framework-3.2.0 → core_framework-4.0.0}/alembic/post/alembic/versions/post_post_views_retention_high_water_mark.py +0 -0
- {core_framework-3.2.0 → core_framework-4.0.0}/alembic/post/alembic/versions/post_tombstone_status_model.py +0 -0
- {core_framework-3.2.0 → core_framework-4.0.0}/alembic/post/alembic/versions/v1_post_init_baseline.py +0 -0
- {core_framework-3.2.0 → core_framework-4.0.0}/alembic/post/alembic.ini +0 -0
- {core_framework-3.2.0/alembic/user → core_framework-4.0.0/alembic/rating}/alembic/README +0 -0
- {core_framework-3.2.0/alembic/user → core_framework-4.0.0/alembic/rating}/alembic/script.py.mako +0 -0
- {core_framework-3.2.0 → core_framework-4.0.0}/alembic/user/alembic/env.py +0 -0
- {core_framework-3.2.0 → core_framework-4.0.0}/alembic/user/alembic/versions/44df70a45ba6_user_add_signup_events.py +0 -0
- {core_framework-3.2.0 → core_framework-4.0.0}/alembic/user/alembic/versions/user_add_avatar_ingest_sequences.py +0 -0
- {core_framework-3.2.0 → core_framework-4.0.0}/alembic/user/alembic/versions/user_add_banner_ingest_sequences.py +0 -0
- {core_framework-3.2.0 → core_framework-4.0.0}/alembic/user/alembic/versions/user_add_date_of_birth_to_profiles.py +0 -0
- {core_framework-3.2.0 → core_framework-4.0.0}/alembic/user/alembic/versions/user_add_event_outbox.py +0 -0
- {core_framework-3.2.0 → core_framework-4.0.0}/alembic/user/alembic/versions/user_add_event_outbox_dead_indexes.py +0 -0
- {core_framework-3.2.0 → core_framework-4.0.0}/alembic/user/alembic/versions/user_add_event_outbox_pending_created_at_index.py +0 -0
- {core_framework-3.2.0 → core_framework-4.0.0}/alembic/user/alembic/versions/user_reserve_sentinel_user_ids.py +0 -0
- {core_framework-3.2.0 → core_framework-4.0.0}/alembic/user/alembic/versions/v1_user_init_baseline.py +0 -0
- {core_framework-3.2.0 → core_framework-4.0.0}/alembic/user/alembic.ini +0 -0
- {core_framework-3.2.0 → core_framework-4.0.0}/core_framework/__init__.py +0 -0
- {core_framework-3.2.0 → core_framework-4.0.0}/core_framework/api/__init__.py +0 -0
- {core_framework-3.2.0 → core_framework-4.0.0}/core_framework/api/admin/__init__.py +0 -0
- {core_framework-3.2.0 → core_framework-4.0.0}/core_framework/api/admin/analytics/__init__.py +0 -0
- {core_framework-3.2.0 → core_framework-4.0.0}/core_framework/api/admin/cache/__init__.py +0 -0
- {core_framework-3.2.0 → core_framework-4.0.0}/core_framework/api/admin/comments/__init__.py +0 -0
- {core_framework-3.2.0 → core_framework-4.0.0}/core_framework/api/admin/moderation/__init__.py +0 -0
- {core_framework-3.2.0 → core_framework-4.0.0}/core_framework/api/admin/outbox/__init__.py +0 -0
- {core_framework-3.2.0 → core_framework-4.0.0}/core_framework/api/admin/outbox/schemas.py +0 -0
- {core_framework-3.2.0 → core_framework-4.0.0}/core_framework/api/admin/posts/__init__.py +0 -0
- {core_framework-3.2.0 → core_framework-4.0.0}/core_framework/api/admin/users/__init__.py +0 -0
- {core_framework-3.2.0 → core_framework-4.0.0}/core_framework/api/attachments/__init__.py +0 -0
- {core_framework-3.2.0 → core_framework-4.0.0}/core_framework/api/auth/__init__.py +0 -0
- {core_framework-3.2.0 → core_framework-4.0.0}/core_framework/api/comments/__init__.py +0 -0
- {core_framework-3.2.0 → core_framework-4.0.0}/core_framework/api/comments/authenticated/__init__.py +0 -0
- {core_framework-3.2.0 → core_framework-4.0.0}/core_framework/api/comments/public/__init__.py +0 -0
- {core_framework-3.2.0 → core_framework-4.0.0}/core_framework/api/comments/router.py +0 -0
- {core_framework-3.2.0 → core_framework-4.0.0}/core_framework/api/events/__init__.py +0 -0
- {core_framework-3.2.0 → core_framework-4.0.0}/core_framework/api/events/schemas.py +0 -0
- {core_framework-3.2.0 → core_framework-4.0.0}/core_framework/api/idempotency/__init__.py +0 -0
- {core_framework-3.2.0 → core_framework-4.0.0}/core_framework/api/idempotency/dependencies.py +0 -0
- {core_framework-3.2.0/core_framework/application/media → core_framework-4.0.0/core_framework/api}/ingest_guards.py +0 -0
- {core_framework-3.2.0 → core_framework-4.0.0}/core_framework/api/notifications/__init__.py +0 -0
- {core_framework-3.2.0 → core_framework-4.0.0}/core_framework/api/notifications/authenticated/__init__.py +0 -0
- {core_framework-3.2.0 → core_framework-4.0.0}/core_framework/api/notifications/router.py +0 -0
- {core_framework-3.2.0 → core_framework-4.0.0}/core_framework/api/posts/__init__.py +0 -0
- {core_framework-3.2.0 → core_framework-4.0.0}/core_framework/api/posts/authenticated/__init__.py +0 -0
- {core_framework-3.2.0 → core_framework-4.0.0}/core_framework/api/posts/public/__init__.py +0 -0
- {core_framework-3.2.0 → core_framework-4.0.0}/core_framework/api/posts/public/schemas.py +0 -0
- {core_framework-3.2.0 → core_framework-4.0.0}/core_framework/api/posts/router.py +0 -0
- {core_framework-3.2.0 → core_framework-4.0.0}/core_framework/api/system/__init__.py +0 -0
- {core_framework-3.2.0 → core_framework-4.0.0}/core_framework/api/system/router.py +0 -0
- {core_framework-3.2.0 → core_framework-4.0.0}/core_framework/api/upload.py +0 -0
- {core_framework-3.2.0 → core_framework-4.0.0}/core_framework/api/users/__init__.py +0 -0
- {core_framework-3.2.0 → core_framework-4.0.0}/core_framework/api/users/authenticated/__init__.py +0 -0
- {core_framework-3.2.0 → core_framework-4.0.0}/core_framework/api/users/authenticated/mappers.py +0 -0
- {core_framework-3.2.0 → core_framework-4.0.0}/core_framework/api/users/public/__init__.py +0 -0
- {core_framework-3.2.0 → core_framework-4.0.0}/core_framework/api/users/router.py +0 -0
- {core_framework-3.2.0 → core_framework-4.0.0}/core_framework/api/users/shared/__init__.py +0 -0
- {core_framework-3.2.0 → core_framework-4.0.0}/core_framework/application/__init__.py +0 -0
- {core_framework-3.2.0 → core_framework-4.0.0}/core_framework/application/analytics/__init__.py +0 -0
- {core_framework-3.2.0 → core_framework-4.0.0}/core_framework/application/analytics/prune_service.py +0 -0
- {core_framework-3.2.0 → core_framework-4.0.0}/core_framework/application/analytics/registry.py +0 -0
- {core_framework-3.2.0 → core_framework-4.0.0}/core_framework/application/analytics/sources/__init__.py +0 -0
- {core_framework-3.2.0 → core_framework-4.0.0}/core_framework/application/analytics/sources/comment_created.py +0 -0
- {core_framework-3.2.0 → core_framework-4.0.0}/core_framework/application/analytics/sources/post_created.py +0 -0
- {core_framework-3.2.0 → core_framework-4.0.0}/core_framework/application/analytics/sources/post_viewed.py +0 -0
- {core_framework-3.2.0 → core_framework-4.0.0}/core_framework/application/analytics/sources/user_registered.py +0 -0
- {core_framework-3.2.0 → core_framework-4.0.0}/core_framework/application/auth/__init__.py +0 -0
- {core_framework-3.2.0 → core_framework-4.0.0}/core_framework/application/cache/__init__.py +0 -0
- {core_framework-3.2.0 → core_framework-4.0.0}/core_framework/application/cache/invalidate_service.py +0 -0
- {core_framework-3.2.0 → core_framework-4.0.0}/core_framework/application/cache/models.py +0 -0
- {core_framework-3.2.0 → core_framework-4.0.0}/core_framework/application/email/enqueue.py +0 -0
- {core_framework-3.2.0 → core_framework-4.0.0}/core_framework/application/email/registry.py +0 -0
- {core_framework-3.2.0 → core_framework-4.0.0}/core_framework/application/email/send.py +0 -0
- {core_framework-3.2.0/core_framework/application/comments → core_framework-4.0.0/core_framework/application/events}/__init__.py +0 -0
- {core_framework-3.2.0 → core_framework-4.0.0}/core_framework/application/events/event_token.py +0 -0
- {core_framework-3.2.0 → core_framework-4.0.0}/core_framework/application/events/models.py +0 -0
- {core_framework-3.2.0 → core_framework-4.0.0}/core_framework/application/events/utm_capture_kinds.py +0 -0
- {core_framework-3.2.0/core_framework/application/events → core_framework-4.0.0/core_framework/application/media}/__init__.py +0 -0
- {core_framework-3.2.0 → core_framework-4.0.0}/core_framework/application/media/attachment_read.py +0 -0
- {core_framework-3.2.0 → core_framework-4.0.0}/core_framework/application/media/read_url_config.py +0 -0
- {core_framework-3.2.0/core_framework/application/media → core_framework-4.0.0/core_framework/application/moderation}/__init__.py +0 -0
- {core_framework-3.2.0 → core_framework-4.0.0}/core_framework/application/moderation/scheduled_service.py +0 -0
- {core_framework-3.2.0/core_framework/application/moderation → core_framework-4.0.0/core_framework/application/notifications}/__init__.py +0 -0
- {core_framework-3.2.0 → core_framework-4.0.0}/core_framework/application/notifications/prune_service.py +0 -0
- {core_framework-3.2.0/core_framework/application/notifications → core_framework-4.0.0/core_framework/application/outbox}/__init__.py +0 -0
- {core_framework-3.2.0 → core_framework-4.0.0}/core_framework/application/outbox/exceptions.py +0 -0
- {core_framework-3.2.0 → core_framework-4.0.0}/core_framework/application/outbox/follow_mirrors.py +0 -0
- {core_framework-3.2.0 → core_framework-4.0.0}/core_framework/application/outbox/polling_service.py +0 -0
- {core_framework-3.2.0/core_framework/application/outbox → core_framework-4.0.0/core_framework/application/posts}/__init__.py +0 -0
- {core_framework-3.2.0/core_framework/application/posts → core_framework-4.0.0/core_framework/application/shared}/__init__.py +0 -0
- {core_framework-3.2.0 → core_framework-4.0.0}/core_framework/application/shared/request_context.py +0 -0
- {core_framework-3.2.0/core_framework/application/shared → core_framework-4.0.0/core_framework/application/users}/__init__.py +0 -0
- {core_framework-3.2.0 → core_framework-4.0.0}/core_framework/application/users/deletion_audit.py +0 -0
- {core_framework-3.2.0 → core_framework-4.0.0}/core_framework/application/users/enums.py +0 -0
- {core_framework-3.2.0 → core_framework-4.0.0}/core_framework/asgi.py +0 -0
- {core_framework-3.2.0 → core_framework-4.0.0}/core_framework/core/context.py +0 -0
- {core_framework-3.2.0 → core_framework-4.0.0}/core_framework/core/database.py +0 -0
- {core_framework-3.2.0 → core_framework-4.0.0}/core_framework/core/exception_handlers/__init__.py +0 -0
- {core_framework-3.2.0 → core_framework-4.0.0}/core_framework/core/exceptions.py +0 -0
- {core_framework-3.2.0 → core_framework-4.0.0}/core_framework/core/firebase.py +0 -0
- {core_framework-3.2.0 → core_framework-4.0.0}/core_framework/core/http_client.py +0 -0
- {core_framework-3.2.0 → core_framework-4.0.0}/core_framework/core/http_probes.py +0 -0
- {core_framework-3.2.0 → core_framework-4.0.0}/core_framework/core/logging.py +0 -0
- {core_framework-3.2.0 → core_framework-4.0.0}/core_framework/core/process.py +0 -0
- {core_framework-3.2.0 → core_framework-4.0.0}/core_framework/core/redis.py +0 -0
- {core_framework-3.2.0 → core_framework-4.0.0}/core_framework/core/runtime.py +0 -0
- {core_framework-3.2.0/core_framework/application/users → core_framework-4.0.0/core_framework/domains}/__init__.py +0 -0
- {core_framework-3.2.0 → core_framework-4.0.0}/core_framework/domains/analytics/dependencies.py +0 -0
- {core_framework-3.2.0 → core_framework-4.0.0}/core_framework/domains/analytics/exceptions.py +0 -0
- {core_framework-3.2.0 → core_framework-4.0.0}/core_framework/domains/analytics/models.py +0 -0
- {core_framework-3.2.0/core_framework/domains → core_framework-4.0.0/core_framework/domains/analytics/ports}/__init__.py +0 -0
- {core_framework-3.2.0 → core_framework-4.0.0}/core_framework/domains/analytics/ports/activity_source.py +0 -0
- {core_framework-3.2.0/core_framework/domains/analytics → core_framework-4.0.0/core_framework/domains/auth}/ports/__init__.py +0 -0
- {core_framework-3.2.0 → core_framework-4.0.0}/core_framework/domains/comment/dependencies.py +0 -0
- {core_framework-3.2.0 → core_framework-4.0.0}/core_framework/domains/email/README.md +0 -0
- {core_framework-3.2.0 → core_framework-4.0.0}/core_framework/domains/email/__init__.py +0 -0
- {core_framework-3.2.0 → core_framework-4.0.0}/core_framework/domains/email/exceptions.py +0 -0
- {core_framework-3.2.0 → core_framework-4.0.0}/core_framework/domains/email/ports/send.py +0 -0
- {core_framework-3.2.0 → core_framework-4.0.0}/core_framework/domains/email/service.py +0 -0
- {core_framework-3.2.0 → core_framework-4.0.0}/core_framework/domains/exceptions.py +0 -0
- {core_framework-3.2.0/core_framework/domains/auth/ports → core_framework-4.0.0/core_framework/domains/media/attachment}/__init__.py +0 -0
- {core_framework-3.2.0/core_framework/domains/media/attachment → core_framework-4.0.0/core_framework/domains/media/attachment/components}/__init__.py +0 -0
- {core_framework-3.2.0 → core_framework-4.0.0}/core_framework/domains/media/attachment/components/finals_publisher.py +0 -0
- {core_framework-3.2.0 → core_framework-4.0.0}/core_framework/domains/media/attachment/exceptions.py +0 -0
- {core_framework-3.2.0/core_framework/domains/media/attachment/components → core_framework-4.0.0/core_framework/domains/media/attachment/ports}/__init__.py +0 -0
- {core_framework-3.2.0 → core_framework-4.0.0}/core_framework/domains/media/attachment/ports/finals_publisher.py +0 -0
- {core_framework-3.2.0 → core_framework-4.0.0}/core_framework/domains/media/attachment/ports/staging.py +0 -0
- {core_framework-3.2.0/core_framework/domains/media/attachment/ports → core_framework-4.0.0/core_framework/domains/media/avatar}/__init__.py +0 -0
- {core_framework-3.2.0/core_framework/domains/media/avatar → core_framework-4.0.0/core_framework/domains/media/avatar/components}/__init__.py +0 -0
- {core_framework-3.2.0 → core_framework-4.0.0}/core_framework/domains/media/avatar/components/finals_publisher.py +0 -0
- {core_framework-3.2.0 → core_framework-4.0.0}/core_framework/domains/media/avatar/components/staging.py +0 -0
- {core_framework-3.2.0 → core_framework-4.0.0}/core_framework/domains/media/avatar/components/variant_encoder.py +0 -0
- {core_framework-3.2.0 → core_framework-4.0.0}/core_framework/domains/media/avatar/constants.py +0 -0
- {core_framework-3.2.0 → core_framework-4.0.0}/core_framework/domains/media/avatar/exceptions.py +0 -0
- {core_framework-3.2.0 → core_framework-4.0.0}/core_framework/domains/media/avatar/models.py +0 -0
- {core_framework-3.2.0/core_framework/domains/media/avatar/components → core_framework-4.0.0/core_framework/domains/media/avatar/ports}/__init__.py +0 -0
- {core_framework-3.2.0 → core_framework-4.0.0}/core_framework/domains/media/avatar/ports/finals_publisher.py +0 -0
- {core_framework-3.2.0 → core_framework-4.0.0}/core_framework/domains/media/avatar/ports/staging.py +0 -0
- {core_framework-3.2.0 → core_framework-4.0.0}/core_framework/domains/media/avatar/ports/variant_encoder.py +0 -0
- {core_framework-3.2.0/core_framework/domains/media/avatar/ports → core_framework-4.0.0/core_framework/domains/media/banner}/__init__.py +0 -0
- {core_framework-3.2.0/core_framework/domains/media/banner → core_framework-4.0.0/core_framework/domains/media/banner/components}/__init__.py +0 -0
- {core_framework-3.2.0 → core_framework-4.0.0}/core_framework/domains/media/banner/components/finals_publisher.py +0 -0
- {core_framework-3.2.0 → core_framework-4.0.0}/core_framework/domains/media/banner/components/staging.py +0 -0
- {core_framework-3.2.0 → core_framework-4.0.0}/core_framework/domains/media/banner/components/variant_encoder.py +0 -0
- {core_framework-3.2.0 → core_framework-4.0.0}/core_framework/domains/media/banner/constants.py +0 -0
- {core_framework-3.2.0 → core_framework-4.0.0}/core_framework/domains/media/banner/exceptions.py +0 -0
- {core_framework-3.2.0 → core_framework-4.0.0}/core_framework/domains/media/banner/models.py +0 -0
- {core_framework-3.2.0/core_framework/domains/media/banner/components → core_framework-4.0.0/core_framework/domains/media/banner/ports}/__init__.py +0 -0
- {core_framework-3.2.0 → core_framework-4.0.0}/core_framework/domains/media/banner/ports/finals_publisher.py +0 -0
- {core_framework-3.2.0 → core_framework-4.0.0}/core_framework/domains/media/banner/ports/staging.py +0 -0
- {core_framework-3.2.0 → core_framework-4.0.0}/core_framework/domains/media/banner/ports/variant_encoder.py +0 -0
- {core_framework-3.2.0/core_framework/domains/media/banner/ports → core_framework-4.0.0/core_framework/domains/media/shared}/__init__.py +0 -0
- {core_framework-3.2.0 → core_framework-4.0.0}/core_framework/domains/media/shared/constants.py +0 -0
- {core_framework-3.2.0 → core_framework-4.0.0}/core_framework/domains/media/shared/exceptions.py +0 -0
- {core_framework-3.2.0 → core_framework-4.0.0}/core_framework/domains/media/shared/utils.py +0 -0
- {core_framework-3.2.0 → core_framework-4.0.0}/core_framework/domains/moderation/__init__.py +0 -0
- {core_framework-3.2.0 → core_framework-4.0.0}/core_framework/domains/moderation/exceptions.py +0 -0
- {core_framework-3.2.0 → core_framework-4.0.0}/core_framework/domains/moderation/models.py +0 -0
- {core_framework-3.2.0 → core_framework-4.0.0}/core_framework/domains/moderation/outcomes.py +0 -0
- {core_framework-3.2.0 → core_framework-4.0.0}/core_framework/domains/notification/dependencies.py +0 -0
- {core_framework-3.2.0 → core_framework-4.0.0}/core_framework/domains/notification/exceptions.py +0 -0
- {core_framework-3.2.0 → core_framework-4.0.0}/core_framework/domains/outbox/dependencies.py +0 -0
- {core_framework-3.2.0 → core_framework-4.0.0}/core_framework/domains/outbox/exceptions.py +0 -0
- {core_framework-3.2.0 → core_framework-4.0.0}/core_framework/domains/outbox/models.py +0 -0
- {core_framework-3.2.0/core_framework/domains/media/shared → core_framework-4.0.0/core_framework/domains/outbox/ports}/__init__.py +0 -0
- {core_framework-3.2.0 → core_framework-4.0.0}/core_framework/domains/outbox/ports/consumer.py +0 -0
- {core_framework-3.2.0 → core_framework-4.0.0}/core_framework/domains/outbox/ports/producer.py +0 -0
- {core_framework-3.2.0 → core_framework-4.0.0}/core_framework/domains/post/dependencies.py +0 -0
- {core_framework-3.2.0 → core_framework-4.0.0}/core_framework/domains/post/outcomes.py +0 -0
- {core_framework-3.2.0 → core_framework-4.0.0}/core_framework/domains/user/exceptions.py +0 -0
- {core_framework-3.2.0 → core_framework-4.0.0}/core_framework/domains/user/utils.py +0 -0
- {core_framework-3.2.0/core_framework/domains/outbox/ports → core_framework-4.0.0/core_framework/infrastructure}/__init__.py +0 -0
- {core_framework-3.2.0 → core_framework-4.0.0}/core_framework/infrastructure/email/resend_email_adapter.py +0 -0
- {core_framework-3.2.0/core_framework/infrastructure → core_framework-4.0.0/core_framework/infrastructure/firebase}/__init__.py +0 -0
- {core_framework-3.2.0/core_framework/infrastructure/firebase → core_framework-4.0.0/core_framework/infrastructure/media}/__init__.py +0 -0
- {core_framework-3.2.0 → core_framework-4.0.0}/core_framework/infrastructure/media/local_attachment_staging_adapter.py +0 -0
- {core_framework-3.2.0 → core_framework-4.0.0}/core_framework/infrastructure/media/local_avatar_staging_adapter.py +0 -0
- {core_framework-3.2.0 → core_framework-4.0.0}/core_framework/infrastructure/media/local_banner_staging_adapter.py +0 -0
- {core_framework-3.2.0 → core_framework-4.0.0}/core_framework/infrastructure/media/pillow_avatar_variant_encoder_adapter.py +0 -0
- {core_framework-3.2.0 → core_framework-4.0.0}/core_framework/infrastructure/media/pillow_banner_variant_encoder_adapter.py +0 -0
- {core_framework-3.2.0 → core_framework-4.0.0}/core_framework/infrastructure/media/pillow_staging_image.py +0 -0
- {core_framework-3.2.0 → core_framework-4.0.0}/core_framework/infrastructure/media/ssh_attachment_finals_publisher_adapter.py +0 -0
- {core_framework-3.2.0 → core_framework-4.0.0}/core_framework/infrastructure/media/ssh_banner_finals_publisher_adapter.py +0 -0
- {core_framework-3.2.0 → core_framework-4.0.0}/core_framework/infrastructure/media/ssh_finals_publisher_adapter.py +0 -0
- {core_framework-3.2.0 → core_framework-4.0.0}/core_framework/infrastructure/media/staging_paths.py +0 -0
- {core_framework-3.2.0/core_framework/infrastructure/media → core_framework-4.0.0/core_framework/infrastructure/outbox}/__init__.py +0 -0
- {core_framework-3.2.0 → core_framework-4.0.0}/core_framework/infrastructure/outbox/outbox_consumer_adapter.py +0 -0
- {core_framework-3.2.0 → core_framework-4.0.0}/core_framework/infrastructure/outbox/outbox_producer_adapter.py +0 -0
- {core_framework-3.2.0 → core_framework-4.0.0}/core_framework/migrate_cli.py +0 -0
- {core_framework-3.2.0 → core_framework-4.0.0}/core_framework/py.typed +0 -0
- {core_framework-3.2.0 → core_framework-4.0.0}/core_framework/testing/firebase.py +0 -0
- {core_framework-3.2.0 → core_framework-4.0.0}/core_framework/testing/firebase_identity_toolkit.py +0 -0
- {core_framework-3.2.0 → core_framework-4.0.0}/core_framework/testing/httpx_test_client.py +0 -0
- {core_framework-3.2.0 → core_framework-4.0.0}/core_framework/testing/migrations.py +0 -0
- {core_framework-3.2.0/core_framework/infrastructure/outbox → core_framework-4.0.0/core_framework/worker}/__init__.py +0 -0
- {core_framework-3.2.0 → core_framework-4.0.0}/core_framework/worker/schedules/analytics_refresh_cron.py +0 -0
- {core_framework-3.2.0 → core_framework-4.0.0}/core_framework/worker/schedules/schedule_aggregate_comment_stats.py +0 -0
- {core_framework-3.2.0 → core_framework-4.0.0}/core_framework/worker/schedules/schedule_aggregate_post_stats.py +0 -0
- {core_framework-3.2.0 → core_framework-4.0.0}/core_framework/worker/schedules/schedule_aggregate_user_stats.py +0 -0
- {core_framework-3.2.0 → core_framework-4.0.0}/core_framework/worker/schedules/schedule_poll_outbox.py +0 -0
- {core_framework-3.2.0 → core_framework-4.0.0}/core_framework/worker/schedules/schedule_prune_analytics_daily_facts.py +0 -0
- {core_framework-3.2.0 → core_framework-4.0.0}/core_framework/worker/schedules/schedule_prune_post_views.py +0 -0
- {core_framework-3.2.0 → core_framework-4.0.0}/core_framework/worker/schedules/schedule_prune_read_notifications.py +0 -0
- {core_framework-3.2.0 → core_framework-4.0.0}/core_framework/worker/schedules/schedule_sweep_stale_attachment_staging.py +0 -0
- {core_framework-3.2.0 → core_framework-4.0.0}/core_framework/worker/schedules/schedule_sweep_stale_avatar_staging.py +0 -0
- {core_framework-3.2.0 → core_framework-4.0.0}/core_framework/worker/schedules/schedule_sweep_stale_banner_staging.py +0 -0
- {core_framework-3.2.0 → core_framework-4.0.0}/core_framework/worker/tasks/delete_attachment_finals.py +0 -0
- {core_framework-3.2.0 → core_framework-4.0.0}/core_framework/worker/tasks/delete_superseded_avatar_finals.py +0 -0
- {core_framework-3.2.0 → core_framework-4.0.0}/core_framework/worker/tasks/delete_superseded_banner_finals.py +0 -0
- {core_framework-3.2.0 → core_framework-4.0.0}/core_framework/worker/tasks/process_account_deletion_scheduled_email.py +0 -0
- {core_framework-3.2.0 → core_framework-4.0.0}/core_framework/worker/tasks/process_admin_user_deletion.py +0 -0
- {core_framework-3.2.0 → core_framework-4.0.0}/core_framework/worker/tasks/process_aggregate_comment_stats.py +0 -0
- {core_framework-3.2.0 → core_framework-4.0.0}/core_framework/worker/tasks/process_aggregate_post_stats.py +0 -0
- {core_framework-3.2.0 → core_framework-4.0.0}/core_framework/worker/tasks/process_aggregate_user_stats.py +0 -0
- {core_framework-3.2.0 → core_framework-4.0.0}/core_framework/worker/tasks/process_attachment_asset_variants.py +0 -0
- {core_framework-3.2.0 → core_framework-4.0.0}/core_framework/worker/tasks/process_banner_asset_variants.py +0 -0
- {core_framework-3.2.0 → core_framework-4.0.0}/core_framework/worker/tasks/process_media_asset_variants.py +0 -0
- {core_framework-3.2.0 → core_framework-4.0.0}/core_framework/worker/tasks/process_mute_lift.py +0 -0
- {core_framework-3.2.0 → core_framework-4.0.0}/core_framework/worker/tasks/process_outbox_row.py +0 -0
- {core_framework-3.2.0 → core_framework-4.0.0}/core_framework/worker/tasks/process_refresh_analytics_bucket.py +0 -0
- {core_framework-3.2.0 → core_framework-4.0.0}/core_framework/worker/tasks/process_transactional_email.py +0 -0
- {core_framework-3.2.0 → core_framework-4.0.0}/core_framework/worker/worker_context.py +0 -0
- {core_framework-3.2.0 → core_framework-4.0.0}/deploy/README.md +0 -0
- {core_framework-3.2.0 → core_framework-4.0.0}/deploy/app/docker-compose.dev.yaml +0 -0
- {core_framework-3.2.0 → core_framework-4.0.0}/deploy/app/dockerfile +0 -0
- {core_framework-3.2.0 → core_framework-4.0.0}/deploy/observability/.env.example +0 -0
- {core_framework-3.2.0 → core_framework-4.0.0}/deploy/observability/grafana/dashboards/application/api-http.json +0 -0
- {core_framework-3.2.0 → core_framework-4.0.0}/deploy/observability/grafana/dashboards/application/worker-jobs.json +0 -0
- {core_framework-3.2.0 → core_framework-4.0.0}/deploy/observability/grafana/dashboards/infrastructure/node-exporter.json +0 -0
- {core_framework-3.2.0 → core_framework-4.0.0}/deploy/observability/grafana/dashboards/infrastructure/postgres-exporter.json +0 -0
- {core_framework-3.2.0 → core_framework-4.0.0}/deploy/observability/grafana/dashboards/infrastructure/redis-exporter.json +0 -0
- {core_framework-3.2.0 → core_framework-4.0.0}/deploy/observability/grafana/provisioning/dashboards/dashboards.yml +0 -0
- {core_framework-3.2.0 → core_framework-4.0.0}/deploy/observability/grafana/provisioning/datasources/datasources.yml +0 -0
- {core_framework-3.2.0 → core_framework-4.0.0}/deploy/observability/loki.yaml +0 -0
- {core_framework-3.2.0 → core_framework-4.0.0}/deploy/observability/otel-collector-config.yaml +0 -0
- {core_framework-3.2.0 → core_framework-4.0.0}/deploy/observability/targets/node/.gitkeep +0 -0
- {core_framework-3.2.0 → core_framework-4.0.0}/deploy/observability/targets/postgres/.gitkeep +0 -0
- {core_framework-3.2.0 → core_framework-4.0.0}/deploy/observability/targets/redis/.gitkeep +0 -0
- {core_framework-3.2.0 → core_framework-4.0.0}/deploy/observability/tempo.yaml +0 -0
- {core_framework-3.2.0 → core_framework-4.0.0}/docs/deployments/edge-upload-limits.md +0 -0
- {core_framework-3.2.0 → core_framework-4.0.0}/docs/deployments/examples/Caddyfile.example +0 -0
- {core_framework-3.2.0 → core_framework-4.0.0}/docs/deployments/examples/Caddyfile.observability.example +0 -0
- {core_framework-3.2.0 → core_framework-4.0.0}/docs/deployments/examples/image-server-known-hosts.example +0 -0
- {core_framework-3.2.0 → core_framework-4.0.0}/docs/deployments/guides/playbook/py-spy-playbook.md +0 -0
- {core_framework-3.2.0 → core_framework-4.0.0}/docs/deployments/guides/setup/py-spy-setup.md +0 -0
- {core_framework-3.2.0 → core_framework-4.0.0}/docs/domains/posts/README.md +0 -0
- {core_framework-3.2.0 → core_framework-4.0.0}/docs/platform/database-triggers.md +0 -0
- {core_framework-3.2.0 → core_framework-4.0.0}/firebase_config.example.json +0 -0
- {core_framework-3.2.0 → core_framework-4.0.0}/makefile +0 -0
- {core_framework-3.2.0/core_framework/worker → core_framework-4.0.0/tests}/__init__.py +0 -0
- {core_framework-3.2.0 → core_framework-4.0.0}/tests/e2e/_auth.py +0 -0
- {core_framework-3.2.0 → core_framework-4.0.0}/tests/e2e/_media.py +0 -0
- {core_framework-3.2.0 → core_framework-4.0.0}/tests/e2e/conftest.py +0 -0
- {core_framework-3.2.0 → core_framework-4.0.0}/tests/e2e/media/pipeline_test.py +0 -0
- {core_framework-3.2.0 → core_framework-4.0.0}/tests/e2e/smoke/canary_test.py +0 -0
- {core_framework-3.2.0 → core_framework-4.0.0}/tests/e2e/smoke/media_test.py +0 -0
- {core_framework-3.2.0 → core_framework-4.0.0}/tests/e2e/smoke/system_test.py +0 -0
- {core_framework-3.2.0 → core_framework-4.0.0}/tests/e2e/smoke/tls_host_test.py +0 -0
- {core_framework-3.2.0/tests → core_framework-4.0.0/tests/integration}/__init__.py +0 -0
- {core_framework-3.2.0 → core_framework-4.0.0}/tests/integration/analytics/_helpers.py +0 -0
- {core_framework-3.2.0/tests/integration → core_framework-4.0.0/tests/integration/api}/__init__.py +0 -0
- {core_framework-3.2.0 → core_framework-4.0.0}/tests/integration/api/_outbox_helpers.py +0 -0
- {core_framework-3.2.0/tests/integration/api → core_framework-4.0.0/tests/integration/api/admin}/__init__.py +0 -0
- {core_framework-3.2.0/tests/integration/api/admin → core_framework-4.0.0/tests/integration/api/admin/analytics}/__init__.py +0 -0
- {core_framework-3.2.0/tests/integration/api/admin/analytics → core_framework-4.0.0/tests/integration/api/admin/cache}/__init__.py +0 -0
- {core_framework-3.2.0/tests/integration/api/admin/cache → core_framework-4.0.0/tests/integration/api/admin/comments}/__init__.py +0 -0
- {core_framework-3.2.0/tests/integration/api/admin/comments → core_framework-4.0.0/tests/integration/api/admin/moderation}/__init__.py +0 -0
- {core_framework-3.2.0/tests/integration/api/admin/moderation → core_framework-4.0.0/tests/integration/api/admin/outbox}/__init__.py +0 -0
- {core_framework-3.2.0/tests/integration/api/admin/outbox → core_framework-4.0.0/tests/integration/api/admin/posts}/__init__.py +0 -0
- {core_framework-3.2.0/tests/integration/api/admin/posts → core_framework-4.0.0/tests/integration/api/admin/users}/__init__.py +0 -0
- {core_framework-3.2.0/tests/integration/api/admin/users → core_framework-4.0.0/tests/integration/api/auth}/__init__.py +0 -0
- {core_framework-3.2.0/tests/integration/api/auth → core_framework-4.0.0/tests/integration/api/comments}/__init__.py +0 -0
- {core_framework-3.2.0/tests/integration/api/comments → core_framework-4.0.0/tests/integration/api/comments/authenticated}/__init__.py +0 -0
- {core_framework-3.2.0/tests/integration/api/comments/authenticated → core_framework-4.0.0/tests/integration/api/comments/public}/__init__.py +0 -0
- {core_framework-3.2.0 → core_framework-4.0.0}/tests/integration/api/media/ingest_contract_test.py +0 -0
- {core_framework-3.2.0 → core_framework-4.0.0}/tests/integration/api/mentions/mentions_integration_test.py +0 -0
- {core_framework-3.2.0/tests/integration/api/comments/public → core_framework-4.0.0/tests/integration/api/notifications}/__init__.py +0 -0
- {core_framework-3.2.0/tests/integration/api/notifications → core_framework-4.0.0/tests/integration/api/posts}/__init__.py +0 -0
- {core_framework-3.2.0 → core_framework-4.0.0}/tests/integration/api/posts/comment_count_aggregation_test.py +0 -0
- {core_framework-3.2.0/tests/integration/api/posts → core_framework-4.0.0/tests/integration/api/posts/public}/__init__.py +0 -0
- {core_framework-3.2.0 → core_framework-4.0.0}/tests/integration/api/public_read_by_id_unavailable_detail_test.py +0 -0
- {core_framework-3.2.0/tests/integration/api/posts/public → core_framework-4.0.0/tests/integration/api/ratings}/__init__.py +0 -0
- {core_framework-3.2.0 → core_framework-4.0.0}/tests/integration/api/system/__init__.py +0 -0
- {core_framework-3.2.0 → core_framework-4.0.0}/tests/integration/api/system/router_test.py +0 -0
- {core_framework-3.2.0 → core_framework-4.0.0}/tests/integration/api/users/__init__.py +0 -0
- {core_framework-3.2.0 → core_framework-4.0.0}/tests/integration/api/users/authenticated/__init__.py +0 -0
- {core_framework-3.2.0 → core_framework-4.0.0}/tests/integration/api/users/public/__init__.py +0 -0
- {core_framework-3.2.0 → core_framework-4.0.0}/tests/integration/worker/__init__.py +0 -0
- {core_framework-3.2.0 → core_framework-4.0.0}/tests/integration/worker/analytics_prune_test.py +0 -0
- {core_framework-3.2.0 → core_framework-4.0.0}/tests/integration/worker/attachment_upload_test.py +0 -0
- {core_framework-3.2.0 → core_framework-4.0.0}/tests/integration/worker/read_notifications_retention_test.py +0 -0
- {core_framework-3.2.0 → core_framework-4.0.0}/tests/integration/worker/stale_staging_sweep_test.py +0 -0
- {core_framework-3.2.0 → core_framework-4.0.0}/tests/unit/__init__.py +0 -0
- {core_framework-3.2.0 → core_framework-4.0.0}/tests/unit/api/dedupe_preserving_order_test.py +0 -0
- {core_framework-3.2.0 → core_framework-4.0.0}/tests/unit/api/posts/authenticated/post_update_mapper_test.py +0 -0
- {core_framework-3.2.0 → core_framework-4.0.0}/tests/unit/application/comments/__init__.py +0 -0
- {core_framework-3.2.0 → core_framework-4.0.0}/tests/unit/application/shared/request_context_test.py +0 -0
- {core_framework-3.2.0 → core_framework-4.0.0}/tests/unit/application/users/deletion_audit_test.py +0 -0
- {core_framework-3.2.0 → core_framework-4.0.0}/tests/unit/core/bundled_alembic_test.py +0 -0
- {core_framework-3.2.0 → core_framework-4.0.0}/tests/unit/core/migrate_cli_test.py +0 -0
- {core_framework-3.2.0 → core_framework-4.0.0}/tests/unit/docs/_api_reference.py +0 -0
- {core_framework-3.2.0 → core_framework-4.0.0}/tests/unit/docs/api_routes_test.py +0 -0
- {core_framework-3.2.0 → core_framework-4.0.0}/tests/unit/domains/__init__.py +0 -0
- {core_framework-3.2.0 → core_framework-4.0.0}/tests/unit/domains/comment/__init__.py +0 -0
- {core_framework-3.2.0 → core_framework-4.0.0}/tests/unit/domains/post/models_test.py +0 -0
- {core_framework-3.2.0 → core_framework-4.0.0}/tests/unit/infrastructure/__init__.py +0 -0
- {core_framework-3.2.0 → core_framework-4.0.0}/tests/unit/infrastructure/media/__init__.py +0 -0
- {core_framework-3.2.0 → core_framework-4.0.0}/tests/unit/infrastructure/media/ssh_finals_publisher_adapter_test.py +0 -0
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
---
|
|
2
|
+
description: Alembic migrations — revision id format and index DDL conventions
|
|
3
|
+
globs: alembic/**/alembic/versions/*.py
|
|
4
|
+
alwaysApply: false
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
# Alembic migrations
|
|
8
|
+
|
|
9
|
+
## Revision IDs
|
|
10
|
+
|
|
11
|
+
`alembic_version.version_num` is a **32-character** string. Revision ids must stay well under that limit.
|
|
12
|
+
|
|
13
|
+
### New revisions (required)
|
|
14
|
+
|
|
15
|
+
- Set `revision` to a **12-character lowercase hex** string (Alembic default), e.g. `a56bc6b7f799`.
|
|
16
|
+
- Generate with `python -c "import secrets; print(secrets.token_hex(6))"` or `alembic revision`.
|
|
17
|
+
- Put the human-readable slug in the **filename** and the module docstring `Revision ID:` line only if you mirror the hex id there — **do not** use descriptive slugs as `revision`.
|
|
18
|
+
|
|
19
|
+
```python
|
|
20
|
+
# ✅ Preferred
|
|
21
|
+
"""replace deleted post status with tombstone statuses
|
|
22
|
+
|
|
23
|
+
Revision ID: 120bf6be81eb
|
|
24
|
+
Revises: a56bc6b7f799
|
|
25
|
+
"""
|
|
26
|
+
|
|
27
|
+
revision: str = "120bf6be81eb"
|
|
28
|
+
```
|
|
29
|
+
|
|
30
|
+
```python
|
|
31
|
+
# ❌ Avoid — long, wastes version_num budget, inconsistent with recent migrations
|
|
32
|
+
revision: str = "post_tombstone_status_model"
|
|
33
|
+
```
|
|
34
|
+
|
|
35
|
+
### Exceptions
|
|
36
|
+
|
|
37
|
+
- Collapsed **`v1_*_init`** baseline revisions keep their stable names (`v1_post_init`, etc.) — do not rename shipped baselines.
|
|
38
|
+
- **Legacy descriptive slug** revision ids (e.g. `post_add_post_mentions`, `user_add_date_of_birth`) stay as-is. Do not rewrite or collapse history just to convert them to hex. Do not re-flag them on B11 unless a deliberate baseline collapse is in progress.
|
|
39
|
+
|
|
40
|
+
### Do not rename shipped revision ids
|
|
41
|
+
|
|
42
|
+
If a revision may already be applied in any environment, **do not** change its `revision` string. Add a forward migration instead.
|
|
43
|
+
|
|
44
|
+
## Index DDL
|
|
45
|
+
|
|
46
|
+
### New index migrations (required)
|
|
47
|
+
|
|
48
|
+
In **`upgrade()`**, create indexes with **`IF NOT EXISTS`** so migrations succeed when an index was already applied manually in production:
|
|
49
|
+
|
|
50
|
+
```python
|
|
51
|
+
op.execute("""
|
|
52
|
+
create index if not exists idx_example_created_at
|
|
53
|
+
on example_table (created_at);
|
|
54
|
+
""")
|
|
55
|
+
```
|
|
56
|
+
|
|
57
|
+
Use **`drop index if exists`** in **`downgrade()`**.
|
|
58
|
+
|
|
59
|
+
### Do not retrofit index DDL
|
|
60
|
+
|
|
61
|
+
Do **not** edit shipped migrations only to add `if not exists` — those revisions may already be applied. New forward migrations follow this rule; legacy `create index` without `if not exists` stays as-is.
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
---
|
|
2
|
+
description: Core non-negotiables — behavior, tech stack, layer direction, host scope
|
|
3
|
+
alwaysApply: true
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# Constitution
|
|
7
|
+
|
|
8
|
+
## Behavior
|
|
9
|
+
|
|
10
|
+
- State assumptions; ask when unclear. Prefer the simplest correct solution.
|
|
11
|
+
- Use the terms in [`docs/platform/glossary.md`](docs/platform/glossary.md) in **new** writing. Do not invent synonyms for those concepts. Do not rewrite shipped ADRs or docs solely to match the glossary.
|
|
12
|
+
- Touch only what the task requires. Match existing style. Remove orphans your edits create.
|
|
13
|
+
- Define verifiable success criteria for non-trivial work.
|
|
14
|
+
- **Wait for the third copy before you extract** — do not extract a private function used once or twice when it is only a few lines (identifier quoting, a short SQL fragment, pass-through wrappers). Extract on the **third** real copy, or earlier when the logic is **~15+ lines / non-obvious branching**, or a scoped rule requires sharing (e.g. normal + `*_strong` repository reads in **`strong-reads.mdc`**). Do not repo-wide refactor unrelated existing helpers.
|
|
15
|
+
|
|
16
|
+
## Tech stack
|
|
17
|
+
|
|
18
|
+
- Python 3.14, Pydantic v2, PostgreSQL 18, orjson (not stdlib json).
|
|
19
|
+
- Absolute imports only (`from core_framework....`). Comma-style `except A, B:` is intentional.
|
|
20
|
+
- Prefer newer APIs and **current Python syntax** over older equivalents still legal on 3.14, for example:
|
|
21
|
+
- `asyncio.TaskGroup` over `asyncio.gather`
|
|
22
|
+
- PEP 695 type parameters (`def f[T](...)`, `def f[**P, R](...)`) over module-level `TypeVar` / `ParamSpec`
|
|
23
|
+
- Built-in generics (`list[str]`, `dict[str, int]`) over `typing.List` / `typing.Dict`
|
|
24
|
+
- `X | Y` over `Optional[X]` / `Union[X, Y]` unless a library API requires the old form
|
|
25
|
+
- Do **not** add `from __future__ import annotations` — 3.14 deferred annotations are the default (PEP 649)
|
|
26
|
+
|
|
27
|
+
## Layers
|
|
28
|
+
|
|
29
|
+
Dependencies point inward: API/worker → application → domain. Never reverse.
|
|
30
|
+
|
|
31
|
+
- **API/worker** — transport adapters; call application services.
|
|
32
|
+
- **Application** — orchestration shared by API + worker; no FastAPI types.
|
|
33
|
+
- **Domain** — models, repositories (Postgres only), services. No API/worker/application imports except wiring in `dependencies.py`.
|
|
34
|
+
|
|
35
|
+
Path-scoped rules under `.cursor/rules/` add detail (API, domains, docs, etc.). For FastAPI/Pydantic work in `core_framework/api/`, use the **fastapi** skill (`.agents/skills/fastapi/`).
|
|
36
|
+
|
|
37
|
+
## Agent skills
|
|
38
|
+
|
|
39
|
+
- Package skills (for example **fastapi**) are Library Skills-managed symlinks under **`.agents/skills/<name>/`**. Rules and hand-authored skills reference that path, not a copied tree under **`.cursor/skills/`**.
|
|
40
|
+
- **`.cursor/skills/<name>`** may symlink to **`.agents/skills/<name>`** for Cursor; Library Skills repairs **`.agents/skills`** links when packages move. After **`uv sync`** or a dependency upgrade, run **`uvx library-skills --yes`** if symlinks are stale.
|
|
41
|
+
|
|
42
|
+
## Host applications
|
|
43
|
+
|
|
44
|
+
Do not edit consuming host repos in the same task as core-framework work unless the user scopes work to a host or asks to sync/upgrade. See the **sync-host-rules** skill.
|
|
45
|
+
|
|
46
|
+
## Feature implementation
|
|
47
|
+
|
|
48
|
+
When the user asks to **grill**, interview, or sharpen a design before building, use the **grill** skill (`.cursor/skills/grill/`). Do not start **implement-feature** until that alignment is done (or the user skips it).
|
|
49
|
+
|
|
50
|
+
Greenfield features (DB → API → repository → service → **documentation** → tests): use the **implement-feature** skill — one layer per response unless the user says otherwise. A feature is **not done** until documentation is updated. A **main feature** is **not done** until its design doc includes a mermaid flowchart of the main control flow (see the **implement-feature** skill). Do not backfill charts onto unrelated older design docs in the same task.
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
---
|
|
2
|
+
description: Enforce importing from domain __init__.py in API/application layers
|
|
3
|
+
globs:
|
|
4
|
+
- core_framework/api/**/*.py
|
|
5
|
+
- core_framework/application/**/*.py
|
|
6
|
+
---
|
|
7
|
+
|
|
8
|
+
# Domain imports
|
|
9
|
+
|
|
10
|
+
When importing from **`core_framework/domains/*`** in API or application code:
|
|
11
|
+
|
|
12
|
+
## Allowed
|
|
13
|
+
|
|
14
|
+
- Public symbols from domain **`__init__.py`** (models, enums, constants, outcomes).
|
|
15
|
+
- Services from **`dependencies.py`** (e.g. **`user_service`**).
|
|
16
|
+
|
|
17
|
+
## Prohibited
|
|
18
|
+
|
|
19
|
+
- Typed or base **domain exceptions** in API/application — use **`application.shared.exceptions`**. Full policy: **`error-boundary.mdc`**.
|
|
20
|
+
- Direct imports from internal modules (`models`, `enums`, `repository`, `service`, `exceptions`).
|
|
21
|
+
|
|
22
|
+
```python
|
|
23
|
+
# ✅
|
|
24
|
+
from core_framework.domains.user import Profile, UserRole
|
|
25
|
+
from core_framework.domains.user.dependencies import user_service
|
|
26
|
+
|
|
27
|
+
# ❌
|
|
28
|
+
from core_framework.domains.post import PostUpdateNotFoundException
|
|
29
|
+
from core_framework.domains.user.models import Profile
|
|
30
|
+
```
|
|
31
|
+
|
|
32
|
+
## Export policy
|
|
33
|
+
|
|
34
|
+
Export from **`__init__.py`** only what outer layers need. Typed exceptions stay internal; export **only** **`BaseXxxException`** per domain for inheritance typing — not for per-domain HTTP handlers. **`DomainValidationError`** lives in **`domains/exceptions.py`** (core handler wiring only).
|
|
35
|
+
|
|
36
|
+
To see what a domain exports, check its **`__init__.py`** **`__all__`**.
|
|
37
|
+
|
|
38
|
+
## After a domain call
|
|
39
|
+
|
|
40
|
+
1. Return **`None`** or empty when the use case allows.
|
|
41
|
+
2. Raise an **application** exception when HTTP must signal failure.
|
|
42
|
+
3. Extend the domain service API to absorb typed exceptions internally.
|
|
43
|
+
|
|
44
|
+
Application code never imports repositories. Exception boundary: **`error-boundary.mdc`**.
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
---
|
|
2
|
+
description: HTTP error boundaries — application vs domain exceptions, handlers, anti-enumeration
|
|
3
|
+
globs:
|
|
4
|
+
- core_framework/core/exception_handlers/**/*.py
|
|
5
|
+
- core_framework/application/**/*.py
|
|
6
|
+
- core_framework/api/**/router.py
|
|
7
|
+
- core_framework/api/**/schemas.py
|
|
8
|
+
- core_framework/domains/**/exceptions.py
|
|
9
|
+
---
|
|
10
|
+
|
|
11
|
+
# Error boundary
|
|
12
|
+
|
|
13
|
+
Platform contract: **`docs/platform/client-error-visibility.md`**. Domain imports: **`domain-imports.mdc`**.
|
|
14
|
+
|
|
15
|
+
## Layers
|
|
16
|
+
|
|
17
|
+
| Layer | Outward errors | HTTP |
|
|
18
|
+
|-------|----------------|------|
|
|
19
|
+
| **Application** | **`application.shared.exceptions`**, **`InvalidPageTokenError`** | Handlers map type → status + catalog **`detail`** |
|
|
20
|
+
| **API** | Pydantic; **`HTTPException`** for transport-local guards | **422** field errors; router-chosen status + **`detail`** |
|
|
21
|
+
| **Domain typed** | Internal — not imported by API/application | No typed handlers |
|
|
22
|
+
| **Domain `BaseXxxException`** | Handler catch-all only | **500** if leaked |
|
|
23
|
+
|
|
24
|
+
## Application and domain
|
|
25
|
+
|
|
26
|
+
- Application **must not** import or raise typed domain exceptions. Signal via **`None`**, empty collections, or **`application.shared.exceptions`**.
|
|
27
|
+
- Typed domain exceptions inherit domain **`BaseXxxException`** → **`BaseDomainException`**. Export **only** **`BaseXxxException`** from domain **`__init__.py`**, not typed subclasses.
|
|
28
|
+
- **`DomainValidationError`** → dedicated **400** handler + **`GENERIC_BAD_REQUEST_DETAIL`**; do not put internal reason in HTTP **`detail`**.
|
|
29
|
+
- Leaked typed domain exception → **`BaseDomainException`** handler → **500** + **`GENERIC_INTERNAL_SERVER_ERROR_DETAIL`**.
|
|
30
|
+
|
|
31
|
+
## Handler registration
|
|
32
|
+
|
|
33
|
+
- Use **`register_exception_handler`** from **`core_framework.core.exception_handlers.common`** — not raw **`app.add_exception_handler`** elsewhere.
|
|
34
|
+
- Register handlers in **`core_framework/core/exception_handlers/setup.py`** and **`application.py`**: application types (specific before any base), **`InvalidPageTokenError`**, cashews **`RateLimitError`** (**429**), **`DomainValidationError`**, one **`BaseDomainException`** leak handler, then **`Exception`** unmapped.
|
|
35
|
+
- No per-domain handler modules for typed exceptions. Handlers translate only — no business logic or repository calls.
|
|
36
|
+
- Do not log **error** for expected application 4xx; **`DomainValidationError`** at **warning**/**info**.
|
|
37
|
+
|
|
38
|
+
## Catalog constants
|
|
39
|
+
|
|
40
|
+
**`GENERIC_BAD_REQUEST_DETAIL`** (400), **`GENERIC_NOT_FOUND_DETAIL`** (404), **`GENERIC_FORBIDDEN_DETAIL`** (403), **`GENERIC_CONFLICT_DETAIL`** (409), ingest 413/415, **`GENERIC_UNPROCESSABLE_ENTITY_DETAIL`** (422), **`GENERIC_TOO_MANY_REQUESTS_DETAIL`** (429), **`GENERIC_SERVICE_UNAVAILABLE_DETAIL`** (503), **`GENERIC_INTERNAL_SERVER_ERROR_DETAIL`** (500).
|
|
41
|
+
|
|
42
|
+
## Anti-enumeration (public routes)
|
|
43
|
+
|
|
44
|
+
- Read-by-id: missing / hidden / withheld → same status + **`GENERIC_NOT_FOUND_DETAIL`** where flow docs align.
|
|
45
|
+
- Idempotent writes on unknown ids → **204** without leaking existence. Empty list pages are OK.
|
|
46
|
+
- Admin/internal routes may differ when documented. Intentional existence-check endpoints are separate product surface.
|
|
47
|
+
|
|
48
|
+
## Validation order
|
|
49
|
+
|
|
50
|
+
User-fixable input shape → API schemas (**422**) or router **`HTTPException`**. Use-case outcomes → application exceptions + handlers. Domain backstops → **`DomainValidationError`** → generic **400** (never domain text in **`detail`**).
|
|
51
|
+
|
|
52
|
+
## Logging
|
|
53
|
+
|
|
54
|
+
Do not **`logger.error`** at every domain **`raise`**.
|
|
55
|
+
|
|
56
|
+
Apply to new handlers and touched raise sites unless the task scopes repo-wide migration.
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
---
|
|
2
|
+
description: Flow docs describe user-facing API behavior only — no implementation code
|
|
3
|
+
globs:
|
|
4
|
+
- docs/domains/**/*.md
|
|
5
|
+
alwaysApply: false
|
|
6
|
+
---
|
|
7
|
+
|
|
8
|
+
# Flow documentation
|
|
9
|
+
|
|
10
|
+
Flow docs under **`docs/domains/{domain}/`** describe **client-visible API behavior**, not implementation.
|
|
11
|
+
|
|
12
|
+
- **Include**: endpoints, auth, request/response fields (text, not JSON examples), errors, idempotency, side effects. A mermaid **flowchart** when the flow is a main multi-step lifecycle (schedule/cancel/worker, command then fan-out) — match **`account_deletion.md`**, **`restrictions.md`**. Skip for a single CRUD endpoint; do not backfill unrelated older flow docs in the same task.
|
|
13
|
+
- **Exclude**: Python/SQL snippets, function names, layer internals, schema DDL — see **`no-code-in-docs.mdc`**.
|
|
14
|
+
|
|
15
|
+
When creating or rewriting flow docs, use the **write-flow-doc** skill and match existing docs (e.g. **`profile.md`**, **`restrictions.md`**).
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
---
|
|
2
|
+
description: Ignore exploratory ClickHouse warehouse notes unless the user explicitly opens that topic
|
|
3
|
+
alwaysApply: true
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# Ignore analytics-warehouse notes
|
|
7
|
+
|
|
8
|
+
[`docs/design/analytics-warehouse-design.md`](docs/design/analytics-warehouse-design.md) is an **exploratory scratchpad**. It is **not** in the pipeline, **not** a backlog item, and **not** a constraint on the shipped system.
|
|
9
|
+
|
|
10
|
+
## Do not
|
|
11
|
+
|
|
12
|
+
- Read, cite, or align work to that document when changing events ingest, analytics rollup, `post_views` / `*_stats`, settings, workers, hosts, or any other area.
|
|
13
|
+
- Add ClickHouse, a richer `POST /events` envelope, warehouse sinks, or “buffer vs diary” migrations **because** that doc exists.
|
|
14
|
+
- Treat its placement rules, sequence, or sale/consent notes as accepted ADRs.
|
|
15
|
+
|
|
16
|
+
## Do
|
|
17
|
+
|
|
18
|
+
- Follow shipped docs: [`docs/domains/events/events.md`](docs/domains/events/events.md), [`docs/design/events-ingest-design.md`](docs/design/events-ingest-design.md), [`docs/design/analytics-rollup-design.md`](docs/design/analytics-rollup-design.md), [`docs/domains/posts/post_stats_aggregation.md`](docs/domains/posts/post_stats_aggregation.md).
|
|
19
|
+
- Open the warehouse notes **only** when the user explicitly asks about that file, ClickHouse warehouse, or returning to that idea.
|
|
20
|
+
|
|
21
|
+
If the user later wants it implemented, they will say so; then make it fit the system as it exists at that time.
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
---
|
|
2
|
+
description: Integration tests should prefer API-level assertions when endpoints exist
|
|
3
|
+
globs:
|
|
4
|
+
- tests/integration/**/*.py
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
# Integration Test Strategy
|
|
8
|
+
|
|
9
|
+
Treat integration tests as black-box API behavior tests whenever possible.
|
|
10
|
+
|
|
11
|
+
## Core Rule
|
|
12
|
+
|
|
13
|
+
- Prefer exercising behavior through HTTP endpoints and asserting API responses.
|
|
14
|
+
- Use internal/database assertions only when no API endpoint exists yet for that behavior.
|
|
15
|
+
- Name the test so a failure line states the broken invariant, not the endpoint/function or a generic `success` / `happy_path`.
|
|
16
|
+
|
|
17
|
+
## Lifecycle Guidance
|
|
18
|
+
|
|
19
|
+
- During initial endpoint implementation (for example, POST exists but GET does not), internal assertions are acceptable to confirm persistence/side effects.
|
|
20
|
+
- After the corresponding read/inspect endpoint is implemented, migrate assertions to that API path and avoid direct DB checks for the same behavior.
|
|
21
|
+
|
|
22
|
+
## Allowed Internal Checks
|
|
23
|
+
|
|
24
|
+
- Setup/seed data when there is no practical API path for test preconditions.
|
|
25
|
+
- Verify side effects that are intentionally not exposed via API (for example, queue internals, non-user-facing audit fields).
|
|
26
|
+
|
|
27
|
+
## Avoid
|
|
28
|
+
|
|
29
|
+
- Testing API behavior by primarily querying the database when an API route already exposes that behavior.
|
|
30
|
+
- Coupling integration tests to repository internals when a stable endpoint contract is available.
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
---
|
|
2
|
+
description: Docs avoid implementation code; HTTP interface listings and schema DDL are OK
|
|
3
|
+
globs: docs/**/*.md
|
|
4
|
+
alwaysApply: false
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
# No Code in Documentation
|
|
8
|
+
|
|
9
|
+
Documentation under **`docs/`** must not carry **implementation** snippets that belong in the repo (executable Python, shell, operational SQL queries, etc.). **`docs/`** describes **what** and **why**; the codebase shows **how**.
|
|
10
|
+
|
|
11
|
+
## What to exclude
|
|
12
|
+
|
|
13
|
+
- Python class/function definitions or examples
|
|
14
|
+
- **SQL for data access or mutation** — `SELECT`, `INSERT`, `UPDATE`, `DELETE`, `MERGE`, CTE-heavy reports, cleanup queries, etc. (describe behavior in prose or name the operation; do not paste DML/query text)
|
|
15
|
+
- Shell commands — **except** in deployment runbooks under **`docs/deployments/`** (see *Exceptions* below)
|
|
16
|
+
- Pseudocode that mimics real code syntax
|
|
17
|
+
- Inline backticked references to internal function/method/class names when prose suffices (prefer describing behavior)
|
|
18
|
+
|
|
19
|
+
## What is allowed
|
|
20
|
+
|
|
21
|
+
- **HTTP API interface listings** — fenced **`http`** blocks or plain lines listing `METHOD /path # short note`. That is **surface contract**, not implementation code.
|
|
22
|
+
- **SQL for table creation / physical design** — e.g. `CREATE TABLE` (and table-level DDL in the same design story, such as `CREATE INDEX`). DDL is a design artifact, not runtime query text.
|
|
23
|
+
- ASCII diagrams and flowcharts (box-drawing characters)
|
|
24
|
+
- Mermaid diagrams (preferred for main-feature control flow: fenced `mermaid` with `flowchart TD` / `flowchart LR`)
|
|
25
|
+
- Markdown tables of fields and types (`jsonb`, `varchar(26)`, etc.)
|
|
26
|
+
- Plain-text lifecycle diagrams (arrows, boxes)
|
|
27
|
+
- File/directory tree layouts (plain text or a neutral fence such as `text` if helpful)
|
|
28
|
+
|
|
29
|
+
## Exceptions
|
|
30
|
+
|
|
31
|
+
- **Deployment runbooks** under **`docs/deployments/`** (setup guides, deploy/release playbooks, SSH/image-server guides) may include fenced **`bash`** shell blocks. These are operator instructions for interactive server setup, not implementation that drifts from source; copy-paste commands are the practical content. This exemption does **not** extend to **`docs/deployments/*-design.md`** design docs, which follow the general rules above.
|
|
32
|
+
- **Design docs** under **`docs/design/`**, **`docs/platform/`**, and **`docs/library/`** (and **`docs/deployments/*-design.md`**) follow the general allow/exclude lists — DDL is allowed, DML and Python are not. Flow docs under **`docs/domains/**`** are stricter: see **`flow-documentation.mdc`** (no DDL, no JSON request bodies, fields described as text/tables).
|
|
33
|
+
|
|
34
|
+
## Rationale
|
|
35
|
+
|
|
36
|
+
Implementation snippets in docs drift from source. **HTTP listings** stay stable as the public contract. **DDL** documents intended physical shape. **DML** and **application code** belong in migrations and modules. Deployment runbooks are operator-facing setup instructions where shell commands are the deliverable, not source-bound implementation.
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
---
|
|
2
|
+
description: Postgres write/read config and wiring conventions
|
|
3
|
+
globs:
|
|
4
|
+
- core_framework/core/settings.py
|
|
5
|
+
- core_framework/core/runtime.py
|
|
6
|
+
- config.toml
|
|
7
|
+
- config.toml.template
|
|
8
|
+
- docs/deployments/**/*.md
|
|
9
|
+
alwaysApply: false
|
|
10
|
+
---
|
|
11
|
+
|
|
12
|
+
# Postgres Config Conventions
|
|
13
|
+
|
|
14
|
+
Use explicit write/read configuration and keep schema names shared.
|
|
15
|
+
|
|
16
|
+
## Settings Model
|
|
17
|
+
|
|
18
|
+
- Use `PostgresConnectionConfig` for connection and pool settings.
|
|
19
|
+
- Use `PostgresSchemasConfig` for schema names.
|
|
20
|
+
- Settings fields must be:
|
|
21
|
+
- `write_postgres`
|
|
22
|
+
- `read_postgres`
|
|
23
|
+
- `postgres_schemas`
|
|
24
|
+
- Do not reintroduce `settings.postgres`.
|
|
25
|
+
|
|
26
|
+
## Config Files
|
|
27
|
+
|
|
28
|
+
- `config.toml` and `config.toml.template` must contain:
|
|
29
|
+
- `[write_postgres]`
|
|
30
|
+
- `[read_postgres]`
|
|
31
|
+
- `[postgres_schemas]`
|
|
32
|
+
- Keep schema values only in `[postgres_schemas]` (no schema duplication inside write/read sections).
|
|
33
|
+
|
|
34
|
+
## Deploy Variables
|
|
35
|
+
|
|
36
|
+
- Use separate env vars for write/read DB rendering:
|
|
37
|
+
- `WRITE_POSTGRES_HOST`, `WRITE_POSTGRES_PORT`, `WRITE_POSTGRES_USER`, `WRITE_POSTGRES_PASSWORD`, `WRITE_POSTGRES_DB`
|
|
38
|
+
- `READ_POSTGRES_HOST`, `READ_POSTGRES_PORT`, `READ_POSTGRES_USER`, `READ_POSTGRES_PASSWORD`, `READ_POSTGRES_DB`
|
|
39
|
+
- Do not use shared `POSTGRES_*` vars for both sections.
|
|
40
|
+
|
|
41
|
+
## Runtime Wiring
|
|
42
|
+
|
|
43
|
+
- Core module globals (`core_framework.core`) export separate instances:
|
|
44
|
+
- `write_postgres`
|
|
45
|
+
- `read_postgres`
|
|
46
|
+
- `CoreRuntime` also holds `outbox_postgres`: same database as `write_postgres`, separate pool sized from `[outbox]` (`min_connections` / `max_connections`). The worker connects it at startup; the API lifespan does not. Do not rebind it as a `core_framework.core` global.
|
|
47
|
+
- Domain dependencies pass `(write, read, strong)` explicitly to repositories.
|
|
48
|
+
- Until a dedicated strong instance exists, use write instance for the strong argument intentionally.
|
|
49
|
+
|
|
50
|
+
## Schema names in SQL
|
|
51
|
+
|
|
52
|
+
- Schema names come only from `settings.postgres_schemas` (see **Settings Model** above).
|
|
53
|
+
- Domain `dependencies.py` passes unquoted `schema=runtime.settings.postgres_schemas.schema_<domain>` into repositories (keyword-only `__init__`).
|
|
54
|
+
- Repositories cache `self.schema_sql = quote_postgres_identifier(schema)` and use `{self.schema_sql}.table` in f-string SQL — never hard-coded `"post".` literals.
|
|
55
|
+
- Outbox producer adapter is wired per domain with `schema` at construction; consumer adapter receives unquoted `schema` per call and caches quoted SQL.
|
|
56
|
+
|
|
57
|
+
Repository isolation rules (no cross-domain schema access): **`repository-schema-isolation.mdc`**.
|
|
@@ -0,0 +1,89 @@
|
|
|
1
|
+
---
|
|
2
|
+
description: Domain repositories must not query other domains' Postgres schemas
|
|
3
|
+
globs:
|
|
4
|
+
- core_framework/domains/**/repository.py
|
|
5
|
+
alwaysApply: false
|
|
6
|
+
---
|
|
7
|
+
|
|
8
|
+
# Repository schema isolation
|
|
9
|
+
|
|
10
|
+
Each domain repository may only read/write tables in **its own** Postgres schema.
|
|
11
|
+
|
|
12
|
+
Canonical rule: `docs/platform/layers-and-boundaries.md` — *no cross-domain schema reads, writes, joins, or foreign keys*.
|
|
13
|
+
|
|
14
|
+
## Schema qualification
|
|
15
|
+
|
|
16
|
+
Repositories receive unquoted `schema` from `runtime.settings.postgres_schemas` in `dependencies.py` (keyword-only `__init__` arg). In `__init__`:
|
|
17
|
+
|
|
18
|
+
- `self.schema` — config schema name (e.g. `post`)
|
|
19
|
+
- `self.schema_sql` — `quote_postgres_identifier(schema)` for SQL interpolation
|
|
20
|
+
|
|
21
|
+
Use `{self.schema_sql}.table` in f-string SQL — not hard-coded `"post".` literals.
|
|
22
|
+
|
|
23
|
+
## Allowed in a repository
|
|
24
|
+
|
|
25
|
+
- SQL qualified with that domain's schema only (e.g. `{self.schema_sql}.posts` in `PostRepository`).
|
|
26
|
+
- **Within-schema** policy gates (e.g. `insert_post_like` checks `{self.schema_sql}.posts.status = active`).
|
|
27
|
+
- **Lookup mirrors** in the same schema (`user_blocks_lookup`, `user_restrictions_lookup`, `user_followers_lookup`) — synced by application flows; mirrors are not authoritative.
|
|
28
|
+
|
|
29
|
+
## Forbidden in a repository
|
|
30
|
+
|
|
31
|
+
- `FROM` / `JOIN` / `EXISTS` / `INSERT … SELECT` against another domain's schema.
|
|
32
|
+
- Importing another domain's `service`, `repository`, or models to enforce policy.
|
|
33
|
+
|
|
34
|
+
```python
|
|
35
|
+
# ❌ moderation/repository.py — cross-domain EXISTS (illustrative schema literals)
|
|
36
|
+
insert into {moderation_schema_sql}.post_reports (...)
|
|
37
|
+
select $1, $2, $3, $4
|
|
38
|
+
where exists (
|
|
39
|
+
select 1 from {post_schema_sql}.posts
|
|
40
|
+
where id = $2 and status = 'active'
|
|
41
|
+
)
|
|
42
|
+
|
|
43
|
+
# ❌ notification/repository.py — cross-domain mute gate
|
|
44
|
+
insert into {notification_schema_sql}.notification_mutes (...)
|
|
45
|
+
select ...
|
|
46
|
+
where exists (select 1 from {comment_schema_sql}.comments where ...)
|
|
47
|
+
```
|
|
48
|
+
|
|
49
|
+
## Alembic migrations (different convention)
|
|
50
|
+
|
|
51
|
+
Do **not** apply repository schema-qualification rules to `alembic/**/versions/*.py`.
|
|
52
|
+
|
|
53
|
+
Each domain Alembic tree sets `search_path` to that domain's schema in `env.py`. Migration SQL uses **unqualified** table and type names (`posts`, `post_reports`, `create type post_status …`) — not `"post".posts`.
|
|
54
|
+
|
|
55
|
+
**Exception — PL/pgSQL trigger / function bodies:** Runtime `search_path` for functions is not the migration session’s path, so audit trigger bodies may **hard-code** that domain’s schema qualifier (e.g. `"user".user_change_history`, `moderation.restriction_history`). That is required and accepted. Keep `[postgres_schemas]` values aligned with those literals; do not treat this as a B11 isolation violation.
|
|
56
|
+
|
|
57
|
+
**Exception — shared extension-schema types:** Domain Alembic `env.py` sets `search_path` to that domain’s schema only, so types and operator classes that live in the shared extensions schema must be **hard-coded** as `extension.…` (e.g. `extension.ltree` on comment `path`, `extension.gin_trgm_ops` on user `username`). That is required and accepted. Leave `[postgres_schemas].schema_extension` as **`extension`** (see `docs/library/overview.md`); do not treat this as a B11 isolation violation.
|
|
58
|
+
|
|
59
|
+
Cross-domain rules still apply to migrations:
|
|
60
|
+
|
|
61
|
+
- No `REFERENCES` / FKs to tables in another domain's schema.
|
|
62
|
+
- No DDL that reads or writes another domain's objects.
|
|
63
|
+
|
|
64
|
+
Stay within the migration tree's domain; one schema per Alembic env.
|
|
65
|
+
|
|
66
|
+
## Where cross-domain policy belongs
|
|
67
|
+
|
|
68
|
+
**Application layer** (or domain service orchestration via dependencies, never cross-schema SQL):
|
|
69
|
+
|
|
70
|
+
```python
|
|
71
|
+
# ✅ application/posts/authenticated_service.py
|
|
72
|
+
post = await post_deps.post_service.retrieve_post_with_metadata_by_id_if_exists(post_id=post_id)
|
|
73
|
+
if post is None or post.status != PostStatus.ACTIVE:
|
|
74
|
+
return False
|
|
75
|
+
return await moderation_deps.moderation_service.add_post_report(...)
|
|
76
|
+
```
|
|
77
|
+
|
|
78
|
+
Before adding a repository write that depends on another domain's row state:
|
|
79
|
+
|
|
80
|
+
1. Can the owning domain gate it within its schema? → do that (likes, views, stats dirty).
|
|
81
|
+
2. Otherwise → gate in `application/**/*_service.py` via the owning domain's service API.
|
|
82
|
+
|
|
83
|
+
## Self-check (repositories only)
|
|
84
|
+
|
|
85
|
+
In `domains/<name>/repository.py`:
|
|
86
|
+
|
|
87
|
+
- Every table/type qualifier in SQL must use `{self.schema_sql}.…` (that domain's schema only).
|
|
88
|
+
- Do not hard-code `"user".`, `"post".`, etc. — use `self.schema` / `self.schema_sql` from config.
|
|
89
|
+
- Mirror lookup tables (`user_blocks_lookup`, etc.) still live under `{self.schema_sql}` when they belong to that domain's schema.
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
---
|
|
2
|
+
description: Strong read policy and repository naming for read-after-write consistency
|
|
3
|
+
globs:
|
|
4
|
+
- core_framework/domains/**/repository.py
|
|
5
|
+
- core_framework/domains/**/service.py
|
|
6
|
+
- core_framework/domains/**/dependencies.py
|
|
7
|
+
- core_framework/application/**/*.py
|
|
8
|
+
---
|
|
9
|
+
|
|
10
|
+
# Strong reads
|
|
11
|
+
|
|
12
|
+
## Policy
|
|
13
|
+
|
|
14
|
+
- **Read-after-write** in the same HTTP request or worker job → **strong** read (required). Refetch with `strong_read_database`, `*_strong` repository methods, or service accessors that call them.
|
|
15
|
+
- **Decision-critical guards** where stale data can cause incorrect branching → **strong** read (required). These are reads performed to decide a branch (for example pre-write existence, role, or state checks that determine whether a write runs or which outcome is returned), even when there is no immediate prior write in the flow. See the "Read Consistency (Strong vs Normal Reads)" ADR.
|
|
16
|
+
- **Accepted exception:** **`check_caller_identity`** / **`check_not_banned`** (alias) / **`get_user_detail`** (`USER_DETAIL_V2` cache + normal reads) — ban, deleted-user, and account-removal-in-progress visibility are eventually consistent by design. The removal-started fence rides that cache; do not strong-read it on every gated request. See **`docs/platform/architecture-decisions.md`** → *Ban / identity gate via cached `USER_DETAIL` is eventually consistent*. Do not flag as a strong-read defect unless that ADR is updated.
|
|
17
|
+
- **Accepted exception:** account-removal media **owner listing** of avatar/banner/attachment staging-registry rows uses the **read replica**. Replica lag or swallowed per-blob staging deletes can leave orphan staging after a successful spine. See **`docs/platform/architecture-decisions.md`** → *Account-removal staging leftovers (Accepted)*. Do not flag as a must-succeed or strong-read defect unless that ADR is updated.
|
|
18
|
+
- **Accepted exception:** followers-only **mention** recipient filtering uses the **follow replica** (`retrieve_follow_exists`, not `_strong`). Lag-window miss or extra mention is accepted. See **`docs/platform/architecture-decisions.md`** → *Followers-only mention eligibility uses the follow replica (Accepted)*. Do not flag as a strong-read defect unless that ADR is updated.
|
|
19
|
+
- **All other strong-read usage** (e.g., list/browse freshness) → opt-in unless the user explicitly requested it in the task.
|
|
20
|
+
- If a flow writes then reads and only a normal-read API exists, add or extend the `*_strong` path and call it from that flow.
|
|
21
|
+
- Repositories accept `strong_read_database: Postgres` on `__init__` for wiring symmetry even when unused.
|
|
22
|
+
|
|
23
|
+
## Repository pattern
|
|
24
|
+
|
|
25
|
+
- Normal reads: explicit methods (e.g. `select_appeal`) using `read_database`.
|
|
26
|
+
- Strong reads: separate methods only where needed (e.g. `select_appeal_strong`) using `strong_read_database`.
|
|
27
|
+
- Share one private helper that accepts a database handle when **both** normal and strong public methods exist — do not duplicate SQL or mapping. If only a `*_strong` method exists today, keep SQL inline in that method (constitution → inline small single-use helpers).
|
|
28
|
+
- Service accessors that call strong repository methods should use **`retrieve_*_strong`** naming (repositories keep **`select_*_strong`**).
|
|
29
|
+
|
|
30
|
+
```python
|
|
31
|
+
# Preferred
|
|
32
|
+
async def select_appeal(self, *, appeal_id: int) -> Appeal:
|
|
33
|
+
return await self._select_appeal_with_database(appeal_id=appeal_id, database=self.read_database)
|
|
34
|
+
|
|
35
|
+
async def select_appeal_strong(self, *, appeal_id: int) -> Appeal:
|
|
36
|
+
return await self._select_appeal_with_database(appeal_id=appeal_id, database=self.strong_read_database)
|
|
37
|
+
```
|
|
38
|
+
|
|
39
|
+
Keep consistency decisions in services/use-case orchestration, not hidden in unrelated call paths.
|
|
@@ -0,0 +1,85 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: code-review
|
|
3
|
+
description: >-
|
|
4
|
+
Review code and report a single list of items to address. Use when the user
|
|
5
|
+
asks for a code review, audit of code/implementation, or review of code
|
|
6
|
+
changes — and when they ask to elaborate, expand, or explain those findings.
|
|
7
|
+
Do not use for design / system-design / product-design doc readiness reviews
|
|
8
|
+
(use design-review).
|
|
9
|
+
---
|
|
10
|
+
|
|
11
|
+
# Code Review
|
|
12
|
+
|
|
13
|
+
Report **one list of items to address**. Check repo rules and originating docs internally. Do **not** split the report into Standards vs Spec (or any other axis). Do **not** tag findings by source.
|
|
14
|
+
|
|
15
|
+
## What to check
|
|
16
|
+
|
|
17
|
+
**Repo rules.** Does the diff follow this repo’s rules and accepted decisions?
|
|
18
|
+
|
|
19
|
+
Layers, conventions, scoped `.cursor/rules`, **Residue**, parallel drift, third-copy, strong reads, test names, main-feature flowchart when this change adds or alters a design doc. Use [`docs/platform/glossary.md`](docs/platform/glossary.md) terms.
|
|
20
|
+
|
|
21
|
+
Do **not** flag documented accepted trade-offs in **`docs/platform/architecture-decisions.md`** unless the implementation violates them. Do **not** flag two similar copies as needing extraction (wait for the third). Do **not** import a generic smell list that fights those rules.
|
|
22
|
+
|
|
23
|
+
**Originating docs.** Does the diff match the design and flow docs?
|
|
24
|
+
|
|
25
|
+
- Missing or partial relative to the spec
|
|
26
|
+
- Behavior the spec did not ask for
|
|
27
|
+
- Implemented but wrong relative to a spec line (quote that line)
|
|
28
|
+
|
|
29
|
+
**Spec sources** (first that applies): docs the user named; design/flow docs the change clearly belongs to; matching `docs/design/*-design.md` / `docs/domains/**/*-design.md` plus the paired flow doc. If none exist, skip this check — do not mention that there is no spec.
|
|
30
|
+
|
|
31
|
+
## Output format (required)
|
|
32
|
+
|
|
33
|
+
**Actionable findings only**, under `## Findings`:
|
|
34
|
+
|
|
35
|
+
- Bugs, wrong behavior, improvements, optimizations, doc/code contradictions, parallel implementation drift (sibling flows that diverge without documented reason), **Residue** after an implementation or refactor, spec gaps / extras / mismatches.
|
|
36
|
+
- One numbered list, prioritized by severity. Each item: file context, what is wrong, fix direction.
|
|
37
|
+
- **Do not** praise, summarize strengths, pad with checklist pass narratives, or emit empty-axis sentences.
|
|
38
|
+
- One-line scope is fine. If there is nothing to address, say so in one sentence — no `## Findings` heading.
|
|
39
|
+
|
|
40
|
+
## Elaborating review points (required)
|
|
41
|
+
|
|
42
|
+
When the user asks to elaborate, expand, explain, or go deeper on review findings (one point, several, or all):
|
|
43
|
+
|
|
44
|
+
- **Always include concrete examples** for each point — never prose-only elaboration.
|
|
45
|
+
- Prefer examples from the reviewed code: cite the relevant snippet, then show a corrected or alternative version when a fix is implied.
|
|
46
|
+
- If the issue is behavioral (race, ordering, missing branch), give a short before/after scenario or input sequence that triggers it.
|
|
47
|
+
- Keep the example tight (a few lines); do not re-dump the whole review.
|
|
48
|
+
|
|
49
|
+
## Workflow
|
|
50
|
+
|
|
51
|
+
1. Pin the diff (named files, or `git diff` against the branch base / range the user gave).
|
|
52
|
+
1. Identify spec sources (see **Originating docs** above).
|
|
53
|
+
1. Read **`docs/platform/layers-and-boundaries.md`**, **`conventions.md`**, **`architecture-decisions.md`**, and **`glossary.md`** for the reviewed scope.
|
|
54
|
+
1. Apply **scoped rules** (`.cursor/rules/*.mdc`) matching files under review — especially **`error-boundary`**, **`domain-imports`**, **`api-layer`**, **`application-layer`**, **`strong-reads`**.
|
|
55
|
+
1. Check for **Residue** from this implementation or refactor (section below). Flag it with delete-now direction unless a live consumer still needs the old path.
|
|
56
|
+
1. Check rules and originating docs. If the diff is large, parallel exploration is fine; **merge into one severity-ordered list** before reporting. Do not paste unmerged sub-agent reports.
|
|
57
|
+
1. Report findings only — no filler.
|
|
58
|
+
1. On elaborate/expand follow-ups, re-read this skill and apply **Elaborating review points**.
|
|
59
|
+
|
|
60
|
+
## Quick checks
|
|
61
|
+
|
|
62
|
+
- Application services: no HTTP types, no domain exceptions, no Pydantic return types, one-line docstrings.
|
|
63
|
+
- API: thin routers, validation in schemas, orchestration in application — **fastapi** skill (`.agents/skills/fastapi/`) + **`api-layer`** / **`api-validation`** / **`error-boundary`** rules.
|
|
64
|
+
- Domain: imports only via **`__init__.py`** / **`dependencies`** from outer layers; no caller-context names (**`domain-caller-context`**).
|
|
65
|
+
- Read-after-write refetches use **`*_strong`** where applicable.
|
|
66
|
+
- **Python modernity (constitution):** prefer current 3.14 syntax in reviewed code — PEP 695 type params over module-level `TypeVar`/`ParamSpec`; no unnecessary `from __future__ import annotations`; builtins / `X | Y` over legacy `typing` aliases; `asyncio.TaskGroup` over `gather`.
|
|
67
|
+
- **Wait for the third copy before you extract** (`docs/platform/conventions.md`): flag a new private helper with one or two call sites unless it is ~15+ lines / non-obvious branching, or a scoped rule requires sharing (`strong-reads`). Do **not** flag two similar inlined copies as needing extraction.
|
|
68
|
+
- **Test name should tell me what broke:** flag tests whose names only name the unit under test or a generic outcome (`test_create_post`, `test_success`, `test_happy_path`). The pytest failure line must state the invariant (e.g. `test_public_feed_excludes_others_followers_only_post`).
|
|
69
|
+
- **Main-feature design flowchart:** if this change introduces a new `*-design.md` (or changes that design’s control flow) and there is no mermaid **`flowchart`** of the main control flow, flag it. Do **not** flag older design docs that never had a chart.
|
|
70
|
+
|
|
71
|
+
## Residue
|
|
72
|
+
|
|
73
|
+
Leftover seams after the new path shipped. Flag them; they are not “later retirement” unless a live producer or in-flight consumer still needs the old path. On greenfield (no hosts, no traffic), treat as **safe to delete now**.
|
|
74
|
+
|
|
75
|
+
Look for:
|
|
76
|
+
|
|
77
|
+
- Dead registration — worker tasks, enums, schedules, or “keep registered for drain” docs with no remaining producer.
|
|
78
|
+
- Compatibility branches the new producers never write (old payload versions, dual handlers, mirrors-only v1).
|
|
79
|
+
- Incomplete moves — logic still in the old module, a shared helper unused while call sites inline the same shape, types left as `Any` after a typed model exists.
|
|
80
|
+
- Docs / OpenAPI still describing the pre-change stored shape, cutover drain, or a history/status value that is never written.
|
|
81
|
+
- Naming leftovers after a rename (old helper name used for a different role).
|
|
82
|
+
|
|
83
|
+
## Parallel drift
|
|
84
|
+
|
|
85
|
+
Flag sibling modules with the same job but different structure (async layout, cleanup order, error/idempotency contracts) when docs do not explain the difference. Do **not** flag differences called out as intentional in design/flow docs or in **`docs/reviews/slices.md`** B7 **Do not flag** (for example root vs reply create-idempotency replay placement in **`docs/design/create-idempotency-design.md`**).
|