11 KiB
Codebase Consolidation & DRY Cleanup — Implementation Plan
For Claude: REQUIRED SUB-SKILL: Use superpowers:executing-plans to implement this plan task-by-task.
Goal: Eliminate ~13,000 lines of duplicated code, god files, and unused compliance scaffolding.
Architecture: Four independent cleanup areas executed in dependency order: DRY consolidation → types.rs split → compliance audit → enhanced_ml.rs cleanup. Single worktree, frequent commits.
Tech Stack: Rust workspace, SQLX_OFFLINE=true for builds, cargo check/clippy/test
Task 1: Delete duplicate RetryStrategy from trading_engine
Files:
- Modify:
crates/trading_engine/src/types/error.rs— delete lines 14-85 (RetryStrategy enum + impl) - Modify:
crates/trading_engine/src/types/retry.rs— if it imports local RetryStrategy, switch tocommon::error::RetryStrategy
Step 1: Check if RetryStrategy is used anywhere in trading_engine
Run: SQLX_OFFLINE=true grep -rn "RetryStrategy" crates/trading_engine/src/ --include="*.rs"
Note: Prior audit found ZERO callers outside the definition file. If confirmed, just delete.
Step 2: Delete the duplicate RetryStrategy enum and its impl block
In crates/trading_engine/src/types/error.rs, delete everything from line 14 (/// Retry strategies) through line 85 (} closing max_attempts). Also delete the comment on lines 10-12 about "moved to error-handling crate".
Step 3: Fix any compilation errors
Run: SQLX_OFFLINE=true cargo check -p trading_engine
If retry.rs imports it, change to: use common::error::RetryStrategy;
Step 4: Commit
git add -A && git commit -m "refactor: delete duplicate RetryStrategy from trading_engine"
Task 2: Delete duplicate ErrorSeverity from data/ and database/
Files:
- Modify:
crates/data/src/error.rs— delete ErrorSeverity enum (line 441+), updateseverity()method to usecommon::error::ErrorSeverity - Modify:
crates/data/src/validation.rs— delete ErrorSeverity enum (line 112+), update struct field and usages - Modify:
crates/database/src/error.rs— delete ErrorSeverity enum (line 119+)
Step 1: Verify common's ErrorSeverity has the same variants
Read crates/common/src/error.rs around line 132. Confirm it has: Critical, High, Medium, Low.
Step 2: In crates/data/src/error.rs:
- Delete the
ErrorSeverityenum definition (~line 441-460) and itsDisplayimpl - Add
use common::error::ErrorSeverity;to imports - The
severity()method on DataError (line 376) stays — it just returns the common type now
Step 3: In crates/data/src/validation.rs:
- Delete the
ErrorSeverityenum definition (~line 112-120) - Add
use common::error::ErrorSeverity;to imports - The
severityfield inValidationErrorstruct stays
Step 4: In crates/database/src/error.rs:
- Delete the
ErrorSeverityenum definition (~line 119+) - Add
use common::error::ErrorSeverity;to imports if anything uses it
Step 5: Verify compilation
Run: SQLX_OFFLINE=true cargo check -p data -p database
Note: If the Display impl differs between copies, keep common's version and fix callers.
Step 6: Run tests
Run: SQLX_OFFLINE=true cargo test -p data --lib && SQLX_OFFLINE=true cargo test -p database --lib
Step 7: Commit
git add -A && git commit -m "refactor: consolidate ErrorSeverity to common crate"
Task 3: Delete duplicate RetryConfig from storage/
Files:
- Modify:
crates/storage/src/model_helpers.rs— delete RetryConfig struct (line 141+) and Default impl (line 152+) - Modify:
crates/storage/src/object_store_backend.rs— update import to usecommon::resilience::RetryConfig
Step 1: Verify common's RetryConfig has matching fields
Read crates/common/src/resilience/retry.rs around line 40. Confirm fields match: max_retries, base_delay, max_delay, circuit_breaker_threshold, circuit_breaker_timeout.
Step 2: Delete RetryConfig from model_helpers.rs
Delete the struct definition, Default impl, and update the field in the struct that uses it (_retry_config: RetryConfig at line 136).
Step 3: Update object_store_backend.rs import
Change: use crate::model_helpers::{ConnectionPool, ProgressCallback, RetryConfig};
To: use crate::model_helpers::{ConnectionPool, ProgressCallback};
Add: use common::resilience::RetryConfig;
Note: If storage doesn't depend on common, add it to storage/Cargo.toml.
Step 4: Verify
Run: SQLX_OFFLINE=true cargo check -p storage
Step 5: Commit
git add -A && git commit -m "refactor: consolidate RetryConfig to common::resilience"
Task 4: Split common/src/types.rs into focused modules
This is a large structural refactor. The 4,909-line file has clear section markers that make splitting straightforward.
Files:
- Create:
crates/common/src/types/directory - Create:
crates/common/src/types/mod.rs— re-exports - Create:
crates/common/src/types/aliases.rs— type aliases (lines 26-77) - Create:
crates/common/src/types/service.rs— ServiceId, ServiceStatus, ConfigVersion, RequestId (lines 125-276) - Create:
crates/common/src/types/market_data.rs— MarketDataEvent, QuoteEvent, TradeEvent, etc. (lines 278-828) - Create:
crates/common/src/types/type_error.rs— CommonTypeError enum + impls (lines 828-1106) - Create:
crates/common/src/types/trading_enums.rs— OrderType, BrokerType, OrderStatus, OrderSide, Currency, TimeInForce (lines 1106-1393) - Create:
crates/common/src/types/identifiers.rs— EventId, FillId, AggregateId, AssetId, ClientId (lines 1393-1631) - Create:
crates/common/src/types/domain.rs— Order, Position, Execution, Price, Quantity, Money, Symbol, etc. (lines 1631-3970) - Create:
crates/common/src/types/market.rs— MarketRegime, TickType, Exchange, MarketTick, TradingSignal, OrderRef (lines 3970-4429) - Delete:
crates/common/src/types.rs(original file)
Step 1: Create the types/ directory
mkdir -p crates/common/src/types
Step 2: Extract each section into its own file
For each file, copy the relevant lines from types.rs, adding necessary imports at the top of each new file (use statements for chrono, serde, uuid, HashMap, etc.).
The mod.rs re-exports everything:
mod aliases;
mod service;
mod market_data;
mod type_error;
mod trading_enums;
mod identifiers;
mod domain;
mod market;
pub use aliases::*;
pub use service::*;
pub use market_data::*;
pub use type_error::*;
pub use trading_enums::*;
pub use identifiers::*;
pub use domain::*;
pub use market::*;
Cross-references within the module use super:: or crate::types::.
Step 3: Move the test module
The #[cfg(test)] mod tests block (lines 4433+) should be split:
- Tests for domain types →
domain.rs - Tests for market data →
market_data.rs - Or keep as a single
tests.rsthat imports from the parent module
Step 4: Update lib.rs if needed
crates/common/src/lib.rs should already have pub mod types; — this stays. The re-exports
in mod.rs maintain backward compatibility.
Step 5: Verify
Run: SQLX_OFFLINE=true cargo check --workspace
This must compile the entire workspace since many crates import from common::types.
Step 6: Run common tests
Run: SQLX_OFFLINE=true cargo test -p common --lib
Step 7: Commit
git add -A && git commit -m "refactor: split common/types.rs (4909 LOC) into 8 focused modules"
Task 5: Audit compliance module usage
Files:
- Read: all files in
crates/trading_engine/src/compliance/ - Read:
crates/trading_engine/src/lib.rs(compliance module export)
Step 1: Find all external callers of each compliance submodule
For each of the 8 compliance files, grep the entire workspace for usage of their public types/functions OUTSIDE the compliance directory:
# For each file, check if its types are used externally
for type in ISO27001ComplianceManager SOXCompliance MiFIDCompliance BestExecutionAnalyzer \
ComplianceReporting AuditTrailManager AutomatedReporting TransactionReport; do
echo "=== $type ==="
grep -rn "$type" crates/ services/ --include="*.rs" | grep -v "compliance/" | grep -v "/tests/"
done
Step 2: Document findings
Create a table:
| Type/Module | External callers | Verdict |
|---|---|---|
| iso27001_compliance | ? | keep/delete |
| sox_compliance | ? | keep/delete |
| ... |
Step 3: Report findings before proceeding
Present the usage table and get confirmation before deleting anything. This step is a checkpoint — do NOT delete without review.
Task 6: Delete unused compliance modules
Based on Task 5 findings. Expected: iso27001, sox, automated_reporting, and best_execution have zero external callers.
Step 1: Delete each unused file
For each confirmed-unused file:
- Delete the file
- Remove
pub mod <name>;fromcompliance/mod.rs - Remove any
pub usere-exports fromcompliance/mod.rs
Step 2: Trim compliance/mod.rs
Remove re-exports for deleted modules. Remove struct definitions in mod.rs that only served as wrappers for deleted submodules.
Step 3: Verify
Run: SQLX_OFFLINE=true cargo check --workspace
Fix any compilation errors — if something was actually used, restore it.
Step 4: Run trading_engine tests
Run: SQLX_OFFLINE=true cargo test -p trading_engine --lib
Step 5: Commit
git add -A && git commit -m "refactor: delete unused compliance scaffolding (-N lines)"
Task 7: Audit and clean enhanced_ml.rs
Files:
- Modify:
services/trading_service/src/services/enhanced_ml.rs - Reference:
crates/ml/src/ensemble/model_adapter.rs(EnsembleModelAdapter)
Step 1: Read the full file and identify
RuntimeModelInfo— does it overlap withml::ModelMetadata?FeaturePreprocessor— does it duplicateProductionFeatureExtractorAdapter?EnsembleConfig— does it duplicateml::ensemble::ExtendedEnsembleConfig?- Model loading code — can it use
build_production_strategy()? - Dead
Status::unavailablestubs
Step 2: Delete/consolidate identified duplicates
Replace internal types with imports from ml crate where possible.
Simplify model loading to delegate to ml::ensemble::build_production_strategy().
Step 3: Verify
Run: SQLX_OFFLINE=true cargo check -p trading_service
Step 4: Run tests
Run: SQLX_OFFLINE=true cargo test -p trading_service --lib
Step 5: Commit
git add -A && git commit -m "refactor: simplify enhanced_ml.rs, remove legacy patterns"
Task 8: Full verification
Step 1: Workspace build
Run: SQLX_OFFLINE=true cargo check --workspace
Expected: zero errors
Step 2: Clippy on affected crates
Run: SQLX_OFFLINE=true cargo clippy -p common -p trading_engine -p data -p database -p storage -p trading_service --lib -- -D warnings
Step 3: Test affected crates
Run:
SQLX_OFFLINE=true cargo test -p common --lib
SQLX_OFFLINE=true cargo test -p trading_engine --lib
SQLX_OFFLINE=true cargo test -p data --lib
SQLX_OFFLINE=true cargo test -p database --lib
SQLX_OFFLINE=true cargo test -p storage --lib
Step 4: Line count verification
Run: git diff --stat main — target: -13,000+ net lines
Step 5: Commit verification results
No new commit needed — just verify all tasks are green.