core-framework 1.6.0__tar.gz → 1.7.0__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (483) hide show
  1. {core_framework-1.6.0 → core_framework-1.7.0}/.cursor/rules/api-layer.mdc +1 -1
  2. {core_framework-1.6.0 → core_framework-1.7.0}/.cursor/rules/api-reference-docs.mdc +5 -5
  3. {core_framework-1.6.0 → core_framework-1.7.0}/.cursor/rules/database-triggers.md +4 -4
  4. {core_framework-1.6.0 → core_framework-1.7.0}/.cursor/rules/domain-services-and-adapters.mdc +1 -1
  5. {core_framework-1.6.0 → core_framework-1.7.0}/.cursor/rules/flow-documentation.mdc +4 -4
  6. {core_framework-1.6.0 → core_framework-1.7.0}/.cursor/rules/henry-cursor-rules-sync.mdc +5 -6
  7. {core_framework-1.6.0 → core_framework-1.7.0}/.cursor/rules/implementation-workflow.mdc +1 -1
  8. core_framework-1.7.0/.cursor/rules/karpathy-guidelines.mdc +70 -0
  9. {core_framework-1.6.0 → core_framework-1.7.0}/.cursor/skills/add-domain/SKILL.md +2 -2
  10. {core_framework-1.6.0 → core_framework-1.7.0}/.cursor/skills/code-review/SKILL.md +5 -5
  11. {core_framework-1.6.0 → core_framework-1.7.0}/.github/workflows/_deploy.yml +7 -7
  12. {core_framework-1.6.0 → core_framework-1.7.0}/.gitignore +1 -1
  13. {core_framework-1.6.0 → core_framework-1.7.0}/CHANGELOG.md +47 -25
  14. {core_framework-1.6.0 → core_framework-1.7.0}/PKG-INFO +3 -3
  15. {core_framework-1.6.0 → core_framework-1.7.0}/README.md +2 -2
  16. core_framework-1.7.0/alembic/media/alembic/versions/media_add_banner_staging_and_lease.py +43 -0
  17. core_framework-1.7.0/alembic/user/alembic/versions/user_add_banner_ingest_sequences.py +34 -0
  18. {core_framework-1.6.0 → core_framework-1.7.0}/config.toml +9 -4
  19. {core_framework-1.6.0 → core_framework-1.7.0}/config.toml.template +3 -1
  20. core_framework-1.7.0/core_framework/api/admin/cache/router.py +32 -0
  21. core_framework-1.7.0/core_framework/api/admin/cache/schemas.py +95 -0
  22. {core_framework-1.6.0 → core_framework-1.7.0}/core_framework/api/admin/router.py +2 -0
  23. {core_framework-1.6.0 → core_framework-1.7.0}/core_framework/api/admin/users/schemas.py +0 -2
  24. {core_framework-1.6.0 → core_framework-1.7.0}/core_framework/api/users/authenticated/router.py +51 -0
  25. {core_framework-1.6.0 → core_framework-1.7.0}/core_framework/api/users/authenticated/schemas.py +5 -2
  26. {core_framework-1.6.0 → core_framework-1.7.0}/core_framework/api/users/mappers.py +0 -20
  27. {core_framework-1.6.0 → core_framework-1.7.0}/core_framework/api/users/shared/schemas.py +15 -6
  28. {core_framework-1.6.0 → core_framework-1.7.0}/core_framework/application/auth/access_service.py +11 -0
  29. {core_framework-1.6.0 → core_framework-1.7.0}/core_framework/application/auth/auth_service.py +8 -0
  30. core_framework-1.7.0/core_framework/application/cache/invalidate_service.py +75 -0
  31. core_framework-1.7.0/core_framework/application/cache/models.py +15 -0
  32. {core_framework-1.6.0 → core_framework-1.7.0}/core_framework/application/comments/admin_service.py +42 -0
  33. {core_framework-1.6.0 → core_framework-1.7.0}/core_framework/application/comments/aggregation_service.py +7 -0
  34. {core_framework-1.6.0 → core_framework-1.7.0}/core_framework/application/comments/authenticated_service.py +52 -0
  35. {core_framework-1.6.0 → core_framework-1.7.0}/core_framework/application/comments/public_service.py +44 -0
  36. {core_framework-1.6.0 → core_framework-1.7.0}/core_framework/application/events/event_service.py +22 -0
  37. core_framework-1.7.0/core_framework/application/media/README.md +17 -0
  38. {core_framework-1.6.0 → core_framework-1.7.0}/core_framework/application/media/avatar_service.py +60 -0
  39. core_framework-1.7.0/core_framework/application/media/banner_service.py +149 -0
  40. {core_framework-1.6.0 → core_framework-1.7.0}/core_framework/application/moderation/appeal_service.py +29 -0
  41. {core_framework-1.6.0 → core_framework-1.7.0}/core_framework/application/moderation/moderator_service.py +13 -0
  42. {core_framework-1.6.0 → core_framework-1.7.0}/core_framework/application/moderation/report_service.py +16 -0
  43. {core_framework-1.6.0 → core_framework-1.7.0}/core_framework/application/moderation/scheduled_service.py +7 -0
  44. {core_framework-1.6.0 → core_framework-1.7.0}/core_framework/application/moderation/user_service.py +93 -0
  45. {core_framework-1.6.0 → core_framework-1.7.0}/core_framework/application/notifications/README.md +2 -2
  46. {core_framework-1.6.0 → core_framework-1.7.0}/core_framework/application/notifications/inbox_service.py +32 -0
  47. {core_framework-1.6.0 → core_framework-1.7.0}/core_framework/application/notifications/mute_service.py +9 -0
  48. {core_framework-1.6.0 → core_framework-1.7.0}/core_framework/application/notifications/notification_service.py +19 -0
  49. {core_framework-1.6.0 → core_framework-1.7.0}/core_framework/application/posts/admin_service.py +33 -0
  50. {core_framework-1.6.0 → core_framework-1.7.0}/core_framework/application/posts/aggregation_service.py +7 -0
  51. {core_framework-1.6.0 → core_framework-1.7.0}/core_framework/application/posts/authenticated_service.py +29 -0
  52. {core_framework-1.6.0 → core_framework-1.7.0}/core_framework/application/posts/public_service.py +42 -0
  53. {core_framework-1.6.0 → core_framework-1.7.0}/core_framework/application/shared/enums.py +3 -0
  54. {core_framework-1.6.0 → core_framework-1.7.0}/core_framework/application/users/admin_service.py +108 -0
  55. {core_framework-1.6.0 → core_framework-1.7.0}/core_framework/application/users/aggregation_service.py +3 -0
  56. {core_framework-1.6.0 → core_framework-1.7.0}/core_framework/application/users/authenticated_service.py +54 -0
  57. {core_framework-1.6.0 → core_framework-1.7.0}/core_framework/application/users/public_service.py +1 -0
  58. {core_framework-1.6.0 → core_framework-1.7.0}/core_framework/application/users/scheduled_service.py +1 -0
  59. {core_framework-1.6.0 → core_framework-1.7.0}/core_framework/core/cache.py +14 -0
  60. {core_framework-1.6.0 → core_framework-1.7.0}/core_framework/core/exception_handlers/media.py +40 -0
  61. {core_framework-1.6.0 → core_framework-1.7.0}/core_framework/core/settings.py +13 -9
  62. {core_framework-1.6.0 → core_framework-1.7.0}/core_framework/domains/comment/README.md +5 -5
  63. {core_framework-1.6.0 → core_framework-1.7.0}/core_framework/domains/comment/service.py +130 -0
  64. {core_framework-1.6.0 → core_framework-1.7.0}/core_framework/domains/media/README.md +7 -4
  65. {core_framework-1.6.0 → core_framework-1.7.0}/core_framework/domains/media/__init__.py +25 -0
  66. core_framework-1.7.0/core_framework/domains/media/avatar/components/finals_publisher.py +39 -0
  67. core_framework-1.7.0/core_framework/domains/media/avatar/components/staging.py +112 -0
  68. {core_framework-1.6.0 → core_framework-1.7.0}/core_framework/domains/media/avatar/components/variant_encoder.py +15 -0
  69. core_framework-1.7.0/core_framework/domains/media/avatar/ports/finals_publisher.py +30 -0
  70. core_framework-1.7.0/core_framework/domains/media/avatar/ports/staging.py +41 -0
  71. core_framework-1.7.0/core_framework/domains/media/avatar/ports/variant_encoder.py +19 -0
  72. {core_framework-1.6.0 → core_framework-1.7.0}/core_framework/domains/media/avatar/service.py +136 -0
  73. core_framework-1.7.0/core_framework/domains/media/banner/components/finals_publisher.py +14 -0
  74. {core_framework-1.6.0/core_framework/domains/media/avatar → core_framework-1.7.0/core_framework/domains/media/banner}/components/staging.py +18 -14
  75. core_framework-1.7.0/core_framework/domains/media/banner/components/variant_encoder.py +16 -0
  76. core_framework-1.7.0/core_framework/domains/media/banner/constants.py +26 -0
  77. core_framework-1.7.0/core_framework/domains/media/banner/exceptions.py +26 -0
  78. core_framework-1.7.0/core_framework/domains/media/banner/models.py +23 -0
  79. core_framework-1.7.0/core_framework/domains/media/banner/ports/finals_publisher.py +29 -0
  80. core_framework-1.7.0/core_framework/domains/media/banner/ports/staging.py +41 -0
  81. core_framework-1.7.0/core_framework/domains/media/banner/ports/variant_encoder.py +19 -0
  82. core_framework-1.7.0/core_framework/domains/media/banner/service.py +152 -0
  83. {core_framework-1.6.0 → core_framework-1.7.0}/core_framework/domains/media/dependencies.py +58 -4
  84. {core_framework-1.6.0 → core_framework-1.7.0}/core_framework/domains/media/shared/repository.py +166 -0
  85. {core_framework-1.6.0 → core_framework-1.7.0}/core_framework/domains/media/shared/utils.py +1 -1
  86. {core_framework-1.6.0 → core_framework-1.7.0}/core_framework/domains/moderation/README.md +1 -1
  87. {core_framework-1.6.0 → core_framework-1.7.0}/core_framework/domains/moderation/service.py +94 -0
  88. {core_framework-1.6.0 → core_framework-1.7.0}/core_framework/domains/notification/README.md +3 -3
  89. {core_framework-1.6.0 → core_framework-1.7.0}/core_framework/domains/notification/service.py +45 -0
  90. {core_framework-1.6.0 → core_framework-1.7.0}/core_framework/domains/post/README.md +4 -4
  91. {core_framework-1.6.0 → core_framework-1.7.0}/core_framework/domains/post/service.py +135 -0
  92. {core_framework-1.6.0 → core_framework-1.7.0}/core_framework/domains/user/README.md +1 -1
  93. {core_framework-1.6.0 → core_framework-1.7.0}/core_framework/domains/user/__init__.py +2 -0
  94. {core_framework-1.6.0 → core_framework-1.7.0}/core_framework/domains/user/models.py +6 -0
  95. {core_framework-1.6.0 → core_framework-1.7.0}/core_framework/domains/user/repository.py +57 -0
  96. {core_framework-1.6.0 → core_framework-1.7.0}/core_framework/domains/user/service.py +117 -0
  97. core_framework-1.7.0/core_framework/infrastructure/media/local_banner_staging_adapter.py +61 -0
  98. {core_framework-1.6.0 → core_framework-1.7.0}/core_framework/infrastructure/media/local_staging_adapter.py +36 -0
  99. core_framework-1.7.0/core_framework/infrastructure/media/pillow_banner_variant_encoder_adapter.py +36 -0
  100. {core_framework-1.6.0 → core_framework-1.7.0}/core_framework/infrastructure/media/pillow_variant_encoder_adapter.py +16 -0
  101. core_framework-1.7.0/core_framework/infrastructure/media/ssh_banner_finals_publisher_adapter.py +82 -0
  102. {core_framework-1.6.0 → core_framework-1.7.0}/core_framework/infrastructure/media/ssh_finals_publisher_adapter.py +26 -0
  103. {core_framework-1.6.0 → core_framework-1.7.0}/core_framework/testing/arq.py +13 -0
  104. {core_framework-1.6.0 → core_framework-1.7.0}/core_framework/testing/auth.py +73 -0
  105. core_framework-1.7.0/core_framework/testing/config.py +44 -0
  106. {core_framework-1.6.0 → core_framework-1.7.0}/core_framework/testing/containers.py +18 -0
  107. {core_framework-1.6.0 → core_framework-1.7.0}/core_framework/testing/firebase.py +19 -0
  108. {core_framework-1.6.0 → core_framework-1.7.0}/core_framework/testing/httpx_test_client.py +11 -0
  109. core_framework-1.7.0/core_framework/testing/media.py +197 -0
  110. {core_framework-1.6.0 → core_framework-1.7.0}/core_framework/testing/plugin.py +39 -0
  111. {core_framework-1.6.0 → core_framework-1.7.0}/core_framework/worker/schedules/__init__.py +10 -0
  112. {core_framework-1.6.0 → core_framework-1.7.0}/core_framework/worker/schedules/schedule_aggregate_comment_stats.py +16 -0
  113. {core_framework-1.6.0 → core_framework-1.7.0}/core_framework/worker/schedules/schedule_aggregate_post_stats.py +16 -0
  114. {core_framework-1.6.0 → core_framework-1.7.0}/core_framework/worker/schedules/schedule_aggregate_user_stats.py +16 -0
  115. {core_framework-1.6.0 → core_framework-1.7.0}/core_framework/worker/schedules/schedule_expired_account_deletions.py +15 -0
  116. {core_framework-1.6.0 → core_framework-1.7.0}/core_framework/worker/schedules/schedule_expired_mute_lifts.py +15 -0
  117. {core_framework-1.6.0 → core_framework-1.7.0}/core_framework/worker/schedules/schedule_sweep_stale_avatar_staging.py +12 -0
  118. core_framework-1.7.0/core_framework/worker/schedules/schedule_sweep_stale_banner_staging.py +15 -0
  119. {core_framework-1.6.0 → core_framework-1.7.0}/core_framework/worker/tasks/__init__.py +6 -0
  120. {core_framework-1.6.0 → core_framework-1.7.0}/core_framework/worker/tasks/delete_superseded_avatar_finals.py +12 -0
  121. core_framework-1.7.0/core_framework/worker/tasks/delete_superseded_banner_finals.py +17 -0
  122. {core_framework-1.6.0 → core_framework-1.7.0}/core_framework/worker/tasks/process_account_deletion.py +14 -0
  123. {core_framework-1.6.0 → core_framework-1.7.0}/core_framework/worker/tasks/process_aggregate_comment_stats.py +15 -0
  124. {core_framework-1.6.0 → core_framework-1.7.0}/core_framework/worker/tasks/process_aggregate_post_stats.py +15 -0
  125. {core_framework-1.6.0 → core_framework-1.7.0}/core_framework/worker/tasks/process_aggregate_user_stats.py +15 -0
  126. core_framework-1.6.0/core_framework/worker/tasks/process_media_asset_variants.py → core_framework-1.7.0/core_framework/worker/tasks/process_banner_asset_variants.py +6 -5
  127. core_framework-1.7.0/core_framework/worker/tasks/process_cache_pattern_invalidation.py +26 -0
  128. core_framework-1.7.0/core_framework/worker/tasks/process_media_asset_variants.py +46 -0
  129. {core_framework-1.6.0 → core_framework-1.7.0}/core_framework/worker/tasks/process_mute_lift.py +13 -0
  130. {core_framework-1.6.0 → core_framework-1.7.0}/docker-compose.yml +2 -2
  131. core_framework-1.7.0/docs/README.md +28 -0
  132. core_framework-1.7.0/docs/deployments/README.md +31 -0
  133. core_framework-1.7.0/docs/deployments/deploy-playbook.md +133 -0
  134. {core_framework-1.6.0/docs/deployment → core_framework-1.7.0/docs/deployments}/edge-upload-limits.md +14 -12
  135. {core_framework-1.6.0/docs/deployment → core_framework-1.7.0/docs/deployments/examples}/Caddyfile.example +14 -2
  136. core_framework-1.7.0/docs/deployments/guides/app-server-deploy-ssh.md +50 -0
  137. core_framework-1.7.0/docs/deployments/guides/image-server-ssh.md +57 -0
  138. core_framework-1.7.0/docs/deployments/guides/postgres-setup.md +153 -0
  139. core_framework-1.7.0/docs/deployments/guides/redis-setup.md +109 -0
  140. core_framework-1.7.0/docs/deployments/guides/ubuntu-server-setup.md +173 -0
  141. core_framework-1.7.0/docs/domains/README.md +16 -0
  142. core_framework-1.7.0/docs/domains/cache/admin_cache_invalidation.md +219 -0
  143. {core_framework-1.6.0/docs/flows → core_framework-1.7.0/docs/domains}/comments/comment_report.md +1 -1
  144. {core_framework-1.6.0/docs/flows → core_framework-1.7.0/docs/domains}/comments/create_comment.md +1 -1
  145. {core_framework-1.6.0/docs/flows → core_framework-1.7.0/docs/domains}/comments/retrieve_comments.md +1 -1
  146. core_framework-1.7.0/docs/domains/media/avatar-upload-design.md +109 -0
  147. core_framework-1.7.0/docs/domains/media/banner-upload-design.md +150 -0
  148. core_framework-1.6.0/docs/media-upload-pipeline-design.md → core_framework-1.7.0/docs/domains/media/upload-pipeline-design.md +33 -28
  149. core_framework-1.7.0/docs/domains/media/upload_pipeline.md +60 -0
  150. {core_framework-1.6.0/docs/flows → core_framework-1.7.0/docs/domains}/mentions/mentions_in_content.md +7 -7
  151. {core_framework-1.6.0/docs/flows → core_framework-1.7.0/docs/domains}/moderation/reports.md +1 -1
  152. {core_framework-1.6.0/docs/flows → core_framework-1.7.0/docs/domains}/notifications/notification_inbox.md +8 -8
  153. {core_framework-1.6.0/docs/flows → core_framework-1.7.0/docs/domains}/posts/author_context.md +5 -5
  154. {core_framework-1.6.0/docs/flows → core_framework-1.7.0/docs/domains}/posts/hashtag_discovery.md +1 -1
  155. {core_framework-1.6.0/docs/flows → core_framework-1.7.0/docs/domains}/posts/post_visibility.md +1 -1
  156. core_framework-1.7.0/docs/domains/users/banner.md +79 -0
  157. {core_framework-1.6.0/docs → core_framework-1.7.0/docs/domains/users}/follow-system-design.md +28 -27
  158. {core_framework-1.6.0/docs/flows → core_framework-1.7.0/docs/domains}/users/follow.md +3 -3
  159. {core_framework-1.6.0/docs/flows → core_framework-1.7.0/docs/domains}/users/my_posts_and_comments.md +7 -7
  160. {core_framework-1.6.0/docs/flows → core_framework-1.7.0/docs/domains}/users/profile.md +61 -7
  161. {core_framework-1.6.0/docs/flows → core_framework-1.7.0/docs/domains}/users/user_removal.md +2 -2
  162. core_framework-1.7.0/docs/library/README.md +11 -0
  163. {core_framework-1.6.0/docs → core_framework-1.7.0/docs/library}/api.md +8 -0
  164. {core_framework-1.6.0/docs → core_framework-1.7.0/docs/library}/core-framework-migration.md +11 -11
  165. core_framework-1.7.0/docs/library/overview.md +49 -0
  166. {core_framework-1.6.0/docs → core_framework-1.7.0/docs/library}/package-api.md +8 -8
  167. {core_framework-1.6.0/docs → core_framework-1.7.0/docs/library}/testing-plugin-design.md +2 -2
  168. core_framework-1.7.0/docs/platform/README.md +13 -0
  169. {core_framework-1.6.0/docs → core_framework-1.7.0/docs/platform}/architecture-decisions.md +9 -9
  170. core_framework-1.7.0/docs/platform/conventions.md +75 -0
  171. {core_framework-1.6.0/docs → core_framework-1.7.0/docs/platform}/database-triggers.md +1 -1
  172. core_framework-1.7.0/docs/platform/domain-services-and-adapters.md +91 -0
  173. {core_framework-1.6.0/docs → core_framework-1.7.0/docs/platform}/event-outbox-design.md +45 -45
  174. core_framework-1.7.0/docs/platform/layers-and-boundaries.md +46 -0
  175. {core_framework-1.6.0/docs → core_framework-1.7.0/docs/platform}/patch-update-typed-payload.md +3 -3
  176. {core_framework-1.6.0 → core_framework-1.7.0}/docs/todo.md +0 -2
  177. {core_framework-1.6.0 → core_framework-1.7.0}/pyproject.toml +1 -1
  178. core_framework-1.7.0/tests/integration/api/admin/cache/router_test.py +357 -0
  179. {core_framework-1.6.0 → core_framework-1.7.0}/tests/integration/api/admin/users/router_test.py +4 -1
  180. core_framework-1.7.0/tests/integration/api/users/authenticated/banner_upload_test.py +165 -0
  181. {core_framework-1.6.0 → core_framework-1.7.0}/tests/integration/api/users/authenticated/router_test.py +90 -2
  182. core_framework-1.7.0/tests/integration/worker/banner_upload_test.py +164 -0
  183. core_framework-1.7.0/tests/unit/infrastructure/media/__init__.py +0 -0
  184. {core_framework-1.6.0 → core_framework-1.7.0}/uv.lock +1 -1
  185. core_framework-1.6.0/.cursor/rules/no-docstrings.mdc +0 -13
  186. core_framework-1.6.0/core_framework/application/media/README.md +0 -11
  187. core_framework-1.6.0/core_framework/domains/media/avatar/components/finals_publisher.py +0 -16
  188. core_framework-1.6.0/core_framework/domains/media/avatar/ports/finals_publisher.py +0 -7
  189. core_framework-1.6.0/core_framework/domains/media/avatar/ports/staging.py +0 -10
  190. core_framework-1.6.0/core_framework/domains/media/avatar/ports/variant_encoder.py +0 -7
  191. core_framework-1.6.0/core_framework/testing/config.py +0 -28
  192. core_framework-1.6.0/core_framework/testing/media.py +0 -81
  193. core_framework-1.6.0/docs/README.md +0 -22
  194. core_framework-1.6.0/docs/architecture.md +0 -137
  195. core_framework-1.6.0/docs/conventions.md +0 -173
  196. core_framework-1.6.0/docs/deployment/image-server-ssh.md +0 -84
  197. core_framework-1.6.0/docs/domain-services-and-adapters.md +0 -179
  198. core_framework-1.6.0/docs/flows/media/upload_pipeline.md +0 -37
  199. {core_framework-1.6.0 → core_framework-1.7.0}/.cursor/rules/api-security.mdc +0 -0
  200. {core_framework-1.6.0 → core_framework-1.7.0}/.cursor/rules/api-validation.mdc +0 -0
  201. {core_framework-1.6.0 → core_framework-1.7.0}/.cursor/rules/application-layer.mdc +0 -0
  202. {core_framework-1.6.0 → core_framework-1.7.0}/.cursor/rules/code-review-output.mdc +0 -0
  203. {core_framework-1.6.0 → core_framework-1.7.0}/.cursor/rules/constants-final.mdc +0 -0
  204. {core_framework-1.6.0 → core_framework-1.7.0}/.cursor/rules/domain-caller-context.mdc +0 -0
  205. {core_framework-1.6.0 → core_framework-1.7.0}/.cursor/rules/domain-imports.mdc +0 -0
  206. {core_framework-1.6.0 → core_framework-1.7.0}/.cursor/rules/domain-input-guards.mdc +0 -0
  207. {core_framework-1.6.0 → core_framework-1.7.0}/.cursor/rules/domain-repository-exceptions.mdc +0 -0
  208. {core_framework-1.6.0 → core_framework-1.7.0}/.cursor/rules/exception-handlers.mdc +0 -0
  209. {core_framework-1.6.0 → core_framework-1.7.0}/.cursor/rules/integration-test-strategy.mdc +0 -0
  210. {core_framework-1.6.0 → core_framework-1.7.0}/.cursor/rules/layer-boundaries.mdc +0 -0
  211. {core_framework-1.6.0 → core_framework-1.7.0}/.cursor/rules/no-code-in-docs.mdc +0 -0
  212. {core_framework-1.6.0 → core_framework-1.7.0}/.cursor/rules/postgres-config-conventions.mdc +0 -0
  213. {core_framework-1.6.0 → core_framework-1.7.0}/.cursor/rules/repository-read-consistency.mdc +0 -0
  214. {core_framework-1.6.0 → core_framework-1.7.0}/.cursor/rules/strong-read-opt-in.mdc +0 -0
  215. {core_framework-1.6.0 → core_framework-1.7.0}/.cursor/rules/structured-logging.mdc +0 -0
  216. {core_framework-1.6.0 → core_framework-1.7.0}/.cursor/rules/tech-stack.mdc +0 -0
  217. {core_framework-1.6.0 → core_framework-1.7.0}/.cursor/skills/add-config/SKILL.md +0 -0
  218. {core_framework-1.6.0 → core_framework-1.7.0}/.cursor/skills/recommend-features/SKILL.md +0 -0
  219. {core_framework-1.6.0 → core_framework-1.7.0}/.dockerignore +0 -0
  220. {core_framework-1.6.0 → core_framework-1.7.0}/.github/workflows/dev-ci-cd.yaml +0 -0
  221. {core_framework-1.6.0 → core_framework-1.7.0}/.github/workflows/manual-deployment.yaml +0 -0
  222. {core_framework-1.6.0 → core_framework-1.7.0}/.github/workflows/publish-pypi.yml +0 -0
  223. {core_framework-1.6.0 → core_framework-1.7.0}/.github/workflows/test.yaml +0 -0
  224. {core_framework-1.6.0 → core_framework-1.7.0}/.pre-commit-config.yaml +0 -0
  225. {core_framework-1.6.0 → core_framework-1.7.0}/.python-version +0 -0
  226. {core_framework-1.6.0 → core_framework-1.7.0}/LICENSE +0 -0
  227. {core_framework-1.6.0 → core_framework-1.7.0}/alembic/comment/alembic/README +0 -0
  228. {core_framework-1.6.0 → core_framework-1.7.0}/alembic/comment/alembic/env.py +0 -0
  229. {core_framework-1.6.0 → core_framework-1.7.0}/alembic/comment/alembic/script.py.mako +0 -0
  230. {core_framework-1.6.0 → core_framework-1.7.0}/alembic/comment/alembic/versions/v1_comment_init_baseline.py +0 -0
  231. {core_framework-1.6.0 → core_framework-1.7.0}/alembic/comment/alembic.ini +0 -0
  232. {core_framework-1.6.0 → core_framework-1.7.0}/alembic/extension/alembic/README +0 -0
  233. {core_framework-1.6.0 → core_framework-1.7.0}/alembic/extension/alembic/env.py +0 -0
  234. {core_framework-1.6.0 → core_framework-1.7.0}/alembic/extension/alembic/script.py.mako +0 -0
  235. {core_framework-1.6.0 → core_framework-1.7.0}/alembic/extension/alembic/versions/v1_ext_init_baseline.py +0 -0
  236. {core_framework-1.6.0 → core_framework-1.7.0}/alembic/extension/alembic.ini +0 -0
  237. {core_framework-1.6.0 → core_framework-1.7.0}/alembic/media/alembic/README +0 -0
  238. {core_framework-1.6.0 → core_framework-1.7.0}/alembic/media/alembic/env.py +0 -0
  239. {core_framework-1.6.0 → core_framework-1.7.0}/alembic/media/alembic/script.py.mako +0 -0
  240. {core_framework-1.6.0 → core_framework-1.7.0}/alembic/media/alembic/versions/v1_media_init_baseline.py +0 -0
  241. {core_framework-1.6.0 → core_framework-1.7.0}/alembic/media/alembic.ini +0 -0
  242. {core_framework-1.6.0 → core_framework-1.7.0}/alembic/moderation/alembic/README +0 -0
  243. {core_framework-1.6.0 → core_framework-1.7.0}/alembic/moderation/alembic/env.py +0 -0
  244. {core_framework-1.6.0 → core_framework-1.7.0}/alembic/moderation/alembic/script.py.mako +0 -0
  245. {core_framework-1.6.0 → core_framework-1.7.0}/alembic/moderation/alembic/versions/v1_mod_init_baseline.py +0 -0
  246. {core_framework-1.6.0 → core_framework-1.7.0}/alembic/moderation/alembic.ini +0 -0
  247. {core_framework-1.6.0 → core_framework-1.7.0}/alembic/notification/alembic/README +0 -0
  248. {core_framework-1.6.0 → core_framework-1.7.0}/alembic/notification/alembic/env.py +0 -0
  249. {core_framework-1.6.0 → core_framework-1.7.0}/alembic/notification/alembic/script.py.mako +0 -0
  250. {core_framework-1.6.0 → core_framework-1.7.0}/alembic/notification/alembic/versions/v1_notif_init_baseline.py +0 -0
  251. {core_framework-1.6.0 → core_framework-1.7.0}/alembic/notification/alembic.ini +0 -0
  252. {core_framework-1.6.0 → core_framework-1.7.0}/alembic/post/alembic/README +0 -0
  253. {core_framework-1.6.0 → core_framework-1.7.0}/alembic/post/alembic/env.py +0 -0
  254. {core_framework-1.6.0 → core_framework-1.7.0}/alembic/post/alembic/script.py.mako +0 -0
  255. {core_framework-1.6.0 → core_framework-1.7.0}/alembic/post/alembic/versions/v1_post_init_baseline.py +0 -0
  256. {core_framework-1.6.0 → core_framework-1.7.0}/alembic/post/alembic.ini +0 -0
  257. {core_framework-1.6.0 → core_framework-1.7.0}/alembic/user/alembic/README +0 -0
  258. {core_framework-1.6.0 → core_framework-1.7.0}/alembic/user/alembic/env.py +0 -0
  259. {core_framework-1.6.0 → core_framework-1.7.0}/alembic/user/alembic/script.py.mako +0 -0
  260. {core_framework-1.6.0 → core_framework-1.7.0}/alembic/user/alembic/versions/user_add_avatar_ingest_sequences.py +0 -0
  261. {core_framework-1.6.0 → core_framework-1.7.0}/alembic/user/alembic/versions/user_add_date_of_birth_to_profiles.py +0 -0
  262. {core_framework-1.6.0 → core_framework-1.7.0}/alembic/user/alembic/versions/v1_user_init_baseline.py +0 -0
  263. {core_framework-1.6.0 → core_framework-1.7.0}/alembic/user/alembic.ini +0 -0
  264. {core_framework-1.6.0 → core_framework-1.7.0}/core_framework/__init__.py +0 -0
  265. {core_framework-1.6.0 → core_framework-1.7.0}/core_framework/api/__init__.py +0 -0
  266. {core_framework-1.6.0 → core_framework-1.7.0}/core_framework/api/admin/__init__.py +0 -0
  267. {core_framework-1.6.0 → core_framework-1.7.0}/core_framework/api/admin/comments/router.py +0 -0
  268. {core_framework-1.6.0 → core_framework-1.7.0}/core_framework/api/admin/comments/schemas.py +0 -0
  269. {core_framework-1.6.0 → core_framework-1.7.0}/core_framework/api/admin/moderation/__init__.py +0 -0
  270. {core_framework-1.6.0 → core_framework-1.7.0}/core_framework/api/admin/moderation/router.py +0 -0
  271. {core_framework-1.6.0 → core_framework-1.7.0}/core_framework/api/admin/moderation/schemas.py +0 -0
  272. {core_framework-1.6.0 → core_framework-1.7.0}/core_framework/api/admin/posts/router.py +0 -0
  273. {core_framework-1.6.0 → core_framework-1.7.0}/core_framework/api/admin/posts/schemas.py +0 -0
  274. {core_framework-1.6.0 → core_framework-1.7.0}/core_framework/api/admin/users/__init__.py +0 -0
  275. {core_framework-1.6.0 → core_framework-1.7.0}/core_framework/api/admin/users/router.py +0 -0
  276. {core_framework-1.6.0 → core_framework-1.7.0}/core_framework/api/auth/__init__.py +0 -0
  277. {core_framework-1.6.0 → core_framework-1.7.0}/core_framework/api/auth/router.py +0 -0
  278. {core_framework-1.6.0 → core_framework-1.7.0}/core_framework/api/auth/schemas.py +0 -0
  279. {core_framework-1.6.0 → core_framework-1.7.0}/core_framework/api/comments/authenticated/mappers.py +0 -0
  280. {core_framework-1.6.0 → core_framework-1.7.0}/core_framework/api/comments/authenticated/router.py +0 -0
  281. {core_framework-1.6.0 → core_framework-1.7.0}/core_framework/api/comments/authenticated/schemas.py +0 -0
  282. {core_framework-1.6.0 → core_framework-1.7.0}/core_framework/api/comments/public/router.py +0 -0
  283. {core_framework-1.6.0 → core_framework-1.7.0}/core_framework/api/comments/public/schemas.py +0 -0
  284. {core_framework-1.6.0 → core_framework-1.7.0}/core_framework/api/comments/router.py +0 -0
  285. {core_framework-1.6.0 → core_framework-1.7.0}/core_framework/api/comments/schemas.py +0 -0
  286. {core_framework-1.6.0 → core_framework-1.7.0}/core_framework/api/constants.py +0 -0
  287. {core_framework-1.6.0 → core_framework-1.7.0}/core_framework/api/dependencies.py +0 -0
  288. {core_framework-1.6.0 → core_framework-1.7.0}/core_framework/api/events/router.py +0 -0
  289. {core_framework-1.6.0 → core_framework-1.7.0}/core_framework/api/events/schemas.py +0 -0
  290. {core_framework-1.6.0 → core_framework-1.7.0}/core_framework/api/notifications/authenticated/router.py +0 -0
  291. {core_framework-1.6.0 → core_framework-1.7.0}/core_framework/api/notifications/authenticated/schemas.py +0 -0
  292. {core_framework-1.6.0 → core_framework-1.7.0}/core_framework/api/notifications/router.py +0 -0
  293. {core_framework-1.6.0 → core_framework-1.7.0}/core_framework/api/posts/authenticated/mappers.py +0 -0
  294. {core_framework-1.6.0 → core_framework-1.7.0}/core_framework/api/posts/authenticated/router.py +0 -0
  295. {core_framework-1.6.0 → core_framework-1.7.0}/core_framework/api/posts/authenticated/schemas.py +0 -0
  296. {core_framework-1.6.0 → core_framework-1.7.0}/core_framework/api/posts/public/router.py +0 -0
  297. {core_framework-1.6.0 → core_framework-1.7.0}/core_framework/api/posts/public/schemas.py +0 -0
  298. {core_framework-1.6.0 → core_framework-1.7.0}/core_framework/api/posts/router.py +0 -0
  299. {core_framework-1.6.0 → core_framework-1.7.0}/core_framework/api/posts/schemas.py +0 -0
  300. {core_framework-1.6.0 → core_framework-1.7.0}/core_framework/api/router.py +0 -0
  301. {core_framework-1.6.0 → core_framework-1.7.0}/core_framework/api/schemas.py +0 -0
  302. {core_framework-1.6.0 → core_framework-1.7.0}/core_framework/api/system/__init__.py +0 -0
  303. {core_framework-1.6.0 → core_framework-1.7.0}/core_framework/api/system/router.py +0 -0
  304. {core_framework-1.6.0 → core_framework-1.7.0}/core_framework/api/users/__init__.py +0 -0
  305. {core_framework-1.6.0 → core_framework-1.7.0}/core_framework/api/users/authenticated/__init__.py +0 -0
  306. {core_framework-1.6.0 → core_framework-1.7.0}/core_framework/api/users/authenticated/mappers.py +0 -0
  307. {core_framework-1.6.0 → core_framework-1.7.0}/core_framework/api/users/public/__init__.py +0 -0
  308. {core_framework-1.6.0 → core_framework-1.7.0}/core_framework/api/users/public/router.py +0 -0
  309. {core_framework-1.6.0 → core_framework-1.7.0}/core_framework/api/users/public/schemas.py +0 -0
  310. {core_framework-1.6.0 → core_framework-1.7.0}/core_framework/api/users/router.py +0 -0
  311. {core_framework-1.6.0 → core_framework-1.7.0}/core_framework/application/__init__.py +0 -0
  312. {core_framework-1.6.0 → core_framework-1.7.0}/core_framework/application/auth/__init__.py +0 -0
  313. {core_framework-1.6.0 → core_framework-1.7.0}/core_framework/application/auth/models.py +0 -0
  314. {core_framework-1.6.0 → core_framework-1.7.0}/core_framework/application/bootstrap.py +0 -0
  315. {core_framework-1.6.0 → core_framework-1.7.0}/core_framework/application/events/README.md +0 -0
  316. {core_framework-1.6.0 → core_framework-1.7.0}/core_framework/application/events/event_token.py +0 -0
  317. {core_framework-1.6.0 → core_framework-1.7.0}/core_framework/application/events/models.py +0 -0
  318. {core_framework-1.6.0 → core_framework-1.7.0}/core_framework/application/moderation/__init__.py +0 -0
  319. {core_framework-1.6.0 → core_framework-1.7.0}/core_framework/application/notifications/enums.py +0 -0
  320. {core_framework-1.6.0 → core_framework-1.7.0}/core_framework/application/shared/__init__.py +0 -0
  321. {core_framework-1.6.0 → core_framework-1.7.0}/core_framework/application/shared/exceptions.py +0 -0
  322. {core_framework-1.6.0 → core_framework-1.7.0}/core_framework/application/shared/user_agent.py +0 -0
  323. {core_framework-1.6.0 → core_framework-1.7.0}/core_framework/application/shared/worker_jobs.py +0 -0
  324. {core_framework-1.6.0 → core_framework-1.7.0}/core_framework/application/users/__init__.py +0 -0
  325. {core_framework-1.6.0 → core_framework-1.7.0}/core_framework/asgi.py +0 -0
  326. {core_framework-1.6.0 → core_framework-1.7.0}/core_framework/bundled_alembic.py +0 -0
  327. {core_framework-1.6.0 → core_framework-1.7.0}/core_framework/constants.py +0 -0
  328. {core_framework-1.6.0 → core_framework-1.7.0}/core_framework/core/__init__.py +0 -0
  329. {core_framework-1.6.0 → core_framework-1.7.0}/core_framework/core/context.py +0 -0
  330. {core_framework-1.6.0 → core_framework-1.7.0}/core_framework/core/database.py +0 -0
  331. {core_framework-1.6.0 → core_framework-1.7.0}/core_framework/core/exception_handlers/__init__.py +0 -0
  332. {core_framework-1.6.0 → core_framework-1.7.0}/core_framework/core/exception_handlers/comment.py +0 -0
  333. {core_framework-1.6.0 → core_framework-1.7.0}/core_framework/core/exception_handlers/common.py +0 -0
  334. {core_framework-1.6.0 → core_framework-1.7.0}/core_framework/core/exception_handlers/moderation.py +0 -0
  335. {core_framework-1.6.0 → core_framework-1.7.0}/core_framework/core/exception_handlers/notification.py +0 -0
  336. {core_framework-1.6.0 → core_framework-1.7.0}/core_framework/core/exception_handlers/post.py +0 -0
  337. {core_framework-1.6.0 → core_framework-1.7.0}/core_framework/core/exception_handlers/setup.py +0 -0
  338. {core_framework-1.6.0 → core_framework-1.7.0}/core_framework/core/exception_handlers/user.py +0 -0
  339. {core_framework-1.6.0 → core_framework-1.7.0}/core_framework/core/firebase.py +0 -0
  340. {core_framework-1.6.0 → core_framework-1.7.0}/core_framework/core/http_client.py +0 -0
  341. {core_framework-1.6.0 → core_framework-1.7.0}/core_framework/core/logging.py +0 -0
  342. {core_framework-1.6.0 → core_framework-1.7.0}/core_framework/core/middleware.py +0 -0
  343. {core_framework-1.6.0 → core_framework-1.7.0}/core_framework/core/observability.py +0 -0
  344. {core_framework-1.6.0 → core_framework-1.7.0}/core_framework/core/pagination.py +0 -0
  345. {core_framework-1.6.0 → core_framework-1.7.0}/core_framework/core/redis.py +0 -0
  346. {core_framework-1.6.0 → core_framework-1.7.0}/core_framework/core/runtime.py +0 -0
  347. {core_framework-1.6.0 → core_framework-1.7.0}/core_framework/domains/__init__.py +0 -0
  348. {core_framework-1.6.0 → core_framework-1.7.0}/core_framework/domains/comment/__init__.py +0 -0
  349. {core_framework-1.6.0 → core_framework-1.7.0}/core_framework/domains/comment/constants.py +0 -0
  350. {core_framework-1.6.0 → core_framework-1.7.0}/core_framework/domains/comment/dependencies.py +0 -0
  351. {core_framework-1.6.0 → core_framework-1.7.0}/core_framework/domains/comment/enums.py +0 -0
  352. {core_framework-1.6.0 → core_framework-1.7.0}/core_framework/domains/comment/exceptions.py +0 -0
  353. {core_framework-1.6.0 → core_framework-1.7.0}/core_framework/domains/comment/models.py +0 -0
  354. {core_framework-1.6.0 → core_framework-1.7.0}/core_framework/domains/comment/repository.py +0 -0
  355. {core_framework-1.6.0 → core_framework-1.7.0}/core_framework/domains/exceptions.py +0 -0
  356. {core_framework-1.6.0 → core_framework-1.7.0}/core_framework/domains/media/avatar/__init__.py +0 -0
  357. {core_framework-1.6.0 → core_framework-1.7.0}/core_framework/domains/media/avatar/components/__init__.py +0 -0
  358. {core_framework-1.6.0 → core_framework-1.7.0}/core_framework/domains/media/avatar/constants.py +0 -0
  359. {core_framework-1.6.0 → core_framework-1.7.0}/core_framework/domains/media/avatar/exceptions.py +0 -0
  360. {core_framework-1.6.0 → core_framework-1.7.0}/core_framework/domains/media/avatar/models.py +0 -0
  361. {core_framework-1.6.0 → core_framework-1.7.0}/core_framework/domains/media/avatar/ports/__init__.py +0 -0
  362. {core_framework-1.6.0 → core_framework-1.7.0}/core_framework/domains/media/shared/__init__.py +0 -0
  363. {core_framework-1.6.0 → core_framework-1.7.0}/core_framework/domains/media/shared/exceptions.py +0 -0
  364. {core_framework-1.6.0 → core_framework-1.7.0}/core_framework/domains/media/shared/service.py +0 -0
  365. {core_framework-1.6.0 → core_framework-1.7.0}/core_framework/domains/moderation/__init__.py +0 -0
  366. {core_framework-1.6.0 → core_framework-1.7.0}/core_framework/domains/moderation/dependencies.py +0 -0
  367. {core_framework-1.6.0 → core_framework-1.7.0}/core_framework/domains/moderation/enums.py +0 -0
  368. {core_framework-1.6.0 → core_framework-1.7.0}/core_framework/domains/moderation/exceptions.py +0 -0
  369. {core_framework-1.6.0 → core_framework-1.7.0}/core_framework/domains/moderation/models.py +0 -0
  370. {core_framework-1.6.0 → core_framework-1.7.0}/core_framework/domains/moderation/repository.py +0 -0
  371. {core_framework-1.6.0 → core_framework-1.7.0}/core_framework/domains/notification/__init__.py +0 -0
  372. {core_framework-1.6.0 → core_framework-1.7.0}/core_framework/domains/notification/dependencies.py +0 -0
  373. {core_framework-1.6.0 → core_framework-1.7.0}/core_framework/domains/notification/enums.py +0 -0
  374. {core_framework-1.6.0 → core_framework-1.7.0}/core_framework/domains/notification/exceptions.py +0 -0
  375. {core_framework-1.6.0 → core_framework-1.7.0}/core_framework/domains/notification/models.py +0 -0
  376. {core_framework-1.6.0 → core_framework-1.7.0}/core_framework/domains/notification/repository.py +0 -0
  377. {core_framework-1.6.0 → core_framework-1.7.0}/core_framework/domains/post/__init__.py +0 -0
  378. {core_framework-1.6.0 → core_framework-1.7.0}/core_framework/domains/post/constants.py +0 -0
  379. {core_framework-1.6.0 → core_framework-1.7.0}/core_framework/domains/post/dependencies.py +0 -0
  380. {core_framework-1.6.0 → core_framework-1.7.0}/core_framework/domains/post/enums.py +0 -0
  381. {core_framework-1.6.0 → core_framework-1.7.0}/core_framework/domains/post/exceptions.py +0 -0
  382. {core_framework-1.6.0 → core_framework-1.7.0}/core_framework/domains/post/models.py +0 -0
  383. {core_framework-1.6.0 → core_framework-1.7.0}/core_framework/domains/post/repository.py +0 -0
  384. {core_framework-1.6.0 → core_framework-1.7.0}/core_framework/domains/user/constants.py +0 -0
  385. {core_framework-1.6.0 → core_framework-1.7.0}/core_framework/domains/user/dependencies.py +0 -0
  386. {core_framework-1.6.0 → core_framework-1.7.0}/core_framework/domains/user/enums.py +0 -0
  387. {core_framework-1.6.0 → core_framework-1.7.0}/core_framework/domains/user/exceptions.py +0 -0
  388. {core_framework-1.6.0 → core_framework-1.7.0}/core_framework/domains/user/utils.py +0 -0
  389. {core_framework-1.6.0 → core_framework-1.7.0}/core_framework/domains/utils.py +0 -0
  390. {core_framework-1.6.0 → core_framework-1.7.0}/core_framework/infrastructure/__init__.py +0 -0
  391. {core_framework-1.6.0 → core_framework-1.7.0}/core_framework/infrastructure/media/__init__.py +0 -0
  392. {core_framework-1.6.0 → core_framework-1.7.0}/core_framework/main.py +0 -0
  393. {core_framework-1.6.0 → core_framework-1.7.0}/core_framework/migrate_cli.py +0 -0
  394. {core_framework-1.6.0 → core_framework-1.7.0}/core_framework/testing/__init__.py +0 -0
  395. {core_framework-1.6.0 → core_framework-1.7.0}/core_framework/testing/hookspecs.py +0 -0
  396. {core_framework-1.6.0 → core_framework-1.7.0}/core_framework/testing/migrations.py +0 -0
  397. {core_framework-1.6.0 → core_framework-1.7.0}/core_framework/worker/__init__.py +0 -0
  398. {core_framework-1.6.0 → core_framework-1.7.0}/core_framework/worker/main.py +0 -0
  399. {core_framework-1.6.0 → core_framework-1.7.0}/core_framework/worker/worker_context.py +0 -0
  400. {core_framework-1.6.0 → core_framework-1.7.0}/docker-compose.dev.yaml +0 -0
  401. {core_framework-1.6.0 → core_framework-1.7.0}/dockerfile +0 -0
  402. {core_framework-1.6.0/docs/deployment → core_framework-1.7.0/docs/deployments/examples}/image-server-known-hosts.example +0 -0
  403. {core_framework-1.6.0/docs/flows → core_framework-1.7.0/docs/domains}/auth/access_control.md +0 -0
  404. {core_framework-1.6.0/docs/flows → core_framework-1.7.0/docs/domains}/auth/registration.md +0 -0
  405. {core_framework-1.6.0/docs/flows → core_framework-1.7.0/docs/domains}/comments/admin_comments.md +0 -0
  406. {core_framework-1.6.0/docs/flows → core_framework-1.7.0/docs/domains}/comments/comment_stats_aggregation.md +0 -0
  407. {core_framework-1.6.0/docs/flows → core_framework-1.7.0/docs/domains}/comments/delete_comment.md +0 -0
  408. {core_framework-1.6.0/docs/flows → core_framework-1.7.0/docs/domains}/comments/edit_comment.md +0 -0
  409. {core_framework-1.6.0/docs/flows → core_framework-1.7.0/docs/domains}/events/events.md +0 -0
  410. {core_framework-1.6.0/docs/flows → core_framework-1.7.0/docs/domains}/moderation/appeals.md +0 -0
  411. {core_framework-1.6.0/docs/flows → core_framework-1.7.0/docs/domains}/moderation/internal_notes.md +0 -0
  412. {core_framework-1.6.0/docs/flows → core_framework-1.7.0/docs/domains}/moderation/moderator_actions.md +0 -0
  413. {core_framework-1.6.0/docs/flows → core_framework-1.7.0/docs/domains}/moderation/restrictions.md +0 -0
  414. {core_framework-1.6.0/docs/flows → core_framework-1.7.0/docs/domains}/posts/admin_posts.md +0 -0
  415. {core_framework-1.6.0/docs/flows → core_framework-1.7.0/docs/domains}/posts/post_like.md +0 -0
  416. {core_framework-1.6.0/docs/flows → core_framework-1.7.0/docs/domains}/posts/post_stats_aggregation.md +0 -0
  417. {core_framework-1.6.0/docs/flows → core_framework-1.7.0/docs/domains}/users/account.md +0 -0
  418. {core_framework-1.6.0/docs/flows → core_framework-1.7.0/docs/domains}/users/account_deletion.md +0 -0
  419. {core_framework-1.6.0/docs/flows → core_framework-1.7.0/docs/domains}/users/avatar.md +0 -0
  420. {core_framework-1.6.0/docs/flows → core_framework-1.7.0/docs/domains}/users/blocks.md +0 -0
  421. {core_framework-1.6.0/docs/flows → core_framework-1.7.0/docs/domains}/users/change_history.md +0 -0
  422. {core_framework-1.6.0/docs/flows → core_framework-1.7.0/docs/domains}/users/check_username_exists.md +0 -0
  423. {core_framework-1.6.0/docs/flows → core_framework-1.7.0/docs/domains}/users/preferences.md +0 -0
  424. {core_framework-1.6.0 → core_framework-1.7.0}/firebase_config.example.json +0 -0
  425. {core_framework-1.6.0 → core_framework-1.7.0}/makefile +0 -0
  426. {core_framework-1.6.0 → core_framework-1.7.0}/tests/__init__.py +0 -0
  427. {core_framework-1.6.0 → core_framework-1.7.0}/tests/conftest.py +0 -0
  428. {core_framework-1.6.0 → core_framework-1.7.0}/tests/integration/__init__.py +0 -0
  429. {core_framework-1.6.0 → core_framework-1.7.0}/tests/integration/api/__init__.py +0 -0
  430. {core_framework-1.6.0 → core_framework-1.7.0}/tests/integration/api/_http_helpers.py +0 -0
  431. {core_framework-1.6.0 → core_framework-1.7.0}/tests/integration/api/admin/__init__.py +0 -0
  432. {core_framework-1.6.0/tests/integration/api/admin/comments → core_framework-1.7.0/tests/integration/api/admin/cache}/__init__.py +0 -0
  433. {core_framework-1.6.0/tests/integration/api/admin/moderation → core_framework-1.7.0/tests/integration/api/admin/comments}/__init__.py +0 -0
  434. {core_framework-1.6.0 → core_framework-1.7.0}/tests/integration/api/admin/comments/router_test.py +0 -0
  435. {core_framework-1.6.0/tests/integration/api/admin/posts → core_framework-1.7.0/tests/integration/api/admin/moderation}/__init__.py +0 -0
  436. {core_framework-1.6.0 → core_framework-1.7.0}/tests/integration/api/admin/moderation/router_test.py +0 -0
  437. {core_framework-1.6.0/tests/integration/api/admin/users → core_framework-1.7.0/tests/integration/api/admin/posts}/__init__.py +0 -0
  438. {core_framework-1.6.0 → core_framework-1.7.0}/tests/integration/api/admin/posts/router_test.py +0 -0
  439. {core_framework-1.6.0/tests/integration/api/auth → core_framework-1.7.0/tests/integration/api/admin/users}/__init__.py +0 -0
  440. {core_framework-1.6.0/tests/integration/api/comments → core_framework-1.7.0/tests/integration/api/auth}/__init__.py +0 -0
  441. {core_framework-1.6.0 → core_framework-1.7.0}/tests/integration/api/auth/router_test.py +0 -0
  442. {core_framework-1.6.0/tests/integration/api/comments/public → core_framework-1.7.0/tests/integration/api/comments}/__init__.py +0 -0
  443. {core_framework-1.6.0 → core_framework-1.7.0}/tests/integration/api/comments/authenticated/comment_writes_integration_test.py +0 -0
  444. {core_framework-1.6.0/tests/integration/api/notifications → core_framework-1.7.0/tests/integration/api/comments/public}/__init__.py +0 -0
  445. {core_framework-1.6.0 → core_framework-1.7.0}/tests/integration/api/comments/public/router_test.py +0 -0
  446. {core_framework-1.6.0 → core_framework-1.7.0}/tests/integration/api/events/router_test.py +0 -0
  447. {core_framework-1.6.0/tests/integration/api/posts → core_framework-1.7.0/tests/integration/api/notifications}/__init__.py +0 -0
  448. {core_framework-1.6.0 → core_framework-1.7.0}/tests/integration/api/notifications/router_test.py +0 -0
  449. {core_framework-1.6.0/tests/integration/api/posts/public → core_framework-1.7.0/tests/integration/api/posts}/__init__.py +0 -0
  450. {core_framework-1.6.0 → core_framework-1.7.0}/tests/integration/api/posts/authenticated/post_writes_integration_test.py +0 -0
  451. {core_framework-1.6.0 → core_framework-1.7.0}/tests/integration/api/posts/comment_count_aggregation_test.py +0 -0
  452. {core_framework-1.6.0 → core_framework-1.7.0}/tests/integration/api/posts/followers_visibility_test.py +0 -0
  453. {core_framework-1.6.0 → core_framework-1.7.0}/tests/integration/api/posts/post_stats_dirty_marking_test.py +0 -0
  454. {core_framework-1.6.0/tests/integration/api/system → core_framework-1.7.0/tests/integration/api/posts/public}/__init__.py +0 -0
  455. {core_framework-1.6.0 → core_framework-1.7.0}/tests/integration/api/posts/public/router_test.py +0 -0
  456. {core_framework-1.6.0/tests/integration/api/users → core_framework-1.7.0/tests/integration/api/system}/__init__.py +0 -0
  457. {core_framework-1.6.0 → core_framework-1.7.0}/tests/integration/api/system/router_test.py +0 -0
  458. {core_framework-1.6.0/tests/integration/api/users/authenticated → core_framework-1.7.0/tests/integration/api/users}/__init__.py +0 -0
  459. {core_framework-1.6.0/tests/integration/api/users/public → core_framework-1.7.0/tests/integration/api/users/authenticated}/__init__.py +0 -0
  460. {core_framework-1.6.0 → core_framework-1.7.0}/tests/integration/api/users/authenticated/avatar_upload_test.py +0 -0
  461. {core_framework-1.6.0/tests/integration/worker → core_framework-1.7.0/tests/integration/api/users/public}/__init__.py +0 -0
  462. {core_framework-1.6.0 → core_framework-1.7.0}/tests/integration/api/users/public/router_test.py +0 -0
  463. {core_framework-1.6.0/tests/unit → core_framework-1.7.0/tests/integration/worker}/__init__.py +0 -0
  464. {core_framework-1.6.0 → core_framework-1.7.0}/tests/integration/worker/account_deletion_test.py +0 -0
  465. {core_framework-1.6.0 → core_framework-1.7.0}/tests/integration/worker/aggregate_comment_stats_test.py +0 -0
  466. {core_framework-1.6.0 → core_framework-1.7.0}/tests/integration/worker/aggregate_post_stats_test.py +0 -0
  467. {core_framework-1.6.0 → core_framework-1.7.0}/tests/integration/worker/aggregate_user_stats_test.py +0 -0
  468. {core_framework-1.6.0 → core_framework-1.7.0}/tests/integration/worker/avatar_upload_test.py +0 -0
  469. {core_framework-1.6.0 → core_framework-1.7.0}/tests/integration/worker/conftest.py +0 -0
  470. {core_framework-1.6.0 → core_framework-1.7.0}/tests/integration/worker/mute_lift_test.py +0 -0
  471. {core_framework-1.6.0 → core_framework-1.7.0}/tests/integration/worker/utils_test.py +0 -0
  472. {core_framework-1.6.0/tests/unit/application/comments → core_framework-1.7.0/tests/unit}/__init__.py +0 -0
  473. {core_framework-1.6.0/tests/unit/domains → core_framework-1.7.0/tests/unit/application/comments}/__init__.py +0 -0
  474. {core_framework-1.6.0 → core_framework-1.7.0}/tests/unit/application/events/event_service_test.py +0 -0
  475. {core_framework-1.6.0 → core_framework-1.7.0}/tests/unit/application/notifications/inbox_service_test.py +0 -0
  476. {core_framework-1.6.0 → core_framework-1.7.0}/tests/unit/core/bundled_alembic_test.py +0 -0
  477. {core_framework-1.6.0 → core_framework-1.7.0}/tests/unit/core/migrate_cli_test.py +0 -0
  478. {core_framework-1.6.0 → core_framework-1.7.0}/tests/unit/core/pagination_test.py +0 -0
  479. {core_framework-1.6.0/tests/unit/domains/comment → core_framework-1.7.0/tests/unit/domains}/__init__.py +0 -0
  480. {core_framework-1.6.0/tests/unit/infrastructure → core_framework-1.7.0/tests/unit/domains/comment}/__init__.py +0 -0
  481. {core_framework-1.6.0 → core_framework-1.7.0}/tests/unit/domains/user/service_test.py +0 -0
  482. {core_framework-1.6.0/tests/unit/infrastructure/media → core_framework-1.7.0/tests/unit/infrastructure}/__init__.py +0 -0
  483. {core_framework-1.6.0 → core_framework-1.7.0}/tests/unit/infrastructure/media/ssh_finals_publisher_adapter_test.py +0 -0
@@ -23,7 +23,7 @@ The API layer is an HTTP adapter, not a business-logic layer.
23
23
 
24
24
  ## Route decorators (OpenAPI)
25
25
 
26
- - Do **not** set **`summary=`** or **`description=`** on **`@router.get`**, **`post`**, **`patch`**, **`put`**, **`delete`**, or **`APIRoute`-style** registrations. Rely on paths, handler names, **`response_model`**, and Pydantic schemas. Do **not** add route **docstrings** for the same purpose either (see **`no-docstrings`**).
26
+ - Do **not** set **`summary=`** or **`description=`** on **`@router.get`**, **`post`**, **`patch`**, **`put`**, **`delete`**, or **`APIRoute`-style** registrations. Rely on paths, handler names, **`response_model`**, and Pydantic schemas. Do **not** add route **docstrings** for the same purpose either.
27
27
 
28
28
  ## Response Models
29
29
 
@@ -1,12 +1,12 @@
1
1
  ---
2
- description: docs/api.md is a minimal API index only
2
+ description: docs/library/api.md is a minimal API index only
3
3
  globs:
4
- - docs/api.md
4
+ - docs/library/api.md
5
5
  ---
6
6
 
7
- # API Reference (docs/api.md)
7
+ # API Reference (docs/library/api.md)
8
8
 
9
- `docs/api.md` is strictly for **quick viewing** of available APIs. It is an index, not detailed documentation.
9
+ `docs/library/api.md` is strictly for **quick viewing** of available APIs. It is an index, not detailed documentation.
10
10
 
11
11
  ## Format
12
12
 
@@ -28,4 +28,4 @@ globs:
28
28
  - Any prose or bullet lists
29
29
  - Detailed behavior notes
30
30
 
31
- For detailed API behavior, create or update flow documentation in `docs/flows/` instead.
31
+ For detailed API behavior, create or update flow documentation in `docs/domains/` instead.
@@ -178,7 +178,7 @@ If you ask for a trigger for business logic, I should:
178
178
 
179
179
  ## Related Documentation
180
180
 
181
- - `docs/database-triggers.md` - **Catalog of all triggers** (update when adding new triggers)
182
- - `docs/conventions.md` - Database Triggers section
183
- - `docs/architecture-decisions.md` - Triggers Only for Audit/History
184
- - `docs/flows/users/change_history.md` - Example of proper trigger usage
181
+ - `docs/platform/database-triggers.md` - **Catalog of all triggers** (update when adding new triggers)
182
+ - `docs/platform/conventions.md` - Database Triggers section
183
+ - `docs/platform/architecture-decisions.md` - Triggers Only for Audit/History
184
+ - `docs/domains/users/change_history.md` - Example of proper trigger usage
@@ -7,7 +7,7 @@ globs:
7
7
 
8
8
  # Domain Services and Adapters
9
9
 
10
- See **`docs/domain-services-and-adapters.md`** for the full model. Apply when adding or changing domain packages and application orchestration.
10
+ See **`docs/platform/domain-services-and-adapters.md`** for the full model. Apply when adding or changing domain packages and application orchestration.
11
11
 
12
12
  ## Application = orchestration
13
13
 
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  description: Flow docs describe user-facing API behavior. No JSON examples, no implementation details.
3
3
  globs:
4
- - docs/flows/**/*.md
4
+ - docs/domains/**/*.md
5
5
  ---
6
6
 
7
7
  # Flow Documentation Rule
@@ -21,7 +21,7 @@ Create a new flow document when:
21
21
 
22
22
  ## File Location and Naming
23
23
 
24
- - **Location**: `docs/flows/{domain}/{feature}.md`
24
+ - **Location**: `docs/domains/{domain}/{feature}.md`
25
25
  - **Naming**: Use lowercase with underscores (e.g., `account_deletion.md`, `change_history.md`)
26
26
  - **Domain folders**: `auth`, `users`, `moderation`, `comments`, etc.
27
27
 
@@ -310,8 +310,8 @@ All endpoints require authentication via Firebase ID token with admin role.
310
310
 
311
311
  When flow docs reference implementation details:
312
312
 
313
- - **Architecture decisions**: Link to `docs/architecture-decisions.md`
314
- - **API reference**: Already covered in `docs/api.md`
313
+ - **Architecture decisions**: Link to `docs/platform/architecture-decisions.md`
314
+ - **API reference**: Already covered in `docs/library/api.md`
315
315
  - **Database schema**: Should be in migration files, not flow docs
316
316
  - **Code structure**: Should be in code comments or architecture docs
317
317
 
@@ -38,14 +38,13 @@ When a rule encodes a new convention, check whether **`docs/`** in both repos ne
38
38
 
39
39
  Sync to henry when core changes:
40
40
 
41
- - **`docs/architecture.md`** henry **`docs/architecture.md`** (Henry preamble + synced body; adapt `docs/flows/…` links in henry to **`docs/core-product-docs.md`**)
42
- - **`docs/domain-services-and-adapters.md`** update henry host summary; core remains canonical
43
- - **`docs/conventions.md`**, **`docs/architecture-decisions.md`** → synced copies in henry when they exist in core (adapt flow-doc links in henry)
44
- - **`docs/deployment/`**, **`docs/media-upload-pipeline-design.md`** → sync when shared deploy/media docs change (adapt flow links in henry)
41
+ - **`docs/platform/`** synced platform docs (layers, conventions, ADRs, adapters, etc.); adapt `docs/domains/…` links in henry to **`docs/core-product-docs.md`**
42
+ - **`docs/library/`** — canonical in core-framework only; henry points to it from **`docs/core-product-docs.md`** (do not add **`docs/library/`** under henry-backend)
43
+ - **`docs/deployments/`**, **`docs/domains/media/upload-pipeline-design.md`** → sync when shared deploy/media docs change (adapt flow links in henry)
45
44
 
46
- **Do not** mirror **`docs/flows/`** into henry-backend. Henry maintains **`docs/core-product-docs.md`** as a pointer/index to core product documentation.
45
+ **Do not** mirror **`docs/domains/`** into henry-backend. Henry maintains **`docs/core-product-docs.md`** as a pointer/index to core product documentation.
47
46
 
48
- Do not overwrite henry-only docs (e.g. **`docs/henry-users-architecture.md`**, calculator architecture, **`docs/core-product-docs.md`**, **`docs/flows/henry/`**).
47
+ Do not overwrite henry-only docs (e.g. **`docs/domains/henry/`**, **`docs/core-product-docs.md`**).
49
48
 
50
49
  ## User-triggered sync
51
50
 
@@ -38,7 +38,7 @@ After the user accepts the API layer (or if there was no API layer):
38
38
 
39
39
  - Implement the **Repository** for the domain layer (Postgres only).
40
40
  - Include the **domain model** if data is retrieved from the database.
41
- - If the feature needs non-SQL I/O (filesystem, HTTP, SSH), add **ports** in the domain and **adapter implementations** under `core_framework/infrastructure/<domain>/` per `docs/domain-services-and-adapters.md`—not in the repository.
41
+ - If the feature needs non-SQL I/O (filesystem, HTTP, SSH), add **ports** in the domain and **adapter implementations** under `core_framework/infrastructure/<domain>/` per `docs/platform/domain-services-and-adapters.md`—not in the repository.
42
42
  - Wait for the user to review and accept before proceeding.
43
43
 
44
44
  ## 4. Service and Application Layer
@@ -0,0 +1,70 @@
1
+ ---
2
+ description: Behavioral guidelines to reduce common LLM coding mistakes. Use when writing, reviewing, or refactoring code to avoid overcomplication, make surgical changes, surface assumptions, and define verifiable success criteria.
3
+ alwaysApply: true
4
+ ---
5
+
6
+ # Karpathy behavioral guidelines
7
+
8
+ Behavioral guidelines to reduce common LLM coding mistakes. Merge with project-specific instructions as needed.
9
+
10
+ **Tradeoff:** These guidelines bias toward caution over speed. For trivial tasks, use judgment.
11
+
12
+ ## 1. Think Before Coding
13
+
14
+ **Don't assume. Don't hide confusion. Surface tradeoffs.**
15
+
16
+ Before implementing:
17
+ - State your assumptions explicitly. If uncertain, ask.
18
+ - If multiple interpretations exist, present them - don't pick silently.
19
+ - If a simpler approach exists, say so. Push back when warranted.
20
+ - If something is unclear, stop. Name what's confusing. Ask.
21
+
22
+ ## 2. Simplicity First
23
+
24
+ **Minimum code that solves the problem. Nothing speculative.**
25
+
26
+ - No features beyond what was asked.
27
+ - No abstractions for single-use code.
28
+ - No "flexibility" or "configurability" that wasn't requested.
29
+ - No error handling for impossible scenarios.
30
+ - If you write 200 lines and it could be 50, rewrite it.
31
+
32
+ Ask yourself: "Would a senior engineer say this is overcomplicated?" If yes, simplify.
33
+
34
+ ## 3. Surgical Changes
35
+
36
+ **Touch only what you must. Clean up only your own mess.**
37
+
38
+ When editing existing code:
39
+ - Don't "improve" adjacent code, comments, or formatting.
40
+ - Don't refactor things that aren't broken.
41
+ - Match existing style, even if you'd do it differently.
42
+ - If you notice unrelated dead code, mention it - don't delete it.
43
+
44
+ When your changes create orphans:
45
+ - Remove imports/variables/functions that YOUR changes made unused.
46
+ - Don't remove pre-existing dead code unless asked.
47
+
48
+ The test: Every changed line should trace directly to the user's request.
49
+
50
+ ## 4. Goal-Driven Execution
51
+
52
+ **Define success criteria. Loop until verified.**
53
+
54
+ Transform tasks into verifiable goals:
55
+ - "Add validation" → "Write tests for invalid inputs, then make them pass"
56
+ - "Fix the bug" → "Write a test that reproduces it, then make it pass"
57
+ - "Refactor X" → "Ensure tests pass before and after"
58
+
59
+ For multi-step tasks, state a brief plan:
60
+ ```
61
+ 1. [Step] → verify: [check]
62
+ 2. [Step] → verify: [check]
63
+ 3. [Step] → verify: [check]
64
+ ```
65
+
66
+ Strong success criteria let you loop independently. Weak criteria ("make it work") require constant clarification.
67
+
68
+ ---
69
+
70
+ **These guidelines are working if:** fewer unnecessary changes in diffs, fewer rewrites due to overcomplication, and clarifying questions come before implementation rather than after mistakes.
@@ -111,7 +111,7 @@ A single `class <Domain>Service:` whose **`__init__`** takes `<Domain>Repository
111
111
 
112
112
  When real behavior is added later, apply `repository-read-consistency` (`/.cursor/rules/repository-read-consistency.mdc`) for reads and `_strong` naming.
113
113
 
114
- If the bounded context needs filesystem, HTTP, or SSH, add **ports/adapters** or extra domain collaborators per `docs/domain-services-and-adapters.md` — do not put that I/O in `repository.py`.
114
+ If the bounded context needs filesystem, HTTP, or SSH, add **ports/adapters** or extra domain collaborators per `docs/platform/domain-services-and-adapters.md` — do not put that I/O in `repository.py`.
115
115
 
116
116
  ### `__init__.py`
117
117
 
@@ -175,7 +175,7 @@ Worker `startup` and API `init_app` already call `configure_application_dependen
175
175
 
176
176
  - `core_framework/domains/<domain>/README.md` — domain exists in code; `alembic/<domain>/` exists with **empty** `versions/`; **not** in `ALEMBIC_DOMAINS` until first revision; **no** DB schema object until a migration creates it.
177
177
  - `CHANGELOG.md` — `### Added` under `[Unreleased]` for domain package, `schema_<domain>`, and Alembic skeleton path (optional). **Do not** list `ALEMBIC_DOMAINS` or revision ids until the first migration lands.
178
- - Update `docs/architecture.md` and `docs/package-api.md` only when the domain exposes anything to the public surface.
178
+ - Update `docs/library/overview.md` and `docs/library/package-api.md` only when the domain exposes anything to the public surface.
179
179
 
180
180
  ## Follow-up: first revision + enroll in `cf-alembic`
181
181
 
@@ -35,17 +35,17 @@ Apply **`.cursor/rules/code-review-output.mdc`**. The user wants **actionable fi
35
35
 
36
36
  Read these files **before** proceeding with the review:
37
37
 
38
- 1. **`docs/architecture.md`** – Domain boundaries, prohibited practices, and dependency rules
39
- 1. **`docs/domain-services-and-adapters.md`** – Application orchestration vs domain services, ports/adapters, multiple collaborators per bounded context
40
- 1. **`docs/conventions.md`** – Coding conventions, domain rules, caching, Redis, exception handling, API layer rules
41
- 1. **`docs/architecture-decisions.md`** – Intentional design choices; do not flag these as issues
38
+ 1. **`docs/platform/layers-and-boundaries.md`** – Domain boundaries, prohibited practices, and dependency rules
39
+ 1. **`docs/platform/domain-services-and-adapters.md`** – Application orchestration vs domain services, ports/adapters, multiple collaborators per bounded context
40
+ 1. **`docs/platform/conventions.md`** – Coding conventions, domain rules, caching, Redis, exception handling, API layer rules
41
+ 1. **`docs/platform/architecture-decisions.md`** – Intentional design choices; do not flag these as issues
42
42
  1. **`.cursor/rules/api-layer.mdc`**, **`.cursor/rules/application-layer.mdc`**, **`.cursor/rules/domain-services-and-adapters.mdc`**, **`.cursor/rules/domain-imports.mdc`**, **`.cursor/rules/domain-caller-context.mdc`** – Apply when reviewing API/application/domain code
43
43
 
44
44
  ## Step 2: Key Context
45
45
 
46
46
  ### Architecture Decisions (do not flag as issues)
47
47
 
48
- - TOML as primary deploy artifact; environment variables can override (see `docs/architecture-decisions.md`)
48
+ - TOML as primary deploy artifact; environment variables can override (see `docs/platform/architecture-decisions.md`)
49
49
  - `trusted_hosts=["*"]` in ProxyHeadersMiddleware (runs behind reverse proxy)
50
50
  - `-> Any` return types when `response_model` is specified
51
51
  - Silent `ForeignKeyViolationError` in `insert_user_block`
@@ -140,7 +140,7 @@ jobs:
140
140
  DOCKERHUB_USERNAME="${{ inputs.dockerhub_username }}"
141
141
  CONFIG_PATH="/home/${{ secrets.SERVER_USER }}/app_configs/core-framework/config.toml"
142
142
  FIREBASE_CONFIG_PATH="/home/${{ secrets.SERVER_USER }}/app_configs/core-framework/firebase_config.json"
143
- AVATAR_STAGING_PATH="/home/${{ secrets.SERVER_USER }}/app_configs/core-framework/avatar-staging"
143
+ MEDIA_STAGING_PATH="/home/${{ secrets.SERVER_USER }}/app_configs/core-framework/media-staging"
144
144
  IMAGE_SERVER_SSH_KEY_PATH="/home/${{ secrets.SERVER_USER }}/app_configs/core-framework/image_server_ssh_key"
145
145
  IMAGE_SERVER_KNOWN_HOSTS_PATH="/home/${{ secrets.SERVER_USER }}/app_configs/core-framework/image_server_known_hosts"
146
146
 
@@ -148,21 +148,21 @@ jobs:
148
148
  DOCKERHUB_USERNAME="$DOCKERHUB_USERNAME" \
149
149
  CONFIG_PATH="$CONFIG_PATH" \
150
150
  FIREBASE_CONFIG_PATH="$FIREBASE_CONFIG_PATH" \
151
- AVATAR_STAGING_PATH="$AVATAR_STAGING_PATH" \
151
+ MEDIA_STAGING_PATH="$MEDIA_STAGING_PATH" \
152
152
  IMAGE_SERVER_SSH_KEY_PATH="$IMAGE_SERVER_SSH_KEY_PATH" \
153
153
  IMAGE_SERVER_KNOWN_HOSTS_PATH="$IMAGE_SERVER_KNOWN_HOSTS_PATH" \
154
154
  docker compose -f "$COMPOSE_FILE" pull
155
155
 
156
- echo "Preparing avatar staging directory and image server SSH key permissions"
157
- mkdir -p "$AVATAR_STAGING_PATH"
156
+ echo "Preparing media staging directory and image server SSH key permissions"
157
+ mkdir -p "$MEDIA_STAGING_PATH"
158
158
  docker run --rm \
159
159
  --user root \
160
- -v "$AVATAR_STAGING_PATH:/app/avatar-staging" \
160
+ -v "$MEDIA_STAGING_PATH:/app/media-staging" \
161
161
  -v "$IMAGE_SERVER_SSH_KEY_PATH:/app/image-server-ssh-key" \
162
162
  -v "$IMAGE_SERVER_KNOWN_HOSTS_PATH:/app/image-server-known-hosts" \
163
163
  --entrypoint "" \
164
164
  "$DOCKERHUB_USERNAME/core-framework:latest" \
165
- sh -c 'mkdir -p /app/avatar-staging && chown -R appuser:appgroup /app/avatar-staging && chown appuser:appgroup /app/image-server-ssh-key && chmod 600 /app/image-server-ssh-key && chown appuser:appgroup /app/image-server-known-hosts && chmod 644 /app/image-server-known-hosts'
165
+ sh -c 'mkdir -p /app/media-staging && chown -R appuser:appgroup /app/media-staging && chown appuser:appgroup /app/image-server-ssh-key && chmod 600 /app/image-server-ssh-key && chown appuser:appgroup /app/image-server-known-hosts && chmod 644 /app/image-server-known-hosts'
166
166
 
167
167
  echo "Running database migrations (cf-alembic iterates core_framework.bundled_alembic.ALEMBIC_DOMAINS in order)"
168
168
  docker run --rm \
@@ -175,7 +175,7 @@ jobs:
175
175
  DOCKERHUB_USERNAME="$DOCKERHUB_USERNAME" \
176
176
  CONFIG_PATH="$CONFIG_PATH" \
177
177
  FIREBASE_CONFIG_PATH="$FIREBASE_CONFIG_PATH" \
178
- AVATAR_STAGING_PATH="$AVATAR_STAGING_PATH" \
178
+ MEDIA_STAGING_PATH="$MEDIA_STAGING_PATH" \
179
179
  IMAGE_SERVER_SSH_KEY_PATH="$IMAGE_SERVER_SSH_KEY_PATH" \
180
180
  IMAGE_SERVER_KNOWN_HOSTS_PATH="$IMAGE_SERVER_KNOWN_HOSTS_PATH" \
181
181
  docker compose -f "$COMPOSE_FILE" up -d \
@@ -11,7 +11,7 @@ wheels/
11
11
  .env
12
12
 
13
13
  # Avatar ingest staging (local disk)
14
- avatar-staging/
14
+ media-staging/
15
15
 
16
16
  # Logs
17
17
  logs/
@@ -1,9 +1,30 @@
1
1
  # Changelog
2
2
 
3
- Notable changes to **core-framework** (import **`core_framework`**). Format follows [Keep a Changelog](https://keepachangelog.com/en/1.1.0/); versioning is [SemVer](https://semver.org/spec/v2.0.0.html). Stable surface: **`docs/package-api.md`**.
3
+ Notable changes to **core-framework** (import **`core_framework`**). Format follows [Keep a Changelog](https://keepachangelog.com/en/1.1.0/); versioning is [SemVer](https://semver.org/spec/v2.0.0.html). Stable surface: **`docs/library/package-api.md`**.
4
4
 
5
5
  ## [Unreleased]
6
6
 
7
+ ## [1.7.0] - 2026-06-01
8
+
9
+ ### Added
10
+
11
+ - **Banner upload (v1):** **`POST /users/me/profile/banner`**, **`media.banner_staging_registry`** / **`banner_ingest_lease`**, worker jobs **`process_banner_asset_variants`** and **`delete_superseded_banner_finals`**, stale banner staging cron, shared **`[media].staging_root`**. **`PATCH /users/me/profile`** no longer accepts **`banner_id`**. See **`docs/domains/media/upload_pipeline.md`**, **`docs/domains/users/banner.md`**, and **`docs/domains/users/profile.md`**.
12
+
13
+ ### Changed
14
+
15
+ - **Breaking (API):** Profile **`banner`** is now an object **`{ "url": "…", "fallback": "…" }`** instead of a single URL string. **`fallback`** is always the default banner URL for load-error UX.
16
+ - **Breaking (hosts):** **`[avatar].staging_root`** removed; use **`[media].staging_root`** (**`MEDIA_STAGING_PATH`** / **`media-staging`**). Migrate existing host **`avatar-staging`** directories to **`media-staging`** on deploy.
17
+
18
+ ### Database
19
+
20
+ - **Media** migration **`media_banner_staging_lease`**: **`banner_staging_registry`**, **`banner_ingest_lease`**.
21
+ - **User** migration **`user_add_banner_ingest_sequences`**: **`banner_ingest_sequence`**, **`banner_applied_sequence`** on **`user_profiles`**.
22
+ - Run **`uv run cf-alembic`** (or the host **`cf-alembic`** step) before deploying code that uses banner upload.
23
+
24
+ ### Documentation
25
+
26
+ - **`docs/domains/users/banner.md`**, profile and upload-pipeline updates, **`docs/deployments/edge-upload-limits.md`** and **`Caddyfile.example`** — banner route body limit.
27
+
7
28
  ## [1.6.0] - 2026-05-27
8
29
 
9
30
  ### Changed
@@ -14,7 +35,7 @@ Notable changes to **core-framework** (import **`core_framework`**). Format foll
14
35
 
15
36
  ### Added
16
37
 
17
- - **Avatar upload (v1):** **`POST /users/me/profile/avatar`**, **`media`** schema, worker variant processing, staging sweep cron, **`[avatar].staging_root`** config. See **`docs/flows/media/upload_pipeline.md`** and **`docs/flows/users/profile.md`**.
38
+ - **Avatar upload (v1):** **`POST /users/me/profile/avatar`**, **`media`** schema, worker variant processing, staging sweep cron, **`[avatar].staging_root`** config. See **`docs/domains/media/upload_pipeline.md`** and **`docs/domains/users/profile.md`**.
18
39
 
19
40
  ### Fixed
20
41
 
@@ -23,7 +44,7 @@ Notable changes to **core-framework** (import **`core_framework`**). Format foll
23
44
 
24
45
  ### Changed
25
46
 
26
- - **Breaking:** **`[image_server].known_hosts_path`** is required; **`SshAvatarFinalsPublisherAdapter`** verifies the image server SSH host key (no longer **`known_hosts=None`**). Deploy must provide **`IMAGE_SERVER_KNOWN_HOSTS`** and mount **`/app/image-server-known-hosts`** on the worker. See **`docs/deployment/image-server-ssh.md`**.
47
+ - **Breaking:** **`[image_server].known_hosts_path`** is required; **`SshAvatarFinalsPublisherAdapter`** verifies the image server SSH host key (no longer **`known_hosts=None`**). Deploy must provide **`IMAGE_SERVER_KNOWN_HOSTS`** and mount **`/app/image-server-known-hosts`** on the worker. See **`docs/deployments/guides/image-server-ssh.md`**.
27
48
  - **Breaking:** **`[avatar].avatar_host_domain`** is **host-only** in **`config.toml`** and deploy secret **`AVATAR_HOST_DOMAIN`** (for example **`avatar.example.com`**, no **`https://`**). The application prepends **`https://`** when assembling public avatar URLs. Values that still include a scheme are normalized at load time.
28
49
  - **Breaking:** **`[banner]`** config aligns with **`[avatar]`**: **`banner_host_domain`** + **`default_banner_image`** (deploy secrets **`BANNER_HOST_DOMAIN`**, **`BANNER_DEFAULT_IMAGE`**) replace **`base_url`** / **`default_url`**. Hostname is host-only; public banner URLs derive **`https://`** in application code.
29
50
 
@@ -35,21 +56,21 @@ Notable changes to **core-framework** (import **`core_framework`**). Format foll
35
56
 
36
57
  ### Documentation
37
58
 
38
- - **Avatar upload edge limits:** **`docs/deployment/edge-upload-limits.md`**, **`docs/deployment/Caddyfile.example`** — route-scoped reverse-proxy **`max_size`** (**6 MiB** recommended) for **`POST /users/me/profile/avatar`**; updated **`docs/flows/media/upload_pipeline.md`** and **`docs/flows/users/profile.md`**.
39
- - **Image server SSH:** **`docs/deployment/image-server-ssh.md`**, **`docs/deployment/image-server-known-hosts.example`** — production checklist for **`known_hosts_path`** and **`IMAGE_SERVER_KNOWN_HOSTS`**.
40
- - **`docs/flows/media/upload_pipeline.md`**: status and HTTP surface aligned with shipped v1 implementation.
41
- - **`docs/flows/users/profile.md`**: **`POST /users/me/profile/avatar`** flow; **`PATCH`** no longer documents **`avatar_id`** as planned.
42
- - **`docs/flows/users/avatar.md`**, **`docs/flows/users/change_history.md`**: avatar change path and ingest MIME notes updated.
43
- - **`docs/flows/users/avatar.md`**, **`docs/flows/users/profile.md`**: **`avatar_host_domain`** documented as host-only; public URLs derive **`https://`** in application code.
44
- - **`docs/domain-services-and-adapters.md`**: **`banner_host_domain`** / **`default_banner_image`** config shape documented alongside avatar.
59
+ - **Avatar upload edge limits:** **`docs/deployments/edge-upload-limits.md`**, **`docs/deployments/examples/Caddyfile.example`** — route-scoped reverse-proxy **`max_size`** (**6 MiB** recommended) for **`POST /users/me/profile/avatar`**; updated **`docs/domains/media/upload_pipeline.md`** and **`docs/domains/users/profile.md`**.
60
+ - **Image server SSH:** **`docs/deployments/guides/image-server-ssh.md`**, **`docs/deployments/examples/image-server-known-hosts.example`** — production checklist for **`known_hosts_path`** and **`IMAGE_SERVER_KNOWN_HOSTS`**.
61
+ - **`docs/domains/media/upload_pipeline.md`**: status and HTTP surface aligned with shipped v1 implementation.
62
+ - **`docs/domains/users/profile.md`**: **`POST /users/me/profile/avatar`** flow; **`PATCH`** no longer documents **`avatar_id`** as planned.
63
+ - **`docs/domains/users/avatar.md`**, **`docs/domains/users/change_history.md`**: avatar change path and ingest MIME notes updated.
64
+ - **`docs/domains/users/avatar.md`**, **`docs/domains/users/profile.md`**: **`avatar_host_domain`** documented as host-only; public URLs derive **`https://`** in application code.
65
+ - **`docs/platform/domain-services-and-adapters.md`**: **`banner_host_domain`** / **`default_banner_image`** config shape documented alongside avatar.
45
66
 
46
67
  ## [1.4.0] - 2026-05-19
47
68
 
48
69
  ### Changed
49
70
 
50
- - **Breaking:** **`avatar`** on profile and related user responses is an object (**`size_128`**, **`size_500`**, **`fallback`**) instead of a single URL string. See **`docs/flows/users/avatar.md`**.
71
+ - **Breaking:** **`avatar`** on profile and related user responses is an object (**`size_128`**, **`size_500`**, **`fallback`**) instead of a single URL string. See **`docs/domains/users/avatar.md`**.
51
72
  - **Breaking:** **`[avatar]`** config uses **`avatar_host_domain`** + **`default_avatar_image`** (deploy env **`AVATAR_HOST_DOMAIN`**, **`AVATAR_DEFAULT_IMAGE`**) instead of **`base_url`** / **`default_url`**.
52
- - **Typed PATCH payloads** — user (preferences, account, profile + admin profile), post, and comment PATCH routes map Pydantic requests to domain `*Update` types at the API boundary; no `model_dump(mode="json")` or dict partial-update payloads through application/domain/repository. See `docs/patch-update-typed-payload.md` and `docs/conventions.md` (*PATCH partial updates*).
73
+ - **Typed PATCH payloads** — user (preferences, account, profile + admin profile), post, and comment PATCH routes map Pydantic requests to domain `*Update` types at the API boundary; no `model_dump(mode="json")` or dict partial-update payloads through application/domain/repository. See `docs/platform/patch-update-typed-payload.md` and `docs/platform/conventions.md` (*PATCH partial updates*).
53
74
  - Self-service profile PATCH invalidates **`USER_DETAIL`** only when **`display_name`** or **`avatar_id`** change (fields present in cached identity). **`profile_visibility`** is coerced to **`ProfileVisibility`** on repository read.
54
75
 
55
76
  ### Added
@@ -62,11 +83,11 @@ Notable changes to **core-framework** (import **`core_framework`**). Format foll
62
83
 
63
84
  ### Documentation
64
85
 
65
- - **`docs/flows/users/avatar.md`**: multi-size **`avatar`** response shape and CDN URL convention.
66
- - **`docs/flows/media/upload_pipeline.md`**: upload pipeline design and v1 implementation reference.
67
- - **`docs/flows/users/profile.md`**: DOB on get/update flows and validation errors.
68
- - **`docs/flows/users/change_history.md`**: profile **`date_of_birth`** changes are not written to change history (audit trigger unchanged).
69
- - **`docs/patch-update-typed-payload.md`**: typed PATCH decisions and patterns for partial-update endpoints.
86
+ - **`docs/domains/users/avatar.md`**: multi-size **`avatar`** response shape and CDN URL convention.
87
+ - **`docs/domains/media/upload_pipeline.md`**: upload pipeline design and v1 implementation reference.
88
+ - **`docs/domains/users/profile.md`**: DOB on get/update flows and validation errors.
89
+ - **`docs/domains/users/change_history.md`**: profile **`date_of_birth`** changes are not written to change history (audit trigger unchanged).
90
+ - **`docs/platform/patch-update-typed-payload.md`**: typed PATCH decisions and patterns for partial-update endpoints.
70
91
 
71
92
  ### Fixed
72
93
 
@@ -103,7 +124,7 @@ Notable changes to **core-framework** (import **`core_framework`**). Format foll
103
124
 
104
125
  ### Documentation
105
126
 
106
- - Follow feature (HTTP, notifications, stats worker, mirrors, **`docs/follow-system-design.md`**, architecture decisions, domain READMEs, **`docs/api.md`**).
127
+ - Follow feature (HTTP, notifications, stats worker, mirrors, **`docs/domains/users/follow-system-design.md`**, architecture decisions, domain READMEs, **`docs/library/api.md`**).
107
128
 
108
129
  ## [1.1.1] - 2026-04-24
109
130
 
@@ -119,7 +140,7 @@ Notable changes to **core-framework** (import **`core_framework`**). Format foll
119
140
 
120
141
  ### Added
121
142
 
122
- - **`core-framework[testing]`** extra: pytest plugin (**`pytest11`** → **`core_framework.testing.plugin`**), **`TestConfig`**, session fixtures (Postgres, Redis, **`AsyncClient`**, migrations, Firebase helpers, optional SAQ). Parallel (**`pytest -n`**) coordination — see **`docs/testing-plugin-design.md`**. **`create_firebase_user_token`** helper.
143
+ - **`core-framework[testing]`** extra: pytest plugin (**`pytest11`** → **`core_framework.testing.plugin`**), **`TestConfig`**, session fixtures (Postgres, Redis, **`AsyncClient`**, migrations, Firebase helpers, optional SAQ). Parallel (**`pytest -n`**) coordination — see **`docs/library/testing-plugin-design.md`**. **`create_firebase_user_token`** helper.
123
144
 
124
145
  ### Changed
125
146
 
@@ -127,11 +148,11 @@ Notable changes to **core-framework** (import **`core_framework`**). Format foll
127
148
 
128
149
  ### Documentation
129
150
 
130
- - **`docs/package-api.md`**, **`docs/core-framework-migration.md`**, **`README.md`**, **`docs/testing-plugin-design.md`** updated for testing and entrypoints.
151
+ - **`docs/library/package-api.md`**, **`docs/library/core-framework-migration.md`**, **`README.md`**, **`docs/library/testing-plugin-design.md`** updated for testing and entrypoints.
131
152
 
132
153
  ## [1.0.0] - 2026-04-18
133
154
 
134
- First **SemVer-stable** release per **`docs/package-api.md`**.
155
+ First **SemVer-stable** release per **`docs/library/package-api.md`**.
135
156
 
136
157
  ### Breaking
137
158
 
@@ -158,7 +179,7 @@ First **SemVer-stable** release per **`docs/package-api.md`**.
158
179
 
159
180
  ### Documentation
160
181
 
161
- - Mentions flow, **`GET /users/usernames/suggest`**, **`docs/api.md`**.
182
+ - Mentions flow, **`GET /users/usernames/suggest`**, **`docs/library/api.md`**.
162
183
 
163
184
  ## [0.4.0] - 2026-03-26
164
185
 
@@ -180,7 +201,7 @@ First **SemVer-stable** release per **`docs/package-api.md`**.
180
201
 
181
202
  ### Documentation
182
203
 
183
- - **`README`**, **`docs/core-framework-migration.md`**, **`docs/package-api.md`**, **`docs/architecture.md`** (runtime / bootstrap).
204
+ - **`README`**, **`docs/library/core-framework-migration.md`**, **`docs/library/package-api.md`**, **`docs/library/overview.md`** (runtime / bootstrap).
184
205
 
185
206
  ### Removed
186
207
 
@@ -190,7 +211,7 @@ First **SemVer-stable** release per **`docs/package-api.md`**.
190
211
 
191
212
  ### Added
192
213
 
193
- - **`init_app(settings)`**, **`create_task_worker(settings)`**, **`CoreRuntime`**, **`build_core_runtime`**, **`configure_application_dependencies`**, **`load_default_settings()`**, **`configure_core_runtime`**. **`docs/package-api.md`**.
214
+ - **`init_app(settings)`**, **`create_task_worker(settings)`**, **`CoreRuntime`**, **`build_core_runtime`**, **`configure_application_dependencies`**, **`load_default_settings()`**, **`configure_core_runtime`**. **`docs/library/package-api.md`**.
194
215
 
195
216
  ### Changed
196
217
 
@@ -211,4 +232,5 @@ First **SemVer-stable** release per **`docs/package-api.md`**.
211
232
  [1.4.0]: https://github.com/NepNepFFXIV/core-framework/compare/v1.3.0...v1.4.0
212
233
  [1.5.0]: https://github.com/NepNepFFXIV/core-framework/compare/v1.4.0...v1.5.0
213
234
  [1.6.0]: https://github.com/NepNepFFXIV/core-framework/compare/v1.5.0...v1.6.0
214
- [unreleased]: https://github.com/NepNepFFXIV/core-framework/compare/v1.6.0...HEAD
235
+ [1.7.0]: https://github.com/NepNepFFXIV/core-framework/compare/v1.6.0...v1.7.0
236
+ [unreleased]: https://github.com/NepNepFFXIV/core-framework/compare/v1.7.0...HEAD
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: core-framework
3
- Version: 1.6.0
3
+ Version: 1.7.0
4
4
  Summary: Core framework package (import as core_framework)
5
5
  Project-URL: Homepage, https://github.com/NepNepFFXIV/core-framework
6
6
  Project-URL: Repository, https://github.com/NepNepFFXIV/core-framework
@@ -87,7 +87,7 @@ def build_app(settings: HostSettings | None = None) -> FastAPI:
87
87
  return app
88
88
  ```
89
89
 
90
- From the host repository root, run **`uv run cf-alembic`**. See [core-framework-migration](docs/core-framework-migration.md).
90
+ From the host repository root, run **`uv run cf-alembic`**. See [core-framework-migration](docs/library/core-framework-migration.md).
91
91
 
92
92
  ## Host pytest
93
93
 
@@ -115,4 +115,4 @@ def anyio_backend() -> str:
115
115
  return "asyncio"
116
116
  ```
117
117
 
118
- See [Package API — Testing](docs/package-api.md#testing-pytest-plugin) and [testing plugin design](docs/testing-plugin-design.md).
118
+ See [Package API — Testing](docs/library/package-api.md#testing-pytest-plugin) and [testing plugin design](docs/library/testing-plugin-design.md).
@@ -50,7 +50,7 @@ def build_app(settings: HostSettings | None = None) -> FastAPI:
50
50
  return app
51
51
  ```
52
52
 
53
- From the host repository root, run **`uv run cf-alembic`**. See [core-framework-migration](docs/core-framework-migration.md).
53
+ From the host repository root, run **`uv run cf-alembic`**. See [core-framework-migration](docs/library/core-framework-migration.md).
54
54
 
55
55
  ## Host pytest
56
56
 
@@ -78,4 +78,4 @@ def anyio_backend() -> str:
78
78
  return "asyncio"
79
79
  ```
80
80
 
81
- See [Package API — Testing](docs/package-api.md#testing-pytest-plugin) and [testing plugin design](docs/testing-plugin-design.md).
81
+ See [Package API — Testing](docs/library/package-api.md#testing-pytest-plugin) and [testing plugin design](docs/library/testing-plugin-design.md).
@@ -0,0 +1,43 @@
1
+ """add banner staging registry and ingest lease
2
+
3
+ Revision ID: media_banner_staging_lease
4
+ Revises: v1_media_init
5
+ Create Date: 2026-06-01 12:00:00.000000
6
+
7
+ """
8
+
9
+ from collections.abc import Sequence
10
+
11
+ from alembic import op
12
+
13
+ revision: str = "media_banner_staging_lease"
14
+ down_revision: str | Sequence[str] | None = "v1_media_init"
15
+ branch_labels: str | Sequence[str] | None = None
16
+ depends_on: str | Sequence[str] | None = None
17
+
18
+
19
+ def upgrade() -> None:
20
+ op.execute("""
21
+ create table banner_staging_registry (
22
+ asset_id varchar(26) not null primary key,
23
+ owner_user_id varchar(128) not null,
24
+ staging_filename text not null,
25
+ created_at timestamptz not null default now()
26
+ );
27
+ """)
28
+
29
+ op.execute("""
30
+ create index idx_banner_staging_registry_created_at
31
+ on banner_staging_registry (created_at);
32
+ """)
33
+
34
+ op.execute("""
35
+ create table banner_ingest_lease (
36
+ owner_user_id varchar(128) not null primary key,
37
+ lease_expires_at timestamptz not null
38
+ );
39
+ """)
40
+
41
+
42
+ def downgrade() -> None:
43
+ pass
@@ -0,0 +1,34 @@
1
+ """add banner ingest sequences to user_profiles
2
+
3
+ Revision ID: user_add_banner_ingest_sequences
4
+ Revises: user_add_avatar_ingest_sequences
5
+ Create Date: 2026-06-01 12:00:00.000000
6
+
7
+ """
8
+
9
+ from collections.abc import Sequence
10
+
11
+ from alembic import op
12
+
13
+ revision: str = "user_add_banner_ingest_sequences"
14
+ down_revision: str | Sequence[str] | None = "user_add_avatar_ingest_sequences"
15
+ branch_labels: str | Sequence[str] | None = None
16
+ depends_on: str | Sequence[str] | None = None
17
+
18
+
19
+ def upgrade() -> None:
20
+ op.execute("""
21
+ alter table user_profiles
22
+ add column banner_ingest_sequence bigint not null default 0,
23
+ add column banner_applied_sequence bigint not null default 0;
24
+ """)
25
+
26
+ op.execute("""
27
+ alter table user_profiles
28
+ add constraint user_profiles_banner_sequences_ordered
29
+ check (banner_applied_sequence <= banner_ingest_sequence);
30
+ """)
31
+
32
+
33
+ def downgrade() -> None:
34
+ pass
@@ -6,15 +6,18 @@ openapi_url = "/openapi.json"
6
6
  allowed_hosts = [
7
7
  "localhost",
8
8
  "127.0.0.1",
9
- "test"
9
+ "api.manga4life.com",
10
+ "test",
10
11
  ]
11
12
  secret_key = "local-dev-secret-key-change-in-production"
12
13
 
14
+ [media]
15
+ staging_root = "media-staging"
16
+
13
17
  [avatar]
14
18
  avatar_host_domain = "avatar.core-framework.com"
15
19
  default_avatar_image = "default.webp"
16
20
  publish_root = "/var/www/sites/avatar"
17
- staging_root = "avatar-staging"
18
21
 
19
22
  [banner]
20
23
  banner_host_domain = "banner.core-framework.com"
@@ -39,8 +42,10 @@ logfire_token = "zzz"
39
42
  [cors]
40
43
  allow_credentials = true
41
44
  allowed_origins = [
42
- "http://localhost",
43
- "http://127.0.0.1",
45
+ "http://localhost:3000",
46
+ "http://127.0.0.1:3000",
47
+ "https://manga4life.com",
48
+ "https://www.manga4life.com",
44
49
  ]
45
50
  allowed_methods = [
46
51
  "GET",
@@ -6,11 +6,13 @@ openapi_url = "/openapi.json"
6
6
  allowed_hosts = $ALLOWED_HOSTS
7
7
  secret_key = "$SECRET_KEY"
8
8
 
9
+ [media]
10
+ staging_root = "/app/media-staging"
11
+
9
12
  [avatar]
10
13
  avatar_host_domain = "$AVATAR_HOST_DOMAIN"
11
14
  default_avatar_image = "$AVATAR_DEFAULT_IMAGE"
12
15
  publish_root = "$AVATAR_PUBLISH_ROOT"
13
- staging_root = "/app/avatar-staging"
14
16
 
15
17
  [banner]
16
18
  banner_host_domain = "$BANNER_HOST_DOMAIN"