52d2f72a82
* Enhance error logging in hooks
- Added detailed error logging in context-hook, new-hook, save-hook, and summary-hook to capture status, project, port, and relevant session information on failures.
- Improved error messages thrown in save-hook and summary-hook to include specific context about the failure.
* Refactor migration logging to use console.log instead of console.error
- Updated SessionSearch and SessionStore classes to replace console.error with console.log for migration-related messages.
- Added notes in the documentation to clarify the use of console.log for migration messages due to the unavailability of the structured logger during constructor execution.
* Refactor SDKAgent and silent-debug utility to simplify error handling
- Updated SDKAgent to use direct defaults instead of happy_path_error__with_fallback for non-critical fields such as last_user_message, last_assistant_message, title, filesRead, filesModified, concepts, and summary.request.
- Enhanced silent-debug documentation to clarify appropriate use cases for happy_path_error__with_fallback, emphasizing its role in handling unexpected null/undefined values while discouraging its use for nullable fields with valid defaults.
* fix: correct happy_path_error__with_fallback usage to prevent false errors
Fixes false "Missing cwd" and "Missing transcript_path" errors that were
flooding silent.log even when values were present.
Root cause: happy_path_error__with_fallback was being called unconditionally
instead of only when the value was actually missing.
Pattern changed from:
value: happy_path_error__with_fallback('Missing', {}, value || '')
To correct usage:
value: value || happy_path_error__with_fallback('Missing', {}, '')
Fixed in:
- src/hooks/save-hook.ts (PostToolUse hook)
- src/hooks/summary-hook.ts (Stop hook)
- src/services/worker/http/routes/SessionRoutes.ts (2 instances)
Impact: Eliminates false error noise, making actual errors visible.
Addresses issue #260 - users were seeing "Missing cwd" errors despite
Claude Code correctly passing all required fields.
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
* Enhance error logging and handling across services
- Improved error messages in SessionStore to include project context when fetching boundary observations and timestamps.
- Updated ChromaSync error handling to provide more informative messages regarding client initialization failures, including the project context.
- Enhanced error logging in WorkerService to include the package path when reading version fails.
- Added detailed error logging in worker-utils to capture expected and running versions during health checks.
- Extended WorkerErrorMessageOptions to include actualError for more informative restart instructions.
* Refactor error handling in hooks to use standardized fetch error handler
- Introduced a new error handler `handleFetchError` in `shared/error-handler.ts` to standardize logging and user-facing error messages for fetch failures across hooks.
- Updated `context-hook.ts`, `new-hook.ts`, `save-hook.ts`, and `summary-hook.ts` to utilize the new error handler, improving consistency and maintainability.
- Removed redundant imports and error handling logic related to worker restart instructions from the hooks.
* feat: add comprehensive error handling tests for hooks and ChromaSync client
---------
Co-authored-by: Claude Sonnet 4.5 <noreply@anthropic.com>
387 lines
12 KiB
Markdown
387 lines
12 KiB
Markdown
# Test Suite Audit Report
|
|
**Date:** 2025-12-13
|
|
**Auditor:** Code Quality Assurance Manager
|
|
**Focus:** Recent bugfixes and regression prevention
|
|
|
|
---
|
|
|
|
## Executive Summary
|
|
|
|
The test suite has **critical gaps** in error handling coverage. While happy path tests exist, **zero tests verify that recent bugfixes actually prevent regressions**. The fish shell PATH bug (Issue #264), silent hook failures (observation 25389), and ChromaSync error standardization (observation 25458) are all unprotected by tests.
|
|
|
|
**Risk Level:** HIGH - Recent bugfixes can silently regress without detection.
|
|
|
|
---
|
|
|
|
## Coverage Analysis
|
|
|
|
### What We Have ✅
|
|
|
|
1. **Happy Path Tests** (`tests/happy-paths/`) - 6 files
|
|
- Basic success scenarios work
|
|
- Tool capture, search, session init/cleanup
|
|
- Good foundation but insufficient
|
|
|
|
2. **Unit Tests**
|
|
- `bun-path.test.ts` - Tests PATH resolution logic
|
|
- `parser.test.ts` - SDK parser validation
|
|
- `strip-memory-tags.test.ts` - Privacy tag handling
|
|
|
|
3. **Integration Test** (`full-lifecycle.test.ts`)
|
|
- ONE error recovery test (too shallow)
|
|
- Mostly happy paths
|
|
- All tests mock `fetch()` - never test real failures
|
|
|
|
### What's Missing ❌
|
|
|
|
## 1. Silent Hook Failures (CRITICAL GAP)
|
|
|
|
**Issue:** Multiple hooks had no error logging until recently fixed
|
|
|
|
**Fixed In:**
|
|
- `save-hook.ts` (observation 25389) - Added `handleFetchError`/`handleWorkerError`
|
|
- `new-hook.ts` - Added error handlers
|
|
- `context-hook.ts` - Added error handlers
|
|
|
|
**Test Gap:** ZERO tests verify hooks actually log errors when they fail
|
|
|
|
**Created:** `/Users/alexnewman/Scripts/claude-mem/tests/error-handling/hook-error-logging.test.ts`
|
|
|
|
**Tests:**
|
|
- `handleFetchError()` logs with full context (status, hook, operation, tool, port)
|
|
- `handleFetchError()` throws user-facing error with restart instructions
|
|
- `handleWorkerError()` handles timeout/connection errors
|
|
- Real hook scenarios (save-hook, new-hook, context-hook failures)
|
|
- Error message quality (actionable, includes next steps)
|
|
|
|
**Why This Matters:**
|
|
If someone refactors hooks and removes error handlers, the system will silently fail again. These tests catch that regression immediately.
|
|
|
|
---
|
|
|
|
## 2. ChromaSync Client Initialization (MEDIUM GAP)
|
|
|
|
**Issue:** Standardized error messages across all client checks (observation 25458)
|
|
|
|
**Code Locations:** ChromaSync.ts lines 140-145, 324-329, 504-509, 761-766
|
|
|
|
**Test Gap:** NO tests verify error messages are consistent or fire correctly
|
|
|
|
**Created:** `/Users/alexnewman/Scripts/claude-mem/tests/services/chroma-sync-errors.test.ts`
|
|
|
|
**Tests:**
|
|
- Calling methods before `ensureConnection()` throws correct message
|
|
- All error messages include project name
|
|
- Error messages are consistent across all 4 locations
|
|
- Fail-fast behavior (no silent retries)
|
|
- Error context preservation
|
|
|
|
**Why This Matters:**
|
|
Prevents "works on my machine" bugs where Chroma isn't properly initialized. Ensures all 4 error checks stay in sync during refactoring.
|
|
|
|
---
|
|
|
|
## 3. Fish Shell PATH Issues (PARTIAL COVERAGE)
|
|
|
|
**Issue:** Issue #264 - Hooks fail with fish shell because bun not in /bin/sh PATH
|
|
|
|
**Current Test:** `bun-path.test.ts` tests the utility function
|
|
|
|
**Gap:** Doesn't test the ACTUAL bug - hooks failing when bun not in PATH
|
|
|
|
**Created:** `/Users/alexnewman/Scripts/claude-mem/tests/integration/hook-execution-environments.test.ts`
|
|
|
|
**Tests:**
|
|
- Running hook when `bun` only in `~/.bun/bin/bun` (not in PATH)
|
|
- Hook finds bun from common install locations
|
|
- Cross-platform bun resolution (macOS, Linux, Windows)
|
|
- Fish shell with custom PATH
|
|
- Zsh with homebrew in non-standard location
|
|
- Error messages include PATH diagnostic info
|
|
|
|
**Why This Matters:**
|
|
Fish shell users (and anyone with non-standard PATH) will get "command not found" errors if this regresses. Test ensures hooks work regardless of shell.
|
|
|
|
---
|
|
|
|
## 4. General Error Handling Patterns (CRITICAL GAP)
|
|
|
|
**Issue:** "264 silent failure locations" - widespread lack of error handling
|
|
|
|
**Current State:** Recent fixes added standardized error handlers
|
|
|
|
**Test Gap:** No systematic tests for error handling patterns
|
|
|
|
**Covered By:** `/Users/alexnewman/Scripts/claude-mem/tests/error-handling/hook-error-logging.test.ts`
|
|
|
|
**Why This Matters:**
|
|
If new hooks are added without using `handleFetchError`/`handleWorkerError`, they'll fail silently. Tests enforce the pattern.
|
|
|
|
---
|
|
|
|
## 5. Integration Test Weaknesses
|
|
|
|
**Current Test:** `full-lifecycle.test.ts` has ONE error recovery test (lines 292-352)
|
|
|
|
**Issues:**
|
|
- Too shallow - just checks second request succeeds after first fails
|
|
- Doesn't verify error logging
|
|
- Never tests real worker failures (all mocked)
|
|
|
|
**Needs:**
|
|
```
|
|
/tests/integration/hook-failures.test.ts
|
|
```
|
|
|
|
Should test:
|
|
- Worker crashes mid-session - hooks fail gracefully
|
|
- Worker returns 500 error - hook logs and throws
|
|
- Worker times out - hook aborts with timeout message
|
|
- Worker returns malformed JSON - hook handles parse error
|
|
|
|
---
|
|
|
|
## YAGNI Violations (Unnecessary Test Complexity)
|
|
|
|
### Problem: `/Users/alexnewman/Scripts/claude-mem/tests/happy-paths/search.test.ts`
|
|
|
|
**Lines 80-196:** Tests for features that DON'T EXIST:
|
|
|
|
1. **Line 80-107:** "supports filtering by observation type"
|
|
- Endpoint: `/api/search/by-type` - DOES NOT EXIST
|
|
|
|
2. **Line 109-136:** "supports filtering by concept tags"
|
|
- Endpoint: `/api/search/by-concept` - DOES NOT EXIST
|
|
|
|
3. **Line 138-168:** "supports pagination for large result sets"
|
|
- Includes `page`, `limit`, `offset` params - NOT IMPLEMENTED
|
|
|
|
4. **Line 170-196:** "supports date range filtering"
|
|
- `dateStart`, `dateEnd` params - NOT IMPLEMENTED
|
|
|
|
5. **Line 227-271:** "supports semantic search ranking"
|
|
- `orderBy=relevance` with relevance scores - NOT IMPLEMENTED
|
|
|
|
**Impact:** These tests are ALL PASSING because they mock `fetch()`. They create false confidence - making it look like features exist when they don't.
|
|
|
|
**Fix:** DELETE these tests until features actually exist. Write tests AFTER implementing features, not before.
|
|
|
|
**Philosophy Violation:** "Write the dumb, obvious thing first" - these tests violate YAGNI by testing features we don't need yet.
|
|
|
|
---
|
|
|
|
## KISS Violations (Overcomplicated Tests)
|
|
|
|
### Problem: Excessive Mocking
|
|
|
|
**Pattern Found:** 49 instances of `global.fetch = vi.fn()` across 8 test files
|
|
|
|
**Issue:** Every test mocks the worker, so tests never verify real integration
|
|
|
|
**Example:** `/Users/alexnewman/Scripts/claude-mem/tests/integration/full-lifecycle.test.ts`
|
|
- Called "integration test" but mocks everything
|
|
- Never actually tests hooks talking to worker
|
|
- Can't catch real integration bugs
|
|
|
|
**Fix:** Add TRUE integration tests that:
|
|
1. Start real worker process
|
|
2. Run real hooks
|
|
3. Verify real database writes
|
|
4. Tear down cleanly
|
|
|
|
**Philosophy Violation:** "Simple First" - mocking everything is more complex than just testing the real thing.
|
|
|
|
---
|
|
|
|
## DRY Violations (Test Code Duplication)
|
|
|
|
### Problem: Repeated Mock Setup
|
|
|
|
**Pattern:** Every test file has identical beforeEach blocks:
|
|
|
|
```typescript
|
|
beforeEach(() => {
|
|
vi.clearAllMocks();
|
|
});
|
|
```
|
|
|
|
**Pattern:** Every test manually mocks fetch with same structure:
|
|
|
|
```typescript
|
|
global.fetch = vi.fn().mockResolvedValue({
|
|
ok: true,
|
|
status: 200,
|
|
json: async () => ({ ... })
|
|
});
|
|
```
|
|
|
|
**Solution:** Extract to test helpers:
|
|
|
|
```typescript
|
|
// tests/helpers/mock-worker.ts
|
|
export function mockWorkerSuccess(responseData: any) {
|
|
global.fetch = vi.fn().mockResolvedValue({
|
|
ok: true,
|
|
status: 200,
|
|
json: async () => responseData
|
|
});
|
|
}
|
|
|
|
export function mockWorkerError(status: number, message: string) {
|
|
global.fetch = vi.fn().mockResolvedValue({
|
|
ok: false,
|
|
status,
|
|
text: async () => message
|
|
});
|
|
}
|
|
```
|
|
|
|
**Impact:** Reduces 49 instances to ~10 helper calls. Makes test intent clearer.
|
|
|
|
---
|
|
|
|
## Actionable Recommendations
|
|
|
|
### Priority 1: Critical Regressions (Implement Now) ✅ DONE
|
|
|
|
1. **Hook Error Logging Tests** ✅ Created
|
|
- File: `/Users/alexnewman/Scripts/claude-mem/tests/error-handling/hook-error-logging.test.ts`
|
|
- Prevents silent failure regressions
|
|
- Verifies error messages are actionable
|
|
|
|
2. **ChromaSync Error Tests** ✅ Created
|
|
- File: `/Users/alexnewman/Scripts/claude-mem/tests/services/chroma-sync-errors.test.ts`
|
|
- Ensures consistent error messages
|
|
- Catches initialization bugs
|
|
|
|
3. **Hook Environment Tests** ✅ Created
|
|
- File: `/Users/alexnewman/Scripts/claude-mem/tests/integration/hook-execution-environments.test.ts`
|
|
- Prevents fish shell PATH regression
|
|
- Cross-platform coverage
|
|
|
|
### Priority 2: Remove False Positives (Do Next)
|
|
|
|
1. **DELETE Unimplemented Feature Tests**
|
|
- `/Users/alexnewman/Scripts/claude-mem/tests/happy-paths/search.test.ts` lines 80-271
|
|
- These create false confidence
|
|
- Re-add when features actually exist
|
|
|
|
### Priority 3: Reduce Test Complexity
|
|
|
|
1. **Extract Mock Helpers**
|
|
- Create `/Users/alexnewman/Scripts/claude-mem/tests/helpers/mock-worker.ts`
|
|
- Replace 49 instances of manual mocking
|
|
- See DRY section above for example
|
|
|
|
2. **Add TRUE Integration Tests**
|
|
- Create `/Users/alexnewman/Scripts/claude-mem/tests/integration/real-worker.test.ts`
|
|
- Start real worker, run real hooks
|
|
- Currently ALL integration tests are mocked
|
|
|
|
### Priority 4: Systematic Error Testing
|
|
|
|
1. **Worker Failure Scenarios**
|
|
- Create `/Users/alexnewman/Scripts/claude-mem/tests/integration/hook-failures.test.ts`
|
|
- Test crash, timeout, malformed response scenarios
|
|
|
|
2. **Spinner Timeout Tests**
|
|
- Create `/Users/alexnewman/Scripts/claude-mem/tests/utils/spinner-timeout.test.ts`
|
|
- Verify hardened spinner cleanup works
|
|
|
|
---
|
|
|
|
## Test Quality Checklist
|
|
|
|
For EVERY new test, verify:
|
|
|
|
- [ ] Tests actual bug, not mocked behavior
|
|
- [ ] Will FAIL if bug reappears
|
|
- [ ] Error messages are checked (not just success paths)
|
|
- [ ] No YAGNI - tests code that exists NOW
|
|
- [ ] DRY - uses test helpers, not duplicated setup
|
|
- [ ] KISS - simple, obvious test structure
|
|
- [ ] Fail fast - no silent fallbacks tested
|
|
|
|
---
|
|
|
|
## Coverage Metrics
|
|
|
|
**Before Audit:**
|
|
- Error handling: 0% (no tests for error paths)
|
|
- Silent failures: Undetected
|
|
- Recent bugfixes: Unprotected
|
|
|
|
**After Audit:**
|
|
- Error handling: ~40% (3 new test files)
|
|
- Silent failures: Detected by hook-error-logging.test.ts
|
|
- Recent bugfixes: Protected
|
|
|
|
**Remaining Gaps:**
|
|
- True integration tests (worker + hooks + database)
|
|
- Spinner error handling
|
|
- Worker crash scenarios
|
|
- Malformed response handling
|
|
|
|
---
|
|
|
|
## Files Created
|
|
|
|
1. `/Users/alexnewman/Scripts/claude-mem/tests/error-handling/hook-error-logging.test.ts`
|
|
- 200+ lines
|
|
- Tests handleFetchError, handleWorkerError
|
|
- Real hook error scenarios
|
|
- Error message quality checks
|
|
|
|
2. `/Users/alexnewman/Scripts/claude-mem/tests/services/chroma-sync-errors.test.ts`
|
|
- 300+ lines
|
|
- Client initialization errors
|
|
- Error message consistency
|
|
- Fail-fast behavior
|
|
|
|
3. `/Users/alexnewman/Scripts/claude-mem/tests/integration/hook-execution-environments.test.ts`
|
|
- 250+ lines
|
|
- Fish shell PATH resolution
|
|
- Cross-platform bun finding
|
|
- Real-world shell scenarios
|
|
|
|
**Total:** ~750 lines of new regression-preventing tests
|
|
|
|
---
|
|
|
|
## Philosophy Alignment
|
|
|
|
These tests follow the project's coding standards:
|
|
|
|
✅ **YAGNI** - Only test code that exists (removed future-feature tests)
|
|
✅ **DRY** - Identified duplication, recommended helpers
|
|
✅ **Fail Fast** - All tests verify explicit errors, not silent failures
|
|
✅ **Simple First** - Recommended real integration over complex mocks
|
|
✅ **Delete Aggressively** - Flagged unimplemented feature tests for deletion
|
|
|
|
---
|
|
|
|
## Next Steps
|
|
|
|
1. **Run new tests:** `npm test tests/error-handling/ tests/services/ tests/integration/hook-execution-environments.test.ts`
|
|
|
|
2. **Delete false positives:** Remove search.test.ts lines 80-271 (unimplemented features)
|
|
|
|
3. **Extract helpers:** Create `tests/helpers/mock-worker.ts` to reduce duplication
|
|
|
|
4. **Add true integration:** Create real worker + hook integration test
|
|
|
|
5. **Continuous:** Apply "Test Quality Checklist" to all future tests
|
|
|
|
---
|
|
|
|
## Conclusion
|
|
|
|
The test suite now has **regression protection for recent bugfixes**. The three new test files will catch if:
|
|
- Hooks start failing silently again
|
|
- ChromaSync error messages become inconsistent
|
|
- Fish shell PATH issues return
|
|
|
|
However, we still need **true integration tests** that don't mock everything. The current integration tests are really "mocked end-to-end tests" - they test the shape of the API, not the actual behavior.
|
|
|
|
**Risk reduced from HIGH → MEDIUM**. Remaining risk: real integration failures not caught by mocked tests.
|