How Orazaka is built: a Ports & Adapters (hexagonal) engine, every module in its ring. The map and the messaging topology below are drawn from the same generated model as the tables that follow — select a module to see what it depends on.

Architecture Reference

🤖 Generated from code by scripts/generate-docs.mjs — do not hand-edit. Run orazaka docs build to refresh.

Ports & Adapters: dependencies point toward the core. Each module has one role — one ring of the hexagon, outermost first — read from the code by the rule beside it.

RoleRuleModules
Clientsa UI repository of the workspace manifest (layer app, kind npm)orazaka-cli, orazaka-mobile-client, orazaka-web-admin, orazaka-web-client
Services & workersa module with a main (SpringApplication.run), or a native workerorazaka-automation-service, orazaka-conversation-service, orazaka-edge, orazaka-job-service, orazaka-knowledge-service, orazaka-studio-service, orazaka-worker-media, krizaka-billing-service, krizaka-notifications-service, krizaka-users-service
Adaptersan imported module that is none of the below: persistence, typed HTTP clients, asset store, bridgeorazaka-assets, orazaka-persistence-app, orazaka-persistence-bridge, orazaka-studio-client, krizaka-billing-client, krizaka-users-client, krizaka-users-persistence
Applicationthe orchestration, pipeline and capability libraries around the core (AGENTS.md §2: business, interceptors, tools)orazaka-business, orazaka-interceptors, orazaka-tools
Domain corea *-core module — the centre of its hexagon, depending on no outer layerorazaka-core, krizaka-users-core
Contractsa Tier-1 *-api module — pure interfaces and recordsorazaka-jobs-api, orazaka-persistence-app-api, orazaka-studio-api, krizaka-billing-api, krizaka-notifications-api, krizaka-users-api
Krizaka platform kita module of krizaka-platform-kit — the cross-cutting code with one author (ADR-073), starters includedkrizaka-messaging, krizaka-observability, krizaka-security, krizaka-spring-boot-starter-observability, krizaka-spring-boot-starter-rabbitmq, krizaka-spring-boot-starter-security, krizaka-spring-boot-starter-web, krizaka-web

Modules

ModuleRoleRepositoryVersionInbound portsOutbound ports
orazaka-cliclientorazaka-cli———
orazaka-mobile-clientclientorazaka-mobile-client———
orazaka-web-adminclientorazaka-web-admin———
orazaka-web-clientclientorazaka-web-client———
orazaka-automation-serviceserviceorazaka-automation-service1.0.0-SNAPSHOT——
orazaka-conversation-serviceserviceorazaka-conversation-service1.0.0-SNAPSHOT——
orazaka-edgeserviceorazaka-edge1.0.0-SNAPSHOT——
orazaka-job-serviceserviceorazaka-job-service1.0.0-SNAPSHOT——
orazaka-knowledge-serviceserviceorazaka-knowledge-service1.0.0-SNAPSHOT——
orazaka-studio-serviceserviceorazaka-studio1.0.0-SNAPSHOT——
orazaka-worker-mediaserviceorazaka-worker-media———
krizaka-billing-serviceservicekrizaka-billing0.2.0——
krizaka-notifications-serviceservicekrizaka-notifications0.2.0——
krizaka-users-serviceservicekrizaka-users0.2.0——
orazaka-assetsadapterorazaka-ai-engine1.0.0-SNAPSHOT——
orazaka-persistence-appadapterorazaka-ai-engine1.0.0-SNAPSHOT——
orazaka-persistence-bridgeadapterorazaka-ai-engine1.0.0-SNAPSHOT——
orazaka-studio-clientadapterorazaka-studio1.0.0-SNAPSHOT——
krizaka-billing-clientadapterkrizaka-billing0.2.0——
krizaka-users-clientadapterkrizaka-users0.2.0——
krizaka-users-persistenceadapterkrizaka-users0.2.0——
orazaka-businessapplicationorazaka-ai-engine1.0.0-SNAPSHOT——
orazaka-interceptorsapplicationorazaka-ai-engine1.0.0-SNAPSHOT——
orazaka-toolsapplicationorazaka-ai-engine1.0.0-SNAPSHOT——
orazaka-coredomainorazaka-ai-engine1.0.0-SNAPSHOTAiClient, CatalogModelService, ChatSessionService, JobService, McpServiceAudioGeneratorClient, CapabilityProvider, ChatGeneratorClient, ChatMemoryStore, ImageGeneratorClient, InfrastructureStatusProvider, KnowledgeService, McpOrchestrator, ModelCatalogProvider, ModelEndpointResolver, PipelineConfigProvider, PlatformMcpServerProvider, PlatformToolConfigProvider, SemanticClassifierPort, TestShaperPort, ToolRegistry, UserCredentialsProvider, UserMcpServerProvider, ValidationPipelineRepository
krizaka-users-coredomainkrizaka-users0.2.0ApiKeyService, IdentityReconciliationService, IdentityService, PasswordRecoveryService, RateLimitProvider, TokenService, UserProfileProviderApiKeyRepositoryPort, AuthorityRepositoryPort, CryptographyPort, OAuth2ProviderVerifier, PasswordEventPublisher, PasswordResetTokenRepositoryPort, UserCredentialRepositoryPort, UserEventPublisher, UserInterceptionRepositoryPort, UserProfileRepositoryPort, UserRepositoryPort, VerificationTokenRepositoryPort
orazaka-jobs-apicontractorazaka-contracts1.0.0-SNAPSHOT——
orazaka-persistence-app-apicontractorazaka-contracts1.0.0-SNAPSHOTCapabilityManager, CatalogModelManager, ChatMemoryPersistenceProvider, ChatSessionPersistenceProvider, JobPersistenceProvider, OutboxStore, PipelineConfigManager, PlatformMcpServerPersistenceProvider, PlatformToolConfigPersistenceProvider, RuntimeConfigProvider, SpeechVoiceManager, UserMcpServerPersistenceProvider, ValidationPipelineManager—
orazaka-studio-apicontractorazaka-studio1.0.0-SNAPSHOT——
krizaka-billing-apicontractkrizaka-billing0.2.0——
krizaka-notifications-apicontractkrizaka-notifications0.2.0——
krizaka-users-apicontractkrizaka-users0.2.0——
krizaka-messagingplatformkrizaka-platform-kit0.2.0——
krizaka-observabilityplatformkrizaka-platform-kit0.2.0——
krizaka-securityplatformkrizaka-platform-kit0.2.0——
krizaka-spring-boot-starter-observabilityplatformkrizaka-platform-kit0.2.0——
krizaka-spring-boot-starter-rabbitmqplatformkrizaka-platform-kit0.2.0——
krizaka-spring-boot-starter-securityplatformkrizaka-platform-kit0.2.0——
krizaka-spring-boot-starter-webplatformkrizaka-platform-kit0.2.0——
krizaka-webplatformkrizaka-platform-kit0.2.0——

Dependencies

Build dependencies between the modules above (test scope excluded): who packages whom.

ModuleDepends on
orazaka-automation-servicekrizaka-billing-client, krizaka-messaging
orazaka-conversation-servicekrizaka-billing-client, krizaka-spring-boot-starter-observability, krizaka-spring-boot-starter-rabbitmq, krizaka-spring-boot-starter-security, krizaka-spring-boot-starter-web, krizaka-users-api, krizaka-users-client, orazaka-assets, orazaka-business, orazaka-core, orazaka-interceptors, orazaka-jobs-api, orazaka-persistence-app, orazaka-persistence-bridge, orazaka-studio-client, orazaka-tools
orazaka-edgekrizaka-security
orazaka-job-servicekrizaka-billing-client, krizaka-messaging, krizaka-security, krizaka-users-api, krizaka-users-client, orazaka-assets, orazaka-business, orazaka-core, orazaka-interceptors, orazaka-jobs-api, orazaka-persistence-app, orazaka-persistence-bridge, orazaka-tools
orazaka-knowledge-servicekrizaka-messaging, krizaka-security
orazaka-studio-servicekrizaka-billing-api, krizaka-billing-client, krizaka-messaging, krizaka-security, orazaka-jobs-api, orazaka-studio-api
krizaka-billing-servicekrizaka-billing-api, krizaka-messaging, krizaka-security
krizaka-notifications-servicekrizaka-messaging, krizaka-notifications-api
krizaka-users-servicekrizaka-security, krizaka-users-core
orazaka-persistence-appkrizaka-messaging, orazaka-jobs-api, orazaka-persistence-app-api
orazaka-persistence-bridgeorazaka-core, orazaka-persistence-app-api
orazaka-studio-clientkrizaka-security, orazaka-studio-api
krizaka-billing-clientkrizaka-billing-api, krizaka-security
krizaka-users-clientkrizaka-security, krizaka-users-api
krizaka-users-persistencekrizaka-messaging
orazaka-businessorazaka-core, orazaka-studio-api, orazaka-studio-client
orazaka-interceptorskrizaka-billing-api, orazaka-core, orazaka-jobs-api
orazaka-toolsorazaka-core
orazaka-corekrizaka-security, orazaka-persistence-app-api
krizaka-users-corekrizaka-users-api, krizaka-users-persistence
orazaka-persistence-app-apiorazaka-jobs-api
orazaka-studio-apiorazaka-jobs-api
krizaka-spring-boot-starter-observabilitykrizaka-observability
krizaka-spring-boot-starter-rabbitmqkrizaka-messaging
krizaka-spring-boot-starter-securitykrizaka-security
krizaka-spring-boot-starter-webkrizaka-web

Runtime flows

Who calls whom while the platform runs: HTTP (UI defaults, the edge route table, the typed clients a service packages) and AMQP (a published routing key that reaches a queue).

FromToKindVia
krizaka-users-servicekrizaka-notifications-serviceamqpkrizaka.notifications.password-events (evt.password.reset)
krizaka-users-servicekrizaka-notifications-serviceamqpkrizaka.notifications.user-events (evt.user.registered)
orazaka-automation-serviceorazaka-studio-serviceamqporazaka.events.studio.connector (evt.automation.telemetry)
orazaka-conversation-serviceorazaka-automation-serviceamqporazaka.jobs.automation (job.automation.approved)
orazaka-conversation-serviceorazaka-job-serviceamqporazaka.jobs.batch (job.media.generate)
orazaka-conversation-serviceorazaka-job-serviceamqporazaka.jobs.interactive (job.text.*, job.media.analyze)
orazaka-conversation-serviceorazaka-studio-serviceamqporazaka.events.studio.capability (evt.capability.changed)
orazaka-conversation-serviceorazaka-worker-mediaamqporazaka.jobs.video (job.video.*, job.compose.*)
orazaka-job-servicekrizaka-billing-serviceamqpkrizaka.billing.settlements (job.{…}.done)
orazaka-job-servicekrizaka-notifications-serviceamqpkrizaka.billing.settlements (job.{…}.done)
orazaka-job-servicekrizaka-users-serviceamqpkrizaka.billing.settlements (job.{…}.done)
orazaka-job-serviceorazaka-automation-serviceamqpkrizaka.billing.settlements (job.{…}.done)
orazaka-job-serviceorazaka-conversation-serviceamqpkrizaka.billing.settlements (job.{…}.done)
orazaka-job-serviceorazaka-conversation-serviceamqporazaka.events.job-relay (job.{…}.done)
orazaka-job-serviceorazaka-knowledge-serviceamqpkrizaka.billing.settlements (job.{…}.done)
orazaka-job-serviceorazaka-studio-serviceamqpkrizaka.billing.settlements (job.{…}.done)
orazaka-job-serviceorazaka-studio-serviceamqporazaka.events.studio (job.{…}.done)
orazaka-job-serviceorazaka-studio-serviceamqporazaka.events.studio.capability (evt.capability.changed)
orazaka-studio-serviceorazaka-automation-serviceamqporazaka.jobs.automation (job.automation.approved)
orazaka-studio-serviceorazaka-job-serviceamqporazaka.jobs.batch (job.media.generate)
orazaka-studio-serviceorazaka-job-serviceamqporazaka.jobs.interactive (job.text.*, job.media.analyze)
orazaka-studio-serviceorazaka-worker-mediaamqporazaka.jobs.video (job.video.*, job.compose.*)
orazaka-automation-servicekrizaka-billing-servicehttpkrizaka-billing-client
orazaka-cliorazaka-conversation-servicehttplocalhost:8080
orazaka-cliorazaka-edgehttplocalhost:8088
orazaka-conversation-servicekrizaka-billing-servicehttpkrizaka-billing-client
orazaka-conversation-servicekrizaka-users-servicehttpkrizaka-users-client
orazaka-conversation-serviceorazaka-studio-servicehttporazaka-studio-client
orazaka-edgekrizaka-billing-servicehttproute /api/v1/billing
orazaka-edgekrizaka-users-servicehttproute /api/v1/api-keys
orazaka-edgekrizaka-users-servicehttproute /api/v1/auth
orazaka-edgekrizaka-users-servicehttproute /api/v1/credentials
orazaka-edgekrizaka-users-servicehttproute /api/v1/interceptions
orazaka-edgekrizaka-users-servicehttproute /api/v1/profile
orazaka-edgeorazaka-conversation-servicehttproute /
orazaka-edgeorazaka-studio-servicehttproute /api/v1/studios
orazaka-job-servicekrizaka-billing-servicehttpkrizaka-billing-client
orazaka-job-servicekrizaka-users-servicehttpkrizaka-users-client
orazaka-job-serviceorazaka-studio-servicehttporazaka-studio-client
orazaka-mobile-clientorazaka-edgehttplocalhost:8088
orazaka-studio-servicekrizaka-billing-servicehttpkrizaka-billing-client
orazaka-web-adminorazaka-edgehttplocalhost:8088
orazaka-web-clientorazaka-conversation-servicehttplocalhost:8080
orazaka-web-clientorazaka-edgehttplocalhost:8088

Interceptor pipeline

Phase 1 — core chain (fixed in code, non-bypassable, ADR-051)

#InterceptorConcern
1SafetyInterceptorvalidation
2ScopeGuardInterceptorgovernance
3UserContextResolvercontext
4SystemContextInjectorcontext
5RagInterceptorenrichment

Phase 2 — configured chain (order and switch in pipeline_interceptor_config)

OrderInterceptorEnabledImplemented
4EntitlementInterceptor✅✅
5McpInterceptor✅✅
6BrandContextInterceptor✅✅
7MemoryInterceptor✅✅
8RefinerInterceptor✅✅
9RouterInterceptor✅✅
9ToolInterceptor✅✅
10MediaInterceptor✅⚠ no class
11UserContextInterceptor✅✅

Messaging topology (AGENTS.md §6)

Exchanges

Retry, then dead letter — a listener on the kit's container (krizaka-messaging, krizaka.messaging.retry) runs up to 5 times, waiting 500 ms ×2 up to 10 s, then the message goes to <queue>.dlq.

Queues

QueueExchangeBindingDLQDeclared byConsumed by
krizaka.billing.settlementsorazaka.eventsjob.*.done, job.*.errorkrizaka.billing.settlements.dlqkrizaka-billing-servicekrizaka-billing-service, krizaka-messaging
krizaka.billing.unmeteredorazaka.eventsevt.turn.unmeteredkrizaka.billing.unmetered.dlqkrizaka-billing-servicekrizaka-billing-service
krizaka.notifications.password-eventsorazaka.eventsevt.password.*krizaka.notifications.password-events.dlqkrizaka-notifications-servicekrizaka-notifications-service
krizaka.notifications.requestsorazaka.eventsevt.notification.requestedkrizaka.notifications.requests.dlqkrizaka-notifications-servicekrizaka-notifications-service
krizaka.notifications.user-eventsorazaka.eventsevt.user.*krizaka.notifications.user-events.dlqkrizaka-notifications-servicekrizaka-notifications-service
orazaka.events.job-relayorazaka.eventsjob.#orazaka.events.job-relay.dlqorazaka-persistence-apporazaka-conversation-service
orazaka.events.studioorazaka.eventsjob.*.done, job.*.errororazaka.events.studio.dlqorazaka-studio-serviceorazaka-studio-service
orazaka.events.studio.capabilityorazaka.eventsevt.capability.*orazaka.events.studio.capability.dlqorazaka-studio-serviceorazaka-studio-service
orazaka.events.studio.connectororazaka.eventsevt.automation.telemetryorazaka.events.studio.connector.dlqorazaka-studio-serviceorazaka-studio-service
orazaka.events.studio.subscriptionorazaka.eventsevt.subscription.*orazaka.events.studio.subscription.dlqorazaka-studio-serviceorazaka-studio-service
orazaka.jobs.automationorazaka.jobsjob.automation.*orazaka.jobs.automation.dlqorazaka-automation-serviceorazaka-automation-service
orazaka.jobs.batchorazaka.jobsjob.media.generateorazaka.jobs.batch.dlqorazaka-persistence-apporazaka-job-service
orazaka.jobs.interactiveorazaka.jobsjob.text.*, job.media.analyzeorazaka.jobs.interactive.dlqorazaka-persistence-apporazaka-job-service
orazaka.jobs.ragorazaka.jobsjob.rag.*orazaka.jobs.rag.dlqorazaka-knowledge-serviceorazaka-knowledge-service
orazaka.jobs.videoorazaka.jobsjob.video.*, job.compose.*orazaka.jobs.video.dlqorazaka-persistence-apporazaka-worker-media (own retry)

Producers

ModuleExchangeRouting key
krizaka-billing-serviceorazaka.events(dynamic)
krizaka-users-coreorazaka.eventsevt.password.reset
krizaka-users-coreorazaka.eventsevt.user.registered
orazaka-automation-serviceorazaka.jobs(dynamic)
orazaka-automation-serviceorazaka.eventsevt.automation.telemetry
orazaka-conversation-serviceorazaka.jobs(capability route)
orazaka-conversation-serviceorazaka.events(dynamic)
orazaka-conversation-serviceorazaka.eventsevt.agent.presence
orazaka-conversation-serviceorazaka.eventsevt.capability.changed
orazaka-conversation-serviceorazaka.jobsjob.automation.approved
orazaka-job-serviceorazaka.events(dynamic)
orazaka-job-serviceorazaka.eventsevt.capability.changed
orazaka-job-serviceorazaka.eventsjob.{…}.done
orazaka-job-serviceorazaka.eventsjob.{…}.error
orazaka-studio-serviceorazaka.jobs(capability route)
orazaka-studio-serviceorazaka.eventsevt.studio.run.failed
orazaka-studio-serviceorazaka.eventsevt.studio.run.started
orazaka-studio-serviceorazaka.eventsevt.studio.run.succeeded
orazaka-studio-serviceorazaka.jobsjob.automation.approved

Capability routes (orazaka_capabilities: where a job of each capability is published)

CapabilityHandlerRouting key
orazaka.studio.media.composemedia.composejob.compose.assemble
orazaka.core.media.visionimage.analyzejob.media.analyze
orazaka.core.media.audio.analysisaudio.analyzejob.media.generate
orazaka.core.media.imageimage.generatejob.media.generate
orazaka.core.media.video.analysisvideo.analyzejob.media.generate
orazaka.core.chat.completiontext.generatejob.text.process
orazaka.core.media.speechspeech.synthesizejob.text.process
orazaka.core.media.videovideo.generatejob.video.generate