# systemprompt-ai Tech Debt Audit
**Layer:** Domain
**Audited:** 2026-01-21
**Verdict:** NEEDS_WORK
---
## Summary
| Architecture | :warning: | 2 |
| Rust Standards | :white_check_mark: | 0 |
| Code Quality | :white_check_mark: | 0 |
| Tech Debt | :warning: | 2 |
**Total Issues:** 4 (2 architectural - cross-domain deps, 2 minor tech debt)
---
## Architectural Status
### Fixed This Audit
| `systemprompt-runtime` dependency | Removed - `AiService::new()` now accepts `DbPool` directly |
| `systemprompt-oauth` dependency | Removed - was unused |
| Missing schema directory | Verified - schema/ exists with proper SQL files |
### Remaining Cross-Domain Dependencies
These are intentional cross-domain integrations that provide cohesive functionality:
| `systemprompt-files` | Image storage, file metadata | AI-generated images need file system integration |
| `systemprompt-analytics` | Session tracking | AI usage tracking requires session context |
**Note:** These dependencies could be abstracted to traits in `shared/traits` for strict domain isolation, but the current integration provides simpler, cohesive functionality.
---
## Fixes Applied (2026-01-21)
### Architectural Fixes
| Removed `systemprompt-runtime` dependency | `Cargo.toml` |
| Removed `systemprompt-oauth` dependency | `Cargo.toml` |
| Changed `AiService::new()` to accept `DbPool` directly | `services/core/ai_service/service.rs` |
| Updated caller in agent crate | `agent/src/services/a2a_server/standalone.rs` |
| Updated README documentation | `README.md` |
### Silent Error Patterns Fixed
| `services/tools/adapter.rs:17-21` | `.and_then(\|c\| serde_json::to_value(c).ok())` | Added `tracing::warn!` logging before `.ok()` |
| `services/tools/adapter.rs:40-51` | `.and_then(\|c\| serde_json::from_value(c).ok())` | Added `tracing::warn!` logging before `.ok()` |
| `services/tools/adapter.rs:95-102` | `.and_then(\|m\| serde_json::to_value(m).ok())` | Added `tracing::warn!` logging before `.ok()` |
| `services/tools/adapter.rs:150-157` | `.and_then(\|m\| serde_json::from_value(m).ok())` | Added `tracing::warn!` logging before `.ok()` |
| `services/providers/gemini/streaming.rs:81-89` | `serde_json::from_str(...).ok()?` | Added `tracing::debug!` logging before `.ok()` |
### unwrap_or_default() Removed
| `services/core/ai_service/tool_execution.rs:183` | `.unwrap_or_default()` | `.unwrap_or_else(Vec::new)` |
| `services/core/ai_service/streaming.rs:45` | `.unwrap_or_default()` | `.unwrap_or_else(Vec::new)` |
| `services/providers/openai/generation.rs:134` | `.unwrap_or_default()` | `.unwrap_or_else(Vec::new)` |
| `services/providers/openai/response_builder.rs:25` | `.unwrap_or_default()` | `.unwrap_or_else(String::new)` |
| `services/providers/gemini/search.rs:141` | `.unwrap_or_default()` | `.unwrap_or_else(String::new)` |
| `services/providers/anthropic/generation.rs:234` | `.unwrap_or_default()` | `.unwrap_or_else(String::new)` |
---
## Warnings
Issues that should be addressed but don't block publication.
| `models/mod.rs:28-34` | Database row struct `AiRequest` uses raw String IDs (acceptable for `FromRow`) | Code Quality |
| `models/mod.rs:58-72` | Database row structs use raw String IDs (sqlx requirement) | Code Quality |
---
## Tech Debt Items
Areas identified for future improvement.
| `services/storage/image_storage.rs:186,219` | `let _ =` for cleanup operations - acceptable but could log | Low |
| `services/core/request_storage/async_operations.rs:112,124` | `unwrap_or()` with fallback values | Medium |
---
## Acceptable Patterns Found
The following patterns were reviewed and found to be acceptable:
| `async_operations.rs:15-19` | `.map_err(...).ok()` | Logs error before converting to Option |
| `image_storage.rs:186,219` | `let _ =` | Cleanup during error path, acceptable |
| `ai_request_record.rs` | Builder pattern | Correct builder implementation with typed IDs |
---
## Commands Executed
```
cargo fmt -p systemprompt-ai -- --check # PASS
cargo clippy -p systemprompt-ai -- -D warnings # BLOCKED (requires database)
```
---
## Dependency Analysis
### Current Dependencies (Cargo.toml)
**Allowed (Shared layer):**
- `systemprompt-models` :white_check_mark:
- `systemprompt-traits` :white_check_mark:
- `systemprompt-identifiers` :white_check_mark:
**Allowed (Infra layer):**
- `systemprompt-database` :white_check_mark:
- `systemprompt-loader` :white_check_mark:
- `systemprompt-logging` :white_check_mark:
**Cross-domain (Accepted):**
- `systemprompt-files` :warning: Provides file storage integration for AI-generated images
- `systemprompt-analytics` :warning: Provides session tracking for AI usage metrics
**Removed:**
- ~~`systemprompt-runtime`~~ :white_check_mark: Removed - was App layer violation
- ~~`systemprompt-oauth`~~ :white_check_mark: Removed - was unused
---
## Verdict Criteria
- **CLEAN**: Zero critical violations, ready for crates.io
- **NEEDS_WORK**: Minor issues, can publish with warnings
- **CRITICAL**: Blocking issues, must resolve before publication
**Current Status: NEEDS_WORK** - All Rust standards violations fixed. App layer violation removed. 2 cross-domain dependencies remain as accepted integrations.
---
## Checklist
### Zero-Tolerance (Publication Blockers)
- [x] Zero inline comments (`//`)
- [x] Zero doc comments (`///`)
- [x] Zero `unwrap()` calls
- [x] Zero `panic!()`, `todo!()`, `unimplemented!()`
- [x] Zero `unsafe` blocks
- [x] Zero raw String IDs (database row structs exempt)
- [x] Zero non-macro SQLX calls
- [x] Zero SQL in service files
- [x] Zero App/Entry layer dependencies - **FIXED: removed systemprompt-runtime**
- [x] Zero `#[cfg(test)]` modules
- [x] Zero `println!`/`eprintln!`/`dbg!`
- [x] Zero TODO/FIXME/HACK comments
- [ ] Clippy passes with `-D warnings` - **BLOCKED: requires database**
- [x] Formatting passes `cargo fmt --check`
### Code Quality (Should Fix)
- [x] All files under 300 lines
- [x] All functions under 75 lines
- [x] All functions have ≤5 parameters
- [x] No silent error swallowing (`.ok()` without context) - **FIXED**
- [x] No `unwrap_or_default()` usage - **FIXED**
- [x] No hardcoded fallback values
- [x] No direct `env::var()` access
### Best Practices (Recommended)
- [x] Builder pattern for complex types
- [x] Correct naming conventions
- [x] Structured logging with `tracing::`
- [x] Domain-specific error types with `thiserror`
- [x] Proper error context propagation
- [x] Schema directory with SQL files present