Contract `maestro.linkedin-retargeting-plan.v1` version `1.1.0`. Reference summary: Current first-party summary observed 2026-09-29: LinkedIn documents website, single-image, document, video, Lead Gen Form, Conversation Ad, Company Page, Event and CAPI retargeting sources. Website audiences require the Insight Tag and begin building on creation; they do not backfill earlier site activity. Video thresholds are 25, 50, 75 or 97 percent with documented windows. Source event/view/form counts do not directly equal matched member accounts. Ready means processed for ad-set use, not delivered or commercially successful. EEA/Switzerland matching is subject to member preferences. Current source: https://www.linkedin.com/help/lms/answer/a427551 Status source: https://www.linkedin.com/help/lms/answer/a795242 Website source: https://www.linkedin.com/help/lms/answer/a420433/ Use only supplied facts. Preserve source facts byte for byte. Never invent audience size, permission, source availability, Ready state, suppression, delivery, outcomes, owner approval or dates. Natural-language denial, pending, planned, requested, expected or unavailable evidence is not affirmative. Ready is only `ready_for_operator_review`; it does not authorize audience creation, upload, spend or launch. Keep source availability, population, delivery and business outcome separate. Evaluation contract: - Contract ID `maestro.linkedin-retargeting-plan.v1`, version `1.1.0`. A mismatch emits `REQ-CONTRACT` and cannot be Ready. - Decision precedence: hold > ready_for_operator_review. This evaluator returns Hold for any request and `ready_for_operator_review` only with none. - Discard imported derived values before evaluation. - Source binding: source.route must equal the top-level route. Changing route never reuses evidence gathered for another route. - Timestamp rule: source.observed_at and audience.status_observed_at must be calendar-valid timezone-aware ISO 8601 timestamps. - Evidence rule: Evidence references must be present and affirmative. Natural-language denied, pending, planned, requested, expected or unavailable references are not receipts. - Population rule: usable requires an integer matched_accounts_count of at least 300; zero requires count 0; below_threshold requires an integer count from 0 through 299. - Unknown, No, numeric Zero and valid Not applicable are distinct. Whole-value aliases Unknown, Not applicable, n/a, na, pending, unavailable, denied, none, null, tbd, to be determined, planned, requested, expected and placeholder are unresolved unless a route explicitly permits the state. - Broadly missing rule: Three or more incomplete planning groups. Groups are {"scope": ["business.name", "business.offer", "business.buyer_scope"], "source": ["route", "source.route", "source.qualifying_action"], "message": ["message.job", "message.buyer_question", "message.offer", "message.destination_url"], "owners": ["business.owner", "permission.owner", "message.owner", "measurement.owner"], "measurement": ["measurement.downstream_event", "measurement.crm_key", "measurement.review_trigger"]}. In that branch emit only missing PLAN-* requests, in scope/source/message/owners/measurement order, plus REQ-CONTRACT when applicable. Do not ask for account receipts. - Once fewer than three planning groups are incomplete, validate the selected route, timestamps, affirmative permission, Ready audience and usable count, all four suppressions, message and measurement. Emit requests in contract/source/tag/permission/audience/completed/customer/opportunity/privacy/message/measurement order. Stable request vocabulary (copy IDs and request text exactly): - `REQ-CONTRACT`: Use contract maestro.linkedin-retargeting-plan.v1 version 1.1.0 and migrate the record before review. - `PLAN-SCOPE`: Supply the business, offer and buyer scope for this plan. - `PLAN-SOURCE`: Choose one supported source route and name the exact qualifying action. - `PLAN-MESSAGE`: Supply the next-message job, buyer question, offer and destination. - `PLAN-OWNERS`: Assign owners for the plan, data permission, message and measurement. - `PLAN-MEASUREMENT`: Supply the downstream event, CRM key and review trigger. - `REQ-SOURCE`: Supply the current selected source/action reference and observation date. - `REQ-TAG`: Supply the current active Insight Tag and website signal receipt. - `REQ-PERMISSION`: Supply explicit approved data-use evidence, owner and opt-out handling. - `REQ-AUDIENCE`: Supply the current LinkedIn audience status receipt and matched population state. - `REQ-SUPPRESSION-COMPLETED`: Supply the completed-step suppression source, refresh rule, owner and current read-back. - `REQ-SUPPRESSION-CUSTOMER`: Supply the customer suppression source, refresh rule, owner and current read-back. - `REQ-SUPPRESSION-OPPORTUNITY`: Supply the open-opportunity suppression source, refresh rule, owner and current read-back. - `REQ-SUPPRESSION-PRIVACY`: Supply the privacy/preference suppression source, refresh rule, owner and current read-back. - `REQ-MESSAGE`: Supply the next-message job, real proof asset, offer and destination. - `REQ-MEASUREMENT`: Supply the downstream event, CRM key, owner and review trigger. Route contract: - `website`: required source.route, source.qualifying_action, source.rule, source.window_days, source.observed_at, source.evidence_ref, source.insight_tag_state, source.insight_tag_evidence_ref, audience.status, audience.status_evidence_ref; allowed windows [30, 60, 90, 180, 365] - `video`: required source.route, source.qualifying_action, source.asset_ref, source.video_view_threshold, source.window_days, source.observed_at, source.evidence_ref, audience.status, audience.status_evidence_ref; allowed windows [30, 60, 90, 180, 365]; thresholds [25, 50, 75, 97] - `lead_gen_form`: required source.route, source.qualifying_action, source.asset_ref, source.lead_form_action, source.window_days, source.observed_at, source.evidence_ref, audience.status, audience.status_evidence_ref; allowed windows [30, 60, 90, 180, 365]; actions ['opened', 'submitted'] - `single_image`: required source.route, source.qualifying_action, source.asset_ref, source.single_image_action, source.window_days, source.observed_at, source.evidence_ref, audience.status, audience.status_evidence_ref; allowed windows [30, 60, 90, 180, 365]; actions ['any_interaction', 'chargeable_click'] - `document`: required source.route, source.qualifying_action, source.asset_ref, source.document_action, source.window_days, source.observed_at, source.evidence_ref, audience.status, audience.status_evidence_ref; allowed windows [30, 60, 90, 180, 365]; actions ['download_or_interaction', 'chargeable_click'] - `conversation`: required source.route, source.qualifying_action, source.asset_ref, source.conversation_action, source.window_days, source.observed_at, source.evidence_ref, audience.status, audience.status_evidence_ref; allowed windows [30, 60, 90, 180, 365]; actions ['opened', 'cta_click'] - `company_page`: required source.route, source.qualifying_action, source.asset_ref, source.company_page_action, source.window_days, source.observed_at, source.evidence_ref, audience.status, audience.status_evidence_ref; allowed windows [30, 60, 90, 180, 365]; actions ['page_view', 'header_cta_click'] - `event`: required source.route, source.qualifying_action, source.asset_ref, source.event_action, source.observed_at, source.evidence_ref, audience.status, audience.status_evidence_ref; actions ['clicked_to_attend', 'registered_attended', 'registered_not_attended', 'engaged_not_registered_or_attended'] - `contact_list`: required source.route, source.qualifying_action, source.asset_ref, source.observed_at, source.evidence_ref, permission.state, permission.evidence_ref, permission.owner, audience.status, audience.status_evidence_ref - `capi`: required source.route, source.qualifying_action, source.asset_ref, source.observed_at, source.evidence_ref, permission.state, permission.evidence_ref, permission.owner, audience.status, audience.status_evidence_ref Readable Markdown renderer grammar, in this exact section order: 1. H1 `LinkedIn retargeting source-to-message handoff`. 2. `Record and decision`: Contract ID, Contract version, Record ID, Fixture status, Decision, Input SHA-256. 3. `Business and route`: Business, Offer, Buyer scope, Plan owner, Route, Source evidence kind. 4. `Source`: Qualifying action, Source rule, Source asset or list reference, Window days, Observed at, Source evidence reference, Insight Tag state, Insight Tag evidence reference, Video view threshold, Lead Form action, Single-image action, Document action, Conversation action, Company Page action, Event action, Source event count. 5. `Permission`: State, Evidence reference, Owner, Notice reference, Opt-out process. 6. `Audience`: Audience name, Status, Status observed at, Status evidence reference, Matched population state, Matched account count. 7. `Suppressions`: one H3 per supplied suppression, named by `kind`, with State, Source, Refresh rule, Owner and Evidence reference. If no suppression array is supplied, write `No suppression records supplied.` 8. `Next message`: Job, Buyer question, Proof asset, Offer, Destination URL, CTA, Owner. 9. `Measurement`: Downstream event, CRM key, Owner, Review trigger, Delivery state, Delivery evidence reference, Business outcome state, Business outcome evidence reference. 10. `Decision reasons`: one bullet per `derived.reasons` value in evaluator order; if absent, write `Unknown`. 11. `Evidence requests`: one bullet per request as `**ID** — owner: exact request Reason: exact reason`; if none, write `No planning evidence requests remain. Account-specific launch checks still apply.` 12. `Next action`: copy `derived.next_action` exactly. For every label above, render the corresponding canonical field even when it is null, zero, false, Unknown, No or Not applicable. Render null or missing as `Unknown`; render numeric zero as `0`; never drop an off-route field. Escape literal `|` as `\|`. This readable handoff is complete field-semantic output, not a selected summary. Canonical JSON renderer rules: - Preserve every supplied non-derived field and value exactly. Do not silently migrate a mismatched contract. - Remove imported `derived`, recompute it, then append keys in this order: decision, reasons, requests, next_action, input_sha256. - Request objects use keys in this order: id, owner, reason, request. Deduplicate by ID and retain evaluator order. - Compute `input_sha256` from UTF-8 JSON of the non-derived record with recursively sorted object keys, compact separators and unescaped Unicode. - Ready next action is exactly `An authorized operator reviews the record and performs account-specific launch checks.` - Hold next action is exactly the first request's `request`. Normative standalone evaluator implementation follows. This is the complete validation-to-request mapping, reason vocabulary, owner selection, fallback rule, deduplication behavior and hash algorithm. Use the embedded contract JSON as `CONTRACT`. Do not summarize, rename or improvise any request object. If code execution is available, run this implementation. Otherwise apply it line by line. Embedded contract JSON: ```json { "contract_id": "maestro.linkedin-retargeting-plan.v1", "contract_version": "1.1.0", "authoritative_input_rule": "Only fields outside derived are source facts. Discard imported derived values and recompute them.", "unknown_semantics": "Unknown means evidence is absent. No means an observed negative. Zero means an observed numeric zero. Not applicable requires a selected route where the check truly does not apply.", "decision_precedence": [ "hold", "ready_for_operator_review" ], "routes": { "website": { "required": [ "source.route", "source.qualifying_action", "source.rule", "source.window_days", "source.observed_at", "source.evidence_ref", "source.insight_tag_state", "source.insight_tag_evidence_ref", "audience.status", "audience.status_evidence_ref" ], "allowed_windows": [ 30, 60, 90, 180, 365 ] }, "video": { "required": [ "source.route", "source.qualifying_action", "source.asset_ref", "source.video_view_threshold", "source.window_days", "source.observed_at", "source.evidence_ref", "audience.status", "audience.status_evidence_ref" ], "thresholds": [ 25, 50, 75, 97 ], "allowed_windows": [ 30, 60, 90, 180, 365 ] }, "lead_gen_form": { "required": [ "source.route", "source.qualifying_action", "source.asset_ref", "source.lead_form_action", "source.window_days", "source.observed_at", "source.evidence_ref", "audience.status", "audience.status_evidence_ref" ], "actions": [ "opened", "submitted" ], "allowed_windows": [ 30, 60, 90, 180, 365 ] }, "single_image": { "required": [ "source.route", "source.qualifying_action", "source.asset_ref", "source.single_image_action", "source.window_days", "source.observed_at", "source.evidence_ref", "audience.status", "audience.status_evidence_ref" ], "actions": [ "any_interaction", "chargeable_click" ], "allowed_windows": [ 30, 60, 90, 180, 365 ] }, "document": { "required": [ "source.route", "source.qualifying_action", "source.asset_ref", "source.document_action", "source.window_days", "source.observed_at", "source.evidence_ref", "audience.status", "audience.status_evidence_ref" ], "actions": [ "download_or_interaction", "chargeable_click" ], "allowed_windows": [ 30, 60, 90, 180, 365 ] }, "conversation": { "required": [ "source.route", "source.qualifying_action", "source.asset_ref", "source.conversation_action", "source.window_days", "source.observed_at", "source.evidence_ref", "audience.status", "audience.status_evidence_ref" ], "actions": [ "opened", "cta_click" ], "allowed_windows": [ 30, 60, 90, 180, 365 ] }, "company_page": { "required": [ "source.route", "source.qualifying_action", "source.asset_ref", "source.company_page_action", "source.window_days", "source.observed_at", "source.evidence_ref", "audience.status", "audience.status_evidence_ref" ], "actions": [ "page_view", "header_cta_click" ], "allowed_windows": [ 30, 60, 90, 180, 365 ] }, "event": { "required": [ "source.route", "source.qualifying_action", "source.asset_ref", "source.event_action", "source.observed_at", "source.evidence_ref", "audience.status", "audience.status_evidence_ref" ], "actions": [ "clicked_to_attend", "registered_attended", "registered_not_attended", "engaged_not_registered_or_attended" ] }, "contact_list": { "required": [ "source.route", "source.qualifying_action", "source.asset_ref", "source.observed_at", "source.evidence_ref", "permission.state", "permission.evidence_ref", "permission.owner", "audience.status", "audience.status_evidence_ref" ] }, "capi": { "required": [ "source.route", "source.qualifying_action", "source.asset_ref", "source.observed_at", "source.evidence_ref", "permission.state", "permission.evidence_ref", "permission.owner", "audience.status", "audience.status_evidence_ref" ] } }, "affirmative_evidence": { "source": "A current non-placeholder reference to the selected source/action and its observed state.", "permission": "Explicit approved state, named owner and current non-placeholder approval/reference. Planned, requested, expected, pending or inferred language fails.", "audience": "Current LinkedIn status reference. Ready proves processing only.", "suppression": "Named current source, refresh rule, owner, observed yes/no state and non-placeholder reference.", "delivery": "Actual ad-set delivery read-back with object IDs and observation time. Audience Ready does not satisfy it.", "outcome": "Actual destination/CRM event read-back with join key and observation time. Delivery does not satisfy it." }, "stable_requests": { "REQ-CONTRACT": "Use contract maestro.linkedin-retargeting-plan.v1 version 1.1.0 and migrate the record before review.", "PLAN-SCOPE": "Supply the business, offer and buyer scope for this plan.", "PLAN-SOURCE": "Choose one supported source route and name the exact qualifying action.", "PLAN-MESSAGE": "Supply the next-message job, buyer question, offer and destination.", "PLAN-OWNERS": "Assign owners for the plan, data permission, message and measurement.", "PLAN-MEASUREMENT": "Supply the downstream event, CRM key and review trigger.", "REQ-SOURCE": "Supply the current selected source/action reference and observation date.", "REQ-TAG": "Supply the current active Insight Tag and website signal receipt.", "REQ-PERMISSION": "Supply explicit approved data-use evidence, owner and opt-out handling.", "REQ-AUDIENCE": "Supply the current LinkedIn audience status receipt and matched population state.", "REQ-SUPPRESSION-COMPLETED": "Supply the completed-step suppression source, refresh rule, owner and current read-back.", "REQ-SUPPRESSION-CUSTOMER": "Supply the customer suppression source, refresh rule, owner and current read-back.", "REQ-SUPPRESSION-OPPORTUNITY": "Supply the open-opportunity suppression source, refresh rule, owner and current read-back.", "REQ-SUPPRESSION-PRIVACY": "Supply the privacy/preference suppression source, refresh rule, owner and current read-back.", "REQ-MESSAGE": "Supply the next-message job, real proof asset, offer and destination.", "REQ-MEASUREMENT": "Supply the downstream event, CRM key, owner and review trigger." }, "launch_boundary": "ready_for_operator_review is not audience creation, upload, spend authorization, campaign launch, delivery or business outcome.", "broadly_missing_rule": { "threshold": "Three or more incomplete planning groups", "groups": { "scope": [ "business.name", "business.offer", "business.buyer_scope" ], "source": [ "route", "source.route", "source.qualifying_action" ], "message": [ "message.job", "message.buyer_question", "message.offer", "message.destination_url" ], "owners": [ "business.owner", "permission.owner", "message.owner", "measurement.owner" ], "measurement": [ "measurement.downstream_event", "measurement.crm_key", "measurement.review_trigger" ] }, "behavior": "Return only the missing PLAN-* requests until fewer than three planning groups are incomplete. Do not ask for account receipts in this branch." }, "source_route_binding": "source.route must equal the top-level route. Changing route never reuses evidence gathered for another route.", "timestamp_rule": "source.observed_at and audience.status_observed_at must be calendar-valid timezone-aware ISO 8601 timestamps.", "evidence_reference_rule": "Evidence references must be present and affirmative. Natural-language denied, pending, planned, requested, expected or unavailable references are not receipts.", "matched_population_rule": "usable requires an integer matched_accounts_count of at least 300; zero requires count 0; below_threshold requires an integer count from 0 through 299." } ``` Reference implementation: ```python #!/usr/bin/env python3 import copy,hashlib,json,re,sys from datetime import datetime from pathlib import Path HERE=Path(__file__).resolve().parent CONTRACT=json.loads((HERE/'contract.json').read_text()) BAD=re.compile(r'^(?:unknown|not applicable|n/?a|na|pending|unavailable|denied|none|null|tbd|to be determined|planned|requested|expected|placeholder)$',re.I) NEGATIVE_REF=re.compile(r'\b(?:denied|pending|planned|requested|expected|unavailable|not\s+approved|not\s+available|not\s+complete|will\s+be|to\s+be\s+(?:added|provided|confirmed|verified))\b',re.I) ACTION_PATHS={'lead_gen_form':'source.lead_form_action','single_image':'source.single_image_action','document':'source.document_action','conversation':'source.conversation_action','company_page':'source.company_page_action','event':'source.event_action'} SUPPRESSION_IDS={'completed_next_step':'REQ-SUPPRESSION-COMPLETED','customer':'REQ-SUPPRESSION-CUSTOMER','open_opportunity':'REQ-SUPPRESSION-OPPORTUNITY','privacy_preference':'REQ-SUPPRESSION-PRIVACY'} PLAN_IDS={'scope':'PLAN-SCOPE','source':'PLAN-SOURCE','message':'PLAN-MESSAGE','owners':'PLAN-OWNERS','measurement':'PLAN-MEASUREMENT'} def present(v): if v is None or v is False:return False if isinstance(v,str):return bool(v.strip()) and not BAD.fullmatch(v.strip()) return True def affirmative_ref(v):return present(v) and not (isinstance(v,str) and NEGATIVE_REF.search(v)) def get(obj,path): cur=obj for part in path.split('.'): if not isinstance(cur,dict):return None cur=cur.get(part) return cur def valid_time(v): if not isinstance(v,str):return False try: parsed=datetime.fromisoformat(v.replace('Z','+00:00')) return parsed.tzinfo is not None except ValueError:return False def req(reqs,id,owner,reason): if any(x['id']==id for x in reqs):return reqs.append({'id':id,'owner':owner or 'Owner assignment required','reason':reason,'request':CONTRACT['stable_requests'][id]}) def finish(x,requests): decision='ready_for_operator_review' if not requests else 'hold' reasons=[q['reason'] for q in requests] if requests else ['Planning, permission, audience, suppression, message and measurement evidence are complete.'] clean=json.dumps(x,sort_keys=True,separators=(',',':'),ensure_ascii=False).encode() x['derived']={'decision':decision,'reasons':reasons,'requests':requests,'next_action':'An authorized operator reviews the record and performs account-specific launch checks.' if not requests else requests[0]['request'],'input_sha256':hashlib.sha256(clean).hexdigest()} return x def evaluate(source): x=copy.deepcopy(source);x.pop('derived',None);requests=[] if x.get('contract_id')!=CONTRACT['contract_id'] or x.get('contract_version')!=CONTRACT['contract_version']: req(requests,'REQ-CONTRACT',get(x,'business.owner'),'The contract identity or version is incompatible.') group_gaps={name:[p for p in paths if not present(get(x,p))] for name,paths in CONTRACT['broadly_missing_rule']['groups'].items()} incomplete=[name for name,gaps in group_gaps.items() if gaps] if len(incomplete)>=3: for name in ('scope','source','message','owners','measurement'): if name in incomplete:req(requests,PLAN_IDS[name],get(x,'business.owner'),f'The {name} planning group is incomplete: {", ".join(group_gaps[name])}.') return finish(x,requests) route=x.get('route') if route not in CONTRACT['routes']: req(requests,'REQ-SOURCE',get(x,'business.owner'),'Choose one supported route and supply its source evidence.') else: spec=CONTRACT['routes'][route] if get(x,'source.route')!=route:req(requests,'REQ-SOURCE',get(x,'business.owner'),'The source evidence kind does not match the selected route.') for field in spec['required']: value=get(x,field);ok=affirmative_ref(value) if field.endswith('evidence_ref') else present(value) if not ok: id='REQ-TAG' if 'insight_tag' in field else 'REQ-PERMISSION' if field.startswith('permission.') else 'REQ-AUDIENCE' if field.startswith('audience.') else 'REQ-SOURCE' req(requests,id,get(x,'permission.owner') or get(x,'business.owner'),f'Missing or non-affirmative {field}.') if spec.get('allowed_windows') and get(x,'source.window_days') not in spec['allowed_windows']:req(requests,'REQ-SOURCE',get(x,'business.owner'),'The source window is not valid for the selected route.') if spec.get('thresholds') and get(x,'source.video_view_threshold') not in spec['thresholds']:req(requests,'REQ-SOURCE',get(x,'business.owner'),'The video threshold is not valid for the selected route.') if spec.get('actions') and get(x,ACTION_PATHS[route]) not in spec['actions']:req(requests,'REQ-SOURCE',get(x,'business.owner'),'The source action is not valid for the selected route.') if route=='website' and get(x,'source.insight_tag_state')!='yes':req(requests,'REQ-TAG',get(x,'business.owner'),'The website route lacks an affirmative active Insight Tag state.') if not valid_time(get(x,'source.observed_at')):req(requests,'REQ-SOURCE',get(x,'business.owner'),'The source observation time is not a calendar-valid timezone-aware ISO 8601 value.') if get(x,'permission.state')!='approved' or not affirmative_ref(get(x,'permission.evidence_ref')) or not present(get(x,'permission.owner')) or not present(get(x,'permission.opt_out_process')):req(requests,'REQ-PERMISSION',get(x,'permission.owner'),'Explicit current data-use approval is incomplete.') if get(x,'audience.status')!='ready' or not affirmative_ref(get(x,'audience.status_evidence_ref')) or get(x,'audience.matched_accounts_state')!='usable' or not valid_time(get(x,'audience.status_observed_at')):req(requests,'REQ-AUDIENCE',get(x,'business.owner'),'LinkedIn Ready status and usable matched-population evidence are incomplete.') state=get(x,'audience.matched_accounts_state');count=get(x,'audience.matched_accounts_count');count_ok=isinstance(count,int) and not isinstance(count,bool) if (state=='usable' and (not count_ok or count<300)) or (state=='zero' and count!=0) or (state=='below_threshold' and (not count_ok or not 0<=count<300)):req(requests,'REQ-AUDIENCE',get(x,'business.owner'),'Matched population state and numeric count are inconsistent.') supplied={s.get('kind'):s for s in x.get('suppressions',[]) if isinstance(s,dict)} for kind,id in SUPPRESSION_IDS.items(): s=supplied.get(kind,{}) if s.get('state')!='yes' or not all(present(s.get(k)) for k in ('source','refresh_rule','owner')) or not affirmative_ref(s.get('evidence_ref')):req(requests,id,s.get('owner'),f'{kind} suppression lacks affirmative current evidence.') m=x.get('message',{}) if not all(present(m.get(k)) for k in ('job','buyer_question','proof_asset','offer','destination_url','owner')):req(requests,'REQ-MESSAGE',m.get('owner'),'The next-message handoff is incomplete.') z=x.get('measurement',{}) if not all(present(z.get(k)) for k in ('downstream_event','crm_key','owner','review_trigger')):req(requests,'REQ-MEASUREMENT',z.get('owner'),'The downstream measurement handoff is incomplete.') return finish(x,requests) if __name__=='__main__': source=json.load(open(sys.argv[1])) if len(sys.argv)>1 else json.load(sys.stdin) print(json.dumps(evaluate(source),indent=2,ensure_ascii=False)) ``` Canonical blank shape: ```json { "contract_id": "maestro.linkedin-retargeting-plan.v1", "contract_version": "1.1.0", "record_id": null, "fixture_status": "blank", "business": { "name": null, "offer": null, "buyer_scope": null, "owner": null }, "route": null, "source": { "qualifying_action": null, "rule": null, "asset_ref": null, "window_days": null, "observed_at": null, "evidence_ref": null, "insight_tag_state": "unknown", "insight_tag_evidence_ref": null, "video_view_threshold": null, "lead_form_action": null, "single_image_action": null, "document_action": null, "conversation_action": null, "company_page_action": null, "event_action": null, "source_event_count": null, "route": null }, "permission": { "state": "unknown", "evidence_ref": null, "owner": null, "notice_ref": null, "opt_out_process": null }, "audience": { "name": null, "status": "unknown", "status_observed_at": null, "status_evidence_ref": null, "matched_accounts_state": "unknown", "matched_accounts_count": null }, "suppressions": [ { "kind": "completed_next_step", "source": null, "refresh_rule": null, "owner": null, "state": "unknown", "evidence_ref": null }, { "kind": "customer", "source": null, "refresh_rule": null, "owner": null, "state": "unknown", "evidence_ref": null }, { "kind": "open_opportunity", "source": null, "refresh_rule": null, "owner": null, "state": "unknown", "evidence_ref": null }, { "kind": "privacy_preference", "source": null, "refresh_rule": null, "owner": null, "state": "unknown", "evidence_ref": null } ], "message": { "job": null, "buyer_question": null, "proof_asset": null, "offer": null, "destination_url": null, "cta": null, "owner": null }, "measurement": { "downstream_event": null, "crm_key": null, "owner": null, "review_trigger": null, "delivery_state": "unknown", "delivery_evidence_ref": null, "business_outcome_state": "unknown", "business_outcome_evidence_ref": null } } ``` Task: independently review and correct the pasted source-to-message record. Use the same broadly missing branch. Report every discrepancy before the corrected record. Return exactly: (1) route and decision; (2) concise readable handoff using the renderer grammar; (3) discrepancies for review or focused planning questions for build; (4) exact stable requests; (5) canonical JSON in one code fence; (6) one exact next action. PASTE RECORD AND RECEIPTS BELOW: