spaps-server-quickstart 0.5.0__tar.gz → 0.5.1__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (576) hide show
  1. {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/.gitignore +14 -0
  2. {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/CHANGELOG.md +12 -0
  3. {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/PKG-INFO +77 -88
  4. {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/README.md +75 -87
  5. {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/docs/MIGRATION_GUIDE.md +1 -1
  6. {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/docs/TM-ENV-001-checklist.md +0 -1
  7. {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/docs/feature-plans/INDEX.md +1 -0
  8. spaps_server_quickstart-0.5.1/docs/feature-plans/trust-invariants-kernel/README.md +38 -0
  9. spaps_server_quickstart-0.5.1/docs/feature-plans/trust-invariants-kernel/backend.md +149 -0
  10. spaps_server_quickstart-0.5.1/docs/feature-plans/trust-invariants-kernel/describe-wave-1-principal-proxy-reuse.md +79 -0
  11. spaps_server_quickstart-0.5.1/docs/feature-plans/trust-invariants-kernel/flows.md +60 -0
  12. spaps_server_quickstart-0.5.1/docs/feature-plans/trust-invariants-kernel/frontend.md +34 -0
  13. spaps_server_quickstart-0.5.1/docs/feature-plans/trust-invariants-kernel/plan.md +202 -0
  14. spaps_server_quickstart-0.5.1/docs/feature-plans/trust-invariants-kernel/schema.mmd +61 -0
  15. spaps_server_quickstart-0.5.1/docs/feature-plans/trust-invariants-kernel/shared.md +120 -0
  16. {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/docs/security-audit-remediation-2026q1-tm007-tm008.md +6 -2
  17. {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/pyproject.toml +2 -1
  18. {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/src/spaps_server_quickstart/__init__.py +1 -1
  19. {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/src/spaps_server_quickstart/api/domains/health_router.py +1 -1
  20. {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/src/spaps_server_quickstart/app_factory.py +2 -0
  21. {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/src/spaps_server_quickstart/auth/__init__.py +13 -10
  22. spaps_server_quickstart-0.5.1/src/spaps_server_quickstart/domains/_db/model_registry.py +37 -0
  23. {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/src/spaps_server_quickstart/domains/affiliate_referrals/repository.py +4 -0
  24. {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/src/spaps_server_quickstart/domains/affiliate_referrals/router.py +6 -1
  25. {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/src/spaps_server_quickstart/domains/affiliate_referrals/service.py +34 -1
  26. {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/src/spaps_server_quickstart/domains/agent_approvals/router.py +2 -1
  27. {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/src/spaps_server_quickstart/domains/agent_approvals/schemas.py +24 -0
  28. {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/src/spaps_server_quickstart/domains/agent_approvals/service.py +35 -17
  29. spaps_server_quickstart-0.5.1/src/spaps_server_quickstart/domains/applications/blueprints.py +563 -0
  30. {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/src/spaps_server_quickstart/domains/applications/models.py +6 -0
  31. {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/src/spaps_server_quickstart/domains/applications/repository.py +2 -1
  32. {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/src/spaps_server_quickstart/domains/applications/router.py +2 -0
  33. {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/src/spaps_server_quickstart/domains/applications/schemas.py +2 -0
  34. {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/src/spaps_server_quickstart/domains/applications/service.py +23 -4
  35. {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/src/spaps_server_quickstart/domains/audit/router.py +8 -4
  36. {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/src/spaps_server_quickstart/domains/audit/service.py +13 -2
  37. {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/src/spaps_server_quickstart/domains/auth/repository.py +7 -1
  38. {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/src/spaps_server_quickstart/domains/auth/router.py +94 -13
  39. {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/src/spaps_server_quickstart/domains/auth/schemas.py +5 -5
  40. {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/src/spaps_server_quickstart/domains/auth/service.py +52 -21
  41. spaps_server_quickstart-0.5.1/src/spaps_server_quickstart/domains/billing_accounts/__init__.py +5 -0
  42. spaps_server_quickstart-0.5.1/src/spaps_server_quickstart/domains/billing_accounts/models.py +55 -0
  43. spaps_server_quickstart-0.5.1/src/spaps_server_quickstart/domains/billing_accounts/repository.py +110 -0
  44. spaps_server_quickstart-0.5.1/src/spaps_server_quickstart/domains/billing_accounts/resolver.py +272 -0
  45. {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/src/spaps_server_quickstart/domains/cfo/router.py +6 -2
  46. {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/src/spaps_server_quickstart/domains/cfo/schemas.py +3 -0
  47. {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/src/spaps_server_quickstart/domains/cfo/service.py +40 -5
  48. {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/src/spaps_server_quickstart/domains/dayrate/repository.py +85 -0
  49. {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/src/spaps_server_quickstart/domains/dayrate/router.py +82 -11
  50. {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/src/spaps_server_quickstart/domains/dayrate/schemas.py +49 -2
  51. {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/src/spaps_server_quickstart/domains/dayrate/service.py +201 -37
  52. {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/src/spaps_server_quickstart/domains/device_flow/router.py +2 -0
  53. {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/src/spaps_server_quickstart/domains/device_flow/service.py +7 -2
  54. spaps_server_quickstart-0.5.1/src/spaps_server_quickstart/domains/docs/discovery.py +50 -0
  55. {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/src/spaps_server_quickstart/domains/docs/repository.py +29 -0
  56. {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/src/spaps_server_quickstart/domains/docs/router.py +30 -0
  57. {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/src/spaps_server_quickstart/domains/docs/schemas.py +43 -0
  58. {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/src/spaps_server_quickstart/domains/docs/service.py +40 -19
  59. {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/src/spaps_server_quickstart/domains/email/router.py +21 -8
  60. {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/src/spaps_server_quickstart/domains/email/service.py +16 -3
  61. {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/src/spaps_server_quickstart/domains/entitlements/repository.py +26 -0
  62. {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/src/spaps_server_quickstart/domains/entitlements/router.py +9 -1
  63. {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/src/spaps_server_quickstart/domains/entitlements/service.py +78 -9
  64. {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/src/spaps_server_quickstart/domains/issue_reporting_platform/errors.py +6 -0
  65. {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/src/spaps_server_quickstart/domains/issue_reporting_platform/models.py +11 -2
  66. {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/src/spaps_server_quickstart/domains/issue_reporting_platform/repository.py +26 -1
  67. {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/src/spaps_server_quickstart/domains/issue_reporting_platform/router.py +61 -0
  68. {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/src/spaps_server_quickstart/domains/issue_reporting_platform/schemas.py +13 -0
  69. spaps_server_quickstart-0.5.1/src/spaps_server_quickstart/domains/issue_reporting_platform/service.py +884 -0
  70. spaps_server_quickstart-0.5.1/src/spaps_server_quickstart/domains/policies/__init__.py +1 -0
  71. spaps_server_quickstart-0.5.1/src/spaps_server_quickstart/domains/policies/errors.py +25 -0
  72. spaps_server_quickstart-0.5.1/src/spaps_server_quickstart/domains/policies/evaluator.py +415 -0
  73. spaps_server_quickstart-0.5.1/src/spaps_server_quickstart/domains/policies/models.py +115 -0
  74. spaps_server_quickstart-0.5.1/src/spaps_server_quickstart/domains/policies/repository.py +138 -0
  75. spaps_server_quickstart-0.5.1/src/spaps_server_quickstart/domains/policies/router.py +198 -0
  76. spaps_server_quickstart-0.5.1/src/spaps_server_quickstart/domains/policies/schemas.py +124 -0
  77. spaps_server_quickstart-0.5.1/src/spaps_server_quickstart/domains/policies/service.py +323 -0
  78. spaps_server_quickstart-0.5.1/src/spaps_server_quickstart/domains/redirects.py +145 -0
  79. {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/src/spaps_server_quickstart/domains/security/models.py +5 -0
  80. {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/src/spaps_server_quickstart/domains/security/repository.py +18 -4
  81. {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/src/spaps_server_quickstart/domains/security/router.py +2 -0
  82. {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/src/spaps_server_quickstart/domains/security/service.py +14 -1
  83. {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/src/spaps_server_quickstart/domains/self_service/router.py +14 -9
  84. {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/src/spaps_server_quickstart/domains/self_service/schemas.py +2 -0
  85. {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/src/spaps_server_quickstart/domains/self_service/service.py +25 -5
  86. {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/src/spaps_server_quickstart/domains/sessions/admin_detection.py +2 -0
  87. {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/src/spaps_server_quickstart/domains/sessions/blacklist_service.py +58 -36
  88. {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/src/spaps_server_quickstart/domains/sessions/password_service.py +11 -0
  89. {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/src/spaps_server_quickstart/domains/stripe/guest_checkout.py +27 -24
  90. {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/src/spaps_server_quickstart/domains/stripe/models.py +3 -0
  91. {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/src/spaps_server_quickstart/domains/stripe/repository.py +40 -3
  92. {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/src/spaps_server_quickstart/domains/stripe/router.py +78 -7
  93. {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/src/spaps_server_quickstart/domains/stripe/schemas.py +64 -5
  94. {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/src/spaps_server_quickstart/domains/stripe/service.py +179 -51
  95. spaps_server_quickstart-0.5.1/src/spaps_server_quickstart/domains/stripe/webhook_handler.py +561 -0
  96. {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/src/spaps_server_quickstart/domains/support_telemetry_platform/router.py +1 -0
  97. {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/src/spaps_server_quickstart/domains/support_telemetry_platform/service.py +7 -5
  98. {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/src/spaps_server_quickstart/domains/wallets/router.py +33 -39
  99. {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/src/spaps_server_quickstart/domains/wallets/schemas.py +0 -2
  100. {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/src/spaps_server_quickstart/domains/wallets/service.py +3 -2
  101. {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/src/spaps_server_quickstart/domains/webhooks/delivery.py +34 -16
  102. {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/src/spaps_server_quickstart/domains/webhooks/destination_security.py +6 -0
  103. {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/src/spaps_server_quickstart/domains/webhooks/errors.py +7 -0
  104. {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/src/spaps_server_quickstart/domains/webhooks/schemas.py +1 -1
  105. {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/src/spaps_server_quickstart/domains/webhooks/service.py +27 -10
  106. {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/src/spaps_server_quickstart/domains/webhooks/signing.py +49 -0
  107. {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/src/spaps_server_quickstart/domains/whitelist/models.py +1 -1
  108. {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/src/spaps_server_quickstart/domains/whitelist/repository.py +2 -2
  109. {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/src/spaps_server_quickstart/domains/whitelist/router.py +36 -17
  110. {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/src/spaps_server_quickstart/domains/whitelist/schemas.py +1 -1
  111. {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/src/spaps_server_quickstart/domains/whitelist/service.py +1 -1
  112. {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/src/spaps_server_quickstart/logging.py +14 -1
  113. {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/src/spaps_server_quickstart/middleware/api_key.py +47 -32
  114. spaps_server_quickstart-0.5.1/src/spaps_server_quickstart/middleware/client_ip.py +91 -0
  115. spaps_server_quickstart-0.5.1/src/spaps_server_quickstart/middleware/envelope.py +169 -0
  116. spaps_server_quickstart-0.5.1/src/spaps_server_quickstart/middleware/key_scope.py +169 -0
  117. spaps_server_quickstart-0.5.1/src/spaps_server_quickstart/middleware/origin_validation.py +135 -0
  118. {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/src/spaps_server_quickstart/middleware/rate_limiting.py +113 -29
  119. {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/src/spaps_server_quickstart/middleware/spaps_deps.py +84 -13
  120. {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/src/spaps_server_quickstart/settings.py +1 -0
  121. {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/src/spaps_server_quickstart/spaps_app.py +87 -3
  122. {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/src/spaps_server_quickstart/spaps_settings.py +11 -1
  123. {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/src/spaps_server_quickstart/startup.py +31 -0
  124. spaps_server_quickstart-0.5.1/tests/conftest.py +45 -0
  125. spaps_server_quickstart-0.5.1/tests/contracts/test_golden_app_pack.py +126 -0
  126. {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/tests/domains/affiliate_referrals/test_router.py +170 -1
  127. {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/tests/domains/affiliate_referrals/test_service.py +26 -0
  128. spaps_server_quickstart-0.5.1/tests/domains/agent_approvals/test_callback_url_validation.py +283 -0
  129. {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/tests/domains/agent_approvals/test_router.py +11 -14
  130. {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/tests/domains/agent_approvals/test_service.py +55 -14
  131. {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/tests/domains/applications/test_repository.py +27 -1
  132. {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/tests/domains/applications/test_router.py +259 -0
  133. {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/tests/domains/audit/test_router.py +12 -3
  134. {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/tests/domains/audit/test_service.py +45 -3
  135. {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/tests/domains/auth/test_repository.py +37 -0
  136. {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/tests/domains/auth/test_router.py +193 -0
  137. {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/tests/domains/auth/test_service.py +287 -2
  138. spaps_server_quickstart-0.5.1/tests/domains/billing_accounts/test_repository.py +251 -0
  139. spaps_server_quickstart-0.5.1/tests/domains/billing_accounts/test_resolver.py +211 -0
  140. {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/tests/domains/cfo/test_router.py +10 -0
  141. {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/tests/domains/cfo/test_service.py +81 -5
  142. {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/tests/domains/dayrate/test_enhanced_booking_service.py +113 -0
  143. {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/tests/domains/dayrate/test_repository.py +126 -0
  144. {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/tests/domains/dayrate/test_router.py +388 -17
  145. {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/tests/domains/dayrate/test_service.py +248 -30
  146. {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/tests/domains/device_flow/test_router.py +7 -1
  147. {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/tests/domains/device_flow/test_service.py +48 -0
  148. {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/tests/domains/docs/test_repository.py +41 -0
  149. {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/tests/domains/docs/test_router.py +67 -1
  150. {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/tests/domains/docs/test_service.py +64 -4
  151. {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/tests/domains/email/test_router.py +87 -6
  152. {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/tests/domains/email/test_service.py +95 -10
  153. {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/tests/domains/entitlements/test_router.py +51 -0
  154. {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/tests/domains/entitlements/test_service.py +53 -4
  155. {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/tests/domains/issue_reporting_platform/test_router.py +163 -2
  156. spaps_server_quickstart-0.5.1/tests/domains/issue_reporting_platform/test_service.py +813 -0
  157. spaps_server_quickstart-0.5.1/tests/domains/policies/test_evaluator.py +375 -0
  158. spaps_server_quickstart-0.5.1/tests/domains/policies/test_router.py +78 -0
  159. spaps_server_quickstart-0.5.1/tests/domains/policies/test_service.py +324 -0
  160. {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/tests/domains/security/test_repository.py +84 -7
  161. {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/tests/domains/security/test_router.py +44 -1
  162. {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/tests/domains/security/test_service.py +20 -6
  163. {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/tests/domains/self_service/test_router.py +141 -26
  164. {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/tests/domains/stripe/test_guest_checkout.py +221 -73
  165. {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/tests/domains/stripe/test_repository.py +29 -3
  166. {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/tests/domains/stripe/test_router.py +370 -6
  167. {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/tests/domains/stripe/test_service.py +294 -28
  168. {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/tests/domains/stripe/test_webhook_handler.py +348 -39
  169. spaps_server_quickstart-0.5.1/tests/domains/stripe/test_webhook_hardening.py +336 -0
  170. {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/tests/domains/support_telemetry_platform/test_router.py +2 -0
  171. {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/tests/domains/support_telemetry_platform/test_service.py +5 -2
  172. spaps_server_quickstart-0.5.1/tests/domains/wallets/test_legacy_routes_tenant_binding.py +82 -0
  173. {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/tests/domains/wallets/test_router.py +12 -15
  174. {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/tests/domains/webhooks/test_delivery.py +97 -0
  175. {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/tests/domains/webhooks/test_router.py +16 -6
  176. {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/tests/domains/webhooks/test_service.py +145 -58
  177. {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/tests/domains/whitelist/test_repository.py +1 -1
  178. {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/tests/domains/whitelist/test_router.py +70 -3
  179. spaps_server_quickstart-0.5.1/tests/middleware/__init__.py +0 -0
  180. {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/tests/middleware/test_api_key.py +34 -3
  181. spaps_server_quickstart-0.5.1/tests/middleware/test_client_ip.py +89 -0
  182. spaps_server_quickstart-0.5.1/tests/middleware/test_envelope.py +115 -0
  183. spaps_server_quickstart-0.5.1/tests/middleware/test_key_scope.py +234 -0
  184. {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/tests/middleware/test_origin_validation.py +27 -5
  185. {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/tests/middleware/test_rate_limiting.py +108 -10
  186. {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/tests/middleware/test_spaps_deps.py +173 -4
  187. spaps_server_quickstart-0.5.1/tests/test_alembic_path_bootstrap.py +66 -0
  188. {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/tests/test_auth.py +89 -16
  189. {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/tests/test_environment_safety.py +15 -0
  190. {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/tests/test_sessions_blacklist.py +97 -7
  191. spaps_server_quickstart-0.5.1/tests/test_spaps_app.py +79 -0
  192. {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/tests/test_startup_validation.py +27 -0
  193. spaps_server_quickstart-0.5.0/docs/TM-ENV-001-summary.md +0 -177
  194. spaps_server_quickstart-0.5.0/src/spaps_server_quickstart/domains/issue_reporting_platform/service.py +0 -409
  195. spaps_server_quickstart-0.5.0/src/spaps_server_quickstart/domains/stripe/webhook_handler.py +0 -366
  196. spaps_server_quickstart-0.5.0/src/spaps_server_quickstart/middleware/envelope.py +0 -129
  197. spaps_server_quickstart-0.5.0/src/spaps_server_quickstart/middleware/key_scope.py +0 -82
  198. spaps_server_quickstart-0.5.0/src/spaps_server_quickstart/middleware/origin_validation.py +0 -83
  199. spaps_server_quickstart-0.5.0/tests/conftest.py +0 -9
  200. spaps_server_quickstart-0.5.0/tests/domains/issue_reporting_platform/test_service.py +0 -369
  201. spaps_server_quickstart-0.5.0/tests/middleware/test_key_scope.py +0 -110
  202. {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/.python-version +0 -0
  203. {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/TM-002-IMPLEMENTATION.md +0 -0
  204. {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/docs/TDD_PLAN.md +0 -0
  205. {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/docs/TM-ENV-001-email-environment-safety.md +0 -0
  206. {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/docs/UPGRADING.md +0 -0
  207. {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/docs/feature-plans/_archived/diff-mvp-plan.md +0 -0
  208. {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/docs/feature-plans/security-audit-remediation-2026q1/AUDIT_REPORT.md +0 -0
  209. {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/docs/feature-plans/security-audit-remediation-2026q1/README.md +0 -0
  210. {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/docs/feature-plans/security-audit-remediation-2026q1/backend.md +0 -0
  211. {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/docs/feature-plans/security-audit-remediation-2026q1/flows.md +0 -0
  212. {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/docs/feature-plans/security-audit-remediation-2026q1/frontend.md +0 -0
  213. {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/docs/feature-plans/security-audit-remediation-2026q1/plan.md +0 -0
  214. {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/docs/feature-plans/security-audit-remediation-2026q1/schema.mmd +0 -0
  215. {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/docs/feature-plans/security-audit-remediation-2026q1/shared.md +0 -0
  216. {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/docs/messaging-broker-plan.md +0 -0
  217. {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/scripts/release.sh +0 -0
  218. {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/src/spaps_server_quickstart/alembic/__init__.py +0 -0
  219. {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/src/spaps_server_quickstart/alembic/naming.py +0 -0
  220. {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/src/spaps_server_quickstart/api/__init__.py +0 -0
  221. {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/src/spaps_server_quickstart/api/dependencies.py +0 -0
  222. {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/src/spaps_server_quickstart/api/domains/__init__.py +0 -0
  223. {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/src/spaps_server_quickstart/api/domains/metrics_router.py +0 -0
  224. {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/src/spaps_server_quickstart/api/health.py +0 -0
  225. {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/src/spaps_server_quickstart/api/router.py +0 -0
  226. {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/src/spaps_server_quickstart/auth/cookies.py +0 -0
  227. {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/src/spaps_server_quickstart/auth/dependencies.py +0 -0
  228. {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/src/spaps_server_quickstart/auth_channels.py +0 -0
  229. {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/src/spaps_server_quickstart/db/__init__.py +0 -0
  230. {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/src/spaps_server_quickstart/db/alembic_status.py +0 -0
  231. {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/src/spaps_server_quickstart/db/migration_runner.py +0 -0
  232. {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/src/spaps_server_quickstart/db/session.py +0 -0
  233. {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/src/spaps_server_quickstart/domains/__init__.py +0 -0
  234. {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/src/spaps_server_quickstart/domains/_db/__init__.py +0 -0
  235. {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/src/spaps_server_quickstart/domains/_db/base.py +0 -0
  236. {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/src/spaps_server_quickstart/domains/_db/rls.py +0 -0
  237. {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/src/spaps_server_quickstart/domains/_db/types.py +0 -0
  238. {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/src/spaps_server_quickstart/domains/affiliate_referrals/__init__.py +0 -0
  239. {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/src/spaps_server_quickstart/domains/affiliate_referrals/errors.py +0 -0
  240. {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/src/spaps_server_quickstart/domains/affiliate_referrals/models.py +0 -0
  241. {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/src/spaps_server_quickstart/domains/affiliate_referrals/schemas.py +0 -0
  242. {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/src/spaps_server_quickstart/domains/agent_approvals/__init__.py +0 -0
  243. {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/src/spaps_server_quickstart/domains/agent_approvals/errors.py +0 -0
  244. {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/src/spaps_server_quickstart/domains/agent_approvals/models.py +0 -0
  245. {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/src/spaps_server_quickstart/domains/agent_approvals/repository.py +0 -0
  246. {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/src/spaps_server_quickstart/domains/applications/__init__.py +0 -0
  247. {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/src/spaps_server_quickstart/domains/approval_authz_prod_hardening/__init__.py +0 -0
  248. {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/src/spaps_server_quickstart/domains/approval_authz_prod_hardening/errors.py +0 -0
  249. {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/src/spaps_server_quickstart/domains/approval_authz_prod_hardening/models.py +0 -0
  250. {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/src/spaps_server_quickstart/domains/approval_authz_prod_hardening/repository.py +0 -0
  251. {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/src/spaps_server_quickstart/domains/approval_authz_prod_hardening/router.py +0 -0
  252. {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/src/spaps_server_quickstart/domains/approval_authz_prod_hardening/schemas.py +0 -0
  253. {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/src/spaps_server_quickstart/domains/approval_authz_prod_hardening/service.py +0 -0
  254. {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/src/spaps_server_quickstart/domains/audit/__init__.py +0 -0
  255. {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/src/spaps_server_quickstart/domains/audit/errors.py +0 -0
  256. {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/src/spaps_server_quickstart/domains/audit/models.py +0 -0
  257. {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/src/spaps_server_quickstart/domains/audit/repository.py +0 -0
  258. {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/src/spaps_server_quickstart/domains/audit/retention.py +0 -0
  259. {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/src/spaps_server_quickstart/domains/audit/schemas.py +0 -0
  260. {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/src/spaps_server_quickstart/domains/auth/__init__.py +0 -0
  261. {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/src/spaps_server_quickstart/domains/cfo/__init__.py +0 -0
  262. {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/src/spaps_server_quickstart/domains/cfo/errors.py +0 -0
  263. {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/src/spaps_server_quickstart/domains/cfo/models.py +0 -0
  264. {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/src/spaps_server_quickstart/domains/cfo/quickbooks.py +0 -0
  265. {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/src/spaps_server_quickstart/domains/cfo/repository.py +0 -0
  266. {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/src/spaps_server_quickstart/domains/cfo_roles/__init__.py +0 -0
  267. {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/src/spaps_server_quickstart/domains/cfo_roles/deps.py +0 -0
  268. {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/src/spaps_server_quickstart/domains/cfo_roles/errors.py +0 -0
  269. {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/src/spaps_server_quickstart/domains/cfo_roles/me_router.py +0 -0
  270. {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/src/spaps_server_quickstart/domains/cfo_roles/router.py +0 -0
  271. {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/src/spaps_server_quickstart/domains/cfo_roles/schemas.py +0 -0
  272. {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/src/spaps_server_quickstart/domains/cfo_roles/service.py +0 -0
  273. {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/src/spaps_server_quickstart/domains/crypto/__init__.py +0 -0
  274. {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/src/spaps_server_quickstart/domains/crypto/errors.py +0 -0
  275. {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/src/spaps_server_quickstart/domains/crypto/models.py +0 -0
  276. {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/src/spaps_server_quickstart/domains/crypto/repository.py +0 -0
  277. {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/src/spaps_server_quickstart/domains/crypto/router.py +0 -0
  278. {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/src/spaps_server_quickstart/domains/crypto/schemas.py +0 -0
  279. {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/src/spaps_server_quickstart/domains/crypto/service.py +0 -0
  280. {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/src/spaps_server_quickstart/domains/dayrate/__init__.py +0 -0
  281. {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/src/spaps_server_quickstart/domains/dayrate/errors.py +0 -0
  282. {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/src/spaps_server_quickstart/domains/dayrate/models.py +0 -0
  283. {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/src/spaps_server_quickstart/domains/dayrate/pricing.py +0 -0
  284. {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/src/spaps_server_quickstart/domains/device_flow/__init__.py +0 -0
  285. {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/src/spaps_server_quickstart/domains/device_flow/repository.py +0 -0
  286. {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/src/spaps_server_quickstart/domains/device_flow/schemas.py +0 -0
  287. {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/src/spaps_server_quickstart/domains/device_flow/store.py +0 -0
  288. {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/src/spaps_server_quickstart/domains/docs/__init__.py +0 -0
  289. {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/src/spaps_server_quickstart/domains/docs/errors.py +0 -0
  290. {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/src/spaps_server_quickstart/domains/docs/models.py +0 -0
  291. {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/src/spaps_server_quickstart/domains/email/__init__.py +0 -0
  292. {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/src/spaps_server_quickstart/domains/email/config.py +0 -0
  293. {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/src/spaps_server_quickstart/domains/email/errors.py +0 -0
  294. {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/src/spaps_server_quickstart/domains/email/mailgun.py +0 -0
  295. {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/src/spaps_server_quickstart/domains/email/models.py +0 -0
  296. {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/src/spaps_server_quickstart/domains/email/repository.py +0 -0
  297. {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/src/spaps_server_quickstart/domains/email/schemas.py +0 -0
  298. {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/src/spaps_server_quickstart/domains/entitlements/__init__.py +0 -0
  299. {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/src/spaps_server_quickstart/domains/entitlements/errors.py +0 -0
  300. {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/src/spaps_server_quickstart/domains/entitlements/models.py +0 -0
  301. {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/src/spaps_server_quickstart/domains/entitlements/schemas.py +0 -0
  302. {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/src/spaps_server_quickstart/domains/errors.py +0 -0
  303. {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/src/spaps_server_quickstart/domains/events.py +0 -0
  304. {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/src/spaps_server_quickstart/domains/issue_reporting_platform/__init__.py +0 -0
  305. {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/src/spaps_server_quickstart/domains/secure_messages/__init__.py +0 -0
  306. {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/src/spaps_server_quickstart/domains/secure_messages/encryption.py +0 -0
  307. {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/src/spaps_server_quickstart/domains/secure_messages/errors.py +0 -0
  308. {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/src/spaps_server_quickstart/domains/secure_messages/models.py +0 -0
  309. {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/src/spaps_server_quickstart/domains/secure_messages/repository.py +0 -0
  310. {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/src/spaps_server_quickstart/domains/secure_messages/router.py +0 -0
  311. {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/src/spaps_server_quickstart/domains/secure_messages/schemas.py +0 -0
  312. {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/src/spaps_server_quickstart/domains/secure_messages/service.py +0 -0
  313. {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/src/spaps_server_quickstart/domains/security/__init__.py +0 -0
  314. {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/src/spaps_server_quickstart/domains/security/errors.py +0 -0
  315. {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/src/spaps_server_quickstart/domains/security/schemas.py +0 -0
  316. {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/src/spaps_server_quickstart/domains/self_service/__init__.py +0 -0
  317. {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/src/spaps_server_quickstart/domains/self_service/errors.py +0 -0
  318. {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/src/spaps_server_quickstart/domains/sessions/__init__.py +0 -0
  319. {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/src/spaps_server_quickstart/domains/sessions/jwt_service.py +0 -0
  320. {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/src/spaps_server_quickstart/domains/sessions/models.py +0 -0
  321. {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/src/spaps_server_quickstart/domains/sessions/nonce_service.py +0 -0
  322. {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/src/spaps_server_quickstart/domains/sessions/repository.py +0 -0
  323. {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/src/spaps_server_quickstart/domains/sessions/router.py +0 -0
  324. {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/src/spaps_server_quickstart/domains/sessions/schemas.py +0 -0
  325. {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/src/spaps_server_quickstart/domains/sessions/service.py +0 -0
  326. {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/src/spaps_server_quickstart/domains/stripe/__init__.py +0 -0
  327. {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/src/spaps_server_quickstart/domains/stripe/errors.py +0 -0
  328. {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/src/spaps_server_quickstart/domains/support_telemetry_platform/__init__.py +0 -0
  329. {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/src/spaps_server_quickstart/domains/support_telemetry_platform/errors.py +0 -0
  330. {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/src/spaps_server_quickstart/domains/support_telemetry_platform/models.py +0 -0
  331. {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/src/spaps_server_quickstart/domains/support_telemetry_platform/repository.py +0 -0
  332. {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/src/spaps_server_quickstart/domains/support_telemetry_platform/schemas.py +0 -0
  333. {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/src/spaps_server_quickstart/domains/users/__init__.py +0 -0
  334. {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/src/spaps_server_quickstart/domains/users/models.py +0 -0
  335. {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/src/spaps_server_quickstart/domains/users/repository.py +0 -0
  336. {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/src/spaps_server_quickstart/domains/users/router.py +0 -0
  337. {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/src/spaps_server_quickstart/domains/users/schemas.py +0 -0
  338. {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/src/spaps_server_quickstart/domains/users/service.py +0 -0
  339. {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/src/spaps_server_quickstart/domains/wallets/__init__.py +0 -0
  340. {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/src/spaps_server_quickstart/domains/wallets/chains/__init__.py +0 -0
  341. {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/src/spaps_server_quickstart/domains/wallets/chains/dispatcher.py +0 -0
  342. {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/src/spaps_server_quickstart/domains/wallets/chains/ethereum.py +0 -0
  343. {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/src/spaps_server_quickstart/domains/wallets/chains/solana.py +0 -0
  344. {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/src/spaps_server_quickstart/domains/wallets/models.py +0 -0
  345. {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/src/spaps_server_quickstart/domains/wallets/repository.py +0 -0
  346. {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/src/spaps_server_quickstart/domains/webhooks/__init__.py +0 -0
  347. {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/src/spaps_server_quickstart/domains/webhooks/models.py +0 -0
  348. {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/src/spaps_server_quickstart/domains/webhooks/repository.py +0 -0
  349. {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/src/spaps_server_quickstart/domains/webhooks/router.py +0 -0
  350. {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/src/spaps_server_quickstart/domains/whitelist/__init__.py +0 -0
  351. {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/src/spaps_server_quickstart/local_mode/__init__.py +0 -0
  352. {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/src/spaps_server_quickstart/local_mode/middleware.py +0 -0
  353. {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/src/spaps_server_quickstart/local_mode/personas.py +0 -0
  354. {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/src/spaps_server_quickstart/middleware/__init__.py +0 -0
  355. {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/src/spaps_server_quickstart/middleware/error_handler.py +0 -0
  356. {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/src/spaps_server_quickstart/middleware/jwt_auth.py +0 -0
  357. {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/src/spaps_server_quickstart/middleware/local_mode.py +0 -0
  358. {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/src/spaps_server_quickstart/middleware/security_headers.py +0 -0
  359. {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/src/spaps_server_quickstart/middleware.py +0 -0
  360. {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/src/spaps_server_quickstart/rbac/__init__.py +0 -0
  361. {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/src/spaps_server_quickstart/schemas/__init__.py +0 -0
  362. {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/src/spaps_server_quickstart/schemas/health.py +0 -0
  363. {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/src/spaps_server_quickstart/sdk/__init__.py +0 -0
  364. {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/src/spaps_server_quickstart/sdk/_ttl_cache.py +0 -0
  365. {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/src/spaps_server_quickstart/sdk/admin_token_cache.py +0 -0
  366. {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/src/spaps_server_quickstart/sdk/feature_evaluator.py +0 -0
  367. {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/src/spaps_server_quickstart/sdk/role_hierarchy.py +0 -0
  368. {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/src/spaps_server_quickstart/sdk/server_clients.py +0 -0
  369. {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/src/spaps_server_quickstart/sdk/trusted_service_middleware.py +0 -0
  370. {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/src/spaps_server_quickstart/secure_messaging.py +0 -0
  371. {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/src/spaps_server_quickstart/seeds/__init__.py +0 -0
  372. {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/src/spaps_server_quickstart/seeds/cli.py +0 -0
  373. {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/src/spaps_server_quickstart/seeds/schemas.py +0 -0
  374. {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/src/spaps_server_quickstart/seeds/validator.py +0 -0
  375. {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/src/spaps_server_quickstart/tasks/__init__.py +0 -0
  376. {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/src/spaps_server_quickstart/tasks/celery_factory.py +0 -0
  377. {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/src/spaps_server_quickstart/tasks/health.py +0 -0
  378. {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/src/spaps_server_quickstart/tasks/notifications.py +0 -0
  379. {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/src/spaps_server_quickstart/templates/.pre-commit-config.yaml +0 -0
  380. {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/src/spaps_server_quickstart/templates/__init__.py +0 -0
  381. {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/src/spaps_server_quickstart/templates/alembic/env.py +0 -0
  382. {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/src/spaps_server_quickstart/templates/alembic/script.py.mako +0 -0
  383. {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/src/spaps_server_quickstart/templates/alembic/versions/.gitkeep +0 -0
  384. {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/src/spaps_server_quickstart/templates/alembic.ini +0 -0
  385. {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/src/spaps_server_quickstart/templates/docs/templates/API_DOCUMENTATION_TEMPLATE.md +0 -0
  386. {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/src/spaps_server_quickstart/templates/docs/templates/DEBUG_REPORT_TEMPLATE.md +0 -0
  387. {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/src/spaps_server_quickstart/templates/docs/templates/OPERATIONS_PLAYBOOK_TEMPLATE.md +0 -0
  388. {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/src/spaps_server_quickstart/templates/domains/__init__.py +0 -0
  389. {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/src/spaps_server_quickstart/templates/domains/admin/router.py +0 -0
  390. {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/src/spaps_server_quickstart/templates/domains/auth/local_routes.py +0 -0
  391. {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/src/spaps_server_quickstart/templates/domains/users/__init__.py +0 -0
  392. {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/src/spaps_server_quickstart/templates/domains/users/models.py +0 -0
  393. {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/src/spaps_server_quickstart/templates/domains/users/repository.py +0 -0
  394. {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/src/spaps_server_quickstart/templates/domains/users/router.py +0 -0
  395. {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/src/spaps_server_quickstart/templates/domains/users/schemas.py +0 -0
  396. {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/src/spaps_server_quickstart/templates/domains/users/service.py +0 -0
  397. {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/src/spaps_server_quickstart/templates/operations/.env.production.example +0 -0
  398. {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/src/spaps_server_quickstart/templates/operations/.githooks/pre-push +0 -0
  399. {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/src/spaps_server_quickstart/templates/operations/.github/workflows/deploy.yml +0 -0
  400. {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/src/spaps_server_quickstart/templates/operations/.github/workflows/rollback.yml +0 -0
  401. {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/src/spaps_server_quickstart/templates/operations/Makefile +0 -0
  402. {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/src/spaps_server_quickstart/templates/operations/deploy/deploy.sh +0 -0
  403. {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/src/spaps_server_quickstart/templates/operations/deploy/docker-compose.migration.yml +0 -0
  404. {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/src/spaps_server_quickstart/templates/operations/deploy/post-deploy-verify.sh +0 -0
  405. {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/src/spaps_server_quickstart/templates/operations/deploy/pre-deploy-checks.sh +0 -0
  406. {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/src/spaps_server_quickstart/templates/operations/docker-compose.prod.yml +0 -0
  407. {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/src/spaps_server_quickstart/templates/operations/scripts/backup-db.sh +0 -0
  408. {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/src/spaps_server_quickstart/templates/operations/scripts/dev/await_db.py +0 -0
  409. {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/src/spaps_server_quickstart/templates/operations/scripts/dev/fetch-prod-db.sh +0 -0
  410. {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/src/spaps_server_quickstart/templates/operations/scripts/dev/local-debug-loop.sh +0 -0
  411. {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/src/spaps_server_quickstart/templates/operations/scripts/dev/start-db.sh +0 -0
  412. {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/src/spaps_server_quickstart/templates/operations/scripts/dev/stop-db.sh +0 -0
  413. {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/src/spaps_server_quickstart/templates/operations/scripts/new-migration.sh +0 -0
  414. {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/src/spaps_server_quickstart/templates/operations/scripts/prepush.sh +0 -0
  415. {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/src/spaps_server_quickstart/templates/operations/scripts/restore-db.sh +0 -0
  416. {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/src/spaps_server_quickstart/templates/scripts/__init__.py +0 -0
  417. {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/src/spaps_server_quickstart/templates/scripts/seeds/__init__.py +0 -0
  418. {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/src/spaps_server_quickstart/templates/scripts/seeds/data/users.yaml +0 -0
  419. {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/src/spaps_server_quickstart/templates/scripts/seeds/schemas/__init__.py +0 -0
  420. {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/src/spaps_server_quickstart/templates/scripts/seeds/schemas/users.py +0 -0
  421. {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/src/spaps_server_quickstart/templates/tests/README.md +0 -0
  422. {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/src/spaps_server_quickstart/templates/tests/__init__.py +0 -0
  423. {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/src/spaps_server_quickstart/templates/tests/api/__init__.py +0 -0
  424. {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/src/spaps_server_quickstart/templates/tests/api/test_health.py +0 -0
  425. {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/src/spaps_server_quickstart/templates/tests/api/test_users_auth.py +0 -0
  426. {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/src/spaps_server_quickstart/templates/tests/conftest.py +0 -0
  427. {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/src/spaps_server_quickstart/templates/tests/domains/__init__.py +0 -0
  428. {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/src/spaps_server_quickstart/templates/tests/domains/example/__init__.py +0 -0
  429. {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/src/spaps_server_quickstart/templates/tests/domains/example/conftest.py +0 -0
  430. {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/src/spaps_server_quickstart/templates/tests/domains/users/__init__.py +0 -0
  431. {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/src/spaps_server_quickstart/templates/tests/domains/users/conftest.py +0 -0
  432. {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/src/spaps_server_quickstart/templates/tests/integration/__init__.py +0 -0
  433. {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/src/spaps_server_quickstart/templates/tests/integration/test_db_connectivity.py +0 -0
  434. {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/src/spaps_server_quickstart/templates/tests/unit/__init__.py +0 -0
  435. {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/src/spaps_server_quickstart/templates/tests/unit/test_settings.py +0 -0
  436. {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/src/spaps_server_quickstart/testing.py +0 -0
  437. {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/templates/Makefile +0 -0
  438. {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/templates/docker-compose.yml +0 -0
  439. {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/templates/operations/.env.production.example +0 -0
  440. {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/templates/operations/.github/workflows/deploy.yml +0 -0
  441. {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/templates/operations/Makefile +0 -0
  442. {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/templates/operations/deploy/deploy.sh +0 -0
  443. {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/templates/operations/deploy/post-deploy-verify.sh +0 -0
  444. {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/templates/operations/deploy/pre-deploy-checks.sh +0 -0
  445. {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/templates/operations/deploy/reverse-proxy/README.md +0 -0
  446. {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/templates/operations/deploy/reverse-proxy/certs/.gitkeep +0 -0
  447. {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/templates/operations/deploy/reverse-proxy/docker-compose.yml +0 -0
  448. {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/templates/operations/deploy/reverse-proxy/nginx.conf +0 -0
  449. {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/templates/operations/deploy/reverse-proxy/sites-available/.gitkeep +0 -0
  450. {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/templates/operations/deploy/reverse-proxy/sites-enabled/.gitkeep +0 -0
  451. {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/templates/operations/deploy/reverse-proxy/static/.gitkeep +0 -0
  452. {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/templates/operations/deploy/reverse-proxy/up.sh +0 -0
  453. {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/templates/operations/docker-compose.dev.yml +0 -0
  454. {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/templates/operations/docker-compose.prod.yml +0 -0
  455. {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/templates/operations/scripts/dev/await_db.py +0 -0
  456. {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/templates/operations/scripts/dev/local-debug-loop.sh +0 -0
  457. {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/templates/operations/scripts/dev/start-db.sh +0 -0
  458. {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/templates/operations/scripts/dev/stop-db.sh +0 -0
  459. {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/templates/tests/conftest.py +0 -0
  460. {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/tests/contracts/__init__.py +0 -0
  461. {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/tests/contracts/test_app_factory_contract.py +0 -0
  462. {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/tests/contracts/test_auth_contract.py +0 -0
  463. {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/tests/contracts/test_celery_contract.py +0 -0
  464. {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/tests/contracts/test_db_contract.py +0 -0
  465. {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/tests/contracts/test_dependencies_contract.py +0 -0
  466. {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/tests/contracts/test_health_contract.py +0 -0
  467. {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/tests/contracts/test_manifest_parity.py +0 -0
  468. {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/tests/contracts/test_oss_hygiene_script.py +0 -0
  469. {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/tests/contracts/test_router_contract.py +0 -0
  470. {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/tests/contracts/test_settings_contract.py +0 -0
  471. {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/tests/domains/__init__.py +0 -0
  472. {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/tests/domains/affiliate_referrals/__init__.py +0 -0
  473. {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/tests/domains/affiliate_referrals/test_schemas.py +0 -0
  474. {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/tests/domains/agent_approvals/__init__.py +0 -0
  475. {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/tests/domains/agent_approvals/test_repository.py +0 -0
  476. {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/tests/domains/applications/__init__.py +0 -0
  477. {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/tests/domains/applications/test_service.py +0 -0
  478. {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/tests/domains/approval_authz_prod_hardening/__init__.py +0 -0
  479. {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/tests/domains/approval_authz_prod_hardening/conftest.py +0 -0
  480. {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/tests/domains/approval_authz_prod_hardening/test_router.py +0 -0
  481. {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/tests/domains/approval_authz_prod_hardening/test_service.py +0 -0
  482. {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/tests/domains/approval_authz_prod_hardening/test_wiring.py +0 -0
  483. {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/tests/domains/audit/__init__.py +0 -0
  484. {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/tests/domains/audit/test_repository.py +0 -0
  485. {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/tests/domains/audit/test_retention.py +0 -0
  486. {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/tests/domains/auth/__init__.py +0 -0
  487. {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/tests/domains/auth/test_refresh_token_anomaly.py +0 -0
  488. {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/tests/domains/cfo/__init__.py +0 -0
  489. {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/tests/domains/cfo/test_repository.py +0 -0
  490. {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/tests/domains/cfo_roles/__init__.py +0 -0
  491. {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/tests/domains/cfo_roles/test_router.py +0 -0
  492. {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/tests/domains/cfo_roles/test_service.py +0 -0
  493. {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/tests/domains/conftest.py +0 -0
  494. {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/tests/domains/crypto/__init__.py +0 -0
  495. {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/tests/domains/crypto/test_repository.py +0 -0
  496. {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/tests/domains/crypto/test_router.py +0 -0
  497. {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/tests/domains/crypto/test_service.py +0 -0
  498. {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/tests/domains/dayrate/__init__.py +0 -0
  499. {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/tests/domains/dayrate/test_allotment_service.py +0 -0
  500. {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/tests/domains/dayrate/test_booking_policy_service.py +0 -0
  501. {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/tests/domains/dayrate/test_booking_routes.py +0 -0
  502. {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/tests/domains/dayrate/test_pricing.py +0 -0
  503. {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/tests/domains/device_flow/__init__.py +0 -0
  504. {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/tests/domains/device_flow/test_store.py +0 -0
  505. {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/tests/domains/docs/__init__.py +0 -0
  506. {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/tests/domains/email/__init__.py +0 -0
  507. {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/tests/domains/email/test_config.py +0 -0
  508. {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/tests/domains/email/test_env_safety.py +0 -0
  509. {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/tests/domains/email/test_repository.py +0 -0
  510. {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/tests/domains/entitlements/__init__.py +0 -0
  511. {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/tests/domains/entitlements/test_repository.py +0 -0
  512. {spaps_server_quickstart-0.5.0/tests/domains/secure_messages → spaps_server_quickstart-0.5.1/tests/domains/policies}/__init__.py +0 -0
  513. {spaps_server_quickstart-0.5.0/tests/domains/security → spaps_server_quickstart-0.5.1/tests/domains/secure_messages}/__init__.py +0 -0
  514. {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/tests/domains/secure_messages/test_encryption.py +0 -0
  515. {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/tests/domains/secure_messages/test_router.py +0 -0
  516. {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/tests/domains/secure_messages/test_service.py +0 -0
  517. {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/tests/domains/secure_messages/test_tm013_security.py +0 -0
  518. {spaps_server_quickstart-0.5.0/tests/domains/self_service → spaps_server_quickstart-0.5.1/tests/domains/security}/__init__.py +0 -0
  519. {spaps_server_quickstart-0.5.0/tests/domains/sessions → spaps_server_quickstart-0.5.1/tests/domains/self_service}/__init__.py +0 -0
  520. {spaps_server_quickstart-0.5.0/tests/domains/stripe → spaps_server_quickstart-0.5.1/tests/domains/sessions}/__init__.py +0 -0
  521. {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/tests/domains/sessions/test_admin_detection.py +0 -0
  522. {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/tests/domains/sessions/test_repository.py +0 -0
  523. {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/tests/domains/sessions/test_router.py +0 -0
  524. {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/tests/domains/sessions/test_service.py +0 -0
  525. {spaps_server_quickstart-0.5.0/tests/domains/users → spaps_server_quickstart-0.5.1/tests/domains/stripe}/__init__.py +0 -0
  526. {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/tests/domains/stripe/test_subscription_application_scoping.py +0 -0
  527. {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/tests/domains/support_telemetry_platform/__init__.py +0 -0
  528. {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/tests/domains/support_telemetry_platform/test_repository.py +0 -0
  529. {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/tests/domains/test_smoke.py +0 -0
  530. {spaps_server_quickstart-0.5.0/tests/domains/wallets → spaps_server_quickstart-0.5.1/tests/domains/users}/__init__.py +0 -0
  531. {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/tests/domains/users/test_repository.py +0 -0
  532. {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/tests/domains/users/test_router.py +0 -0
  533. {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/tests/domains/users/test_service.py +0 -0
  534. {spaps_server_quickstart-0.5.0/tests/domains/webhooks → spaps_server_quickstart-0.5.1/tests/domains/wallets}/__init__.py +0 -0
  535. {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/tests/domains/wallets/test_chains.py +0 -0
  536. {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/tests/domains/wallets/test_repository.py +0 -0
  537. {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/tests/domains/wallets/test_service.py +0 -0
  538. {spaps_server_quickstart-0.5.0/tests/domains/whitelist → spaps_server_quickstart-0.5.1/tests/domains/webhooks}/__init__.py +0 -0
  539. {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/tests/domains/webhooks/test_repository.py +0 -0
  540. {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/tests/domains/webhooks/test_signing.py +0 -0
  541. {spaps_server_quickstart-0.5.0/tests/middleware → spaps_server_quickstart-0.5.1/tests/domains/whitelist}/__init__.py +0 -0
  542. {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/tests/domains/whitelist/test_service.py +0 -0
  543. {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/tests/middleware/test_jwt_auth.py +0 -0
  544. {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/tests/middleware/test_local_mode.py +0 -0
  545. {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/tests/middleware/test_security_headers.py +0 -0
  546. {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/tests/seeds/test_cli.py +0 -0
  547. {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/tests/test_alembic_naming.py +0 -0
  548. {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/tests/test_api_router.py +0 -0
  549. {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/tests/test_app_factory.py +0 -0
  550. {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/tests/test_auth_channels.py +0 -0
  551. {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/tests/test_auth_cookies.py +0 -0
  552. {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/tests/test_auth_dependencies.py +0 -0
  553. {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/tests/test_bcrypt_compat.py +0 -0
  554. {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/tests/test_db_session.py +0 -0
  555. {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/tests/test_dev_data_pipeline.py +0 -0
  556. {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/tests/test_health_router.py +0 -0
  557. {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/tests/test_imports.py +0 -0
  558. {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/tests/test_local_mode.py +0 -0
  559. {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/tests/test_logging.py +0 -0
  560. {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/tests/test_middleware.py +0 -0
  561. {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/tests/test_migration_runner.py +0 -0
  562. {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/tests/test_migration_status.py +0 -0
  563. {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/tests/test_operations_templates.py +0 -0
  564. {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/tests/test_package_metadata.py +0 -0
  565. {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/tests/test_rbac.py +0 -0
  566. {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/tests/test_readme_snippets.py +0 -0
  567. {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/tests/test_sdk.py +0 -0
  568. {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/tests/test_secure_messaging.py +0 -0
  569. {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/tests/test_seed_validation.py +0 -0
  570. {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/tests/test_session_autocommit.py +0 -0
  571. {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/tests/test_sessions_jwt.py +0 -0
  572. {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/tests/test_sessions_nonce.py +0 -0
  573. {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/tests/test_sessions_password.py +0 -0
  574. {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/tests/test_settings.py +0 -0
  575. {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/tests/test_tasks.py +0 -0
  576. {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/todo.md +0 -0
@@ -78,7 +78,10 @@ storybook-static/
78
78
  # IDE
79
79
  .vscode/
80
80
  .idea/
81
+ .codex/
82
+ .mcp.json
81
83
  .claude/settings.local.json
84
+ .claude/skills/
82
85
  *.swp
83
86
  *.swo
84
87
  *.swn
@@ -151,6 +154,13 @@ backup-feb8.sql
151
154
  # Stripe CLI
152
155
  .stripe-listen.pid
153
156
 
157
+ # Local modes/swarm artifacts
158
+ .ntm/
159
+ .skillbox/
160
+ MODES_ANALYSIS_PROGRESS.md
161
+ MODES_OF_REASONING_REPORT_AND_ANALYSIS_OF_PROJECT.md
162
+ MODES_SWARM/
163
+
154
164
  # OS files
155
165
  Thumbs.db
156
166
  Desktop.ini
@@ -171,3 +181,7 @@ playwright/.cache/
171
181
  # pnpm-lock.yaml*.tgz
172
182
 
173
183
  **/coverage.xml
184
+
185
+ context.yaml
186
+ MODES_OF_REASONING_SECOND_PASS_REPORT.md
187
+ skillbox-config/
@@ -8,6 +8,18 @@ The format follows [Keep a Changelog](https://keepachangelog.com/en/1.1.0/) and
8
8
 
9
9
  - No changes yet.
10
10
 
11
+ ## [0.5.0] - 2026-03-29
12
+
13
+ ### Added
14
+
15
+ - End-user issue-reporting flows, runtime token admin support, and support-telemetry helpers for downstream FastAPI services.
16
+ - Browser-friendly device-flow verification and expanded reusable database helper surface.
17
+
18
+ ### Fixed
19
+
20
+ - Magic-link redirect handling, stale session admin-email behavior, and related auth/session hardening.
21
+ - Hotspot complexity and coverage gaps across webhook, auth, and session paths.
22
+
11
23
  ## [0.4.0] - 2026-02-11
12
24
 
13
25
  ### Added
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: spaps-server-quickstart
3
- Version: 0.5.0
3
+ Version: 0.5.1
4
4
  Summary: Shared FastAPI/Celery scaffolding for Sweet Potato service backends.
5
5
  Project-URL: Homepage, https://api.sweetpotato.dev
6
6
  Project-URL: Repository, https://github.com/sweet-potato/spaps
@@ -25,6 +25,7 @@ Requires-Dist: eth-account<1.0,>=0.13.0
25
25
  Requires-Dist: fastapi<0.119,>=0.118.0
26
26
  Requires-Dist: greenlet<4.0,>=3.0.3
27
27
  Requires-Dist: httpx<0.29,>=0.28.1
28
+ Requires-Dist: orjson<4.0,>=3.10.0
28
29
  Requires-Dist: pgvector<0.5,>=0.4.1
29
30
  Requires-Dist: psycopg[binary]<3.3,>=3.2.10
30
31
  Requires-Dist: pydantic-settings<3.0,>=2.3.0
@@ -71,35 +72,28 @@ Requires-Dist: respx<0.23,>=0.22.0; extra == 'testing'
71
72
  Requires-Dist: testcontainers[postgres]<5.0,>=4.0.0; extra == 'testing'
72
73
  Description-Content-Type: text/markdown
73
74
 
74
- # SPAPS Server Quickstart
75
+ # spaps-server-quickstart
75
76
 
76
- Reusable FastAPI, SQLAlchemy, Celery, auth, and operational scaffolding for Sweet Potato service backends. This is the active backend package in the repository and the shared foundation for SPAPS-aligned Python services.
77
+ Reusable FastAPI, SQLAlchemy, Celery, auth, and operational scaffolding for SPAPS-aligned Python services. This is the active backend package in this repository.
78
+
79
+ Examples in this README use placeholders such as `https://api.example.test` and local-only database URLs. Replace them with values from your own environment.
80
+
81
+ ## Install
77
82
 
78
83
  ```bash
79
84
  pip install spaps-server-quickstart
80
85
  ```
81
86
 
82
- ## TL;DR
83
-
84
- **The Problem**: new FastAPI services keep re-solving the same problems around app factories, auth middleware, RBAC, async database wiring, Celery bootstrapping, and deployment guardrails.
85
-
86
- **The Solution**: `spaps-server-quickstart` packages the shared SPAPS backend conventions into one installable Python package so new services start from a tested baseline instead of ad hoc scaffolding.
87
+ This package targets Python 3.12+.
87
88
 
88
- ### Why Use `spaps-server-quickstart`?
89
+ ## When It Fits
89
90
 
90
- | Feature | What it gives you |
91
+ | Need | Package gives you |
91
92
  | --- | --- |
92
- | App factory and startup checks | `create_app`, settings loaders, and environment validation |
93
- | Shared auth + RBAC | SPAPS auth middleware, auth channels, trusted-service middleware, and role dependencies |
94
- | Async data layer | SQLAlchemy 2.0 async helpers, migration runner, and session dependencies |
95
- | Operational templates | Deployment scripts, compose stubs, dev DB helpers, and packaging patterns |
96
-
97
- ## Metadata
98
-
99
- - `package_name`: `spaps-server-quickstart`
100
- - `latest_version`: `0.4.0`
101
- - `minimum_runtime`: `Python >=3.12`
102
- - `api_base_url`: `https://api.sweetpotato.dev`
93
+ | A real FastAPI starting point | `create_app`, settings loaders, request logging, and startup checks |
94
+ | Shared auth and RBAC | SPAPS auth middleware, auth channels, cookies, and role dependencies |
95
+ | Async database plumbing | SQLAlchemy 2 async session helpers and Alembic support |
96
+ | Operational scaffolding | Celery setup, deploy templates, local-mode helpers, and service SDK utilities |
103
97
 
104
98
  ## Quick Start
105
99
 
@@ -107,47 +101,59 @@ pip install spaps-server-quickstart
107
101
  from fastapi import APIRouter
108
102
 
109
103
  from spaps_server_quickstart import create_app
110
- from spaps_server_quickstart.settings import BaseServiceSettings
104
+ from spaps_server_quickstart.settings import (
105
+ BaseServiceSettings,
106
+ create_settings_loader,
107
+ )
111
108
 
112
109
 
113
- def load_settings() -> BaseServiceSettings:
114
- return BaseServiceSettings(env="test", app_name="README Quickstart")
110
+ class ExampleSettings(BaseServiceSettings):
111
+ app_name: str = "Example Service"
112
+ spaps_auth_enabled: bool = False
115
113
 
116
114
 
117
115
  router = APIRouter()
118
116
 
119
117
 
120
- @router.get("/hello")
121
- async def hello() -> dict[str, str]:
122
- return {"message": "Hello from SPAPS"}
118
+ @router.get("/health")
119
+ async def health() -> dict[str, bool]:
120
+ return {"ok": True}
123
121
 
124
122
 
125
- app = create_app(settings_loader=load_settings, api_router=router)
123
+ app = create_app(
124
+ settings_loader=create_settings_loader(ExampleSettings),
125
+ api_router=router,
126
+ )
126
127
  ```
127
128
 
128
- ## Design Principles
129
-
130
- 1. Start from a real service baseline, not a toy template.
131
- 2. Keep auth, middleware, and operational guardrails reusable across services.
132
- 3. Prefer explicit service composition through settings loaders and dependency injection.
133
- 4. Keep the local-development path close to production behavior.
134
- 5. Make the happy path easy without hiding the underlying FastAPI and SQLAlchemy primitives.
135
-
136
- ## What the Package Includes
129
+ ## What the Package Ships
137
130
 
138
131
  | Area | Highlights |
139
132
  | --- | --- |
140
- | App lifecycle | `create_app`, startup checks, environment validation, logging |
141
- | Auth | `SpapsAuthMiddleware`, auth cookies, auth channel service, local auth mode |
142
- | Routing and RBAC | Base router builder, role helpers, authenticated-user dependencies |
133
+ | App lifecycle | `create_app`, startup validation, logging, CORS wiring |
134
+ | Auth | `SpapsAuthMiddleware`, auth cookies, auth channel service, local mode |
135
+ | Routing and RBAC | Base router builder, authenticated-user dependencies, `require_roles`, `has_required_roles` |
143
136
  | Database | Async sessionmaker factory, migration runner, Alembic helpers |
144
137
  | Tasks | Celery app factory plus notification and ping task helpers |
145
- | Service SDK helpers | Admin token cache, server-side SPAPS clients, feature evaluation, trusted-service middleware |
146
- | Templates | Domain examples, operations bundle, env examples, and local dev helpers |
138
+ | Service SDK helpers | Admin token cache, server-side SPAPS clients, trusted-service middleware, feature evaluation |
139
+ | Templates | Domain examples, tests, deployment scaffolding, and local operations helpers |
140
+ | Reference contract | The `golden_path` app blueprint, seeded paid-access policy, and downstream runbook for the core auth -> billing -> entitlement -> access loop |
141
+
142
+ ## Golden App Pack
143
+
144
+ If you want one SPAPS-native reference contract instead of a blank scaffold, start with the `golden_path` blueprint.
145
+
146
+ It is the canonical pack for:
147
+
148
+ - browser auth and session bootstrap
149
+ - Stripe checkout or subscription flows
150
+ - entitlement projection into `paid_access`
151
+ - policy-gated access through the seeded `access-paid-features` rule
152
+ - an operator runbook under `docs/downstream_apps/golden-path-reference/`
147
153
 
148
154
  ## Local Development Mode
149
155
 
150
- Set `DEVELOPMENT_ENVIRONMENT=local` to enable the local-auth bypass workflow used in development and tests.
156
+ Set `DEVELOPMENT_ENVIRONMENT=local` to enable local auth bypass in development and tests.
151
157
 
152
158
  ```python
153
159
  from spaps_server_quickstart.local_mode import (
@@ -171,73 +177,49 @@ Default personas:
171
177
 
172
178
  ## Configuration
173
179
 
174
- Key settings exposed through `BaseServiceSettings` and related SPAPS settings:
180
+ Common settings exposed through `BaseServiceSettings`:
175
181
 
176
182
  | Setting | Purpose |
177
183
  | --- | --- |
178
184
  | `development_environment` | Enables local bypass mode when set to `local` |
185
+ | `spaps_auth_enabled` | Turns SPAPS auth middleware on or off |
179
186
  | `spaps_auth_exempt_paths` | Comma-separated paths that skip SPAPS auth |
180
187
  | `cors_allow_origins` | Shared CORS configuration |
181
- | `secure_messages_enabled` | Toggles secure-messaging gateway support |
182
- | `secure_messages_timeout` | HTTP timeout for secure-messaging calls |
188
+ | `database_url` | Async SQLAlchemy database URL |
189
+ | `redis_url` | Redis URL used by Celery defaults |
190
+ | `secure_messages_enabled` | Enables secure-messaging gateway support |
183
191
 
184
192
  Example environment:
185
193
 
186
194
  ```bash
187
195
  DEVELOPMENT_ENVIRONMENT=local
196
+ SPAPS_API_URL=https://api.example.test
197
+ SPAPS_API_KEY=spaps_sec_example
198
+ DATABASE_URL=postgresql+asyncpg://postgres:postgres@localhost:5432/service
188
199
  SPAPS_AUTH_EXEMPT_PATHS=/health,/docs
189
200
  CORS_ALLOW_ORIGINS=http://localhost:3000,http://localhost:5173
190
201
  ```
191
202
 
192
- ## Operational Templates
193
-
194
- The package ships with templates and scripts for the workflows the real SPAPS services use:
195
-
196
- - Docker Compose and reverse-proxy stubs
197
- - Deploy scripts with preflight and post-deploy checks
198
- - Database backup, restore, and migration helpers
199
- - Shared dev DB helpers and local debug-loop support
200
- - Example domains and tests for bootstrapping new services
201
-
202
- ## Architecture
203
-
204
- ```text
205
- FastAPI service
206
- |
207
- +--> create_app + settings loader
208
- |
209
- +--> auth middleware / RBAC / dependencies
210
- |
211
- +--> async DB session + Alembic helpers
212
- |
213
- +--> Celery tasks + service SDK helpers
214
- |
215
- +--> shared operational templates
216
- |
217
- v
218
- SPAPS-aligned production service
219
- ```
220
-
221
- ## Validation and Development
203
+ ## Validation
222
204
 
223
- When working in this repository, the root `Makefile` is the canonical workflow:
205
+ From the repository root, the `Makefile` is the canonical workflow:
224
206
 
225
207
  ```bash
226
208
  make install
227
209
  make pytest
228
210
  make lint
229
211
  make typecheck
212
+ make pytest-cov
230
213
  make test
231
- make local-up
232
214
  ```
233
215
 
234
216
  Useful additional commands:
235
217
 
236
218
  ```bash
237
219
  make pytest-full
238
- make pytest-cov
239
220
  make migrate
240
221
  make new-migration MSG="add_example_table"
222
+ make local-up
241
223
  ```
242
224
 
243
225
  ## Troubleshooting
@@ -248,29 +230,29 @@ That is expected when testmon sees no impacted tests. Use `make pytest-full` whe
248
230
 
249
231
  ### Local auth bypass is not active
250
232
 
251
- Confirm `DEVELOPMENT_ENVIRONMENT=local` is set before application startup.
233
+ Confirm `DEVELOPMENT_ENVIRONMENT=local` is set before application startup and that `LocalAuthMiddleware` is wired into the app.
252
234
 
253
235
  ### Unauthenticated routes still require auth
254
236
 
255
- Check `spaps_auth_exempt_paths` and make sure the configured paths match the actual router paths.
237
+ Check `spaps_auth_exempt_paths` and make sure the configured paths match the router paths exactly.
256
238
 
257
239
  ### Startup fails on environment validation
258
240
 
259
- Review the required settings and any environment-safety checks triggered during startup validation.
241
+ Review the required settings and any safety checks triggered during startup.
260
242
 
261
243
  ### I need a new service quickly
262
244
 
263
- Start from the included templates and keep the repo-root validation path intact while adapting the service-specific settings.
245
+ Start from the included templates, then keep the repo-root validation path intact while adapting domain code and settings.
264
246
 
265
247
  ## Limitations
266
248
 
267
- - This package is a scaffold, not a complete application by itself.
268
- - Downstream services still need their own domain routers, schemas, repositories, and deployment configuration.
269
- - Some operational templates intentionally require environment-specific edits before production use.
249
+ - This package is a scaffold, not a finished application.
250
+ - Downstream services still need their own routers, schemas, repositories, and deployment settings.
251
+ - Some operational templates intentionally need environment-specific edits before production use.
270
252
 
271
253
  ## FAQ
272
254
 
273
- ### Is this the active SPAPS backend in this repo?
255
+ ### Is this the active backend package in this repo?
274
256
 
275
257
  Yes. This package replaces the old Node/Express stack as the active backend surface.
276
258
 
@@ -288,7 +270,14 @@ Yes. Use `require_roles`, `has_required_roles`, and the authenticated-user depen
288
270
 
289
271
  ### What is the recommended validation path here?
290
272
 
291
- From the repository root: `make pytest`, `make lint`, `make typecheck`, and `make test`.
273
+ From the repository root: `make pytest`, `make lint`, `make typecheck`, `make pytest-cov`, and `make test`.
274
+
275
+ ## Metadata
276
+
277
+ - `package_name`: `spaps-server-quickstart`
278
+ - `latest_version`: `0.5.0`
279
+ - `minimum_runtime`: `Python >=3.12`
280
+ - `api_base_url`: `https://api.sweetpotato.dev`
292
281
 
293
282
  ## About Contributions
294
283
 
@@ -1,32 +1,25 @@
1
- # SPAPS Server Quickstart
1
+ # spaps-server-quickstart
2
2
 
3
- Reusable FastAPI, SQLAlchemy, Celery, auth, and operational scaffolding for Sweet Potato service backends. This is the active backend package in the repository and the shared foundation for SPAPS-aligned Python services.
3
+ Reusable FastAPI, SQLAlchemy, Celery, auth, and operational scaffolding for SPAPS-aligned Python services. This is the active backend package in this repository.
4
+
5
+ Examples in this README use placeholders such as `https://api.example.test` and local-only database URLs. Replace them with values from your own environment.
6
+
7
+ ## Install
4
8
 
5
9
  ```bash
6
10
  pip install spaps-server-quickstart
7
11
  ```
8
12
 
9
- ## TL;DR
10
-
11
- **The Problem**: new FastAPI services keep re-solving the same problems around app factories, auth middleware, RBAC, async database wiring, Celery bootstrapping, and deployment guardrails.
12
-
13
- **The Solution**: `spaps-server-quickstart` packages the shared SPAPS backend conventions into one installable Python package so new services start from a tested baseline instead of ad hoc scaffolding.
13
+ This package targets Python 3.12+.
14
14
 
15
- ### Why Use `spaps-server-quickstart`?
15
+ ## When It Fits
16
16
 
17
- | Feature | What it gives you |
17
+ | Need | Package gives you |
18
18
  | --- | --- |
19
- | App factory and startup checks | `create_app`, settings loaders, and environment validation |
20
- | Shared auth + RBAC | SPAPS auth middleware, auth channels, trusted-service middleware, and role dependencies |
21
- | Async data layer | SQLAlchemy 2.0 async helpers, migration runner, and session dependencies |
22
- | Operational templates | Deployment scripts, compose stubs, dev DB helpers, and packaging patterns |
23
-
24
- ## Metadata
25
-
26
- - `package_name`: `spaps-server-quickstart`
27
- - `latest_version`: `0.4.0`
28
- - `minimum_runtime`: `Python >=3.12`
29
- - `api_base_url`: `https://api.sweetpotato.dev`
19
+ | A real FastAPI starting point | `create_app`, settings loaders, request logging, and startup checks |
20
+ | Shared auth and RBAC | SPAPS auth middleware, auth channels, cookies, and role dependencies |
21
+ | Async database plumbing | SQLAlchemy 2 async session helpers and Alembic support |
22
+ | Operational scaffolding | Celery setup, deploy templates, local-mode helpers, and service SDK utilities |
30
23
 
31
24
  ## Quick Start
32
25
 
@@ -34,47 +27,59 @@ pip install spaps-server-quickstart
34
27
  from fastapi import APIRouter
35
28
 
36
29
  from spaps_server_quickstart import create_app
37
- from spaps_server_quickstart.settings import BaseServiceSettings
30
+ from spaps_server_quickstart.settings import (
31
+ BaseServiceSettings,
32
+ create_settings_loader,
33
+ )
38
34
 
39
35
 
40
- def load_settings() -> BaseServiceSettings:
41
- return BaseServiceSettings(env="test", app_name="README Quickstart")
36
+ class ExampleSettings(BaseServiceSettings):
37
+ app_name: str = "Example Service"
38
+ spaps_auth_enabled: bool = False
42
39
 
43
40
 
44
41
  router = APIRouter()
45
42
 
46
43
 
47
- @router.get("/hello")
48
- async def hello() -> dict[str, str]:
49
- return {"message": "Hello from SPAPS"}
44
+ @router.get("/health")
45
+ async def health() -> dict[str, bool]:
46
+ return {"ok": True}
50
47
 
51
48
 
52
- app = create_app(settings_loader=load_settings, api_router=router)
49
+ app = create_app(
50
+ settings_loader=create_settings_loader(ExampleSettings),
51
+ api_router=router,
52
+ )
53
53
  ```
54
54
 
55
- ## Design Principles
56
-
57
- 1. Start from a real service baseline, not a toy template.
58
- 2. Keep auth, middleware, and operational guardrails reusable across services.
59
- 3. Prefer explicit service composition through settings loaders and dependency injection.
60
- 4. Keep the local-development path close to production behavior.
61
- 5. Make the happy path easy without hiding the underlying FastAPI and SQLAlchemy primitives.
62
-
63
- ## What the Package Includes
55
+ ## What the Package Ships
64
56
 
65
57
  | Area | Highlights |
66
58
  | --- | --- |
67
- | App lifecycle | `create_app`, startup checks, environment validation, logging |
68
- | Auth | `SpapsAuthMiddleware`, auth cookies, auth channel service, local auth mode |
69
- | Routing and RBAC | Base router builder, role helpers, authenticated-user dependencies |
59
+ | App lifecycle | `create_app`, startup validation, logging, CORS wiring |
60
+ | Auth | `SpapsAuthMiddleware`, auth cookies, auth channel service, local mode |
61
+ | Routing and RBAC | Base router builder, authenticated-user dependencies, `require_roles`, `has_required_roles` |
70
62
  | Database | Async sessionmaker factory, migration runner, Alembic helpers |
71
63
  | Tasks | Celery app factory plus notification and ping task helpers |
72
- | Service SDK helpers | Admin token cache, server-side SPAPS clients, feature evaluation, trusted-service middleware |
73
- | Templates | Domain examples, operations bundle, env examples, and local dev helpers |
64
+ | Service SDK helpers | Admin token cache, server-side SPAPS clients, trusted-service middleware, feature evaluation |
65
+ | Templates | Domain examples, tests, deployment scaffolding, and local operations helpers |
66
+ | Reference contract | The `golden_path` app blueprint, seeded paid-access policy, and downstream runbook for the core auth -> billing -> entitlement -> access loop |
67
+
68
+ ## Golden App Pack
69
+
70
+ If you want one SPAPS-native reference contract instead of a blank scaffold, start with the `golden_path` blueprint.
71
+
72
+ It is the canonical pack for:
73
+
74
+ - browser auth and session bootstrap
75
+ - Stripe checkout or subscription flows
76
+ - entitlement projection into `paid_access`
77
+ - policy-gated access through the seeded `access-paid-features` rule
78
+ - an operator runbook under `docs/downstream_apps/golden-path-reference/`
74
79
 
75
80
  ## Local Development Mode
76
81
 
77
- Set `DEVELOPMENT_ENVIRONMENT=local` to enable the local-auth bypass workflow used in development and tests.
82
+ Set `DEVELOPMENT_ENVIRONMENT=local` to enable local auth bypass in development and tests.
78
83
 
79
84
  ```python
80
85
  from spaps_server_quickstart.local_mode import (
@@ -98,73 +103,49 @@ Default personas:
98
103
 
99
104
  ## Configuration
100
105
 
101
- Key settings exposed through `BaseServiceSettings` and related SPAPS settings:
106
+ Common settings exposed through `BaseServiceSettings`:
102
107
 
103
108
  | Setting | Purpose |
104
109
  | --- | --- |
105
110
  | `development_environment` | Enables local bypass mode when set to `local` |
111
+ | `spaps_auth_enabled` | Turns SPAPS auth middleware on or off |
106
112
  | `spaps_auth_exempt_paths` | Comma-separated paths that skip SPAPS auth |
107
113
  | `cors_allow_origins` | Shared CORS configuration |
108
- | `secure_messages_enabled` | Toggles secure-messaging gateway support |
109
- | `secure_messages_timeout` | HTTP timeout for secure-messaging calls |
114
+ | `database_url` | Async SQLAlchemy database URL |
115
+ | `redis_url` | Redis URL used by Celery defaults |
116
+ | `secure_messages_enabled` | Enables secure-messaging gateway support |
110
117
 
111
118
  Example environment:
112
119
 
113
120
  ```bash
114
121
  DEVELOPMENT_ENVIRONMENT=local
122
+ SPAPS_API_URL=https://api.example.test
123
+ SPAPS_API_KEY=spaps_sec_example
124
+ DATABASE_URL=postgresql+asyncpg://postgres:postgres@localhost:5432/service
115
125
  SPAPS_AUTH_EXEMPT_PATHS=/health,/docs
116
126
  CORS_ALLOW_ORIGINS=http://localhost:3000,http://localhost:5173
117
127
  ```
118
128
 
119
- ## Operational Templates
120
-
121
- The package ships with templates and scripts for the workflows the real SPAPS services use:
122
-
123
- - Docker Compose and reverse-proxy stubs
124
- - Deploy scripts with preflight and post-deploy checks
125
- - Database backup, restore, and migration helpers
126
- - Shared dev DB helpers and local debug-loop support
127
- - Example domains and tests for bootstrapping new services
128
-
129
- ## Architecture
130
-
131
- ```text
132
- FastAPI service
133
- |
134
- +--> create_app + settings loader
135
- |
136
- +--> auth middleware / RBAC / dependencies
137
- |
138
- +--> async DB session + Alembic helpers
139
- |
140
- +--> Celery tasks + service SDK helpers
141
- |
142
- +--> shared operational templates
143
- |
144
- v
145
- SPAPS-aligned production service
146
- ```
147
-
148
- ## Validation and Development
129
+ ## Validation
149
130
 
150
- When working in this repository, the root `Makefile` is the canonical workflow:
131
+ From the repository root, the `Makefile` is the canonical workflow:
151
132
 
152
133
  ```bash
153
134
  make install
154
135
  make pytest
155
136
  make lint
156
137
  make typecheck
138
+ make pytest-cov
157
139
  make test
158
- make local-up
159
140
  ```
160
141
 
161
142
  Useful additional commands:
162
143
 
163
144
  ```bash
164
145
  make pytest-full
165
- make pytest-cov
166
146
  make migrate
167
147
  make new-migration MSG="add_example_table"
148
+ make local-up
168
149
  ```
169
150
 
170
151
  ## Troubleshooting
@@ -175,29 +156,29 @@ That is expected when testmon sees no impacted tests. Use `make pytest-full` whe
175
156
 
176
157
  ### Local auth bypass is not active
177
158
 
178
- Confirm `DEVELOPMENT_ENVIRONMENT=local` is set before application startup.
159
+ Confirm `DEVELOPMENT_ENVIRONMENT=local` is set before application startup and that `LocalAuthMiddleware` is wired into the app.
179
160
 
180
161
  ### Unauthenticated routes still require auth
181
162
 
182
- Check `spaps_auth_exempt_paths` and make sure the configured paths match the actual router paths.
163
+ Check `spaps_auth_exempt_paths` and make sure the configured paths match the router paths exactly.
183
164
 
184
165
  ### Startup fails on environment validation
185
166
 
186
- Review the required settings and any environment-safety checks triggered during startup validation.
167
+ Review the required settings and any safety checks triggered during startup.
187
168
 
188
169
  ### I need a new service quickly
189
170
 
190
- Start from the included templates and keep the repo-root validation path intact while adapting the service-specific settings.
171
+ Start from the included templates, then keep the repo-root validation path intact while adapting domain code and settings.
191
172
 
192
173
  ## Limitations
193
174
 
194
- - This package is a scaffold, not a complete application by itself.
195
- - Downstream services still need their own domain routers, schemas, repositories, and deployment configuration.
196
- - Some operational templates intentionally require environment-specific edits before production use.
175
+ - This package is a scaffold, not a finished application.
176
+ - Downstream services still need their own routers, schemas, repositories, and deployment settings.
177
+ - Some operational templates intentionally need environment-specific edits before production use.
197
178
 
198
179
  ## FAQ
199
180
 
200
- ### Is this the active SPAPS backend in this repo?
181
+ ### Is this the active backend package in this repo?
201
182
 
202
183
  Yes. This package replaces the old Node/Express stack as the active backend surface.
203
184
 
@@ -215,7 +196,14 @@ Yes. Use `require_roles`, `has_required_roles`, and the authenticated-user depen
215
196
 
216
197
  ### What is the recommended validation path here?
217
198
 
218
- From the repository root: `make pytest`, `make lint`, `make typecheck`, and `make test`.
199
+ From the repository root: `make pytest`, `make lint`, `make typecheck`, `make pytest-cov`, and `make test`.
200
+
201
+ ## Metadata
202
+
203
+ - `package_name`: `spaps-server-quickstart`
204
+ - `latest_version`: `0.5.0`
205
+ - `minimum_runtime`: `Python >=3.12`
206
+ - `api_base_url`: `https://api.sweetpotato.dev`
219
207
 
220
208
  ## About Contributions
221
209
 
@@ -222,7 +222,7 @@ the structure expected by downstream dependencies like `require_roles` and `requ
222
222
  - Log into ghcr.io using `GHCR_DEPLOY_USER` / `GHCR_DEPLOY_TOKEN` secrets.
223
223
  - Pull the commit-tagged image and restart the app (or compose stack) with `SPAPS_IMAGE=<image:tag>` set in the environment.
224
224
  - Refresh `/opt/sweet-potato/deploy/reverse-proxy` so the shared proxy reloads certificates and vhosts.
225
- 6. Document these steps in the service README so operators can redeploy from GHCR without rebuilding locally (see `sweet-potato/deploy/production-checklist.md` for reference).
225
+ 6. Document these steps in the service README so operators can redeploy from GHCR without rebuilding locally.
226
226
 
227
227
  ## 13. Alembic & CI/CD Templates
228
228
 
@@ -49,7 +49,6 @@ This checklist ensures the email environment safety implementation is complete a
49
49
  ### ✅ Documentation
50
50
 
51
51
  - [x] Created `docs/TM-ENV-001-email-environment-safety.md` (comprehensive threat model doc)
52
- - [x] Created `docs/TM-ENV-001-summary.md` (implementation summary)
53
52
  - [x] Created `docs/TM-ENV-001-checklist.md` (this file)
54
53
 
55
54
  ### ✅ Code Search
@@ -8,6 +8,7 @@ Only slice folders under this directory should be treated as tracked feature pla
8
8
 
9
9
  | Status | Slice | Scope | Notes |
10
10
  | --- | --- | --- | --- |
11
+ | PLANNED | [trust-invariants-kernel](./trust-invariants-kernel/README.md) | Request principal, scope rules, secret redaction, and truthful JSON contract enforcement in the active FastAPI runtime | Narrow follow-on slice that supersedes the "already compliant" trust-boundary assumptions in `security-audit-remediation-2026q1`. |
11
12
  | DONE | [security-audit-remediation-2026q1](./security-audit-remediation-2026q1/README.md) | `TM-002`, `TM-007`, `TM-008`, `TM-009`, `TM-010`, `TM-011`, `TM-013` | Audit-validated in `AUDIT_REPORT.md`; implemented in the active Python/FastAPI runtime. |
12
13
 
13
14
  ## Notes
@@ -0,0 +1,38 @@
1
+ # Trust Invariants Kernel Plan
2
+
3
+ This folder contains a domain-planner style slice for consolidating trust-boundary rules in the active SPAPS Python runtime.
4
+
5
+ ## Scope
6
+
7
+ - Active stack only: `packages/python-server-quickstart/` (FastAPI/Python)
8
+ - Explicitly out of scope: deprecated Node/Express runtime under `src/`
9
+ - Focus: one request principal, one set of scope rules, one secret-exposure policy, and one truthful JSON contract model
10
+
11
+ ## Why This Slice Exists
12
+
13
+ The previous security remediation slice marked several trust-model items as complete, but the live code still allows drift between:
14
+
15
+ - API key rotation and API key validation
16
+ - route-level scope intent and repository filtering
17
+ - secret-bearing models and normal read responses
18
+ - runtime JSON envelopes and generated OpenAPI/client contracts
19
+ - trusted proxy IP resolution and rate-limit identity
20
+
21
+ This slice addresses that drift by introducing an executable kernel instead of more one-off fixes.
22
+
23
+ ## Plan Artifacts
24
+
25
+ - `plan.md`: strategy, landscape, user stories, and tradeoffs
26
+ - `shared.md`: locked contract deltas and runtime trust contract
27
+ - `backend.md`: backend rules, migrations, and TDD matrix
28
+ - `frontend.md`: API-only downstream consumer impact
29
+ - `flows.md`: critical request, rotation, and redaction flows
30
+ - `schema.mmd`: conceptual ERD for trust-boundary entities
31
+
32
+ ## Suggested Execution Order
33
+
34
+ 1. Principal and proxy-trust kernel
35
+ 2. Scope-rule consolidation for audit and security surfaces
36
+ 3. Secret write-only policy for webhook and credential surfaces
37
+ 4. Truthful envelope/OpenAPI/manifest contract alignment
38
+ 5. Describe packets for each implementation wave