Commitment tracker (D-139 P6.B)
Vendor-agnostic Layer-1 silent producer wrapping the post-substrate-canary `commitment_tracker` topic per spec § A.9.2c. Subscribes to bus events from BOTH connection.api.hubspot.contact AND connection.api.salesforce.contact updates; for each fired contact reads any housekeeping-computed row via `enrichment-list` filtered to the canonical `system.housekeeping.commitment_tracker` author, then re-emits it through the recipe cycle so the row carries an up-to-date `cursor_at` reflecting the contact touch. The substrate-side AI compute path (full Pass-4 evidence-quality fold — authorship_acceptance ['user', 'crm_user', 'unknown'] + lifecycle_state_acceptance ['point_in_time', 'completed'] + body_state_acceptance ['inline_body'] + dedupe_acceptance 'exact_only' + per-contact perspective fan-in via extractContactIdentity) lands in `backend/server/src/housekeeping/engagement-aggregates/commitment-tracker.ts` paralleling the P5 sentiment + NBA producers. Recipe writes carry `authored_by_recipe_id` distinct from `system.housekeeping.commitment_tracker` so both rows coexist on the unique `(topic, scope, target_id, authored_by_recipe_id)` index without conflict. Honest empty default per spec — when no housekeeping row exists the recipe writes an empty `commitments[]` rather than synthesizing speculative commitments at the recipe layer (no AI runs at the recipe level; substrate-side housekeeping is the canonical compute path). Trust default `manual` per D-132 — user must promote at MANUAL_RUN_THRESHOLD before the substrate producer fires; pool default `free_only` per spec § P6.B. Pack-level body-content MCP grant per spec § A.9.5 ships through the `crm-commitment-tracker` pack manifest's `mcp_body_visibility_grants: ['data.contact.engagements.body_content']`.
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.