# Leonard Execution Card — GBP Snapshot Ingest v1.2 **Goal:** Map a filled GBP Snapshot Intake into client docs with minimal reasoning. **Governing docs:** - `docs/agents/agent-charter-v1.md` - `docs/agents/audit-playbook-v1.md` - `docs/templates/gbp-snapshot-intake.md` (v1.2+) --- ## Input required A completed `gbp-snapshot-intake` (or form output) for the client. If required metadata missing (client name, snapshot datetime, source, observation surface), stop and report `BLOCKED: incomplete intake`. --- ## Step 1 — Update Data Inventory GBP row only Open: `docs/clients//data-inventory-v1.md` Map intake → GBP section. Rules: - Factual values only - Blank → `NOT_OBSERVED` - Confirmed absent after looking → `NOT_PRESENT` - **PLACE_ID:** if MAPS_URL present and PLACE_ID empty → **compute** from URL (`/g/...`, `0x...:0x...`); never leave blank when derivable - Secondary `!5s` / related feature IDs → note as related-listing **lead** (not conclusion) - **PRIMARY_CATEGORY:** must be single canonical value; multi-token free text → write `INVALID_CAPTURE` + raw string; do not invent primary - **CLAIMED_STATUS inference (allowed, named signals only):** - If claim prompt NOT_PRESENT/No **and** review responses Yes → may write `Likely Claimed — inferred` + list signals - Do not write Tier 1 Claimed without owner/dashboard source - Verification Tier: owner dashboard → 1; human Maps / API → 2 - Snapshot datetime from intake (require TZ when open-now is set) - Do not rewrite non-GBP sources unless intake names them --- ## Step 2 — Threat Trigger Rules (boolean only) Apply **only** these rules. No creative threats. | Rule ID | Version | Condition | Action | |---------|---------|-----------|--------| | R1 | 1.2 | BOOKING_BUTTON_PRESENT_ON_GBP = No **and** action-button row completeness OK (messaging observed or explicitly NOT_OBSERVED as incomplete) | Ensure threat for missing public booking on GBP. Prefer title form: missing GBP booking button. If siblings null, emit **reduced confidence** note in evidence. Update evidence/recency if exists; else create. verification_tier: 2; severity: major (provisional). | | R2 | 1.2 | (Claimed = No OR Unknown) AND (reviews thin OR NOT_OBSERVED) | Ensure threat for thin/unclear GBP completeness. Prefer **enumerated deficits** in evidence (posts, services, photos, Q&A, categories). If status is Likely Claimed — inferred, still allow thin-review threat but do not claim “unclaimed.” | | R3 | 1.2 | SECOND_LISTING_NEARBY = Yes **or** secondary feature ID lead present | Ensure minor tier-2 related/duplicate listing risk threat; evidence must say lead vs verified. | | R4 | 1.2 | Star rating + review count both observed | Do **not** create threat from rating alone. | | R5 | 1.2 | Field NOT_OBSERVED alone | Do not invent threat from absence of observation unless R1–R3/R6 fire. | | R6 | 1.2 | Services listed present **and** category/services breadth mismatch observable (e.g. services narrow vs multi category tokens / spin+PT vs strength only) | Ensure threat for services vs category discovery mismatch. | **Rules log requirement (output):** for each fired rule include: rule ID, version, input fields read, values read, output emitted (threat ID or update). --- ## Step 3 — Output format Return only: 1. Updated GBP inventory section 2. Threat Register changes (if any rule fired) 3. `Changes Made` list — bullet facts; include **object IDs** (e.g. T-012) when creating/updating threats 4. `Rules Fired` list — structured per log requirement above Forbidden: - Severity upgrades beyond template defaults without human request - Solution language - Competitor claims - New threats outside R1–R6 - Phone masking / partial redaction of intake values --- ## Pass criteria - Every written value traces to intake or deterministic URL parse - No extra narrative analysis - Tier labels correct; severity separate from verification_tier - Only trigger rules created/updated threats - PLACE_ID computed when URL present **If uncertain:** leave field as `NOT_OBSERVED` and do not fire a rule.