diff --git a/.cursor/rules/rust/complex/workspace.mdc b/.cursor/rules/rust/complex/workspace.mdc
index 5540e16..a7d443a 100644
--- a/.cursor/rules/rust/complex/workspace.mdc
+++ b/.cursor/rules/rust/complex/workspace.mdc
@@ -911,7 +911,7 @@ chrono = { workspace = true }
uuid = { workspace = true }
# Domain-specific dependencies
-bcrypt = "0.15"
+argon2 = "0.5"
validator = { version = "0.18", features = ["derive"] }
regex = { workspace = true }
diff --git a/.cursor/rules/rust/core/api-design.mdc b/.cursor/rules/rust/core/api-design.mdc
new file mode 100644
index 0000000..361fa91
--- /dev/null
+++ b/.cursor/rules/rust/core/api-design.mdc
@@ -0,0 +1,798 @@
+---
+description:
+globs:
+alwaysApply: false
+---
+# ๐จ RUST API DESIGN BEST PRACTICES
+
+> **TL;DR:** Comprehensive API design guidelines for creating ergonomic, maintainable, and idiomatic Rust libraries and services.
+
+## ๐ API DESIGN STRATEGY
+
+```mermaid
+graph TD
+ Start["API Design"] --> Purpose{"API
Purpose?"}
+
+ Purpose -->|Library| LibAPI["Library API"]
+ Purpose -->|Service| ServiceAPI["Service API"]
+ Purpose -->|CLI| CLIAPI["CLI API"]
+
+ LibAPI --> Ergonomics["Ergonomic Design"]
+ ServiceAPI --> RESTDesign["REST/gRPC Design"]
+ CLIAPI --> CLIDesign["Command Interface"]
+
+ Ergonomics --> FlexibleInputs["Flexible Input Types"]
+ Ergonomics --> BuilderPattern["Builder Pattern"]
+ Ergonomics --> ErrorDesign["Error Design"]
+
+ RESTDesign --> OpenAPI["OpenAPI Documentation"]
+ RESTDesign --> Validation["Input Validation"]
+ RESTDesign --> Authentication["Authentication"]
+
+ CLIDesign --> Subcommands["Subcommand Structure"]
+ CLIDesign --> Configuration["Configuration Management"]
+ CLIDesign --> HelpSystem["Help System"]
+
+ FlexibleInputs --> TraitDesign["Trait Design"]
+ BuilderPattern --> TraitDesign
+ ErrorDesign --> TraitDesign
+
+ OpenAPI --> AsyncAPI["Async API Patterns"]
+ Validation --> AsyncAPI
+ Authentication --> AsyncAPI
+
+ Subcommands --> Testing["Testing Strategy"]
+ Configuration --> Testing
+ HelpSystem --> Testing
+
+ TraitDesign --> Documentation["Documentation"]
+ AsyncAPI --> Documentation
+ Testing --> Documentation
+
+ Documentation --> APIComplete["API Complete"]
+
+ style Start fill:#4da6ff,stroke:#0066cc,color:white
+ style Ergonomics fill:#4dbb5f,stroke:#36873f,color:white
+ style RESTDesign fill:#ffa64d,stroke:#cc7a30,color:white
+ style CLIDesign fill:#d94dbb,stroke:#a3378a,color:white
+```
+
+## ๐ฏ API DESIGN PRINCIPLES
+
+### Ergonomic Function Signatures
+```rust
+use std::path::Path;
+
+// โ
Accept flexible input types
+pub fn read_config>(path: P) -> Result {
+ let path = path.as_ref();
+ // Implementation
+}
+
+// โ
Use Into for string-like parameters
+pub fn create_user>(name: S, email: S) -> Result {
+ let name = name.into();
+ let email = email.into();
+ // Implementation
+}
+
+// โ
Prefer borrowing over ownership when possible
+pub fn validate_email(email: &str) -> Result<(), ValidationError> {
+ // Implementation - doesn't need to own the string
+}
+
+// โ
Return owned data when caller needs ownership
+pub fn generate_token() -> String {
+ // Implementation returns owned String
+}
+
+// โ Avoid overly generic signatures without clear benefit
+// pub fn process(input: T, func: F) -> U where F: Fn(T) -> U
+```
+
+### Builder Pattern Implementation
+```rust
+use typed_builder::TypedBuilder;
+
+// โ
Use TypedBuilder for complex configuration
+#[derive(Debug, TypedBuilder)]
+pub struct HttpClient {
+ #[builder(setter(into))]
+ base_url: String,
+
+ #[builder(default = Duration::from_secs(30))]
+ timeout: Duration,
+
+ #[builder(default)]
+ headers: HashMap,
+
+ #[builder(default, setter(strip_option))]
+ proxy: Option,
+
+ #[builder(default = false)]
+ verify_ssl: bool,
+}
+
+impl HttpClient {
+ // โ
Provide a simple constructor for common cases
+ pub fn new>(base_url: S) -> Self {
+ Self::builder()
+ .base_url(base_url)
+ .build()
+ }
+
+ // โ
Provide convenient factory methods
+ pub fn with_auth>(base_url: S, token: S) -> Self {
+ let mut headers = HashMap::new();
+ headers.insert("Authorization".to_string(), format!("Bearer {}", token.into()));
+
+ Self::builder()
+ .base_url(base_url)
+ .headers(headers)
+ .build()
+ }
+}
+
+// โ
Usage examples
+let client = HttpClient::new("https://api.example.com");
+
+let authenticated_client = HttpClient::builder()
+ .base_url("https://api.example.com")
+ .timeout(Duration::from_secs(60))
+ .verify_ssl(true)
+ .build();
+```
+
+### Error Handling Design
+```rust
+use thiserror::Error;
+
+// โ
Well-structured error hierarchy
+#[derive(Error, Debug)]
+pub enum ApiError {
+ #[error("Network error: {source}")]
+ Network {
+ #[from]
+ source: reqwest::Error,
+ },
+
+ #[error("Invalid request: {message}")]
+ InvalidRequest { message: String },
+
+ #[error("Authentication failed")]
+ Authentication,
+
+ #[error("Resource not found: {resource_type} with id {id}")]
+ NotFound {
+ resource_type: String,
+ id: String,
+ },
+
+ #[error("Rate limit exceeded: retry after {retry_after} seconds")]
+ RateLimit { retry_after: u64 },
+
+ #[error("Server error: {status_code}")]
+ Server { status_code: u16 },
+}
+
+impl ApiError {
+ // โ
Provide utility methods for error classification
+ pub fn is_retryable(&self) -> bool {
+ matches!(
+ self,
+ ApiError::Network { .. } | ApiError::RateLimit { .. } | ApiError::Server { status_code } if *status_code >= 500
+ )
+ }
+
+ pub fn retry_after(&self) -> Option {
+ match self {
+ ApiError::RateLimit { retry_after } => Some(Duration::from_secs(*retry_after)),
+ _ => None,
+ }
+ }
+}
+
+// โ
Domain-specific result type
+pub type ApiResult = Result;
+```
+
+## ๐ TRAIT DESIGN PATTERNS
+
+### Cohesive Trait Design
+```rust
+// โ
Single responsibility traits
+pub trait Serializable {
+ fn serialize(&self) -> Result, SerializationError>;
+ fn deserialize(data: &[u8]) -> Result
+ where
+ Self: Sized;
+}
+
+pub trait Cacheable {
+ type Key;
+ fn cache_key(&self) -> Self::Key;
+ fn cache_ttl(&self) -> Option;
+}
+
+// โ
Composable traits
+pub trait Repository {
+ type Error;
+ type Id;
+
+ async fn find_by_id(&self, id: Self::Id) -> Result