Last meaningful touch (D-139)
Vendor-agnostic Layer-1 silent producer wrapping the `last_meaningful_touch` topic per spec § A.9.1. Subscribes to bus events from BOTH connection.api.hubspot.deal AND connection.api.salesforce.opportunity updates; for each fired record reads any housekeeping-computed row via `enrichment-list` with the dynamic `{{context.event.payload.platform}}` scope and re-emits it through the recipe cycle. The substrate-side housekeeping engagement-aggregates code (D-139 P3 — `backend/server/src/housekeeping/engagement-aggregates/last-meaningful-touch.ts`) is the canonical compute path with the full Pass-4 evidence-quality fold (excludes tracking-pixel + workflow auto-logs via authorship NOT IN crm_automation/system_process; lifecycle filter point_in_time + completed only; direction-agnostic — any meaningful inbound or outbound counts). Recipe writes carry `authored_by_recipe_id` distinct from the housekeeping `system.housekeeping.<topic>` author so both rows coexist on the unique `(topic, scope, target_id, authored_by_recipe_id)` index without conflict. Honest-zero defaults per the value-schema invariant (last_touch_at = 0 paired with all-null vendor + entity + authorship + direction) when no housekeeping row exists yet — the value-schema validator enforces the pairing.
How it works
Inspect the data fetches, transforms, gates, and output this recipe runs.
Trust & control
What installing this recipe would let it do. Recued grants these permissions at install — review them there before approving.