Architecture for operators and app developers
This framework uses a strict runtime core plus pluggable APP modules. Business teams extend the platform with APP modules, while runtime concerns stay in core.
Runtime architecture
core.config.get_settings()loads configuration from environment variables.AppRegistryloadsinstalled_appsand validates module dependencies and compatibility.core.app.factory.create_appassembles middleware, system routes, and app runtime registries.- Request security pipeline resolves token session and tenant context.
- Permissions are checked against route policy and role projection.
- Process role starts selected runtime loops (
server,worker,scheduler,outbox-dispatcher,migrate).
Process role behavior
server: API traffic entrypoint; exposes/healthz,/readyz,/version,/docs,/metrics.worker: consumes async task queue and executes jobs.scheduler: triggers scheduled jobs.outbox-dispatcher: drains event outbox in batches.migrate: runs staged migration planning and execution workflows.
APP module contract
Every APP module must export module as AppModule:
from core.apps import AppModule, MigrationSpec
module = AppModule(
label="books",
version="0.1.0",
routers=[...],
models=["platform_apps.books.models"],
migrations=MigrationSpec(path="platform_apps.books.migrations"),
permissions=[...],
)
Mandatory structure:
labelmust be valid snake_case.versionmust be declared.routers,models,permissionsmust be valid values.migrationsmust be importable and point to amanifest.
Optional fields enable extension:
dependenciesrequired_capabilities,provided_capabilities,min_core_versionerror_codes,message_catalogstask_handlers,schedules,event_handlerslifecycle_hooksadmin_models,admin_routes,dashboard_widgetsauth_session_storepublic_api
What check-app enforces
- module path is importable
- all required files exist
- migration metadata exists and validates
- no tenant-model contract violations
- all tenant-scoped repository classes are safe (
TenantScopedRepository/CrossTenantRepository) - router created with
create_router - route permissions are declared in
AppModule.permissions - all routed responses use
Envelope/ListEnvelope
Request flow in practice
- Route policy from
create_routerruns request security middleware. - Authentication and tenant resolution run (token, optional
X-Tenant-ID). - Permission resolution returns decision.
- Router handler executes service logic.
- Handler returns envelope responses.
Tenant and permission baseline
- Tenant isolation is enforced by
TenantScopedModelandTenantScopedRepository. - Token tenant comes from JWT claim
tid. - Header tenant uses
X-Tenant-ID. - If both are present, they must match.
- Route-level permissions are written as
resource:actionand checked byPermissionSpec.
Extension boundary recommendation
Use APP modules for:
- domain models and repositories
- domain routers and permissions
- domain tasks and schedules
- module configuration metadata
Use core for:
- middleware and security policy changes
- permission backend selection
- migration planner and CLI workflow
- shared platform services
Advanced framework customization belongs to guides/advanced-architecture.md.