Surfaced by CodeRabbit on #48 (core/src/engine/sync.rs ~L312-353). Pre-existing — the engine's MemoryConfig.sync.budget carried these but no ported pipeline READ them (grep: only max_items and sync_depth_days are consumed), so they were unenforced before the move too. PipelineConfig was deliberately narrowed to what pipelines actually read.
MemorySourceEntry.max_tokens_per_sync and max_cost_per_sync_usd exist on the source and in the registry UI, but no sync path enforces them.
Fix: extend PipelineConfig with both, thread through run_composio_connection, and enforce in the orchestrator loop alongside max_items (the loop already tracks provider_cost_usd per run, so the cost cap is a comparison away).
Surfaced by CodeRabbit on #48 (
core/src/engine/sync.rs~L312-353). Pre-existing — the engine'sMemoryConfig.sync.budgetcarried these but no ported pipeline READ them (grep: onlymax_itemsandsync_depth_daysare consumed), so they were unenforced before the move too.PipelineConfigwas deliberately narrowed to what pipelines actually read.MemorySourceEntry.max_tokens_per_syncandmax_cost_per_sync_usdexist on the source and in the registry UI, but no sync path enforces them.Fix: extend
PipelineConfigwith both, thread throughrun_composio_connection, and enforce in the orchestrator loop alongsidemax_items(the loop already tracksprovider_cost_usdper run, so the cost cap is a comparison away).