leonard-gbp-execution-card v1.2 — PLACE_ID compute, vocabulary, R1 completeness, claimed inference, R6 services mismatch

This commit is contained in:
Ty
2026-08-03 19:08:09 +00:00
parent b8d35127c5
commit cfa120869e
+39 -61
View File
@@ -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/<client>/data-inventory-v1.md`
Open: `docs/clients/<client>/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 R1R3 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 R1R3/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 R1R3
- New threats outside R1R6
- 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.