Files
manual_slop/tests/tier2/phase12_invariant_test.py
T
ed a9969563dc conductor(plan): mark Phase 12 complete (ai_client rethrow; 6 sites addressed)
Phase 12: ai_client rethrow classification (6 sites).

Site 1 (L276 _load_credentials): added 'from e' (Pattern 1)
Sites 2+3 (L878+L879 _default_send nested): added 'from None' (Pattern 1)
Site 4 (L1336 _list_anthropic_models): migrated to Result (the broken
  'raise ErrorInfo from exc' runtime bug — same pattern as Phase 10 site 1)
Site 5 (L2078 _send inside _send_gemini_cli): added 'from None' (Pattern 1)
Site 6 (L2759 _dashscope_call): added 'from None' (Pattern 1)

KNOWN LIMITATION: the audit script does not have a heuristic for
'raise X from e' or 'from None' (Pattern 1 compliant). The 5 Pattern 1
sites remain classified as INTERNAL_RETHROW ('suspicious but not
violation') in the audit. Strict mode (Phase 14 gate) accepts this.

Adding a Pattern 1 heuristic requires Tier 1 approval per the
conventions ('Never modify audit heuristics without explicit Tier 1
approval'). Documented in the end-of-track report.

Audit state (after Phase 12):
  mcp_client: 0 migration-target (Phase 3-8 complete)
  ai_client:  7 -> 6 migration-target (5 RETHROW + 0 SS + 0 BC + 0 UNCLEAR)
              BC: 0 (Phase 10)
              SS: 0 (Phase 11)
              RETHROW: 7 -> 6 (one site migrated to Result in Phase 12)
              UNCLEAR: 0
              COMPLIANT: 33 -> 34 (+1)
  rag_engine: 9 migration-target (Phase 13)

Tests: 109 pass (was 97; +12 Phase 12 site/invariant tests).
2026-06-20 15:49:51 -04:00

56 lines
2.4 KiB
Python

"""Phase 12 invariant tests (GREEN).
6 RETHROW sites addressed:
- Site 1 (L276 _load_credentials): added 'from e' (Pattern 1)
- Sites 2+3 (L878+L879 _default_send nested in run_with_tool_loop): added 'from None'
- Site 4 (L1336 _list_anthropic_models): migrated to Result[T] (the broken 'raise ErrorInfo from exc' bug)
- Site 5 (L2078 _send inside _send_gemini_cli): added 'from None'
- Site 6 (L2759 _dashscope_call): added 'from None'
KNOWN LIMITATION: the audit does not recognize 'raise X from e' / 'from None'
as Pattern 1 (compliant). The 5 remaining RETHROW sites are classified as
'suspicious' (INTERNAL_RETHROW) but NOT 'violation' (strict mode accepts).
Adding a Pattern 1 heuristic requires Tier 1 approval.
"""
import sys
sys.path.insert(0, ".")
def test_phase12_ai_client_rethrow_count_at_most_5():
"""After Phase 12: ai_client RETHROW count is <= 5 (was 7 at baseline)."""
import json
import subprocess
r = subprocess.run(
["uv", "run", "python", "scripts/audit_exception_handling.py",
"--include-baseline", "--json"],
capture_output=True, text=True
)
data = json.loads(r.stdout)
files = {f["filename"]: f for f in data["files"]}
ai = files["src\\ai_client.py"]
rethrow = sum(1 for x in ai["findings"] if x["category"] == "INTERNAL_RETHROW")
# Phase 9 redo: -1 site (L1594 _list_gemini_models migrated to Result)
# Phase 10: -1 site (BC site 1 migrated)
# Phase 12: -1 site (site 4 migrated to Result)
# Baseline was 7; expected <= 5 (7 - 1 - 1 - 1 = 4 actually, but Pattern 1 sites stay as RETHROW)
assert rethrow <= 5, f"expected ai_client RETHROW <= 5 after Phase 12, got {rethrow}"
def test_phase12_list_anthropic_models_result_exists():
"""Site 4 migration: _list_anthropic_models_result helper exists."""
import src.ai_client
assert hasattr(src.ai_client, "_list_anthropic_models_result")
def test_phase12_legacy_functions_preserved():
"""Legacy functions must still exist."""
import src.ai_client
for name in ("_load_credentials",
"_list_anthropic_models",
"_default_send",
"_dashscope_call"):
assert hasattr(src.ai_client, name) or name == "_default_send", \
f"{name} legacy function missing"
# _default_send is nested; check via run_with_tool_loop
# The nested _default_send is part of run_with_tool_loop
assert callable(getattr(src.ai_client, "run_with_tool_loop", None))