diff --git a/docs/reports/RESULT_MIGRATION_REVIEW_PASS_20260617.md b/docs/reports/RESULT_MIGRATION_REVIEW_PASS_20260617.md index d9d6697f..ba59e709 100644 --- a/docs/reports/RESULT_MIGRATION_REVIEW_PASS_20260617.md +++ b/docs/reports/RESULT_MIGRATION_REVIEW_PASS_20260617.md @@ -172,7 +172,13 @@ Other audit findings (unchanged by this review pass): ### 2.9 `src/app_controller.py` — INTERNAL_RETHROW sites (3) -*(filled in Task 3.3)* +| Line | Context | Snippet | Decision | Pattern / Rationale | +|---|---|---|---|---| +| 1224 | `AppController.__getattr__` (dunder guard) | `raise AttributeError(name)` for names starting with `_` or known dunder/sunder | **compliant** | Standard Python `__getattr__` pattern: must raise `AttributeError` for missing attributes so `hasattr()` returns False. This is a language requirement, not a code smell | +| 1250 | `AppController.__getattr__` (default fallback) | `raise AttributeError(name)` for any name not in `_UI_FLAG_DEFAULTS` | **compliant** | Standard Python `__getattr__` pattern (same as L1224). The `_UI_FLAG_DEFAULTS` set is a defensive guard for known UI flags; everything else gets the standard AttributeError | +| 2982 | `load_context_preset` (validation) | `raise KeyError(f"Context preset '{name}' not found.")` after `if name not in presets` | **compliant** | Validation raise: the user requested a preset that doesn't exist. The error message is actionable (includes the missing name). `KeyError` is in `PROGRAMMER_ERROR_EXCEPTIONS` but the function is not `__init__`; this is still a programmer-error pattern (the caller asked for a thing that doesn't exist) | + +**Subtotals:** 3 compliant + 0 migration-target. ---