9a9238892d
Phase 12.4: re-run audit_exception_handling.py with Heuristic #19 removed and Heuristic D added. Total sites: 403. - INTERNAL_BROAD_CATCH: 134 - INTERNAL_SILENT_SWALLOW: 46 (was logged as INTERNAL_COMPLIANT under #19) - INTERNAL_RETHROW: 30 - INTERNAL_PROGRAMMER_RAISE: 29 - INTERNAL_COMPLIANT: 93 - UNCLEAR: 20 - BOUNDARY_SDK: 19 - BOUNDARY_FASTAPI: 15 - BOUNDARY_CONVERSION: 12 - INTERNAL_OPTIONAL_RETURN: 5 Phase 12.5: triage per file. Generated docs/reports/PHASE12_TRIAGE_20260617.md. Top files by violations: - src/mcp_client.py: 46 (sub-track 3 scope, NOT sub-track 2) - src/app_controller.py: 45 (sub-track 3 scope) - src/gui_2.py: 42 (sub-track 4 scope) - src/ai_client.py: 33 (baseline; not migration target) - src/api_hooks.py: 16 (sub-track 2; 12.6.1) - src/rag_engine.py: 9 (baseline; not migration target) - src/multi_agent_conductor.py: 4 (sub-track 2; 12.6.9) - src/aggregate.py: 4 (sub-track 2; small file) - src/shell_runner.py: 3 (sub-track 2; 12.6.11) - src/warmup.py: 2 (verify Phase 11; 12.6.2) - src/project_manager.py: 2 (verify Phase 11; 12.6.6) - src/session_logger.py: 2 (sub-track 2; 12.6.12) - src/models.py: 2 (sub-track 2; 12.6.8) - src/orchestrator_pm.py: 1 (verify Phase 11; 12.6.5) The 16 api_hooks.py sites are HTTP handler sub-functions where the except body swallows exceptions and returns an empty fallback payload. The actual HTTP response (self.send_response(200)) happens AFTER the try/except, not inside the except body. Heuristic D.1 doesn't match because the send_response is outside the except block. These sites need full Result[T] migration: controller methods return Result[dict], except body converts exception to ErrorInfo, HTTP handler checks result.ok and returns 4xx/5xx on failure. L451/L824/L914 are different — they call self.send_response(500) INSIDE the except body (drain point pattern). 13 other sites are silent fallbacks.