Root causes fixed:
- test_config_wiring.py: `callable()` returns False on LangChain @tool
objects — replaced with `hasattr(x, "invoke")` check
- test_env_override.py: `load_dotenv()` in default_config.py re-reads
.env on importlib.reload(), leaking user's TRADINGAGENTS_* env vars
into isolation tests — mock env vars before reload
- test_scanner_comprehensive.py: LLM-calling test was not marked
@pytest.mark.integration — added marker so offline runs skip it
- test_scanner_fallback.py: assertions used stale `_output_files` list
from a previous run when output dir already existed — clear dir in
setUp; also fixed tool-availability check using hasattr(x, "invoke")
- test_scanner_graph.py: output-file path assertions used hardcoded
date string instead of fixture date; graph node assertions checked
for removed node names
Full offline suite: 388 passed, 70 deselected, 0 failures.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>