Private
Public Access
chore: TIER-2 READ conductor/code_styleguides/error_handling.md lines 462-940 before Phase 11 — CRITICAL ANTI-SLIMING (logging is NOT a drain)
Phase 11: ai_client silent-swallow (11 sites; was 9, +2 from Phase 9 narrowing set_tool_preset/set_bias_profile).
CRITICAL ANTI-SLIMING RULES (MUST follow):
1. NO narrowing + logging: 'except (NarrowType): logging.error(...)' is a VIOLATION
2. NO empty defaults: 'except (NarrowType): args = {}' is a VIOLATION (sliming)
3. NO pass: 'except: pass' is a VIOLATION (silent)
4. NO traceback.print_exc alone: similar to logging, data is lost
5. logging.error / logger.exception / sys.stderr.write alone: NOT a drain
Per MUST-NOT-DO #6: 'DO NOT catch except Exception and silently swallow.'
Per MUST-NOT-DO #7: 'DO NOT catch except Exception in non-*_result code without conversion to ErrorInfo.'
Per TIER1_REVIEW 2026-06-20 (Phase 9 redo): 'empty default is NOT a drain — the caller must observe the errors.'
Canonical pattern for SS sites:
def _feature_result(...) -> Result[T]:
try:
return Result(data=compute())
except (NarrowType) as e:
return Result(data=<zero>, errors=[ErrorInfo(kind=INTERNAL, message=str(e), source=..., original=e)])
Legacy wrapper preserves original signature; surface errors via Result where possible.
Some sites may not have a clear 'caller' (e.g., _extract_gemini_thoughts is called inline); for these, the _result helper captures the structured error and the legacy function returns the empty data default (preserving current behavior).
This commit is contained in: