What It Stores
| Category | Namespace Pattern | Example |
|---|---|---|
| User preferences | tenant:{id}/user:{uid}/preferences | Theme, editor settings, notification prefs |
| Tenant settings | tenant:{id}/settings | Org-wide defaults, feature flags |
| Session metadata | tenant:{id}/sessions/{sid} | Active session state, context |
| Project definitions | tenant:{id}/projects/{pid} | Project config, agent assignments |
| Device registries | tenant:{id}/user:{uid}/devices/{did} | Push tokens, device capabilities |
| Encrypted credentials | tenant:{id}/credentials | OAuth tokens, API keys (encrypted at rest) |
| Automation definitions | tenant:{id}/automations | Workflow blueprints, trigger rules |
| Skill configs | tenant:{id}/skills | Skill parameters, enabled/disabled state |
| Integration configs | tenant:{id}/integrations | Slack, GitHub, Linear connection settings |
| Audit logs | tenant:{id}/audit | Configuration change history |
Key Properties
| Property | Detail |
|---|---|
| Consistency | Linearizable writes via Raft consensus (reads from local FSM state) |
| Durability | SQLite with PRAGMA synchronous=FULL for the Raft log |
| Real-time | WebSocket pub/sub pushes changes to subscribers within milliseconds |
| Multi-tenancy | All namespaces are tenant-scoped (tenant:{id}/...) |
| CAS support | Compare-and-swap writes prevent lost updates |
| TTL support | Optional expiresAt per entry for automatic expiration |
| Versioning | Monotonically increasing version per key for conflict detection |
| Snapshots | Full-state snapshots via bun:sqlite serialize/deserialize |
Architecture at a Glance
Who Uses It
Diminuendo gateway connects over both HTTP REST (writes) and WebSocket (reads + subscriptions). It authenticates withCONCORDANCE_API_KEY and has full read/write access. Diminuendo resolves client-facing ACP config/* scopes (like “user” or “tenant”) into full Concordance namespaces using the authenticated user’s identity.
Podium agents connect over HTTP REST with CONCORDANCE_AGENT_API_KEY for read-only access to configuration values they need at runtime (skill configs, integration settings, credentials).
Clients never talk to Concordance directly. They send ACP config/* JSON-RPC methods to Diminuendo, which resolves scopes to namespaces and proxies the request.