| Goal | Approach |
|---|---|
| Interfaces are the only way in | Every module has an openapi.yaml (OpenAPI 3.1); the UI and third parties call the same interface. Permissions come from x-permission in the specification, not from code. |
| Replaceable modules | Modular monolith in Python with FastAPI: one folder per module with interface.py (public interface) and router.py (HTTP). Modules call each other in the same process through the public interface; a module can be split out and called over HTTP without changing its callers. |
| Flows without hidden coupling | Process Orchestration (C12-M1): flows are data (flows.yaml). Every step of a flow runs through Process Orchestration; modules call each other directly only for queries. Event-driven, long-running steps answer “running” and end with an event. |
| Own data per module | One PostgreSQL database and database user per module; references to other modules only by ID. Events go out through an outbox per module and never carry secrets. |
| Trust without a central portal | Every OSP runs its own installation; the CSP provides the trust list, the company identifier (BPN) with the home OSP, the directory BPN → DID and discovery. |
| Sign-in without passwords | The Portal IAM of an OSP has exactly one identity provider, the EBW-Connector, which checks the EUDI Wallet and the Business Wallet. |
| Testable in isolation | Every module has a built-in stand-in for its neighbours, so it can be developed and tested alone. |
This work is licensed under the CC-BY-4.0.