ic-engine v2.4.0 — Phase 2.5 vision migration to clio. Lineage: feb3279 feat: initial cut of ic-engine extracted from InvestorClaw v2.2.3 db155ae ci(gitlab): bootstrap GitLab CI pipeline for ic-engine HEAD release: ic-engine v2.4.0 (Phase 2.5 — vision via clio) What's new in v2.4.0: pdf_extraction_dual_mode.py vision path now goes through clio.extract.vision rather than a direct Anthropic client. ic-engine declares clio~=0.1 as a dep (pinned to v0.1.0 via git+ until clio is on PyPI). ExtractionMode is now provider-agnostic; IC_ENGINE_VISION env var replaces the legacy INVESTORCLAW_DEPLOYMENT_MODE knob. PORTFOLIO_VISION_PROMPT is defined locally — the only piece of portfolio domain that lives in this module. extract_pdf.py kept verbatim (Schwab/UBS/IRA strategies stay in ic-engine per IC_DECOMPOSITION Phase 1.5a deviation note). Public surface (DualModePDFExtractor.extract_holdings / .detect_broker) preserved for drop-in InvestorClaw + InvestorClaude consumption. Substrate: clio v0.1.0 (gitlab.com/perlowja/clio).