Inbound/outbound ratio (D-139)
Vendor-agnostic Layer-1 silent producer wrapping the `inbound_outbound_ratio` 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/inbound-outbound-ratio.ts`) is the canonical compute path with the full Pass-4 evidence-quality fold (inbound = direction='inbound' + authorship excluding automation/system_process; outbound = direction='outbound' + authorship IN user/crm_user; failed sends + no_answer count toward outbound effort but never as prospect engagement). 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 `'mutual'` default per the bucket enum invariant when no housekeeping row exists yet.
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.