Channels: GET/PUT /channels/config and POST /channels/config/test expose the IM channel configuration over the API - per-channel enable/token/allowlist editing, a connection test (Telegram runs a real getMe), and honest unavailable-adapter reporting for missing optional dependencies. The Settings UI grows a channel-configuration section (ChannelConfigSection).
Custom providers: custom_provider_routes + custom_profiles add provider-definition management (create/test/activate OpenAI-compatible endpoints) with capabilities.py resolving active custom credentials; the Settings UI gets CustomProviderManager with a draft -> tested -> active progression (DESIGN.md documents the design system for this flow).
Persian (fa): full fa.json locale with key parity across all seven locales, RTL handling in index.css and the chat components, i18n loader registration, and LANGCHAIN_MAX_TOKENS passthrough for custom LLM endpoints.
Full suite on the integrated tree: 11645 passed, 107 skipped, 0 failed.
Two Iran-based crypto exchanges join the loader registry as explicit-source-only OHLCV loaders: Nobitex (IRT-quoted pairs, public UDF endpoint) and Wallex (TMN-quoted pairs, public UDF endpoint). Both are keyless public endpoints and are deliberately excluded from the auto-detect fallback chain, where non-IRT/TMN pairs would never resolve.
market_data: symbol-to-source routing for *IRT (Nobitex) and *TMN (Wallex) patterns. metrics: annualisation entries for both sources in _TRADING_DAYS (365, 24/7 crypto) and every _BARS_PER_DAY interval layer. trading service: when the operator has installed exactly one connection for a profile, CLI/agent flows auto-resolve it; explicit connection ids from the Web UI always win. data-routing skill manifest and its count test stay in sync.
Full suite on the integrated tree: 11645 passed, 107 skipped, 0 failed.
Locks: _lock_exclusive-style helpers in governance/ledger.py, live/daily_count.py and providers/openai_codex.py wrote a b'\0' sentinel byte into empty files to have a lockable range. Byte-range locks on Windows are valid beyond EOF, so lock offset 0 without writing anything. The sentinel made the hash-chain walk read a malformed line 0 and refuse every first append with LedgerCorruptionError (compliance ledger unusable on Windows).
Paths: backtest archive manifests now record POSIX separators (as_posix) and the pending-write target regex accepts Windows absolute paths containing spaces (e.g. C:\Users\First Last\...) by matching non-greedily to the first .md boundary.
Env precedence: _load_env_file no longer clobbers variables already present in the environment (override=False) - exported credentials outrank .env, pinned by test_dispatch_connector_never_overrides_a_real_environment_variable.
Tests: permission assertions that only hold on POSIX are guarded with os.name checks, and inherently POSIX-only tests (flock lock file, symlink privileges, directory fsync, SIGALRM hang-guard) carry skipif marks with reasons; test_lockup_expiry_integer_code no longer requires live network access; test_mcp_client_adapter path fixture is separator-agnostic; welcome-panel assertion accepts the platform path separator.
Full suite on the integrated tree: 11645 passed, 107 skipped, 0 failed.