Overview
-
:material-shield-check:{ .lg .middle } Core Services
Canonical, Storage, Messaging, Gateway — secure and modular
-
:material-puzzle:{ .lg .middle } Modular Design
Plugin-first architecture with well-defined contracts
-
:material-insights:{ .lg .middle } Observability
Audit logs, metrics, and health endpoints across services
Admin-First Design
All core service operations must be available through the Admin Console. No CLI-only controls.
PHI/PII Handling
Core services are built to minimize PHI exposure. Use classification and redaction in storage and messages.
Network Exposure
Do not expose internal core endpoints directly to the public internet. Use the Gateway for external access.
Services at a Glance
| Service | Purpose | Exposed Interfaces | HIPAA |
|---|---|---|---|
| canonical | Normalize and transform data | gRPC/REST, plugins | Compliant |
| storage | Encrypted PHI/PII storage | REST API, SDK | Compliant |
| messaging | Inter-plugin event bus | Pub/Sub API | Compliant |
| gateway | External proxy & filtering | HTTP(S) ingress | Compliant |
-
:material-code-tags-check:{ .lg .middle } Stable SDKs
Python and Node.js SDKs for service access
-
:material-security:{ .lg .middle } Audit & Retention
7-year retention for audit logs, tamper-proof append-only store
High-level Architecture
mermaid flowchart LR AdminUI[Admin Console] -->|Admin API| API[Admin API Gateway] API --> Canonical[Canonical Service] API --> Storage[Storage Service] API --> Messaging[Messaging Service] Gateway[External Gateway] -->|Proxied Requests| API Storage -->|Encrypted| Vault[(Key Vault)]
Getting Service Status
- Requests the unified health endpoint which aggregates service health
Service Contracts (short)
- Canonical: accepts plugin-specific payloads, returns normalized canonical model
- Storage: uses AES-256 at rest, per-tenant keying supported
- Messaging: event bus supports routing, filters, and PII-safe payloads
- Gateway: domain allowlists, request/response transformations
Operator Lane & Messaging — What You Need To Do
- Ensure plugins expose an inbox endpoint
- Add an endpoint key in the plugin manifest:
message.receive(ormessages.receive,inbox, ormessage) pointing to your handler path, e.g.,/inbox. - The Core dispatcher will POST messages to that path with
X-Caller-Pluginand optionalAuthorizationheader (plugin token). - Configure operator allowlists
- Use
POST /admin/operator/allowlist/auto-generatewith{ caller, target, merge: true }to seed operations from the target plugin’s manifest endpoints. - Edit or review via Admin Console → Operator Policy.
- Optional dev-mode: allow manifest-declared operations without explicit allowlist by setting
DEV_MODE=trueoroperator.allow.dev_all=true(ConfigService). - Optional tuning via env
MESSAGE_MAX_ATTEMPTS,MESSAGE_RETRY_BASE_SECONDS,MESSAGE_DELIVERY_TIMEOUTfor delivery retry/backoff.EVENT_BUS_BACKEND=memory|nats|redisto select event bus transport.
Glossary
- CanonicalUser
- Standard user model across plugins
- Audit Log
- Immutable, append-only record of data and operational events
Operational Checklist
- Ensure audit.retention_years >= 7
- Verify encryption keys stored in Key Vault
- Regularly rotate keys and review RBAC
Debugging Tips
Use Ctrl+Shift+I to open browser devtools for Admin UI troubleshooting. Check network requests to /api/* endpoints.