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.
- {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/.gitignore +14 -0
- {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/CHANGELOG.md +12 -0
- {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/PKG-INFO +77 -88
- {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/README.md +75 -87
- {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/docs/MIGRATION_GUIDE.md +1 -1
- {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/docs/TM-ENV-001-checklist.md +0 -1
- {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/docs/feature-plans/INDEX.md +1 -0
- spaps_server_quickstart-0.5.1/docs/feature-plans/trust-invariants-kernel/README.md +38 -0
- spaps_server_quickstart-0.5.1/docs/feature-plans/trust-invariants-kernel/backend.md +149 -0
- spaps_server_quickstart-0.5.1/docs/feature-plans/trust-invariants-kernel/describe-wave-1-principal-proxy-reuse.md +79 -0
- spaps_server_quickstart-0.5.1/docs/feature-plans/trust-invariants-kernel/flows.md +60 -0
- spaps_server_quickstart-0.5.1/docs/feature-plans/trust-invariants-kernel/frontend.md +34 -0
- spaps_server_quickstart-0.5.1/docs/feature-plans/trust-invariants-kernel/plan.md +202 -0
- spaps_server_quickstart-0.5.1/docs/feature-plans/trust-invariants-kernel/schema.mmd +61 -0
- spaps_server_quickstart-0.5.1/docs/feature-plans/trust-invariants-kernel/shared.md +120 -0
- {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/docs/security-audit-remediation-2026q1-tm007-tm008.md +6 -2
- {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/pyproject.toml +2 -1
- {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/src/spaps_server_quickstart/__init__.py +1 -1
- {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/src/spaps_server_quickstart/api/domains/health_router.py +1 -1
- {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/src/spaps_server_quickstart/app_factory.py +2 -0
- {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/src/spaps_server_quickstart/auth/__init__.py +13 -10
- spaps_server_quickstart-0.5.1/src/spaps_server_quickstart/domains/_db/model_registry.py +37 -0
- {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/src/spaps_server_quickstart/domains/affiliate_referrals/repository.py +4 -0
- {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/src/spaps_server_quickstart/domains/affiliate_referrals/router.py +6 -1
- {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/src/spaps_server_quickstart/domains/affiliate_referrals/service.py +34 -1
- {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/src/spaps_server_quickstart/domains/agent_approvals/router.py +2 -1
- {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/src/spaps_server_quickstart/domains/agent_approvals/schemas.py +24 -0
- {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/src/spaps_server_quickstart/domains/agent_approvals/service.py +35 -17
- spaps_server_quickstart-0.5.1/src/spaps_server_quickstart/domains/applications/blueprints.py +563 -0
- {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/src/spaps_server_quickstart/domains/applications/models.py +6 -0
- {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/src/spaps_server_quickstart/domains/applications/repository.py +2 -1
- {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/src/spaps_server_quickstart/domains/applications/router.py +2 -0
- {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/src/spaps_server_quickstart/domains/applications/schemas.py +2 -0
- {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/src/spaps_server_quickstart/domains/applications/service.py +23 -4
- {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/src/spaps_server_quickstart/domains/audit/router.py +8 -4
- {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/src/spaps_server_quickstart/domains/audit/service.py +13 -2
- {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/src/spaps_server_quickstart/domains/auth/repository.py +7 -1
- {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/src/spaps_server_quickstart/domains/auth/router.py +94 -13
- {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/src/spaps_server_quickstart/domains/auth/schemas.py +5 -5
- {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/src/spaps_server_quickstart/domains/auth/service.py +52 -21
- spaps_server_quickstart-0.5.1/src/spaps_server_quickstart/domains/billing_accounts/__init__.py +5 -0
- spaps_server_quickstart-0.5.1/src/spaps_server_quickstart/domains/billing_accounts/models.py +55 -0
- spaps_server_quickstart-0.5.1/src/spaps_server_quickstart/domains/billing_accounts/repository.py +110 -0
- spaps_server_quickstart-0.5.1/src/spaps_server_quickstart/domains/billing_accounts/resolver.py +272 -0
- {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/src/spaps_server_quickstart/domains/cfo/router.py +6 -2
- {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/src/spaps_server_quickstart/domains/cfo/schemas.py +3 -0
- {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/src/spaps_server_quickstart/domains/cfo/service.py +40 -5
- {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/src/spaps_server_quickstart/domains/dayrate/repository.py +85 -0
- {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/src/spaps_server_quickstart/domains/dayrate/router.py +82 -11
- {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/src/spaps_server_quickstart/domains/dayrate/schemas.py +49 -2
- {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/src/spaps_server_quickstart/domains/dayrate/service.py +201 -37
- {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/src/spaps_server_quickstart/domains/device_flow/router.py +2 -0
- {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/src/spaps_server_quickstart/domains/device_flow/service.py +7 -2
- spaps_server_quickstart-0.5.1/src/spaps_server_quickstart/domains/docs/discovery.py +50 -0
- {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/src/spaps_server_quickstart/domains/docs/repository.py +29 -0
- {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/src/spaps_server_quickstart/domains/docs/router.py +30 -0
- {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/src/spaps_server_quickstart/domains/docs/schemas.py +43 -0
- {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/src/spaps_server_quickstart/domains/docs/service.py +40 -19
- {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/src/spaps_server_quickstart/domains/email/router.py +21 -8
- {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/src/spaps_server_quickstart/domains/email/service.py +16 -3
- {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/src/spaps_server_quickstart/domains/entitlements/repository.py +26 -0
- {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/src/spaps_server_quickstart/domains/entitlements/router.py +9 -1
- {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/src/spaps_server_quickstart/domains/entitlements/service.py +78 -9
- {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/src/spaps_server_quickstart/domains/issue_reporting_platform/errors.py +6 -0
- {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/src/spaps_server_quickstart/domains/issue_reporting_platform/models.py +11 -2
- {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/src/spaps_server_quickstart/domains/issue_reporting_platform/repository.py +26 -1
- {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/src/spaps_server_quickstart/domains/issue_reporting_platform/router.py +61 -0
- {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/src/spaps_server_quickstart/domains/issue_reporting_platform/schemas.py +13 -0
- spaps_server_quickstart-0.5.1/src/spaps_server_quickstart/domains/issue_reporting_platform/service.py +884 -0
- spaps_server_quickstart-0.5.1/src/spaps_server_quickstart/domains/policies/__init__.py +1 -0
- spaps_server_quickstart-0.5.1/src/spaps_server_quickstart/domains/policies/errors.py +25 -0
- spaps_server_quickstart-0.5.1/src/spaps_server_quickstart/domains/policies/evaluator.py +415 -0
- spaps_server_quickstart-0.5.1/src/spaps_server_quickstart/domains/policies/models.py +115 -0
- spaps_server_quickstart-0.5.1/src/spaps_server_quickstart/domains/policies/repository.py +138 -0
- spaps_server_quickstart-0.5.1/src/spaps_server_quickstart/domains/policies/router.py +198 -0
- spaps_server_quickstart-0.5.1/src/spaps_server_quickstart/domains/policies/schemas.py +124 -0
- spaps_server_quickstart-0.5.1/src/spaps_server_quickstart/domains/policies/service.py +323 -0
- spaps_server_quickstart-0.5.1/src/spaps_server_quickstart/domains/redirects.py +145 -0
- {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/src/spaps_server_quickstart/domains/security/models.py +5 -0
- {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/src/spaps_server_quickstart/domains/security/repository.py +18 -4
- {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/src/spaps_server_quickstart/domains/security/router.py +2 -0
- {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/src/spaps_server_quickstart/domains/security/service.py +14 -1
- {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/src/spaps_server_quickstart/domains/self_service/router.py +14 -9
- {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/src/spaps_server_quickstart/domains/self_service/schemas.py +2 -0
- {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/src/spaps_server_quickstart/domains/self_service/service.py +25 -5
- {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/src/spaps_server_quickstart/domains/sessions/admin_detection.py +2 -0
- {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/src/spaps_server_quickstart/domains/sessions/blacklist_service.py +58 -36
- {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/src/spaps_server_quickstart/domains/sessions/password_service.py +11 -0
- {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/src/spaps_server_quickstart/domains/stripe/guest_checkout.py +27 -24
- {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/src/spaps_server_quickstart/domains/stripe/models.py +3 -0
- {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/src/spaps_server_quickstart/domains/stripe/repository.py +40 -3
- {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/src/spaps_server_quickstart/domains/stripe/router.py +78 -7
- {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/src/spaps_server_quickstart/domains/stripe/schemas.py +64 -5
- {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/src/spaps_server_quickstart/domains/stripe/service.py +179 -51
- spaps_server_quickstart-0.5.1/src/spaps_server_quickstart/domains/stripe/webhook_handler.py +561 -0
- {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/src/spaps_server_quickstart/domains/support_telemetry_platform/router.py +1 -0
- {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/src/spaps_server_quickstart/domains/support_telemetry_platform/service.py +7 -5
- {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/src/spaps_server_quickstart/domains/wallets/router.py +33 -39
- {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/src/spaps_server_quickstart/domains/wallets/schemas.py +0 -2
- {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/src/spaps_server_quickstart/domains/wallets/service.py +3 -2
- {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/src/spaps_server_quickstart/domains/webhooks/delivery.py +34 -16
- {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/src/spaps_server_quickstart/domains/webhooks/destination_security.py +6 -0
- {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/src/spaps_server_quickstart/domains/webhooks/errors.py +7 -0
- {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/src/spaps_server_quickstart/domains/webhooks/schemas.py +1 -1
- {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/src/spaps_server_quickstart/domains/webhooks/service.py +27 -10
- {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/src/spaps_server_quickstart/domains/webhooks/signing.py +49 -0
- {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/src/spaps_server_quickstart/domains/whitelist/models.py +1 -1
- {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/src/spaps_server_quickstart/domains/whitelist/repository.py +2 -2
- {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/src/spaps_server_quickstart/domains/whitelist/router.py +36 -17
- {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/src/spaps_server_quickstart/domains/whitelist/schemas.py +1 -1
- {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/src/spaps_server_quickstart/domains/whitelist/service.py +1 -1
- {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/src/spaps_server_quickstart/logging.py +14 -1
- {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/src/spaps_server_quickstart/middleware/api_key.py +47 -32
- spaps_server_quickstart-0.5.1/src/spaps_server_quickstart/middleware/client_ip.py +91 -0
- spaps_server_quickstart-0.5.1/src/spaps_server_quickstart/middleware/envelope.py +169 -0
- spaps_server_quickstart-0.5.1/src/spaps_server_quickstart/middleware/key_scope.py +169 -0
- spaps_server_quickstart-0.5.1/src/spaps_server_quickstart/middleware/origin_validation.py +135 -0
- {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/src/spaps_server_quickstart/middleware/rate_limiting.py +113 -29
- {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/src/spaps_server_quickstart/middleware/spaps_deps.py +84 -13
- {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/src/spaps_server_quickstart/settings.py +1 -0
- {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/src/spaps_server_quickstart/spaps_app.py +87 -3
- {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/src/spaps_server_quickstart/spaps_settings.py +11 -1
- {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/src/spaps_server_quickstart/startup.py +31 -0
- spaps_server_quickstart-0.5.1/tests/conftest.py +45 -0
- spaps_server_quickstart-0.5.1/tests/contracts/test_golden_app_pack.py +126 -0
- {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/tests/domains/affiliate_referrals/test_router.py +170 -1
- {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/tests/domains/affiliate_referrals/test_service.py +26 -0
- spaps_server_quickstart-0.5.1/tests/domains/agent_approvals/test_callback_url_validation.py +283 -0
- {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/tests/domains/agent_approvals/test_router.py +11 -14
- {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/tests/domains/agent_approvals/test_service.py +55 -14
- {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/tests/domains/applications/test_repository.py +27 -1
- {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/tests/domains/applications/test_router.py +259 -0
- {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/tests/domains/audit/test_router.py +12 -3
- {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/tests/domains/audit/test_service.py +45 -3
- {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/tests/domains/auth/test_repository.py +37 -0
- {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/tests/domains/auth/test_router.py +193 -0
- {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/tests/domains/auth/test_service.py +287 -2
- spaps_server_quickstart-0.5.1/tests/domains/billing_accounts/test_repository.py +251 -0
- spaps_server_quickstart-0.5.1/tests/domains/billing_accounts/test_resolver.py +211 -0
- {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/tests/domains/cfo/test_router.py +10 -0
- {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/tests/domains/cfo/test_service.py +81 -5
- {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/tests/domains/dayrate/test_enhanced_booking_service.py +113 -0
- {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/tests/domains/dayrate/test_repository.py +126 -0
- {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/tests/domains/dayrate/test_router.py +388 -17
- {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/tests/domains/dayrate/test_service.py +248 -30
- {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/tests/domains/device_flow/test_router.py +7 -1
- {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/tests/domains/device_flow/test_service.py +48 -0
- {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/tests/domains/docs/test_repository.py +41 -0
- {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/tests/domains/docs/test_router.py +67 -1
- {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/tests/domains/docs/test_service.py +64 -4
- {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/tests/domains/email/test_router.py +87 -6
- {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/tests/domains/email/test_service.py +95 -10
- {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/tests/domains/entitlements/test_router.py +51 -0
- {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/tests/domains/entitlements/test_service.py +53 -4
- {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/tests/domains/issue_reporting_platform/test_router.py +163 -2
- spaps_server_quickstart-0.5.1/tests/domains/issue_reporting_platform/test_service.py +813 -0
- spaps_server_quickstart-0.5.1/tests/domains/policies/test_evaluator.py +375 -0
- spaps_server_quickstart-0.5.1/tests/domains/policies/test_router.py +78 -0
- spaps_server_quickstart-0.5.1/tests/domains/policies/test_service.py +324 -0
- {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/tests/domains/security/test_repository.py +84 -7
- {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/tests/domains/security/test_router.py +44 -1
- {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/tests/domains/security/test_service.py +20 -6
- {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/tests/domains/self_service/test_router.py +141 -26
- {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/tests/domains/stripe/test_guest_checkout.py +221 -73
- {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/tests/domains/stripe/test_repository.py +29 -3
- {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/tests/domains/stripe/test_router.py +370 -6
- {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/tests/domains/stripe/test_service.py +294 -28
- {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/tests/domains/stripe/test_webhook_handler.py +348 -39
- spaps_server_quickstart-0.5.1/tests/domains/stripe/test_webhook_hardening.py +336 -0
- {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/tests/domains/support_telemetry_platform/test_router.py +2 -0
- {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/tests/domains/support_telemetry_platform/test_service.py +5 -2
- spaps_server_quickstart-0.5.1/tests/domains/wallets/test_legacy_routes_tenant_binding.py +82 -0
- {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/tests/domains/wallets/test_router.py +12 -15
- {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/tests/domains/webhooks/test_delivery.py +97 -0
- {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/tests/domains/webhooks/test_router.py +16 -6
- {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/tests/domains/webhooks/test_service.py +145 -58
- {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/tests/domains/whitelist/test_repository.py +1 -1
- {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/tests/domains/whitelist/test_router.py +70 -3
- spaps_server_quickstart-0.5.1/tests/middleware/__init__.py +0 -0
- {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/tests/middleware/test_api_key.py +34 -3
- spaps_server_quickstart-0.5.1/tests/middleware/test_client_ip.py +89 -0
- spaps_server_quickstart-0.5.1/tests/middleware/test_envelope.py +115 -0
- spaps_server_quickstart-0.5.1/tests/middleware/test_key_scope.py +234 -0
- {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/tests/middleware/test_origin_validation.py +27 -5
- {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/tests/middleware/test_rate_limiting.py +108 -10
- {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/tests/middleware/test_spaps_deps.py +173 -4
- spaps_server_quickstart-0.5.1/tests/test_alembic_path_bootstrap.py +66 -0
- {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/tests/test_auth.py +89 -16
- {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/tests/test_environment_safety.py +15 -0
- {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/tests/test_sessions_blacklist.py +97 -7
- spaps_server_quickstart-0.5.1/tests/test_spaps_app.py +79 -0
- {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/tests/test_startup_validation.py +27 -0
- spaps_server_quickstart-0.5.0/docs/TM-ENV-001-summary.md +0 -177
- spaps_server_quickstart-0.5.0/src/spaps_server_quickstart/domains/issue_reporting_platform/service.py +0 -409
- spaps_server_quickstart-0.5.0/src/spaps_server_quickstart/domains/stripe/webhook_handler.py +0 -366
- spaps_server_quickstart-0.5.0/src/spaps_server_quickstart/middleware/envelope.py +0 -129
- spaps_server_quickstart-0.5.0/src/spaps_server_quickstart/middleware/key_scope.py +0 -82
- spaps_server_quickstart-0.5.0/src/spaps_server_quickstart/middleware/origin_validation.py +0 -83
- spaps_server_quickstart-0.5.0/tests/conftest.py +0 -9
- spaps_server_quickstart-0.5.0/tests/domains/issue_reporting_platform/test_service.py +0 -369
- spaps_server_quickstart-0.5.0/tests/middleware/test_key_scope.py +0 -110
- {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/.python-version +0 -0
- {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/TM-002-IMPLEMENTATION.md +0 -0
- {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/docs/TDD_PLAN.md +0 -0
- {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/docs/TM-ENV-001-email-environment-safety.md +0 -0
- {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/docs/UPGRADING.md +0 -0
- {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/docs/feature-plans/_archived/diff-mvp-plan.md +0 -0
- {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/docs/feature-plans/security-audit-remediation-2026q1/AUDIT_REPORT.md +0 -0
- {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/docs/feature-plans/security-audit-remediation-2026q1/README.md +0 -0
- {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/docs/feature-plans/security-audit-remediation-2026q1/backend.md +0 -0
- {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/docs/feature-plans/security-audit-remediation-2026q1/flows.md +0 -0
- {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/docs/feature-plans/security-audit-remediation-2026q1/frontend.md +0 -0
- {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/docs/feature-plans/security-audit-remediation-2026q1/plan.md +0 -0
- {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/docs/feature-plans/security-audit-remediation-2026q1/schema.mmd +0 -0
- {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/docs/feature-plans/security-audit-remediation-2026q1/shared.md +0 -0
- {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/docs/messaging-broker-plan.md +0 -0
- {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/scripts/release.sh +0 -0
- {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/src/spaps_server_quickstart/alembic/__init__.py +0 -0
- {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/src/spaps_server_quickstart/alembic/naming.py +0 -0
- {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/src/spaps_server_quickstart/api/__init__.py +0 -0
- {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/src/spaps_server_quickstart/api/dependencies.py +0 -0
- {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/src/spaps_server_quickstart/api/domains/__init__.py +0 -0
- {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/src/spaps_server_quickstart/api/domains/metrics_router.py +0 -0
- {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/src/spaps_server_quickstart/api/health.py +0 -0
- {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/src/spaps_server_quickstart/api/router.py +0 -0
- {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/src/spaps_server_quickstart/auth/cookies.py +0 -0
- {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/src/spaps_server_quickstart/auth/dependencies.py +0 -0
- {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/src/spaps_server_quickstart/auth_channels.py +0 -0
- {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/src/spaps_server_quickstart/db/__init__.py +0 -0
- {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/src/spaps_server_quickstart/db/alembic_status.py +0 -0
- {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/src/spaps_server_quickstart/db/migration_runner.py +0 -0
- {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/src/spaps_server_quickstart/db/session.py +0 -0
- {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/src/spaps_server_quickstart/domains/__init__.py +0 -0
- {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/src/spaps_server_quickstart/domains/_db/__init__.py +0 -0
- {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/src/spaps_server_quickstart/domains/_db/base.py +0 -0
- {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/src/spaps_server_quickstart/domains/_db/rls.py +0 -0
- {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/src/spaps_server_quickstart/domains/_db/types.py +0 -0
- {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/src/spaps_server_quickstart/domains/affiliate_referrals/__init__.py +0 -0
- {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/src/spaps_server_quickstart/domains/affiliate_referrals/errors.py +0 -0
- {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/src/spaps_server_quickstart/domains/affiliate_referrals/models.py +0 -0
- {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/src/spaps_server_quickstart/domains/affiliate_referrals/schemas.py +0 -0
- {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/src/spaps_server_quickstart/domains/agent_approvals/__init__.py +0 -0
- {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/src/spaps_server_quickstart/domains/agent_approvals/errors.py +0 -0
- {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/src/spaps_server_quickstart/domains/agent_approvals/models.py +0 -0
- {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/src/spaps_server_quickstart/domains/agent_approvals/repository.py +0 -0
- {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/src/spaps_server_quickstart/domains/applications/__init__.py +0 -0
- {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
- {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
- {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
- {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
- {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
- {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
- {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
- {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/src/spaps_server_quickstart/domains/audit/__init__.py +0 -0
- {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/src/spaps_server_quickstart/domains/audit/errors.py +0 -0
- {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/src/spaps_server_quickstart/domains/audit/models.py +0 -0
- {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/src/spaps_server_quickstart/domains/audit/repository.py +0 -0
- {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/src/spaps_server_quickstart/domains/audit/retention.py +0 -0
- {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/src/spaps_server_quickstart/domains/audit/schemas.py +0 -0
- {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/src/spaps_server_quickstart/domains/auth/__init__.py +0 -0
- {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/src/spaps_server_quickstart/domains/cfo/__init__.py +0 -0
- {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/src/spaps_server_quickstart/domains/cfo/errors.py +0 -0
- {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/src/spaps_server_quickstart/domains/cfo/models.py +0 -0
- {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/src/spaps_server_quickstart/domains/cfo/quickbooks.py +0 -0
- {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/src/spaps_server_quickstart/domains/cfo/repository.py +0 -0
- {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/src/spaps_server_quickstart/domains/cfo_roles/__init__.py +0 -0
- {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/src/spaps_server_quickstart/domains/cfo_roles/deps.py +0 -0
- {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/src/spaps_server_quickstart/domains/cfo_roles/errors.py +0 -0
- {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/src/spaps_server_quickstart/domains/cfo_roles/me_router.py +0 -0
- {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/src/spaps_server_quickstart/domains/cfo_roles/router.py +0 -0
- {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/src/spaps_server_quickstart/domains/cfo_roles/schemas.py +0 -0
- {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/src/spaps_server_quickstart/domains/cfo_roles/service.py +0 -0
- {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/src/spaps_server_quickstart/domains/crypto/__init__.py +0 -0
- {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/src/spaps_server_quickstart/domains/crypto/errors.py +0 -0
- {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/src/spaps_server_quickstart/domains/crypto/models.py +0 -0
- {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/src/spaps_server_quickstart/domains/crypto/repository.py +0 -0
- {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/src/spaps_server_quickstart/domains/crypto/router.py +0 -0
- {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/src/spaps_server_quickstart/domains/crypto/schemas.py +0 -0
- {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/src/spaps_server_quickstart/domains/crypto/service.py +0 -0
- {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/src/spaps_server_quickstart/domains/dayrate/__init__.py +0 -0
- {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/src/spaps_server_quickstart/domains/dayrate/errors.py +0 -0
- {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/src/spaps_server_quickstart/domains/dayrate/models.py +0 -0
- {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/src/spaps_server_quickstart/domains/dayrate/pricing.py +0 -0
- {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/src/spaps_server_quickstart/domains/device_flow/__init__.py +0 -0
- {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/src/spaps_server_quickstart/domains/device_flow/repository.py +0 -0
- {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/src/spaps_server_quickstart/domains/device_flow/schemas.py +0 -0
- {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/src/spaps_server_quickstart/domains/device_flow/store.py +0 -0
- {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/src/spaps_server_quickstart/domains/docs/__init__.py +0 -0
- {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/src/spaps_server_quickstart/domains/docs/errors.py +0 -0
- {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/src/spaps_server_quickstart/domains/docs/models.py +0 -0
- {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/src/spaps_server_quickstart/domains/email/__init__.py +0 -0
- {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/src/spaps_server_quickstart/domains/email/config.py +0 -0
- {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/src/spaps_server_quickstart/domains/email/errors.py +0 -0
- {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/src/spaps_server_quickstart/domains/email/mailgun.py +0 -0
- {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/src/spaps_server_quickstart/domains/email/models.py +0 -0
- {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/src/spaps_server_quickstart/domains/email/repository.py +0 -0
- {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/src/spaps_server_quickstart/domains/email/schemas.py +0 -0
- {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/src/spaps_server_quickstart/domains/entitlements/__init__.py +0 -0
- {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/src/spaps_server_quickstart/domains/entitlements/errors.py +0 -0
- {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/src/spaps_server_quickstart/domains/entitlements/models.py +0 -0
- {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/src/spaps_server_quickstart/domains/entitlements/schemas.py +0 -0
- {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/src/spaps_server_quickstart/domains/errors.py +0 -0
- {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/src/spaps_server_quickstart/domains/events.py +0 -0
- {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/src/spaps_server_quickstart/domains/issue_reporting_platform/__init__.py +0 -0
- {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/src/spaps_server_quickstart/domains/secure_messages/__init__.py +0 -0
- {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/src/spaps_server_quickstart/domains/secure_messages/encryption.py +0 -0
- {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/src/spaps_server_quickstart/domains/secure_messages/errors.py +0 -0
- {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/src/spaps_server_quickstart/domains/secure_messages/models.py +0 -0
- {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/src/spaps_server_quickstart/domains/secure_messages/repository.py +0 -0
- {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/src/spaps_server_quickstart/domains/secure_messages/router.py +0 -0
- {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/src/spaps_server_quickstart/domains/secure_messages/schemas.py +0 -0
- {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/src/spaps_server_quickstart/domains/secure_messages/service.py +0 -0
- {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/src/spaps_server_quickstart/domains/security/__init__.py +0 -0
- {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/src/spaps_server_quickstart/domains/security/errors.py +0 -0
- {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/src/spaps_server_quickstart/domains/security/schemas.py +0 -0
- {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/src/spaps_server_quickstart/domains/self_service/__init__.py +0 -0
- {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/src/spaps_server_quickstart/domains/self_service/errors.py +0 -0
- {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/src/spaps_server_quickstart/domains/sessions/__init__.py +0 -0
- {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/src/spaps_server_quickstart/domains/sessions/jwt_service.py +0 -0
- {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/src/spaps_server_quickstart/domains/sessions/models.py +0 -0
- {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/src/spaps_server_quickstart/domains/sessions/nonce_service.py +0 -0
- {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/src/spaps_server_quickstart/domains/sessions/repository.py +0 -0
- {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/src/spaps_server_quickstart/domains/sessions/router.py +0 -0
- {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/src/spaps_server_quickstart/domains/sessions/schemas.py +0 -0
- {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/src/spaps_server_quickstart/domains/sessions/service.py +0 -0
- {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/src/spaps_server_quickstart/domains/stripe/__init__.py +0 -0
- {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/src/spaps_server_quickstart/domains/stripe/errors.py +0 -0
- {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/src/spaps_server_quickstart/domains/support_telemetry_platform/__init__.py +0 -0
- {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/src/spaps_server_quickstart/domains/support_telemetry_platform/errors.py +0 -0
- {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/src/spaps_server_quickstart/domains/support_telemetry_platform/models.py +0 -0
- {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/src/spaps_server_quickstart/domains/support_telemetry_platform/repository.py +0 -0
- {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/src/spaps_server_quickstart/domains/support_telemetry_platform/schemas.py +0 -0
- {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/src/spaps_server_quickstart/domains/users/__init__.py +0 -0
- {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/src/spaps_server_quickstart/domains/users/models.py +0 -0
- {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/src/spaps_server_quickstart/domains/users/repository.py +0 -0
- {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/src/spaps_server_quickstart/domains/users/router.py +0 -0
- {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/src/spaps_server_quickstart/domains/users/schemas.py +0 -0
- {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/src/spaps_server_quickstart/domains/users/service.py +0 -0
- {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/src/spaps_server_quickstart/domains/wallets/__init__.py +0 -0
- {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/src/spaps_server_quickstart/domains/wallets/chains/__init__.py +0 -0
- {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/src/spaps_server_quickstart/domains/wallets/chains/dispatcher.py +0 -0
- {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/src/spaps_server_quickstart/domains/wallets/chains/ethereum.py +0 -0
- {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/src/spaps_server_quickstart/domains/wallets/chains/solana.py +0 -0
- {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/src/spaps_server_quickstart/domains/wallets/models.py +0 -0
- {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/src/spaps_server_quickstart/domains/wallets/repository.py +0 -0
- {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/src/spaps_server_quickstart/domains/webhooks/__init__.py +0 -0
- {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/src/spaps_server_quickstart/domains/webhooks/models.py +0 -0
- {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/src/spaps_server_quickstart/domains/webhooks/repository.py +0 -0
- {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/src/spaps_server_quickstart/domains/webhooks/router.py +0 -0
- {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/src/spaps_server_quickstart/domains/whitelist/__init__.py +0 -0
- {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/src/spaps_server_quickstart/local_mode/__init__.py +0 -0
- {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/src/spaps_server_quickstart/local_mode/middleware.py +0 -0
- {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/src/spaps_server_quickstart/local_mode/personas.py +0 -0
- {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/src/spaps_server_quickstart/middleware/__init__.py +0 -0
- {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/src/spaps_server_quickstart/middleware/error_handler.py +0 -0
- {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/src/spaps_server_quickstart/middleware/jwt_auth.py +0 -0
- {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/src/spaps_server_quickstart/middleware/local_mode.py +0 -0
- {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/src/spaps_server_quickstart/middleware/security_headers.py +0 -0
- {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/src/spaps_server_quickstart/middleware.py +0 -0
- {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/src/spaps_server_quickstart/rbac/__init__.py +0 -0
- {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/src/spaps_server_quickstart/schemas/__init__.py +0 -0
- {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/src/spaps_server_quickstart/schemas/health.py +0 -0
- {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/src/spaps_server_quickstart/sdk/__init__.py +0 -0
- {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/src/spaps_server_quickstart/sdk/_ttl_cache.py +0 -0
- {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/src/spaps_server_quickstart/sdk/admin_token_cache.py +0 -0
- {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/src/spaps_server_quickstart/sdk/feature_evaluator.py +0 -0
- {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/src/spaps_server_quickstart/sdk/role_hierarchy.py +0 -0
- {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/src/spaps_server_quickstart/sdk/server_clients.py +0 -0
- {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/src/spaps_server_quickstart/sdk/trusted_service_middleware.py +0 -0
- {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/src/spaps_server_quickstart/secure_messaging.py +0 -0
- {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/src/spaps_server_quickstart/seeds/__init__.py +0 -0
- {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/src/spaps_server_quickstart/seeds/cli.py +0 -0
- {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/src/spaps_server_quickstart/seeds/schemas.py +0 -0
- {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/src/spaps_server_quickstart/seeds/validator.py +0 -0
- {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/src/spaps_server_quickstart/tasks/__init__.py +0 -0
- {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/src/spaps_server_quickstart/tasks/celery_factory.py +0 -0
- {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/src/spaps_server_quickstart/tasks/health.py +0 -0
- {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/src/spaps_server_quickstart/tasks/notifications.py +0 -0
- {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/src/spaps_server_quickstart/templates/.pre-commit-config.yaml +0 -0
- {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/src/spaps_server_quickstart/templates/__init__.py +0 -0
- {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/src/spaps_server_quickstart/templates/alembic/env.py +0 -0
- {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/src/spaps_server_quickstart/templates/alembic/script.py.mako +0 -0
- {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/src/spaps_server_quickstart/templates/alembic/versions/.gitkeep +0 -0
- {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/src/spaps_server_quickstart/templates/alembic.ini +0 -0
- {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
- {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
- {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
- {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/src/spaps_server_quickstart/templates/domains/__init__.py +0 -0
- {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/src/spaps_server_quickstart/templates/domains/admin/router.py +0 -0
- {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/src/spaps_server_quickstart/templates/domains/auth/local_routes.py +0 -0
- {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/src/spaps_server_quickstart/templates/domains/users/__init__.py +0 -0
- {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/src/spaps_server_quickstart/templates/domains/users/models.py +0 -0
- {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/src/spaps_server_quickstart/templates/domains/users/repository.py +0 -0
- {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/src/spaps_server_quickstart/templates/domains/users/router.py +0 -0
- {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/src/spaps_server_quickstart/templates/domains/users/schemas.py +0 -0
- {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/src/spaps_server_quickstart/templates/domains/users/service.py +0 -0
- {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/src/spaps_server_quickstart/templates/operations/.env.production.example +0 -0
- {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/src/spaps_server_quickstart/templates/operations/.githooks/pre-push +0 -0
- {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/src/spaps_server_quickstart/templates/operations/.github/workflows/deploy.yml +0 -0
- {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/src/spaps_server_quickstart/templates/operations/.github/workflows/rollback.yml +0 -0
- {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/src/spaps_server_quickstart/templates/operations/Makefile +0 -0
- {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/src/spaps_server_quickstart/templates/operations/deploy/deploy.sh +0 -0
- {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
- {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
- {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
- {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/src/spaps_server_quickstart/templates/operations/docker-compose.prod.yml +0 -0
- {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/src/spaps_server_quickstart/templates/operations/scripts/backup-db.sh +0 -0
- {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
- {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
- {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
- {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
- {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
- {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/src/spaps_server_quickstart/templates/operations/scripts/new-migration.sh +0 -0
- {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/src/spaps_server_quickstart/templates/operations/scripts/prepush.sh +0 -0
- {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/src/spaps_server_quickstart/templates/operations/scripts/restore-db.sh +0 -0
- {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/src/spaps_server_quickstart/templates/scripts/__init__.py +0 -0
- {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/src/spaps_server_quickstart/templates/scripts/seeds/__init__.py +0 -0
- {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/src/spaps_server_quickstart/templates/scripts/seeds/data/users.yaml +0 -0
- {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/src/spaps_server_quickstart/templates/scripts/seeds/schemas/__init__.py +0 -0
- {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/src/spaps_server_quickstart/templates/scripts/seeds/schemas/users.py +0 -0
- {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/src/spaps_server_quickstart/templates/tests/README.md +0 -0
- {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/src/spaps_server_quickstart/templates/tests/__init__.py +0 -0
- {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/src/spaps_server_quickstart/templates/tests/api/__init__.py +0 -0
- {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/src/spaps_server_quickstart/templates/tests/api/test_health.py +0 -0
- {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
- {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/src/spaps_server_quickstart/templates/tests/conftest.py +0 -0
- {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/src/spaps_server_quickstart/templates/tests/domains/__init__.py +0 -0
- {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/src/spaps_server_quickstart/templates/tests/domains/example/__init__.py +0 -0
- {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/src/spaps_server_quickstart/templates/tests/domains/example/conftest.py +0 -0
- {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/src/spaps_server_quickstart/templates/tests/domains/users/__init__.py +0 -0
- {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/src/spaps_server_quickstart/templates/tests/domains/users/conftest.py +0 -0
- {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/src/spaps_server_quickstart/templates/tests/integration/__init__.py +0 -0
- {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
- {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/src/spaps_server_quickstart/templates/tests/unit/__init__.py +0 -0
- {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/src/spaps_server_quickstart/templates/tests/unit/test_settings.py +0 -0
- {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/src/spaps_server_quickstart/testing.py +0 -0
- {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/templates/Makefile +0 -0
- {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/templates/docker-compose.yml +0 -0
- {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/templates/operations/.env.production.example +0 -0
- {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/templates/operations/.github/workflows/deploy.yml +0 -0
- {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/templates/operations/Makefile +0 -0
- {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/templates/operations/deploy/deploy.sh +0 -0
- {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/templates/operations/deploy/post-deploy-verify.sh +0 -0
- {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/templates/operations/deploy/pre-deploy-checks.sh +0 -0
- {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/templates/operations/deploy/reverse-proxy/README.md +0 -0
- {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/templates/operations/deploy/reverse-proxy/certs/.gitkeep +0 -0
- {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/templates/operations/deploy/reverse-proxy/docker-compose.yml +0 -0
- {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/templates/operations/deploy/reverse-proxy/nginx.conf +0 -0
- {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/templates/operations/deploy/reverse-proxy/sites-available/.gitkeep +0 -0
- {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/templates/operations/deploy/reverse-proxy/sites-enabled/.gitkeep +0 -0
- {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/templates/operations/deploy/reverse-proxy/static/.gitkeep +0 -0
- {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/templates/operations/deploy/reverse-proxy/up.sh +0 -0
- {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/templates/operations/docker-compose.dev.yml +0 -0
- {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/templates/operations/docker-compose.prod.yml +0 -0
- {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/templates/operations/scripts/dev/await_db.py +0 -0
- {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/templates/operations/scripts/dev/local-debug-loop.sh +0 -0
- {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/templates/operations/scripts/dev/start-db.sh +0 -0
- {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/templates/operations/scripts/dev/stop-db.sh +0 -0
- {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/templates/tests/conftest.py +0 -0
- {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/tests/contracts/__init__.py +0 -0
- {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/tests/contracts/test_app_factory_contract.py +0 -0
- {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/tests/contracts/test_auth_contract.py +0 -0
- {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/tests/contracts/test_celery_contract.py +0 -0
- {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/tests/contracts/test_db_contract.py +0 -0
- {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/tests/contracts/test_dependencies_contract.py +0 -0
- {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/tests/contracts/test_health_contract.py +0 -0
- {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/tests/contracts/test_manifest_parity.py +0 -0
- {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/tests/contracts/test_oss_hygiene_script.py +0 -0
- {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/tests/contracts/test_router_contract.py +0 -0
- {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/tests/contracts/test_settings_contract.py +0 -0
- {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/tests/domains/__init__.py +0 -0
- {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/tests/domains/affiliate_referrals/__init__.py +0 -0
- {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/tests/domains/affiliate_referrals/test_schemas.py +0 -0
- {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/tests/domains/agent_approvals/__init__.py +0 -0
- {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/tests/domains/agent_approvals/test_repository.py +0 -0
- {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/tests/domains/applications/__init__.py +0 -0
- {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/tests/domains/applications/test_service.py +0 -0
- {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/tests/domains/approval_authz_prod_hardening/__init__.py +0 -0
- {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/tests/domains/approval_authz_prod_hardening/conftest.py +0 -0
- {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/tests/domains/approval_authz_prod_hardening/test_router.py +0 -0
- {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/tests/domains/approval_authz_prod_hardening/test_service.py +0 -0
- {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/tests/domains/approval_authz_prod_hardening/test_wiring.py +0 -0
- {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/tests/domains/audit/__init__.py +0 -0
- {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/tests/domains/audit/test_repository.py +0 -0
- {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/tests/domains/audit/test_retention.py +0 -0
- {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/tests/domains/auth/__init__.py +0 -0
- {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/tests/domains/auth/test_refresh_token_anomaly.py +0 -0
- {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/tests/domains/cfo/__init__.py +0 -0
- {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/tests/domains/cfo/test_repository.py +0 -0
- {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/tests/domains/cfo_roles/__init__.py +0 -0
- {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/tests/domains/cfo_roles/test_router.py +0 -0
- {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/tests/domains/cfo_roles/test_service.py +0 -0
- {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/tests/domains/conftest.py +0 -0
- {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/tests/domains/crypto/__init__.py +0 -0
- {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/tests/domains/crypto/test_repository.py +0 -0
- {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/tests/domains/crypto/test_router.py +0 -0
- {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/tests/domains/crypto/test_service.py +0 -0
- {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/tests/domains/dayrate/__init__.py +0 -0
- {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/tests/domains/dayrate/test_allotment_service.py +0 -0
- {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/tests/domains/dayrate/test_booking_policy_service.py +0 -0
- {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/tests/domains/dayrate/test_booking_routes.py +0 -0
- {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/tests/domains/dayrate/test_pricing.py +0 -0
- {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/tests/domains/device_flow/__init__.py +0 -0
- {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/tests/domains/device_flow/test_store.py +0 -0
- {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/tests/domains/docs/__init__.py +0 -0
- {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/tests/domains/email/__init__.py +0 -0
- {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/tests/domains/email/test_config.py +0 -0
- {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/tests/domains/email/test_env_safety.py +0 -0
- {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/tests/domains/email/test_repository.py +0 -0
- {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/tests/domains/entitlements/__init__.py +0 -0
- {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/tests/domains/entitlements/test_repository.py +0 -0
- {spaps_server_quickstart-0.5.0/tests/domains/secure_messages → spaps_server_quickstart-0.5.1/tests/domains/policies}/__init__.py +0 -0
- {spaps_server_quickstart-0.5.0/tests/domains/security → spaps_server_quickstart-0.5.1/tests/domains/secure_messages}/__init__.py +0 -0
- {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/tests/domains/secure_messages/test_encryption.py +0 -0
- {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/tests/domains/secure_messages/test_router.py +0 -0
- {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/tests/domains/secure_messages/test_service.py +0 -0
- {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/tests/domains/secure_messages/test_tm013_security.py +0 -0
- {spaps_server_quickstart-0.5.0/tests/domains/self_service → spaps_server_quickstart-0.5.1/tests/domains/security}/__init__.py +0 -0
- {spaps_server_quickstart-0.5.0/tests/domains/sessions → spaps_server_quickstart-0.5.1/tests/domains/self_service}/__init__.py +0 -0
- {spaps_server_quickstart-0.5.0/tests/domains/stripe → spaps_server_quickstart-0.5.1/tests/domains/sessions}/__init__.py +0 -0
- {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/tests/domains/sessions/test_admin_detection.py +0 -0
- {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/tests/domains/sessions/test_repository.py +0 -0
- {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/tests/domains/sessions/test_router.py +0 -0
- {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/tests/domains/sessions/test_service.py +0 -0
- {spaps_server_quickstart-0.5.0/tests/domains/users → spaps_server_quickstart-0.5.1/tests/domains/stripe}/__init__.py +0 -0
- {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/tests/domains/stripe/test_subscription_application_scoping.py +0 -0
- {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/tests/domains/support_telemetry_platform/__init__.py +0 -0
- {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/tests/domains/support_telemetry_platform/test_repository.py +0 -0
- {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/tests/domains/test_smoke.py +0 -0
- {spaps_server_quickstart-0.5.0/tests/domains/wallets → spaps_server_quickstart-0.5.1/tests/domains/users}/__init__.py +0 -0
- {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/tests/domains/users/test_repository.py +0 -0
- {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/tests/domains/users/test_router.py +0 -0
- {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/tests/domains/users/test_service.py +0 -0
- {spaps_server_quickstart-0.5.0/tests/domains/webhooks → spaps_server_quickstart-0.5.1/tests/domains/wallets}/__init__.py +0 -0
- {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/tests/domains/wallets/test_chains.py +0 -0
- {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/tests/domains/wallets/test_repository.py +0 -0
- {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/tests/domains/wallets/test_service.py +0 -0
- {spaps_server_quickstart-0.5.0/tests/domains/whitelist → spaps_server_quickstart-0.5.1/tests/domains/webhooks}/__init__.py +0 -0
- {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/tests/domains/webhooks/test_repository.py +0 -0
- {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/tests/domains/webhooks/test_signing.py +0 -0
- {spaps_server_quickstart-0.5.0/tests/middleware → spaps_server_quickstart-0.5.1/tests/domains/whitelist}/__init__.py +0 -0
- {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/tests/domains/whitelist/test_service.py +0 -0
- {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/tests/middleware/test_jwt_auth.py +0 -0
- {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/tests/middleware/test_local_mode.py +0 -0
- {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/tests/middleware/test_security_headers.py +0 -0
- {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/tests/seeds/test_cli.py +0 -0
- {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/tests/test_alembic_naming.py +0 -0
- {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/tests/test_api_router.py +0 -0
- {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/tests/test_app_factory.py +0 -0
- {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/tests/test_auth_channels.py +0 -0
- {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/tests/test_auth_cookies.py +0 -0
- {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/tests/test_auth_dependencies.py +0 -0
- {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/tests/test_bcrypt_compat.py +0 -0
- {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/tests/test_db_session.py +0 -0
- {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/tests/test_dev_data_pipeline.py +0 -0
- {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/tests/test_health_router.py +0 -0
- {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/tests/test_imports.py +0 -0
- {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/tests/test_local_mode.py +0 -0
- {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/tests/test_logging.py +0 -0
- {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/tests/test_middleware.py +0 -0
- {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/tests/test_migration_runner.py +0 -0
- {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/tests/test_migration_status.py +0 -0
- {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/tests/test_operations_templates.py +0 -0
- {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/tests/test_package_metadata.py +0 -0
- {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/tests/test_rbac.py +0 -0
- {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/tests/test_readme_snippets.py +0 -0
- {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/tests/test_sdk.py +0 -0
- {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/tests/test_secure_messaging.py +0 -0
- {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/tests/test_seed_validation.py +0 -0
- {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/tests/test_session_autocommit.py +0 -0
- {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/tests/test_sessions_jwt.py +0 -0
- {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/tests/test_sessions_nonce.py +0 -0
- {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/tests/test_sessions_password.py +0 -0
- {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/tests/test_settings.py +0 -0
- {spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/tests/test_tasks.py +0 -0
- {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.
|
|
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
|
-
#
|
|
75
|
+
# spaps-server-quickstart
|
|
75
76
|
|
|
76
|
-
Reusable FastAPI, SQLAlchemy, Celery, auth, and operational scaffolding for
|
|
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
|
-
|
|
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
|
-
|
|
89
|
+
## When It Fits
|
|
89
90
|
|
|
90
|
-
|
|
|
91
|
+
| Need | Package gives you |
|
|
91
92
|
| --- | --- |
|
|
92
|
-
|
|
|
93
|
-
| Shared auth
|
|
94
|
-
| Async
|
|
95
|
-
| Operational
|
|
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
|
|
104
|
+
from spaps_server_quickstart.settings import (
|
|
105
|
+
BaseServiceSettings,
|
|
106
|
+
create_settings_loader,
|
|
107
|
+
)
|
|
111
108
|
|
|
112
109
|
|
|
113
|
-
|
|
114
|
-
|
|
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("/
|
|
121
|
-
async def
|
|
122
|
-
return {"
|
|
118
|
+
@router.get("/health")
|
|
119
|
+
async def health() -> dict[str, bool]:
|
|
120
|
+
return {"ok": True}
|
|
123
121
|
|
|
124
122
|
|
|
125
|
-
app = create_app(
|
|
123
|
+
app = create_app(
|
|
124
|
+
settings_loader=create_settings_loader(ExampleSettings),
|
|
125
|
+
api_router=router,
|
|
126
|
+
)
|
|
126
127
|
```
|
|
127
128
|
|
|
128
|
-
##
|
|
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
|
|
141
|
-
| Auth | `SpapsAuthMiddleware`, auth cookies, auth channel service, local
|
|
142
|
-
| Routing and RBAC | Base router builder,
|
|
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,
|
|
146
|
-
| Templates | Domain examples,
|
|
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
|
|
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
|
-
|
|
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
|
-
| `
|
|
182
|
-
| `
|
|
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
|
-
##
|
|
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
|
-
|
|
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
|
|
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
|
|
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
|
|
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
|
|
268
|
-
- Downstream services still need their own
|
|
269
|
-
- Some operational templates intentionally
|
|
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
|
|
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
|
-
#
|
|
1
|
+
# spaps-server-quickstart
|
|
2
2
|
|
|
3
|
-
Reusable FastAPI, SQLAlchemy, Celery, auth, and operational scaffolding for
|
|
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
|
-
|
|
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
|
-
|
|
15
|
+
## When It Fits
|
|
16
16
|
|
|
17
|
-
|
|
|
17
|
+
| Need | Package gives you |
|
|
18
18
|
| --- | --- |
|
|
19
|
-
|
|
|
20
|
-
| Shared auth
|
|
21
|
-
| Async
|
|
22
|
-
| Operational
|
|
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
|
|
30
|
+
from spaps_server_quickstart.settings import (
|
|
31
|
+
BaseServiceSettings,
|
|
32
|
+
create_settings_loader,
|
|
33
|
+
)
|
|
38
34
|
|
|
39
35
|
|
|
40
|
-
|
|
41
|
-
|
|
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("/
|
|
48
|
-
async def
|
|
49
|
-
return {"
|
|
44
|
+
@router.get("/health")
|
|
45
|
+
async def health() -> dict[str, bool]:
|
|
46
|
+
return {"ok": True}
|
|
50
47
|
|
|
51
48
|
|
|
52
|
-
app = create_app(
|
|
49
|
+
app = create_app(
|
|
50
|
+
settings_loader=create_settings_loader(ExampleSettings),
|
|
51
|
+
api_router=router,
|
|
52
|
+
)
|
|
53
53
|
```
|
|
54
54
|
|
|
55
|
-
##
|
|
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
|
|
68
|
-
| Auth | `SpapsAuthMiddleware`, auth cookies, auth channel service, local
|
|
69
|
-
| Routing and RBAC | Base router builder,
|
|
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,
|
|
73
|
-
| Templates | Domain examples,
|
|
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
|
|
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
|
-
|
|
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
|
-
| `
|
|
109
|
-
| `
|
|
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
|
-
##
|
|
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
|
-
|
|
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
|
|
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
|
|
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
|
|
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
|
|
195
|
-
- Downstream services still need their own
|
|
196
|
-
- Some operational templates intentionally
|
|
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
|
|
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
|
|
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
|
|
{spaps_server_quickstart-0.5.0 → spaps_server_quickstart-0.5.1}/docs/TM-ENV-001-checklist.md
RENAMED
|
@@ -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
|