From cfa120869ec509bac24c1d8c052f4f7b6d525643 Mon Sep 17 00:00:00 2001 From: Ty Date: Mon, 3 Aug 2026 19:08:09 +0000 Subject: [PATCH] =?UTF-8?q?leonard-gbp-execution-card=20v1.2=20=E2=80=94?= =?UTF-8?q?=20PLACE=5FID=20compute,=20vocabulary,=20R1=20completeness,=20c?= =?UTF-8?q?laimed=20inference,=20R6=20services=20mismatch?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/agents/leonard-gbp-execution-card.md | 100 +++++++++------------- 1 file changed, 39 insertions(+), 61 deletions(-) diff --git a/docs/agents/leonard-gbp-execution-card.md b/docs/agents/leonard-gbp-execution-card.md index 9ca03f3..f67eac6 100644 --- a/docs/agents/leonard-gbp-execution-card.md +++ b/docs/agents/leonard-gbp-execution-card.md @@ -1,103 +1,81 @@ -# Leonard Execution Card — GBP Snapshot Ingest v1.1 +# 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` +- `docs/templates/gbp-snapshot-intake.md` (v1.2+) --- ## Input required -A completed `gbp-snapshot-intake.md` (or generated form output) for the client. +A completed `gbp-snapshot-intake` (or form output) for the client. -If any required metadata is missing (client name, snapshot date, source), stop and report `BLOCKED: incomplete intake`. +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` +Open: `docs/clients//data-inventory-v1.md` -Update **only** the Google Business Profile (GBP) section using these mappings: +Map intake → GBP section. Rules: -| Intake field | Inventory field | -|--------------|-----------------| -| Source | Access Status / Notes | -| Snapshot date | Snapshot Date | -| Business name shown | Notes | -| Address shown | Notes | -| Phone shown | Notes | -| Website shown | Notes | -| Primary category + Additional categories | Notes | -| Star rating | Notes | -| Review count | Notes | -| Review responses observed + detail | Notes | -| “Own this business?” prompt visible | Notes | -| Claimed status | Notes | -| Verified badge | Notes | -| Hours listed + hours text | Notes | -| Open now observed | Notes | -| Booking button present on the GBP | Notes | -| Booking button label | Notes | -| Messaging button present | Notes | -| Other action buttons | Notes | -| Photos present + approx count | Notes | -| Services listed | Notes | -| Updates / Posts status + most recent post date | Notes | -| Q&A status | Notes | -| Attributes / highlights | Notes | -| Second related listing + names + notes | Notes / Gaps | -| Raw notes | Notes / Gaps | - -Rules: -- Write factual values only -- Blank intake field → `Not observed` -- Verification Tier: - - Owner dashboard / owner-confirmed → Tier 1 - - Human Maps eye or Places API → Tier 2 -- Do not rewrite other sources unless the intake explicitly names them +- 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 new creative threats. +Apply **only** these rules. No creative threats. -| Rule ID | Condition | Action | -|---------|-----------|--------| -| R1 | Booking button present on the GBP = No | Ensure a threat exists for missing public booking on GBP surfaces. If missing, add a Tier 2 Major threat with evidence from intake. If exists, update Data Recency + Evidence Snippet only. | -| R2 | Claimed status = No or Unknown AND (rating/reviews thin or Not observed) | Ensure a threat exists for weak/unclear GBP completeness. Update evidence/recency only if exists. | -| R3 | Second related listing nearby = Yes | Ensure a Minor Tier 2 threat exists for related/duplicate listing risk. Update evidence only. | -| R4 | Star rating and review count both observed | Do **not** create a new threat from rating alone. Only update inventory. | -| R5 | Any field Not observed | Do not invent a threat from absence of observation alone unless R1–R3 fire. | +| 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. | -If no rule fires, leave Threat Register unchanged except optional recency note on existing GBP-related threats. +**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: -1. Updated GBP inventory section (or full inventory if required by tooling) -2. Threat Register changes only if a rule fired -3. `Changes Made` list (bullet facts only) -4. `Rules Fired:` list (R1/R2/R3/none) +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–R3 +- New threats outside R1–R6 +- Phone masking / partial redaction of intake values --- ## Pass criteria -- Every written value traces to the intake +- Every written value traces to intake or deterministic URL parse - No extra narrative analysis -- Tier labels correct +- 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. +**If uncertain:** leave field as `NOT_OBSERVED` and do not fire a rule.