Project Type: Go Client Library
Target Consumers: CQ platform services (cqmd, cqex, cqpm, cqdefi)
Deployment Model: Imported as Go module dependency
-
Library Architecture
- Public API in
pkg/, implementation ininternal/ - No
cmd/directory (library only) - Dependency injection: accept
cqi.HTTPClientandcqi.WebSocketClientin constructors - Provide
mock.Clientfor deterministic testing
- Public API in
-
Core Interfaces
VenueClientinterface with 9 methods (trading, account, market data, streaming, health)- All methods return CQC-typed data or CQI-typed errors
- All streaming uses CQI WebSocket client
-
CQI Infrastructure Integration
cqi/httpclient: REST calls with retry, circuit breaker, rate limitingcqi/websocket: Streaming with auto-reconnect, connection poolingcqi/logging,cqi/metrics,cqi/errors: Observability and error handling- Per-venue rate limits via
cqi/httpclient.RateLimitConfig
-
MVP Venue Implementations (4 venues)
- Coinbase Advanced Trade: REST v3 + WebSocket, HMAC-SHA256, 10/15 req/sec, spot (implemented as
pkg/venues/coinbase/) - Coinbase Prime: REST + JWT, institutional, SOR/TWAP/VWAP
- FalconX: REST + Bearer, RFQ, polling only
- Fordefi: REST + MPC, approval workflow, custody
- Coinbase Advanced Trade: REST v3 + WebSocket, HMAC-SHA256, 10/15 req/sec, spot (implemented as
-
Internal Components
internal/auth/: Per-venueSignerinterface (HMAC-SHA256, JWT, Bearer, MPC for MVP venues)internal/normalizer/: Venue JSON/XML → CQC protobuf, error code mapping
- Coinbase Exchange (legacy v2 API, replaced by Advanced Trade v3)
- Binance, Kraken, OKX, Bybit CEX connectors
- Uniswap V3, Curve DEX connectors
- Aave lending protocol
- FIX Protocol adapter
- Go 1.21+: Required by CQI, supports generics for type-safe clients
- Go Modules: Dependency management
- CQC (
github.com/Combine-Capital/cqc): Protocol Buffer typescqc/venues/v1: Venue, Order, OrderStatus, Balance, ExecutionReportcqc/markets/v1: Price, OrderBook, Trade, MarketData
- CQI (
github.com/Combine-Capital/cqi): Infrastructure primitivescqi/httpclient: HTTP client with retry, circuit breaker, rate limitingcqi/websocket: WebSocket client with auto-reconnectcqi/logging: Structured logging (zerolog)cqi/metrics: Prometheus metricscqi/errors: Typed error handling
- Standard Library:
context,time,sync,encoding/json
- testify: Assertions and mocking (
github.com/stretchr/testify) - gomock (optional): Mock generation for interfaces
- No additional HTTP/WebSocket libraries (CQI provides)
- No additional observability libraries (CQI provides)
- No database or caching (library does not persist state)
- No custom rate limiting (CQI provides)
┌─────────────────────────────────────────────────────────────────┐
│ Consuming Service (cqmd/cqex/cqpm) │
│ ┌──────────────────────────────────────────────────────────┐ │
│ │ Service Code (e.g., Market Data Aggregator) │ │
│ └────────────┬─────────────────────────────────────────────┘ │
│ │ imports & instantiates │
└───────────────┼──────────────────────────────────────────────────┘
│
▼
┌─────────────────────────────────────────────────────────────────┐
│ CQVX Library │
│ ┌──────────────────────────────────────────────────────────┐ │
│ │ pkg/client/ │ │
│ │ ┌────────────────────────────────────────────────────┐ │ │
│ │ │ VenueClient Interface │ │ │
│ │ │ - PlaceOrder() → *cqc.ExecutionReport │ │ │
│ │ │ - GetOrderBook() → *cqc.OrderBook │ │ │
│ │ │ - SubscribeTrades() → streaming via cqi.WSClient │ │ │
│ │ └────────────────────────────────────────────────────┘ │ │
│ └──────────────────┬───────────────────────────────────────┘ │
│ │ implemented by │
│ ┌──────────────────┴───────────────────────────────────────┐ │
│ │ pkg/venues/ │ │
│ │ ┌──────────────┐ ┌──────────────┐ ┌──────────────┐ │ │
│ │ │ coinbase/ │ │ prime/ │ │ falconx/ │ │ │
│ │ │ Client │ │ Client │ │ Client │ ... │ │
│ │ └──────┬───────┘ └──────┬───────┘ └──────┬───────┘ │ │
│ └─────────┼────────────────┼────────────────┼─────────────┘ │
│ │ │ │ │
│ └────────────────┼────────────────┘ │
│ │ uses │
│ ┌──────────────────────────────────────────────────────────────┘ │
│ │ internal/ │ │
│ │ ┌─────────────────────┐ ┌──────────────────────────┐ │ │
│ │ │ auth/ │ │ normalizer/ │ │ │
│ │ │ - Signer interface │ │ - JSON → CQC protobuf │ │ │
│ │ │ - HMAC-SHA256 │ │ - Error code mapping │ │ │
│ │ │ - JWT │ │ - Timestamp conversion │ │ │
│ │ │ - Bearer │ │ - Decimal normalization │ │ │
│ │ │ - MPC │ │ │ │ │
│ │ └─────────────────────┘ └──────────────────────────┘ │ │
│ └──────────────────────────────────────────────────────────┘ │
│ │ depends on │
└─────────────────────────────┼────────────────────────────────────┘
│
▼
┌─────────────────────────────────────────────────────────────────┐
│ CQI Infrastructure │
│ ┌──────────────────┐ ┌──────────────────┐ ┌──────────────┐ │
│ │ httpclient │ │ websocket │ │ logging │ │
│ │ - Retry │ │ - Auto-reconnect│ │ - Zerolog │ │
│ │ - Circuit break │ │ - Pooling │ │ │ │
│ │ - Rate limit │ │ - Multiplexing │ │ metrics │ │
│ └──────────────────┘ └──────────────────┘ │ - Prometheus│ │
│ │ │ │
│ ┌──────────────────────────────────────┐ │ errors │ │
│ │ CQC Protocol Buffers │ │ - Typed │ │
│ │ - venues/v1: Order, ExecutionReport │ │ - Wrapping │ │
│ │ - markets/v1: OrderBook, Trade │ └──────────────┘ │
│ └──────────────────────────────────────┘ │
└─────────────────────────────────────────────────────────────────┘
│
▼
┌──────────────────┐
│ Trading Venues │
│ (Coinbase, etc) │
└──────────────────┘
1. Service instantiates venue client:
client := coinbase.NewClient(config, cqiHTTPClient, cqiWSClient, logger)
2. Service calls VenueClient method:
report, err := client.PlaceOrder(ctx, order)
3. CQVX Coinbase Client processes:
a. internal/auth: Generate HMAC-SHA256 signature
b. Apply signature as middleware to cqiHTTPClient
c. cqiHTTPClient: Make HTTP POST to Coinbase API
- Automatic retry on transient failures
- Rate limiting (15 req/sec enforced)
- Metrics emitted (request count, latency)
d. Receive Coinbase JSON response
e. internal/normalizer: Parse JSON → CQC ExecutionReport protobuf
f. Return *cqc.ExecutionReport to service
4. Service receives normalized CQC data:
- No knowledge of Coinbase-specific formats
- Same interface for all venues
- CQI-typed errors on failure
1. Service subscribes to order book:
err := client.SubscribeOrderBook(ctx, "BTC-USD", handler)
2. CQVX Coinbase Client processes:
a. internal/auth: Generate WebSocket auth token
b. cqiWSClient: Establish WebSocket connection
- Automatic reconnect on disconnect
- Connection pooling
- Metrics emitted (message rate, connection status)
c. Send Coinbase subscribe message
d. Receive Coinbase JSON messages
e. internal/normalizer: Parse JSON → CQC OrderBook protobuf
f. Call handler(orderBook *cqc.OrderBook)
3. Service handler receives normalized CQC data:
- Real-time updates in CQC format
- Automatic reconnection handled by CQI
- No venue-specific message handling
Purpose: Define unified VenueClient interface that all venues implement
Inputs: None (interface definition)
Outputs: Go interface type
Dependencies:
cqc/venues/v1(Order, ExecutionReport, OrderStatus, Balance types)cqc/markets/v1(OrderBook, Trade, Price types)
Key Responsibilities:
- Define 9 methods covering trading, account, market data, streaming, health
- Ensure all methods use context.Context for cancellation
- Specify CQC types for all returns
- Document expected error types (CQI errors)
Files:
pkg/client/client.go: Interface definitionpkg/client/types.go: Filter and query parameter types
Purpose: Implement VenueClient interface for specific trading venues
Inputs:
- Configuration (API keys, endpoints, rate limits)
- CQI HTTPClient (injected dependency)
- CQI WebSocketClient (injected dependency)
- Logger (injected dependency)
Outputs:
- Venue-specific Client struct implementing VenueClient
- Constructor function:
NewClient(cfg Config, http *cqi.HTTPClient, ws *cqi.WSClient, logger *cqi.Logger) *Client
Dependencies:
internal/auth: Venue-specific signature generationinternal/normalizer: Venue response → CQC conversioncqi/httpclient: HTTP requestscqi/websocket: Streaming connectionscqi/logging,cqi/metrics,cqi/errors: Observability
Key Responsibilities:
- Implement all 9 VenueClient methods
- Configure CQI clients with venue-specific settings (rate limits, endpoints)
- Apply venue authentication via internal/auth
- Normalize all responses via internal/normalizer
- Handle venue-specific quirks (pagination, timestamp formats)
- Provide Health() check for connection status
MVP Venues:
pkg/venues/coinbase/: Coinbase Advanced Trade (REST v3 + WebSocket)pkg/venues/prime/: Coinbase Prime (REST + JWT)pkg/venues/falconx/: FalconX (REST + RFQ)pkg/venues/fordefi/: Fordefi (REST + MPC)
Files per venue:
client.go: Client struct and constructorconfig.go: Configuration structtrading.go: PlaceOrder, CancelOrder, GetOrder, GetOrdersaccount.go: GetBalancemarket.go: GetOrderBookstreaming.go: SubscribeOrderBook, SubscribeTradeshealth.go: Health check
Purpose: Provide deterministic mock for testing consuming services
Inputs: Test configuration (expected calls, canned responses)
Outputs: Mock implementation of VenueClient
Dependencies:
cqctypes for canned responsestestify/mock(optional) or manual mock
Key Responsibilities:
- Implement all 9 VenueClient methods
- Allow configuration of expected calls and responses
- Support assertion of method calls in tests
- No network communication (pure in-memory)
Files:
pkg/client/mock/mock.go: Mock client implementationpkg/client/mock/builders.go: Helper functions for creating test data
Purpose: Generate venue-specific authentication signatures and tokens
Inputs:
- Venue credentials (API key, secret, passphrase, etc.)
- HTTP request details (method, path, body, timestamp)
Outputs:
- Signed request (headers or query parameters)
- Middleware function for CQI HTTPClient
Dependencies:
- Go standard library:
crypto/hmac,crypto/sha256,encoding/base64 - JWT libraries for JWT-based auth
Key Responsibilities:
- Define
Signerinterface - Implement venue-specific signers:
HMACSignerSHA256: Coinbase Advanced Trade (API key + secret + passphrase)JWTSigner: Coinbase Prime (JWT-based signing)BearerTokenSigner: FalconX (static bearer token)MPCSigner: Fordefi (multi-party computation signing)
- Apply signatures as CQI HTTP middleware
- Handle nonce generation for replay protection
- Handle timestamp formatting per venue requirements
Files:
internal/auth/signer.go: Signer interfaceinternal/auth/hmac.go: HMAC-SHA256 implementationinternal/auth/jwt.go: JWT implementationinternal/auth/bearer.go: Bearer token implementationinternal/auth/mpc.go: MPC signing implementation
Purpose: Convert venue-specific responses to CQC protobuf types
Inputs:
- Venue JSON/XML response bytes
- Venue error responses
Outputs:
- CQC protobuf messages
- CQI-typed errors
Dependencies:
encoding/json: JSON parsingcqcprotobuf typescqi/errors: Error type construction
Key Responsibilities:
- Parse venue-specific JSON schemas
- Map venue fields to CQC protobuf fields
- Handle venue-specific enums → CQC enums
- Convert timestamp formats (RFC3339, Unix, ISO8601) → protobuf Timestamp
- Normalize decimal formats (string, float64) → protobuf Decimal
- Map venue error codes to CQI error types (Permanent, Temporary, RateLimit, etc.)
- Handle missing fields with appropriate defaults
Files:
internal/normalizer/normalizer.go: Normalizer interfaceinternal/normalizer/coinbase/: Coinbase Advanced Trade normalizersorder.go: Coinbase Order → cqc.Orderexecution.go: Coinbase Fill → cqc.ExecutionReportbalance.go: Coinbase Account → cqc.Balanceorderbook.go: Coinbase L2 → cqc.OrderBookerrors.go: Coinbase error codes → cqi.Error
internal/normalizer/prime/: Prime-specific normalizersinternal/normalizer/falconx/: FalconX-specific normalizersinternal/normalizer/fordefi/: Fordefi-specific normalizers
Purpose: Provide shared types for configuration and parameters
Inputs: None (type definitions)
Outputs: Go struct types
Dependencies: None
Key Responsibilities:
- Define filter types for queries (OrderFilter, TimeRange)
- Define common configuration structs
- Define callback handler types for streaming
Files:
pkg/types/filters.go: Query filter typespkg/types/handlers.go: Streaming handler types
github.com/Combine-Capital/cqvx/
├── go.mod # Module definition
├── go.sum # Dependency checksums
├── README.md # Library usage documentation
├── LICENSE # License file
├── Makefile # Build and test automation
│
├── docs/
│ ├── BRIEF.md # Project brief (requirements)
│ ├── SPEC.md # This technical specification
│ └── ROADMAP.md # Implementation roadmap
│
├── pkg/ # Public API (importable)
│ ├── client/
│ │ ├── client.go # VenueClient interface (9 methods)
│ │ ├── types.go # Common types (Config, Filter)
│ │ └── mock/
│ │ ├── mock.go # Mock VenueClient implementation
│ │ └── builders.go # Test data builders
│ │
│ ├── types/
│ │ ├── filters.go # Query filters (OrderFilter, TimeRange)
│ │ └── handlers.go # Streaming handlers (OrderBookHandler, TradeHandler)
│ │
│ └── venues/ # Venue implementations
│ ├── coinbase/ # Coinbase Advanced Trade (v3 API)
│ │ ├── client.go # Client struct + NewClient()
│ │ ├── config.go # Config struct
│ │ ├── trading.go # PlaceOrder, CancelOrder, GetOrder, GetOrders
│ │ ├── account.go # GetBalance
│ │ ├── market.go # GetOrderBook
│ │ ├── streaming.go # SubscribeOrderBook, SubscribeTrades
│ │ ├── health.go # Health
│ │ └── client_test.go # Unit tests
│ │
│ ├── prime/ # Coinbase Prime
│ │ ├── client.go
│ │ ├── config.go
│ │ ├── trading.go
│ │ ├── account.go
│ │ ├── market.go
│ │ ├── streaming.go
│ │ ├── health.go
│ │ └── client_test.go
│ │
│ ├── falconx/ # FalconX
│ │ ├── client.go
│ │ ├── config.go
│ │ ├── trading.go # RFQ-specific implementation
│ │ ├── account.go
│ │ ├── market.go
│ │ ├── health.go
│ │ └── client_test.go
│ │
│ └── fordefi/ # Fordefi
│ ├── client.go
│ ├── config.go
│ ├── trading.go # MPC + approval workflow
│ ├── account.go
│ ├── market.go
│ ├── health.go
│ └── client_test.go
│
├── internal/ # Private implementation (not importable)
│ ├── auth/
│ │ ├── signer.go # Signer interface
│ │ ├── hmac.go # HMAC-SHA256 signer
│ │ ├── jwt.go # JWT signer
│ │ ├── bearer.go # Bearer token signer
│ │ ├── mpc.go # MPC signer
│ │ ├── signer_test.go # Auth tests
│ │ └── testdata/ # Test fixtures (sample signatures)
│ │
│ └── normalizer/
│ ├── normalizer.go # Normalizer interface
│ ├── common.go # Common normalization functions
│ │
│ ├── coinbase/
│ │ ├── order.go # Coinbase Order → cqc.Order
│ │ ├── execution.go # Coinbase Fill → cqc.ExecutionReport
│ │ ├── balance.go # Coinbase Account → cqc.Balance
│ │ ├── orderbook.go # Coinbase L2 → cqc.OrderBook
│ │ ├── trade.go # Coinbase Trade → cqc.Trade
│ │ ├── errors.go # Error code mapping
│ │ ├── normalizer_test.go # Tests
│ │ └── testdata/ # Sample JSON responses
│ │
│ ├── prime/
│ │ ├── order.go
│ │ ├── execution.go
│ │ ├── balance.go
│ │ ├── orderbook.go
│ │ ├── errors.go
│ │ ├── normalizer_test.go
│ │ └── testdata/
│ │
│ ├── falconx/
│ │ ├── quote.go # FalconX Quote → cqc.Order
│ │ ├── execution.go
│ │ ├── balance.go
│ │ ├── errors.go
│ │ ├── normalizer_test.go
│ │ └── testdata/
│ │
│ └── fordefi/
│ ├── transaction.go # Fordefi Transaction → cqc.Order
│ ├── execution.go
│ ├── balance.go
│ ├── errors.go
│ ├── normalizer_test.go
│ └── testdata/
│
├── examples/ # Usage examples
│ ├── simple/
│ │ └── main.go # Basic usage example
│ └── streaming/
│ └── main.go # WebSocket streaming example
│
└── test/
└── integration/ # Integration tests (optional, requires live creds)
├── coinbase_test.go
├── prime_test.go
├── falconx_test.go
└── fordefi_test.go
// Step 1: Import venue package
import (
"github.com/Combine-Capital/cqvx/pkg/venues/coinbase"
"github.com/Combine-Capital/cqi/pkg/httpclient"
"github.com/Combine-Capital/cqi/pkg/websocket"
"github.com/Combine-Capital/cqi/pkg/logging"
cqcVenues "github.com/Combine-Capital/cqc/gen/go/cqc/venues/v1"
)
// Step 2: Create CQI infrastructure clients (service-managed)
httpClient := httpclient.New(httpclient.Config{
Timeout: 10 * time.Second,
Retry: httpclient.RetryConfig{MaxAttempts: 3, Backoff: "exponential"},
})
wsClient := websocket.New(websocket.Config{
ReconnectBackoff: websocket.ExponentialBackoff{
Initial: 1 * time.Second,
Max: 60 * time.Second,
},
})
logger := logging.New("cqmd")
// Step 3: Configure venue client
cfg := coinbase.Config{
APIKey: os.Getenv("COINBASE_API_KEY"),
Secret: os.Getenv("COINBASE_SECRET"),
Passphrase: os.Getenv("COINBASE_PASSPHRASE"),
BaseURL: "https://api.exchange.coinbase.com",
RateLimit: httpclient.RateLimitConfig{
RequestsPerSecond: 15,
},
}
// Step 4: Instantiate venue client
client := coinbase.NewClient(cfg, httpClient, wsClient, logger)
// Step 5: Use unified VenueClient interface
ctx := context.Background()
// Trading
order := &cqcVenues.Order{
Symbol: "BTC-USD",
Side: cqcVenues.OrderSide_BUY,
Type: cqcVenues.OrderType_LIMIT,
Quantity: "0.1",
Price: "50000.00",
}
report, err := client.PlaceOrder(ctx, order)
if err != nil {
// CQI-typed error with venue context
logger.Error("order failed", "error", err)
}
// Market Data
book, err := client.GetOrderBook(ctx, "BTC-USD")
// Streaming
handler := func(book *cqcMarkets.OrderBook) {
logger.Info("orderbook update", "bids", len(book.Bids))
}
err = client.SubscribeOrderBook(ctx, "BTC-USD", handler)
// Health
if err := client.Health(ctx); err != nil {
logger.Warn("venue unhealthy", "error", err)
}// test/service_test.go
import (
"testing"
"github.com/Combine-Capital/cqvx/pkg/client/mock"
cqcVenues "github.com/Combine-Capital/cqc/gen/go/cqc/venues/v1"
)
func TestOrderExecution(t *testing.T) {
// Create mock venue client
mockClient := mock.NewClient()
// Configure mock behavior
mockClient.OnPlaceOrder(func(ctx context.Context, order *cqcVenues.Order) (*cqcVenues.ExecutionReport, error) {
return &cqcVenues.ExecutionReport{
OrderId: "mock-12345",
Status: cqcVenues.OrderStatus_FILLED,
FilledQuantity: order.Quantity,
AveragePrice: order.Price,
}, nil
})
// Test service logic with mock
service := NewTradingService(mockClient)
err := service.ExecuteTrade(ctx, "BTC-USD", "0.1")
assert.NoError(t, err)
// Assert mock was called correctly
assert.Equal(t, 1, mockClient.PlaceOrderCallCount())
}Additional Venues:
- Same VenueClient interface, just add new
pkg/venues/{venue}/directory - Reuse
internal/auth/andinternal/normalizer/patterns - <500 LOC per venue (auth + normalization)
Advanced Order Types:
- Extend
cqc.Orderprotobuf with new fields - Update normalizers to handle new fields
- No changes to CQVX architecture
Multi-Venue Routing:
- Consuming service (cqex) implements routing logic
- CQVX remains simple single-venue client library
- No changes to CQVX
Connection Pooling:
- CQI manages connection pooling (no CQVX changes)
- CQVX clients automatically benefit
Advanced Streaming:
- CQI manages WebSocket multiplexing (no CQVX changes)
- CQVX just provides venue-specific subscribe logic
- Setup
go.modwith CQC and CQI dependencies - Define
VenueClientinterface inpkg/client/client.go - Define common types in
pkg/types/ - Implement mock client in
pkg/client/mock/ - Write integration tests for mock client
- Define
Signerinterface ininternal/auth/signer.go - Implement HMAC-SHA256 signer (for Coinbase)
- Implement JWT signer (for Prime)
- Implement Bearer token signer (for FalconX)
- Implement MPC signer (for Fordefi)
- Write comprehensive auth unit tests
- Define
Normalizerinterface - Implement common normalization utilities (timestamps, decimals)
- Implement Coinbase normalizers (order, execution, balance, orderbook, errors)
- Implement Prime normalizers
- Implement FalconX normalizers
- Implement Fordefi normalizers
- Write normalization unit tests with testdata
-
Coinbase Advanced Trade (Week 3)
- Implement Client struct and constructor
- Implement trading methods (PlaceOrder, CancelOrder, GetOrder, GetOrders)
- Implement account methods (GetBalance)
- Implement market data methods (GetOrderBook)
- Implement streaming methods (SubscribeOrderBook, SubscribeTrades)
- Implement health check
- Write unit tests
-
Coinbase Prime (Week 3)
- Same structure as Coinbase Advanced Trade, JWT auth variant
-
FalconX (Week 4)
- RFQ workflow implementation
- Polling-based (no WebSocket)
-
Fordefi (Week 4)
- MPC signing integration
- Approval workflow handling
- Write comprehensive README.md with usage examples
- Create
examples/simple/with basic usage - Create
examples/streaming/with WebSocket usage - Document each venue's specific configuration
- Integration tests (optional, requires live credentials)
- Auth tests: Verify signature generation matches venue expectations
- Use test vectors from venue documentation
- Mock HTTP client to verify headers/params
- Normalizer tests: Verify JSON → CQC conversion
- Use real venue response samples in testdata/
- Test edge cases (missing fields, unusual formats)
- Client tests: Verify method implementations
- Mock CQI HTTP/WS clients
- Verify correct endpoints, methods, bodies
- Verify error handling
- Requires live venue credentials (not for CI)
- Test end-to-end flows with real venues
- Validate normalization with live data
- Used for manual verification, not automated testing
- Comprehensive mock client for consuming services
- Verify mock matches VenueClient interface exactly
- Test data builders for common scenarios
- ✅ Can import and instantiate any venue client in <30 minutes
- ✅ All operations return CQC types (100% type-safe)
- ✅ Can test service logic with mock.Client (no live connections)
- ✅ Same code works across all 4 MVP venues
- ✅ Adding new venue requires <500 LOC
- ✅ Zero HTTP/WebSocket infrastructure duplication
- ✅ All operations emit CQI logs/metrics automatically
- ✅ All venue errors mapped to CQI types
- ✅ ≥99.9% request success rate (CQI retry + circuit breaker)
- ✅ <10ms normalization overhead
- ✅ 1-60s exponential backoff WebSocket reconnect
- ✅ 0% HTTP 429 errors (CQI rate limiting)
- ❌ Running as standalone service
- ❌ Implementing HTTP/WebSocket infrastructure
- ❌ Cross-venue aggregation or routing logic
- ❌ Data persistence or caching
- ❌ Event publishing to message bus
- ❌ Service discovery or registration
- ❌ Admin UI or monitoring dashboards
- ❌ Building for Post-MVP venues (Binance, Kraken, etc.)