Option A: Separate Crates

symphony_instruments = "0.3.0"
symphony_operators = "0.2.1"
symphony_motifs = "0.2.5"

Option B: Unified Crate with Features

symphony_external_api = { version = "0.3.0", features = ["instruments", "motifs"] }


📊 Detailed Comparison

1. Dependency Management

Separate Crates ✅

# AI Developer - Only gets AI dependencies
[dependencies]
symphony_instruments = "0.3.0"
# Pulls: tokio, serde_json, reqwest, tch (PyTorch), candle-core
# Size: ~45MB

# UI Developer - Only gets UI dependencies
[dependencies]
symphony_motifs = "0.2.5"
# Pulls: tauri, wry, css-color, web-sys
# Size: ~23MB

# Data Engineer - Minimal dependencies
[dependencies]
symphony_operators = "0.2.1"
# Pulls: csv, regex, serde
# Size: ~8MB

Unified with Features ❓

# AI Developer
[dependencies]
symphony_external_api = { version = "0.3.0", features = ["instruments"] }
# Still pulls: ALL potential dependencies (features don't eliminate unused deps)
# Size: ~76MB (full dependency tree)

# Problem: Rust features are additive, not subtractive
# If any dependency in your tree enables "motifs", you get UI dependencies too

Winner: Separate Crates - True dependency isolation

2. Compile Times

Separate Crates ✅

# AI extension development
cargo build  # Only compiles AI-related crates
# Time: ~45 seconds (clean build)
# Incremental: ~3 seconds

# When other extension types update, no recompilation needed

Unified with Features ⚠️

# Even with features, larger codebase to analyze
cargo build --features="instruments"
# Time: ~67 seconds (clean build)
# Incremental: ~5 seconds

# Any change to shared code triggers recompilation of entire crate

Winner: Separate Crates - Faster builds, better incremental compilation

3. Versioning & Release Management

Separate Crates ✅