# Baseline Metrics ## Run Info - **Run**: 01-quality-cleanup - **Mode**: Automatic - **Date**: 2026-04-13 ## Source Metrics | Metric | Value | |--------|-------| | Source files | 11 | | Source LOC | 785 | | Test files | 6 | | Test LOC | 295 | | Endpoints | 7 | ### Source File Breakdown | File | LOC | Type | |------|-----|------| | api_client.pyx | 222 | Cython | | main.py | 187 | Python | | hardware_service.pyx | 100 | Cython | | binary_split.py | 69 | Python | | security.pyx | 68 | Cython | | cdn_manager.pyx | 44 | Cython | | constants.pyx | 44 | Cython | | setup.py | 27 | Python | | unlock_state.py | 11 | Python | | credentials.pyx | 9 | Cython | | user.pyx | 6 | Cython | ## Test Results (Last Run) | Metric | Value | |--------|-------| | Total tests | 18 | | Passed | 18 | | Failed | 0 | | Skipped | 0 | | Errors | 0 | | Duration | 12.87s | ## Endpoint Inventory | Endpoint | Method | Tested | Notes | |----------|--------|--------|-------| | /health | GET | Yes | AC-1 | | /status | GET | Yes | AC-2 partial | | /login | POST | Yes | AC-2, AC-3 | | /load/{filename} | POST | Yes | AC-4 | | /upload/{filename} | POST | Yes | AC-5 | | /unlock | POST | Yes | AC-6, AC-7, AC-10 | | /unlock/status | GET | Yes | AC-8 | ## Identified Issues | # | Issue | Location | Severity | Category | |---|-------|----------|----------|----------| | 1 | ApiClient singleton not thread-safe | main.py:20-25 | Medium | Race condition | | 2 | Global mutable unlock state | main.py:48-50 | Medium | Testability / thread safety | | 3 | Manual PKCS7 unpadding (incomplete validation) | security.pyx:38-44, binary_split.py:46-53 | Medium | Security / correctness | | 4 | Hardcoded log file path | constants.pyx:20 | Low | Configurability | | 5 | `os.remove` error silently swallowed | main.py:143-146 | Low | Error handling | | 6 | Dead code: 5 orphan methods + 5 orphan constants | api_client.pyx, constants.pyx | Low | Dead code | ### Issue Details **Issue 1 — ApiClient singleton race condition**: `get_api_client()` checks `if api_client is None` and assigns without a lock. Under concurrent requests, two threads could create separate instances, the second overwriting the first. **Issue 2 — Global mutable unlock state**: `unlock_state` and `unlock_error` are module-level globals in `main.py`. They are protected by `unlock_lock` for writes, but the pattern of global state makes reasoning about state transitions harder and prevents running multiple unlock sequences. **Issue 3 — Manual PKCS7 unpadding**: `security.pyx:38-44` manually reads the last byte to determine padding length, but does not validate that all N trailing bytes equal N (as PKCS7 requires). Corrupted or tampered ciphertext silently produces garbage. If the last byte is outside 1-16, data is returned as-is with no error. The library's `padding.PKCS7(128).unpadder()` is already imported (line 8) and used for encryption — the same should be used for decryption. The same manual pattern exists in `binary_split.py:46-53` for archive decryption. **Issue 4 — Hardcoded log path**: `constants.pyx:20` writes to `"Logs/log_loader_{time:YYYYMMDD}.txt"` with no environment variable override. Works in Docker where `/app/Logs/` is the implicit path, but breaks or creates unexpected directories in other environments. **Issue 5 — Silent error swallowing**: `main.py:143-146` catches `OSError` on `os.remove(tar_path)` and passes silently. Per project rules, errors should not be silently suppressed. **Issue 6 — Dead code**: 5 orphan methods in `api_client.pyx` (`get_user`, `list_files`, `check_resource`, `upload_to_cdn`, `download_from_cdn`) — defined and declared in `.pxd` but never called from any source file. 5 orphan constants in `constants.pyx` (`CONFIG_FILE`, `QUEUE_CONFIG_FILENAME`, `AI_ONNX_MODEL_FILE`, `MODELS_FOLDER`, `ALIGNMENT_WIDTH`) — declared but never referenced outside their own file. Git history preserves them if ever needed again. ## Dependencies | Package | Version | Used In | |---------|---------|---------| | fastapi | latest | main.py | | uvicorn[standard] | latest | server | | Cython | 3.1.3 | build | | requests | 2.32.4 | api_client, binary_split | | pyjwt | 2.10.1 | api_client | | cryptography | 44.0.2 | security, binary_split | | boto3 | 1.40.9 | cdn_manager | | loguru | 0.7.3 | constants | | pyyaml | 6.0.2 | api_client | | psutil | 7.0.0 | hardware_service | | python-multipart | latest | main.py (file upload) |