← All stories

BRANCH · ef-094-salesforce-sync-limits

Salesforce sync limits and field rules

EF-094Persona: OrganizerRoots in: event-setupMatrix: Absent gap probe

Salesforce sync rules should enforce active campaign limits, import caps, email uniqueness, Lead vs Contact selection, and field mappings before any campaign sync runs. The matrix marks this absent, so the story is a contract gap probe. Tier-3 tightening: Salesforce sync-limit administration now references ui-async-job-admin-page for the job lifecycle foundation.

Happy path / Lifecycle

  1. Open Salesforce sync rules.

    Organizer reviews active campaign count, import size cap, email uniqueness policy, Lead/Contact target, and field map readiness.

  2. Repair invalid rules.

    The UI blocks sync until required mappings and limit conflicts are resolved.

  3. Save rules.

    A single audit row records the rule revision and provider transaction id.

Failure modes

Expired token refresh

Expired token refreshes before rule validation retries.

429 backoff

Limit metadata reads back off with jitter.

Webhook replay

Rule callback replay is idempotent.

Schema drift

Unknown Salesforce field metadata does not crash mapping UI.

Missing credential

Re-auth CTA replaces stack traces.

Sandbox isolation

Mock fixture cannot validate against prod org metadata.

Audit row

Every rule validation writes one audit row.

Partial rollback

Failed mapping save rolls back or shows per-field outcomes.

Active campaign limit

Too many active campaigns blocks save with a count and remediation.

Import size cap

Oversized import is blocked before commit.

Lead vs Contact required

Sync cannot run until target object policy is explicit.

Parity gap

Gap panel remains until rule enforcement ships.

Stable test attributes

Visibility teeth. Rule status, errors, and gap marker must be visible when active.

data-testWherePurpose
salesforce-sync-rules-panelsync rulesmain surface
salesforce-active-campaign-limitsync rulescampaign limit
salesforce-import-size-capsync rulesimport cap
salesforce-email-uniqueness-rulesync rulesdedupe policy
salesforce-lead-contact-selectorsync rulestarget object
salesforce-field-map-editorsync rulesfield mapping
salesforce-sync-rules-save-ctasync rulessave rules
salesforce-sync-rules-gap-panelsync rulesabsent gap marker

Agent test plan

- salesforce-sync-rules-opens
- salesforce-sync-rules-gap-probe
- oauth-refresh-on-expired-token
- rate-limit-backoff
- webhook-replay-idempotent
- schema-drift-degrades-gracefully
- missing-credential-graceful-error
- sandbox-vs-prod-isolation
- audit-log-row-per-sync
- partial-import-rollback
- active-campaign-limit-blocks
- import-size-cap-blocks
- lead-contact-required
- field-map-required