Token-bucket rate limiter (no new dependencies) with three tiers:
- Auth routes: 10 req/min, burst 5 (brute-force protection)
- Trading/read routes: 200 req/min, burst 20
- Compute routes (backtest/training/tune): 30 req/min, burst 5
Includes background cleanup task for stale entries and 7 unit tests.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- Fix all 98 clippy warnings (0 remaining with -D warnings)
- Add 30s default gRPC timeout on all channels via Endpoint::timeout()
- Replace readiness probe is_some() with actual gRPC health check (returns 503 when degraded)
- Add responsive Tailwind breakpoints to all 5 dashboard pages
- Add ComponentErrorBoundary for crash-prone chart components
- Log JWT validation errors at debug level instead of silently discarding
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- Replace redundant closures with function references in correlation.rs
- Use unwrap_or_default() instead of unwrap_or_else(T::new)
- Allow clippy::infinite_loop on intentional reconnect/heartbeat loops
- Allow clippy::empty_structs_with_brackets in generated proto code
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Replace 6 stub handlers returning fake JSON with real gRPC proxies:
- training.rs: list_jobs→ListTrainingJobs, start_job→StartTraining, cancel_job→StopTraining
- tune.rs: start_tune→StartTuningJob, get_status/get_best→GetTuningJobStatus, stop_tune→StopTuningJob
Add ml_training proto module and MlTrainingServiceClient factory.
All 24/24 web-gateway REST endpoints now proxy to real gRPC services.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
All production code already uses safe patterns. This enforces the same
safety standard as ml, risk, common, data, and all service crates.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- Replace impl Trait params with concrete types or named generics
- Rename shadowed variables (tx/ch/inner → unique names per scope)
- Add -> ! return type on infinite reconnect/heartbeat loops
- Replace wildcard enum match with explicit tonic::Code variants
- Use drop() on #[must_use] broadcast send results
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
New web-gateway crate with:
- JWT auth middleware with claims extraction
- REST routes proxying to gRPC: trading, risk, ML, training, backtesting,
performance, config, and hyperparameter tuning
- Proto compilation from shared tli/proto definitions
- AppState with lazy gRPC channels and WebSocket broadcast
- Axum server with CORS, tracing, and graceful shutdown
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>