b45047f0b3
pollDueSources now collects genuinely-new tender IDs via an indexed dedupKey pre-check (existing upsert doesn't report create-vs-update), and calls TenderMatchingService.matchDelta(newTenderIds) once at the end of the tick — the delta-only matching boundary (D-07). Changed/ re-seen rows are excluded, only genuinely new rows trigger matching. TenderMatchingService registered as a provider in TendersModule and injected into TenderIngestionService. Ingestion spec extended to assert matchDelta receives only the new IDs, and is not called when no new tenders were ingested this tick. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>