REFERENCE SUMMARY Facebook Lead Ads can use an Instant Form, a website form or an account-dependent hybrid path. Select the route from the next action. Instant Forms fit short native requests. Website routes fit booking, quotes, fuller product context or sensitive information. Keep the ad, form introduction and ending on one promise. Preserve campaign, ad set, ad, Page and form identity plus the exact tracking specification in the standalone handoff. Every collected field must have a purpose, destination, type, owner and failure behavior. Missing privacy approval, CRM destination or record owner blocks launch. Lead retrieval moves Meta submissions to the business. Conversions API for CRM sends later CRM status back to Meta. Treat those as separate directions. Meta's Lead Ads Testing Tool creates fake organic leads that are not associated with an ad. Track Status and an HTTP 200 prove endpoint transport only. Delivery requires destination read-back of exact values, destination record ID, timestamps, timezone, latency, owner and duplicate result. Paid or selected real-source proof requires a separate controlled submission through that source path. Source boundaries: current mechanics were checked against Meta for Business Help and Meta for Developers on 27 September 2026. Recheck account controls before launch. Never invent current account availability, approval, live IDs, legal conclusions, delivery or performance. EXECUTABLE CONTRACT The exact contract below controls version, route type, state enums, nested requirements and canonical request IDs. Do not shorten the version, translate state values, wrap the canonical record under supplied_input/assessment, or rename a canonical request. A derived request for a repeated row must use `req-field--`, `req-question--` or `req-map--`. { "contract_version": "1.0.0", "routes": [ "INSTANT_FORM", "WEBSITE", "HYBRID" ], "readiness": [ "DRAFT_READY", "DRAFT_HOLD", "FORM_READY", "FORM_HOLD", "CRM_READY", "CRM_HOLD", "TRANSPORT_VERIFIED", "TRANSPORT_HOLD", "SOURCE_ORIGIN_VERIFIED", "SOURCE_ORIGIN_HOLD", "LAUNCH_READY", "LAUNCH_HOLD", "TRANSPORT_FAILED", "SOURCE_ORIGIN_FAILED" ], "semantic_unresolved": [ "", "unknown", "pending", "not supplied", "not provided", "not approved", "not applicable", "not_applicable", "approval was not granted", "permission was not granted", "evidence was not supplied", "tbd", "placeholder", "no controlled source submission", "no real submission", "no submission occurred", "no submission was performed" ], "normalized_record_schema": { "top_level": [ "contract_version", "fixture_id", "fictional", "route", "route_reason", "audience", "offer", "promised_next_action", "campaign", "ad", "form", "website", "privacy", "crm", "transport", "source_origin", "states", "requests" ], "states": { "draft": "DRAFT_READY|DRAFT_HOLD", "form": "FORM_READY|FORM_HOLD", "crm": "CRM_READY|CRM_HOLD", "transport": "TRANSPORT_VERIFIED|TRANSPORT_HOLD|TRANSPORT_FAILED", "source_origin": "SOURCE_ORIGIN_VERIFIED|SOURCE_ORIGIN_HOLD|SOURCE_ORIGIN_FAILED", "launch": "LAUNCH_READY|LAUNCH_HOLD" }, "request_keys": [ "request_id", "field", "owner", "action" ], "route_type": "string enum: INSTANT_FORM, WEBSITE or HYBRID", "replay": "The normalized JSON is the complete canonical record at top level. It can be passed directly to the evaluator without unwrapping. states and requests are derived output fields.", "hybrid_branches": { "paths": [ "instant_form", "website" ], "transport_path": "transport.branches.", "transport_required": [ "origin", "test_kind", "source_lead_id", "sent_at", "sent_values", "received_values", "destination_record_id", "received_at", "latency", "assigned_owner", "duplicate_result" ], "source_origin_path": "source_origin.branches.", "source_origin_required": [ "state", "test_kind", "selected_source_path", "source_lead_id", "submitted_at", "sent_values", "received_values", "destination_record_id", "received_at", "latency", "owner", "assigned_owner", "duplicate_result", "evidence" ], "map_rule": "Each branch independently supplies every applicable CRM map source and destination read-back, exact value and type, and expected-owner comparison. No branch inherits a sibling or root result.", "state_rule": "Missing or semantically unresolved evidence holds that branch. A supplied value, type or owner mismatch fails that branch. Overall launch is ready only if both branches pass transport and selected real-source proof.", "request_rule": "Use req--transport- and req--source-origin-, with dotted fields under the exact branch path.", "source_origin_request_actions": { "selected_source_path": "Record observed selected source path for this branch's selected real-source submission.", "source_lead_id": "Record observed source lead id for this branch's selected real-source submission.", "destination_record_id": "Record observed destination record id for this branch's selected real-source submission.", "owner": "Record observed owner for this branch's selected real-source submission.", "assigned_owner": "Record observed assigned owner for this branch's selected real-source submission.", "submitted_at": "Record observed submitted at for this branch's selected real-source submission.", "received_at": "Record observed received at for this branch's selected real-source submission.", "latency": "Record observed latency for this branch's selected real-source submission.", "duplicate_result": "Record observed duplicate result for this branch's selected real-source submission.", "evidence": "Record observed evidence for this branch's selected real-source submission.", "state": "Operate the selected real source path and record its verified state.", "test_kind": "Identify the controlled selected real-source submission; a transport test cannot prove it.", "test_kind_mismatch": "Operate the selected real-source path; a different test kind cannot prove this branch.", "sent_values": "Record values sent through this selected real-source path.", "received_values": "Read back values received from this selected real-source path.", "mapped_sent": "Record the selected-source sent value for .", "mapped_sent_unresolved": "Supply an observed, resolved selected-source sent value for .", "mapped_readback": "Read back the selected-source mapped destination for .", "mapped_readback_unresolved": "Read back an observed, resolved selected-source destination value for .", "mapped_mismatch": "Repair the selected-source mapped value mismatch for .", "owner_mismatch": "Route the selected-source record to the expected CRM record owner, then read it back again." }, "transport_request_actions": { "test_kind": "Record the branch transport test kind.", "test_kind_mismatch": "Run and record the branch's own transport test.", "mapped_sent": "Record the sent value for every applicable mapped source, including .", "mapped_sent_unresolved": "Supply an observed, resolved sent value for ; a placeholder does not prove delivery.", "mapped_readback": "Read back the mapped destination value for .", "mapped_readback_unresolved": "Read back an observed, resolved destination value for .", "mapped_mismatch": "Repair and retest the to value mismatch.", "owner_mismatch": "Route the record to the expected CRM record owner, then read back the assigned owner again.", "origin": "Name the test origin.", "source_lead_id": "Record the source lead ID.", "destination_record_id": "Record the destination record ID.", "assigned_owner": "Read back the assigned owner.", "duplicate_result": "Record the deduplication result.", "sent_values": "Record every sent value.", "received_values": "Read back every received value.", "sent_at": "Record timezone-aware sent and received timestamps plus latency in seconds.", "received_at": "Record timezone-aware sent and received timestamps plus latency in seconds.", "latency": "Record timezone-aware sent and received timestamps plus latency in seconds." }, "transport_expected_test_kinds": { "instant_form": "META_TEST_TOOL_ORGANIC", "website": "WEBSITE_CONTROLLED_TEST" } }, "human_readable_handoff": { "required": true, "states": "Copy the six canonical states exactly.", "identity_and_tracking": [ "campaign_id", "ad_set_id", "ad_id", "page_id", "form_id", "tracking_specification" ], "sections": [ "route_and_offer", "message_contract", "selected_route_details", "fields_and_qualification", "privacy_and_consent", "crm_handoff", "test_states", "open_requests" ], "rule": "Include this object and a visible ## Human-readable implementation handoff section in every output, including Hold and Failed cases." } }, "source_evidence_denial_rule": "For source_origin.evidence or hybrid branch evidence, treat a grammatical negation of the controlled, real, live or selected-source operation as unresolved even when a state claims VERIFIED. Evaluate the negation, operation and source object independently of the sentence subject, voice, tense or intervening adverbs. For a standalone route, a VERIFIED claim additionally requires affirmative past-tense evidence that the controlled/real/live/selected operation completed and that the destination or CRM read-back/receipt completed. Planned, scheduled, future, awaiting or pending language stays unresolved; arbitrary supplied prose and a bare submission noun cannot prove operation. Hybrid branches also require structured selected-source IDs, values, owners and timestamps. Keep SOURCE_ORIGIN_HOLD and emit the exact proof/evidence request. A statement that no duplicate submission occurred is not a source-test denial and remains the explicit negative control.", "nested_requirements": { "form.fields": [ "source", "purpose", "destination", "type", "owner", "failure_behavior" ], "form.questions": [ "question", "options", "decision", "source", "destination", "type", "owner", "failure_behavior" ], "crm.field_map": [ "source", "destination", "type", "transformation", "failure_behavior" ] }, "nested_request_actions": { "form.fields": { "source": "Name the source field.", "purpose": "State why the field is collected.", "destination": "Name the destination field.", "type": "Name the field type.", "owner": "Name the field owner.", "failure_behavior": "Define missing or invalid value behavior." }, "form.questions": { "question": "Supply the qualification question.", "options": "Supply its controlled options.", "decision": "State the decision this answer supports.", "source": "Bind the question to a source key.", "destination": "Bind the answer to a destination field.", "type": "Name the answer type.", "owner": "Name the routing owner.", "failure_behavior": "Define missing or invalid answer behavior." }, "crm.field_map": { "source": "Name the source value.", "destination": "Name the destination field.", "type": "Name the destination type.", "transformation": "Define the transformation or explicitly state None.", "failure_behavior": "Define missing or invalid value behavior." } }, "canonical_requests": { "route": { "request_id": "req-route", "owner": "draft", "action": "Choose INSTANT_FORM, WEBSITE or HYBRID." }, "audience": { "request_id": "req-audience", "owner": "draft", "action": "Name the exact audience." }, "offer": { "request_id": "req-offer", "owner": "draft", "action": "Name the exact resource or action." }, "promised_next_action": { "request_id": "req-next-action", "owner": "draft", "action": "State what happens immediately after submission." }, "ad.opening": { "request_id": "req-ad-opening", "owner": "draft", "action": "Supply the ad opening." }, "ad.headline": { "request_id": "req-ad-headline", "owner": "draft", "action": "Supply the ad headline." }, "form.introduction": { "request_id": "req-form-intro", "owner": "draft", "action": "Supply the form or page introduction." }, "form.ending": { "request_id": "req-ending", "owner": "draft", "action": "Supply the ending and destination action." }, "campaign.campaign_id": { "request_id": "req-campaign-id", "owner": "draft", "action": "Supply the campaign ID or keep launch on Hold until it exists." }, "campaign.ad_set_id": { "request_id": "req-ad-set-id", "owner": "draft", "action": "Supply the ad set ID or keep launch on Hold until it exists." }, "campaign.ad_id": { "request_id": "req-ad-id", "owner": "draft", "action": "Supply the ad ID or keep launch on Hold until it exists." }, "campaign.tracking_specification": { "request_id": "req-tracking-specification", "owner": "draft", "action": "Define the exact tracking parameters and object IDs to preserve." }, "privacy.url": { "request_id": "req-privacy-url", "owner": "form", "action": "Supply the final privacy-policy URL." }, "privacy.approval_state": { "request_id": "req-privacy-approval", "owner": "form", "action": "Provide an affirmative privacy approval state and ISO approval date." }, "privacy.owner": { "request_id": "req-privacy-owner", "owner": "form", "action": "Name the privacy and consent owner." }, "form.fields": { "request_id": "req-fields", "owner": "form", "action": "List every collected field and its purpose." }, "form.questions": { "request_id": "req-questions", "owner": "form", "action": "List each qualification question, options and decision." }, "form.destination_url": { "request_id": "req-destination-url", "owner": "form", "action": "Supply the final ending or website destination URL." }, "privacy.notice": { "request_id": "req-privacy-notice", "owner": "form", "action": "Supply the exact privacy notice or disclaimer text." }, "privacy.approval_date": { "request_id": "req-privacy-approval-date", "owner": "form", "action": "Supply the ISO approval date." }, "privacy.disclaimer_destination": { "request_id": "req-disclaimer-destination", "owner": "form", "action": "Map the disclaimer response separately from field_data." }, "privacy.disclaimer_type": { "request_id": "req-disclaimer-type", "owner": "form", "action": "Define the approved disclaimer response type." }, "crm.destination": { "request_id": "req-crm-destination", "owner": "crm", "action": "Name the CRM or lead-management destination." }, "crm.record_owner": { "request_id": "req-record-owner", "owner": "crm", "action": "Name the person or queue that owns a delivered record." }, "crm.field_map": { "request_id": "req-field-map", "owner": "crm", "action": "Map every source value to a destination field and type." }, "crm.deduplication_rule": { "request_id": "req-dedupe", "owner": "crm", "action": "Supply the deduplication rule." }, "crm.response_target": { "request_id": "req-response-target", "owner": "crm", "action": "Supply the response target, clock and timezone." }, "crm.failure_owner": { "request_id": "req-failure-owner", "owner": "crm", "action": "Name the owner of mapping or delivery failures." }, "crm.escalation": { "request_id": "req-escalation", "owner": "crm", "action": "Define the failure escalation path." }, "transport.origin": { "request_id": "req-test-origin", "owner": "transport", "action": "Name the test origin." }, "transport.source_lead_id": { "request_id": "req-source-id", "owner": "transport", "action": "Record the source lead ID." }, "transport.sent_values": { "request_id": "req-sent-values", "owner": "transport", "action": "Record every sent value." }, "transport.received_values": { "request_id": "req-received-values", "owner": "transport", "action": "Read back every received value." }, "transport.destination_record_id": { "request_id": "req-destination-id", "owner": "transport", "action": "Record the destination record ID." }, "transport.received_at": { "request_id": "req-received-at", "owner": "transport", "action": "Record the received timestamp and timezone." }, "transport.latency": { "request_id": "req-latency", "owner": "transport", "action": "Record the delivery latency with units." }, "transport.assigned_owner": { "request_id": "req-delivered-owner", "owner": "transport", "action": "Read back the assigned owner." }, "transport.duplicate_result": { "request_id": "req-duplicate-result", "owner": "transport", "action": "Record the deduplication result." }, "transport.sent_at": { "request_id": "req-sent-at", "owner": "transport", "action": "Record the sent timestamp and timezone." }, "source_origin.evidence": { "request_id": "req-source-origin-proof", "owner": "source_origin", "action": "Operate one controlled submission through the selected real source path and read it back in the destination." }, "source_origin.owner": { "request_id": "req-source-origin-owner", "owner": "source_origin", "action": "Name the person responsible for the controlled source-origin test." } }, "state_rules": { "draft": "DRAFT_HOLD when any required draft path is unresolved; otherwise DRAFT_READY.", "transport_missing_coverage": "TRANSPORT_HOLD unless transport is already failed.", "transport_unresolved_mapped_value": "A semantically unresolved sent or read-back mapped value is TRANSPORT_HOLD even when both copies match. Boolean false and numeric zero are resolved and may be valid for their declared types.", "transport_value_or_owner_mismatch": "TRANSPORT_FAILED.", "hybrid": "Evaluate both transport and selected-source-origin branch objects independently. Ignore claimed verified labels when branch evidence is missing or contradictory. Failed beats Hold; Hold beats Verified.", "receipt": "Render transport and source-origin state, failure and Hold rows from the evaluated result; show supplied result only as a clearly labeled claim.", "launch": "LAUNCH_READY only when draft, form and CRM are ready and transport plus source origin are verified." }, "transport_request_rules": { "missing_timing": { "request_ids": [ "req-transport-sent-at", "req-transport-received-at", "req-transport-latency" ], "fields": [ "transport.sent_at", "transport.received_at", "transport.latency" ], "owner": "transport", "action_for_each": "Record timezone-aware sent and received timestamps plus latency in seconds.", "note": "These are separate derived requests. The canonical req-sent-at, req-received-at and req-latency use different actions and must also be present when their paths are unresolved." }, "mapped_source_missing": { "request_id": "req-transport--sent", "field": "transport.sent_values.", "owner": "transport", "action": "Record the sent value for every applicable mapped source, including ." }, "mapped_destination_missing": { "request_id": "req-transport--readback", "field": "transport.received_values.", "owner": "transport", "action": "Read back the mapped destination value for ." }, "mapped_source_unresolved": { "request_id": "req-transport--sent-unresolved", "field": "transport.sent_values.", "owner": "transport", "action": "Supply an observed, resolved sent value for ; a placeholder does not prove delivery." }, "mapped_destination_unresolved": { "request_id": "req-transport--readback-unresolved", "field": "transport.received_values.", "owner": "transport", "action": "Read back an observed, resolved destination value for ." }, "mapped_value_or_type_mismatch": { "request_id": "req-transport--mismatch", "field": "transport.received_values.", "owner": "transport", "action": "Repair and retest the to value mismatch." }, "assigned_owner_mismatch": { "request_id": "req-transport-owner-mismatch", "field": "transport.assigned_owner", "owner": "transport", "action": "Route the record to the expected CRM record owner, then read back the assigned owner again." } } } CANONICAL REQUEST CONSTRUCTION Build `requests` from the supplied record with this exact algorithm. Do not add requests from your own judgment. 1. A value is unresolved only when it is null, an empty list/object, its normalized text starts with `unknown`, matches the executable contract's `semantic_unresolved` values, or contains one of: not supplied, not provided, not approved, was not granted, was not supplied, was not provided, evidence unavailable, permission denied, rejected, not yet approved, pending approval, approval denied, declined, no controlled real-source, no controlled real source, no controlled source-origin, no controlled source origin, no selected-source submission, no selected source submission, no controlled source submission, no real submission, no submission occurred, no submission was performed. A syntactically supplied URL, including a reserved example URL in a fictional fixture, counts as supplied. An elapsed-duration response target counts as supplied without a timezone; timezone validation applies to transport timestamps. 2. For every unresolved path in `canonical_requests`, copy its request_id, exact dotted field path, owner and action byte for byte. Never create a synonym request for a resolved path. 3. For each `form.fields` row at zero-based index i, set slug to its source lowercased with underscores changed to hyphens, or i when source is unresolved. For each unresolved nested key, emit `req-field--`, field `form.fields..`, owner `form`, and the exact action in `nested_request_actions.form.fields`. If no `crm.field_map` row has the same source and destination, also emit `req-field--mapping`, field `crm.field_map.`, owner `crm`, action `Map the field source to the same destination named in the form contract.` 4. For each `form.questions` row at zero-based index i, emit an exact nested request for every unresolved key using `req-question--`, dotted field `form.questions..`, owner `form`, and the exact action in `nested_request_actions.form.questions`. If source, destination and type do not bind exactly to one `form.fields` row, also emit `req-question--binding`, field `form.questions.`, owner `form`, action `Bind the question source, destination and type to the matching collected field.` 5. For each `crm.field_map` row at zero-based index i, use the same source slug rule. For every unresolved nested key emit `req-map--`, field `crm.field_map..`, owner `crm`, and the exact action in `nested_request_actions.crm.field_map`. 6. Apply the executable contract's route, privacy approval, complete-map transport comparison/timing, expected-owner comparison, string-ID, hybrid-branch and selected-real-source rules exactly. For each applicable `crm.field_map` row, use the exact templates in `transport_request_rules`: a missing source gets only the source-specific `-sent` request; a semantically unresolved present source gets `-sent-unresolved`; a missing mapped destination gets `-readback`; an unresolved present destination gets `-readback-unresolved`; a resolved value or type mismatch gets `-mismatch`. Equal Unknown, null or blank values remain Hold. Boolean false and permitted numeric zero remain resolved. Never substitute whole-object requests when only one member is missing or wrong. `transport.assigned_owner` must exactly match `crm.record_owner`; a supplied mismatch gets `req-transport-owner-mismatch` and makes transport TRANSPORT_FAILED. Preserve canonical IDs, fields, owners and actions byte for byte. 6a. For HYBRID, do not inherit evidence from root transport/source-origin or a sibling branch. For each of instant_form and website, require every transport field named in `normalized_record_schema.hybrid_branches.transport_required` under `transport.branches.`. Compare every declared map source and destination with exact value and type, the expected and observed owner, source/destination string IDs, timezone-aware timestamps and recomputed latency, and duplicate result. Require every field named in `source_origin_required` under `source_origin.branches.`, including selected path and evidence, and run the same map/owner/time checks on the selected real-source submission. A verified status label cannot override missing or contradictory evidence. Use branch-specific dotted fields and `req--transport-...` or `req--source-origin-...` IDs. Missing/unresolved branch evidence holds; mismatched values, types or owners fail; any branch Hold/Fail keeps overall LAUNCH_HOLD. 6b. Copy exact branch actions from `normalized_record_schema.hybrid_branches.source_origin_request_actions` and `transport_request_actions`. Do not invent a more helpful paraphrase. For a missing branch object, generate the full set of branch field requests plus applicable mapped source and destination requests; a single generic branch request is insufficient. For a present but wrong source `test_kind`, emit only the `-test-kind-mismatch` request for that field and mark SOURCE_ORIGIN_FAILED. For a missing test kind, emit the `-test-kind` request and hold. For transport timing, every missing `sent_at`, `received_at` or `latency` request uses the single exact action `Record timezone-aware sent and received timestamps plus latency in seconds.` For a wrong transport test kind, the expected kind comes from `transport_expected_test_kinds`, never from the supplied wrong value: instant_form requires `META_TEST_TOOL_ORGANIC`; website requires `WEBSITE_CONTROLLED_TEST`. 6c. A missing whole transport value can have TWO distinct valid request IDs: the canonical whole-path request from `canonical_requests` and the transport-specific derived request. For example, `sent_values={}` emits both `req-sent-values` and `req-transport-sent-values`; `received_values={}` emits both `req-received-values` and `req-transport-received-values`. Do not suppress one because their fields match. This also applies to missing origin, IDs, owner, duplicate result and timestamps. Derived timing requests always use the SAME action from `transport_request_rules.missing_timing.action_for_each`; do not reuse the canonical timing request action. When `transport.duplicate_result` is missing, emit both `req-duplicate-result` and `req-transport-duplicate-result`; never collapse them because they share a field and action. De-duplicate only identical request IDs. 6d. Evaluate source evidence with `source_evidence_denial_rule`, even when `source_origin.state` claims VERIFIED. `No controlled source submission occurred.` and `No real submission was performed.` each require SOURCE_ORIGIN_HOLD and `req-source-origin-proof` for an Instant Form or website route. A hybrid branch uses its exact branch `-evidence` request. `No duplicate submission occurred` is not a denial of source operation. 7. De-duplicate by request_id with the last canonical object winning, then sort lexicographically by request_id. Every canonical request object has exactly four keys in this order: `request_id`, `field`, `owner`, `action`. Never put reason, consequence, status, evidence or any other key inside `requests`. Put review consequences in a separate prose finding or separate `checks` entry. Use dotted paths, never bracket paths. Use hyphens in derived request IDs, never underscores. STATE AND REQUEST PARITY EXAMPLES - If any required draft path such as `campaign.campaign_id` is unresolved, states.draft is `DRAFT_HOLD` in JSON and prose. The presence of enough copy to draft cannot promote it. - If `crm.field_map` maps `company_name` to `company_name` and only `transport.sent_values.company_name` is absent, emit exactly `{"request_id":"req-transport-company-name-sent","field":"transport.sent_values.company_name","owner":"transport","action":"Record the sent value for every applicable mapped source, including company_name."}`. - If `custom_disclaimer_response` maps to `lead_form_notice_response` and only that destination read-back is absent, emit exactly `{"request_id":"req-transport-custom-disclaimer-response-readback","field":"transport.received_values.lead_form_notice_response","owner":"transport","action":"Read back the mapped destination value for custom_disclaimer_response."}`. - If `transport.assigned_owner` is supplied but differs from `crm.record_owner`, emit exactly `{"request_id":"req-transport-owner-mismatch","field":"transport.assigned_owner","owner":"transport","action":"Route the record to the expected CRM record owner, then read back the assigned owner again."}`. - If both sent and received `company_name` are `Unknown`, emit `req-transport-company-name-sent-unresolved` at `transport.sent_values.company_name` and keep TRANSPORT_HOLD; equality never verifies a placeholder. - If the website branch of a HYBRID record has a wrong email, emit `req-website-transport-work-email-mismatch` at `transport.branches.website.received_values.email` and set TRANSPORT_FAILED even if the instant_form branch is complete. - If a HYBRID website selected-source branch supplies `META_TEST_TOOL_ORGANIC` or any `test_kind` other than `SELECTED_SOURCE_ORIGIN`, emit exactly `req-website-source-origin-test-kind-mismatch`, set that branch and overall source origin to `SOURCE_ORIGIN_FAILED`, and keep launch on Hold. A testing-tool claim is a contradiction, not merely missing evidence. - The wrong-kind request object is exactly `{"request_id":"req-website-source-origin-test-kind-mismatch","field":"source_origin.branches.website.test_kind","owner":"source_origin","action":"Operate the selected real-source path; a different test kind cannot prove this branch."}`. Do not replace it with `req-website-source-origin-test-kind` or a second evidence request when the evidence value itself is supplied. - If `form.fields[0].source=work_email` has no matching CRM map row, emit exactly `{"request_id":"req-field-work-email-mapping","field":"crm.field_map.work-email","owner":"crm","action":"Map the field source to the same destination named in the form contract."}`. Only the request ID slug and its field-map slug use hyphens; the supplied source key stays `work_email` everywhere else. - If all transport timestamps are unresolved, emit `req-sent-at`, `req-received-at` and `req-latency` with their distinct canonical actions AND `req-transport-sent-at`, `req-transport-received-at` and `req-transport-latency` with action exactly `Record timezone-aware sent and received timestamps plus latency in seconds.` for each derived request. - A sentence such as “No controlled source submission occurred.” or “No real submission was performed.” is unresolved evidence even if a supplied state claims SOURCE_ORIGIN_VERIFIED. Emit the applicable source-origin proof request and keep launch on Hold. - The top-level `requests` array is authoritative. Derive every prose open-request list from those exact objects. Never invent, omit, rename, paraphrase or normalize a canonical request ID, field, owner or action in a second pass. TASK Review a Facebook Lead Ads implementation handoff and delivery receipt. Decide whether another teammate can implement the route and whether the available evidence supports launch. REVIEW RULES 1. Recompute the route from the required next action. Check INSTANT_FORM, WEBSITE and HYBRID independently. 2. Check that audience, offer, ad opening, headline, form introduction, questions, ending and destination keep one promise. 3. Check each field for purpose, destination, type and missing-value behavior. 4. Require the privacy URL, exact notice or disclaimer, approval state/date and owner. Do not give legal advice or convert a placeholder into approval. 5. Require CRM destination, exact field map, record owner, deduplication, response target, failure owner and escalation. 6. For transport, require every applicable CRM map source in sent values, compare each mapped destination value and type, and compare assigned owner with the expected CRM record owner. Require source ID, destination record ID, timestamps, timezone, latency and duplicate result. Missing coverage holds transport; a value or owner mismatch fails it. 6a. Equal Unknown, blank or null mapped values remain unresolved and hold transport. Valid Boolean false and permitted numeric zero are observed values. For HYBRID, inspect the instant_form and website transport and selected-source-origin branch records independently. A correct branch cannot pass an incomplete or wrong sibling branch. 7. Treat the Meta testing tool as fake/organic and not ad-associated. Endpoint success cannot prove paid source, CRM values, owner, deduplication, follow-up, qualification or CRM-to-Meta feedback. 8. Keep source-origin verification on Hold until a controlled submission through the selected real source path is read back in the destination. 9. Submitted, Delivered, Accepted, Contacted, Qualified and Booked require their own observed events. Unknown stays Unknown. 10. Reject invented claims, owner opinions, performance results or current account controls. MISSING-INPUT BEHAVIOR Return one stable request per missing field. Preserve valid supplied request IDs. Missing privacy approval, CRM destination or record owner must include these exact requests when applicable: `req-privacy-approval`, `req-crm-destination`, `req-record-owner`. Do not rename the field because a human label changes. OUTPUT CONTRACT Return: - First, machine-readable JSON that is the complete canonical record at top level and can be replayed directly through the evaluator. Construct this record before the prose. Use contract_version `1.0.0`, a route enum string, the exact lowercase state keys and exact readiness values in the executable contract. Include checks, full request objects with exactly request_id/field/owner/action, next_test and limitations as additional top-level fields. Never output generic PASS/HOLD/FAIL in the six readiness state fields. Never add `consequence` or any fifth key to a canonical request object. - Overall result: PASS, FAIL or HOLD. - DRAFT, FORM, CRM, TRANSPORT, SOURCE_ORIGIN and LAUNCH states. - Route decision and any contradiction. - A human-readable identity and tracking section that repeats the supplied campaign ID, ad set ID, ad ID, Page ID, form ID and tracking specification verbatim. - Message-continuity findings. - Field, privacy and CRM findings. - Delivery-receipt comparison. - Open requests with request ID, field, owner, consequence and exact action. Consequence belongs only in this prose list or a separate `checks` item, never inside the canonical `requests` array. - Smallest next action that can clear the first Hold. The human-readable identity and tracking section is mandatory in every response, including Hold and Failed cases. Also place it in the top-level JSON field `human_readable_handoff` with `states` copied byte for byte from the canonical `states` object, `identity_and_tracking` containing campaign_id, ad_set_id, ad_id, page_id, form_id and tracking_specification copied verbatim, and eight named sections from `normalized_record_schema.human_readable_handoff.sections`. Print a visible `## Human-readable implementation handoff` section after the JSON with those same states and identity/tracking values. Do not omit this because the JSON already mentions them. FINAL SELF-CHECK BEFORE RETURNING - The complete `requests` array must include every unresolved canonical path and every derived field, transport and hybrid branch request. Distinct IDs with the same field are both required. - Copy branch request actions byte for byte from the embedded contract. A supplied wrong source-test kind is FAILED with `-test-kind-mismatch`; an absent kind is HOLD with `-test-kind`. - Sort the final `requests` array by the complete `request_id` string in ascending bytewise lexicographic order immediately before serializing JSON. Check every adjacent pair. For example, `req-failure-owner` comes before every `req-field-...` ID; never group requests by topic or owner. - The visible human handoff and its JSON object must both be present. Missing or Failed evidence does not remove these sections. HANDOFF AND RECEIPT TO REVIEW Paste the complete files here.