## Phase 8: Enterprise Extractor Improvements ✅ - 14 security extractors (TLS, JWT, SQL injection, XSS, etc.) - 10 framework-specific extractors (Spring, Django, Rails, etc.) - Config file security detection (YAML, TOML) ## Phase 9: Autonomous Extractor Generation ✅ - Shadow mode executor with TP/FP tracking - Graduation pipeline with confidence thresholds - Auto-rollback on regression detection - Cross-project pattern syncing ## UAT Suite Complete (14 scripts, 90 tests) - test-core-detection.sh (6 tests) - test-declarative-extractors.sh (5 tests) - test-domain-frameworks.sh (5 tests) - test-domain-unreal.sh (3 tests) - test-llm-extraction.sh (6 tests) - test-eval-harness.sh (5 tests) - test-cross-language.sh (3 tests) - test-precommit-performance.sh (4 tests) - test-output-formats.sh (8 tests) - test-drift-detection.sh (6 tests) - test-exit-codes.sh (12 tests) + 3 more scripts ## Other Changes - Updated roadmap to mark Phase 8-9 complete - Added .gitignore entries for build artifacts - Updated pre-commit: 800 line limit, exclude tests/data/cmd Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
88 lines
3.5 KiB
Markdown
88 lines
3.5 KiB
Markdown
# aphoria-error-mapping
|
|
|
|
## AUDIT (2026-02-06)
|
|
|
|
**Pattern:** Inconsistent `.map_err()` patterns across Aphoria codebase
|
|
|
|
**Analysis:**
|
|
Found 152 `.map_err()` calls across 4 patterns:
|
|
|
|
| Pattern | Count | Action |
|
|
|---------|-------|--------|
|
|
| A - Context-aware `format!()` | 55 | ✅ Keep as standard |
|
|
| B - Direct `.to_string()` | 35 | ❌ Replace with A |
|
|
| C - Bare `format!()` (returns String) | 11 | ❌ Replace with A |
|
|
| D - Custom closure logic | 43 | ⚠️ Keep for structured errors |
|
|
|
|
**Standard Pattern (A):**
|
|
```rust
|
|
some_op().map_err(|e| AphoriaError::Variant(format!(
|
|
"Failed to do X at Y: {}",
|
|
e
|
|
)))?;
|
|
```
|
|
|
|
**Anti-Pattern (B):**
|
|
```rust
|
|
some_op().map_err(|e| AphoriaError::Variant(e.to_string()))?;
|
|
// Loses context: what operation? what was the file/path?
|
|
```
|
|
|
|
**Files to fix (by priority):**
|
|
|
|
1. `episteme/local/store.rs` - 13 Pattern B instances
|
|
2. `episteme/local/mod.rs` - 4 Pattern B instances
|
|
3. `walker/mod.rs`, `walker/git.rs` - 4 Pattern B instances
|
|
4. `policy.rs`, `policy_ops.rs` - 6 Pattern B instances
|
|
5. `corpus/rfc/mod.rs`, `owasp/mod.rs` - 3 Pattern B instances
|
|
6. `episteme/aliases.rs`, `drift.rs` - 5 Pattern B instances
|
|
7. `hosted.rs` - 11 Pattern C instances
|
|
|
|
**Total changes needed:** 46 instances
|
|
|
|
## FIX (2026-02-06)
|
|
|
|
- [x] `episteme/local/store.rs` - Fixed 13 Pattern B instances:
|
|
- serialize_assertion → "Failed to serialize claim/observation/authoritative assertion"
|
|
- journal.append → "Failed to append to WAL"
|
|
- journal.force_sync → "Failed to sync WAL"
|
|
- ingestor.process_pending → "Failed to process ingestion"
|
|
- get_by_predicate → "Failed to fetch predicate index"
|
|
- [x] `episteme/local/mod.rs` - Fixed 4 Pattern B instances:
|
|
- Journal::open → "Failed to open WAL at {path}"
|
|
- HybridStore::open → "Failed to open store at {path}"
|
|
- Ingestor::new → "Failed to create ingestor"
|
|
- load_or_generate_key → "Failed to load/generate signing key at {path}"
|
|
- [x] `walker/mod.rs` + `git.rs` - Fixed 2 Pattern B instances:
|
|
- directory entry → "Failed to read directory entry"
|
|
- git diff → "Failed to execute git diff command"
|
|
- [x] `policy.rs` + `policy_ops.rs` - Fixed 7 Pattern B instances:
|
|
- write/read policy file with path context
|
|
- cache file creation with path context
|
|
- assertion serialization with subject context
|
|
- alias import with alias names
|
|
- [x] `episteme/aliases.rs` + `drift.rs` - Fixed 4 Pattern B instances:
|
|
- get_canonical → with code_path context
|
|
- set_alias → with both paths context
|
|
- list_all_aliases → with operation description
|
|
- get_by_predicate → with operation description
|
|
- [x] `hosted.rs` - Fixed Pattern C (11 instances → AphoriaError::Hosted):
|
|
- Changed return types from `Result<T, String>` to `Result<T, AphoriaError>`
|
|
- All HTTP errors now use `AphoriaError::Hosted(format!(...))`
|
|
- [x] `corpus/rfc/mod.rs` + `owasp/mod.rs` - Already using context-aware patterns:
|
|
- Uses structured error variants with rfc/sheet context
|
|
|
|
**Remaining:** 1 instance in policy.rs:206 - intentionally ignores error (signature validation)
|
|
|
|
## ENFORCE (2026-02-06)
|
|
|
|
Added to `.claude/skills/aphoria-dev/skill.md`:
|
|
- **Do Not #12:** "Use generic `.map_err(|e| AphoriaError::X(e.to_string()))`. Always include operation context in error messages."
|
|
- **ALWAYS:** "Use context-aware error mapping: `.map_err(|e| AphoriaError::X(format!("Failed to Y: {e}")))`"
|
|
|
|
## COMPLETE (2026-02-06)
|
|
|
|
**Before:** 46 Pattern B/C instances
|
|
**After:** 1 intentional exception (signature validation)
|
|
**Fixed:** 45 instances across 10 files
|