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 Build a complete Facebook Lead Ads implementation handoff and delivery-test plan from the supplied inputs. Make a provisional draft when the message can be drafted safely. Keep launch on Hold when any launch fact is missing. REQUIRED INPUTS 1. Audience, offer and promised next action. 2. Preferred route and reason, plus campaign, ad set, ad, Page and form IDs and the exact tracking specification. Unknown IDs keep launch on Hold. 3. Ad opening, headline and CTA. 4. Form or page introduction, fields, qualification questions, ending and destination. 5. Privacy-policy URL, notice or disclaimer text, approval state/date and owner. 6. CRM destination, complete field map, record owner, deduplication rule, response target and failure owner. 7. Transport fixture and any observed destination read-back. 8. Source-origin test owner and evidence, if operated. MISSING-INPUT BEHAVIOR - Do not invent a value, approval, ID, owner, URL, question option, CRM field, result or account control. - Treat blank, Unknown, pending, not supplied, not approved, “permission was not granted” and similar natural negative statements as unresolved. - Return one stable request per missing field using lowercase `req-` IDs derived from the field name. - Missing privacy approval, CRM destination or record owner must produce `LAUNCH_HOLD`. - A Meta testing-tool receipt may produce `TRANSPORT_VERIFIED` only after destination read-back. It must keep `SOURCE_ORIGIN_HOLD`. - Off-route fields become `NOT_APPLICABLE`; they cannot hold the selected route. HYBRID requires both route branches. OUTPUT CONTRACT Return these sections in order: 1. Normalized JSON record that preserves all supplied machine IDs and values byte for byte. The JSON must be the complete canonical record at top level, use contract_version `1.0.0`, use a route enum string, include all six exact state values and include full request objects with exactly request_id, field, owner and action. It must replay directly through the evaluator without unwrapping or manual mapping. Construct this record first. 2. Route decision and reason derived from that same record. 3. Human-readable implementation handoff derived from that same record, with DRAFT, FORM, CRM, TRANSPORT, SOURCE_ORIGIN and LAUNCH states. 4. Open requests with request ID, field, owner, reason, exact action and clearing evidence. Consequences and clearing evidence belong here, never inside the canonical request objects. Use the exact lowercase state keys `draft`, `form`, `crm`, `transport`, `source_origin`, `launch` and exact state vocabulary: DRAFT_READY/DRAFT_HOLD, FORM_READY/FORM_HOLD, CRM_READY/CRM_HOLD, TRANSPORT_VERIFIED/TRANSPORT_HOLD/TRANSPORT_FAILED, SOURCE_ORIGIN_VERIFIED/SOURCE_ORIGIN_HOLD/SOURCE_ORIGIN_FAILED and LAUNCH_READY/LAUNCH_HOLD. Separate drafting from launch. Preserve every supplied fact exactly unless you identify a contradiction and request a decision. The human-readable handoff is mandatory in every response, including Hold and Failed cases, and must repeat the supplied campaign ID, ad set ID, ad ID, Page ID, form ID and tracking specification verbatim. Also place it in the top-level JSON field `human_readable_handoff` so it cannot be dropped during structured output. That object must contain `states` copied byte for byte from the canonical `states` object, an `identity_and_tracking` object 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 the same six states and identity/tracking values. Never compute a second state set. When draft essentials are missing, return DRAFT_HOLD and a provisional Hold handoff with Unknown for missing values. Still include every canonical request, including both whole-path and derived transport requests. Ask no more than five focused questions in the prose. Never fabricate a completed handoff. FINAL SELF-CHECK BEFORE RETURNING - Compare the complete `requests` array against every unresolved canonical path, every nested row, every route field, every transport field and every hybrid branch. Do not stop after the first five requests. - Copy exact request actions from the embedded contract. Preserve distinct IDs even when two requests have the same field. - 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 because `a` comes before `i`; never group requests by topic or owner. - A supplied wrong hybrid source-test kind is FAILED with `-test-kind-mismatch`; an absent kind is HOLD with `-test-kind`. - Print the visible human handoff and its JSON object in all cases. If either is missing, the response is incomplete. SUPPLIED INPUTS Paste the complete business and campaign inputs here.