# FluentCRM review context

Apply the relevant contracts below alongside AGENTS.md. Start from the route, hook, worker or add-on that actually consumes the changed value.

## Contact field updates

For Fluent Forms, trace raw form data and feed mapping through app/Services/ExternalIntegrations/FluentForm/Bootstrap.php into the contacts API. Once smartcodes are parsed, a hidden input and a submitted empty value can look identical. Use an existing contact with a populated custom field. Omission preserves it, deliberate clearing removes it, and a submitted zero survives. Cover both contact creation and update branches and nested mappings when touched. See tests/integration/fluentforms-empty-custom-field.php and fix 96e321385.

## Automation step references

When editing import, copy or save, follow step IDs through app/Services/Funnel/FunnelHelper.php and the action consuming those IDs. A target must resolve inside its destination automation. Check a valid local target, a copied target requiring remapping, and a stale target from another funnel. Confirm the persisted reference after a second save. See tests/integration/automation-copy-step-targets.php and fix 49111f739.

## Scheduled transitions

For recovery or bulk processing in app/Services/Funnel/FunnelProcessor.php, inspect the write predicate as well as the selection query. If a contact is cancelled or rescheduled between selection and update, the newer state must survive. Exercise a still-eligible contact in the same batch. Historical fix f1e47d9ef includes the interleaving and regression fixture. Check the worker implementation on the review target before applying this rule.

## Core and FluentCampaign Pro

Treat resources/admin/shared/ exports and their import map as a public API. For a rename or removal, identify the consuming add-on version and inspect FLUENTCRM_MODULE_API in fluent-crm.php. Verify Core alone and the supported Core/Pro pairing. A Core build exercises only one side. For chunk changes, use the release asset audit described in AGENTS.md and distinguish emitted files from files actually shipped.

## Checks

For PHP changes follow tests/README.md and the gate in AGENTS.md. For a finding, name the entry point, affected persisted value or downstream consumer, and an assertion that reaches it. Record any add-on, delivery provider or packaged-asset behavior still unverified.
