Upgrade GBP snapshot form to v1.1 — Services, Posts status, Claim prompt, Messaging button, refined Q&A and ownership fields for full consistency with intake template and execution card

This commit is contained in:
Ty
2026-08-03 17:51:29 +00:00
parent 628bcc2724
commit e121e79d03
+65 -26
View File
@@ -3,7 +3,7 @@
<head>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1" />
<title>DOP — GBP Snapshot Intake</title>
<title>DOP — GBP Snapshot Intake v1.1</title>
<style>
:root {
--bg: #0f1419;
@@ -141,8 +141,8 @@
</head>
<body>
<div class="wrap">
<h1>DOP — GBP Snapshot Intake</h1>
<p class="sub">General-purpose cold audit form. Fill once per client. Generate text → copy/paste to Leonard. Uses execution card rules only.</p>
<h1>DOP — GBP Snapshot Intake v1.1</h1>
<p class="sub">Improved cold-audit form. Fill once per client Generate paste to Leonard. Follows execution card rules only.</p>
<form id="gbpForm" autocomplete="off">
<div class="card">
@@ -196,7 +196,7 @@
</div>
<div>
<label for="primary_category">Primary category</label>
<input id="primary_category" type="text" />
<input id="primary_category" type="text" placeholder="Copy exactly as shown" />
</div>
<div>
<label for="additional_categories">Additional categories</label>
@@ -217,13 +217,17 @@
<input id="review_count" type="text" placeholder="e.g. 42" />
</div>
<div>
<label for="review_responses">Review response behavior observed</label>
<label for="review_responses">Review responses observed</label>
<select id="review_responses">
<option value="Unknown">Unknown</option>
<option value="Yes">Yes</option>
<option value="No">No</option>
</select>
</div>
<div>
<label for="review_responses_detail">Approx how many / how recent (optional)</label>
<input id="review_responses_detail" type="text" />
</div>
</div>
</div>
@@ -231,7 +235,15 @@
<h2>Ownership / Claim Signals</h2>
<div class="grid">
<div>
<label for="claimed">Claimed or “Own this business visible</label>
<label for="claim_prompt">“Own this business?” prompt visible</label>
<select id="claim_prompt">
<option value="Unknown">Unknown</option>
<option value="Yes">Yes</option>
<option value="No">No</option>
</select>
</div>
<div>
<label for="claimed">Claimed status (your best judgment)</label>
<select id="claimed">
<option value="Unknown">Unknown</option>
<option value="Yes">Yes</option>
@@ -278,7 +290,7 @@
<h2>Conversion</h2>
<div class="grid">
<div>
<label for="booking_button">Booking / appointment button present</label>
<label for="booking_button">Booking button present <strong>on the GBP</strong> (not the website)</label>
<select id="booking_button">
<option value="Unknown">Unknown</option>
<option value="Yes">Yes</option>
@@ -289,6 +301,14 @@
<label for="booking_label">Booking button label (if any)</label>
<input id="booking_label" type="text" />
</div>
<div>
<label for="messaging_button">Messaging button present</label>
<select id="messaging_button">
<option value="Unknown">Unknown</option>
<option value="Yes">Yes</option>
<option value="No">No</option>
</select>
</div>
<div class="full">
<label for="other_buttons">Other action buttons observed</label>
<input id="other_buttons" type="text" />
@@ -310,22 +330,34 @@
<label for="photo_count">Approx photo count</label>
<input id="photo_count" type="text" />
</div>
<div class="full">
<label for="services">Services listed</label>
<input id="services" type="text" placeholder="e.g. strength training only" />
</div>
<div>
<label for="posts_visible">Posts visible</label>
<select id="posts_visible">
<option value="Unknown">Unknown</option>
<option value="Yes">Yes</option>
<option value="No">No</option>
<label for="posts_status">Updates / Posts status</label>
<select id="posts_status">
<option value="Not visible">Not visible</option>
<option value="Present but empty">Present but empty</option>
<option value="Present with content">Present with content</option>
</select>
</div>
<div>
<label for="qa_visible">Q&A visible</label>
<select id="qa_visible">
<option value="Unknown">Unknown</option>
<option value="Yes">Yes</option>
<option value="No">No</option>
<label for="recent_post">Most recent post date (approx, optional)</label>
<input id="recent_post" type="text" />
</div>
<div>
<label for="qa_status">Q&A status</label>
<select id="qa_status">
<option value="Not visible">Not visible</option>
<option value="Visible but empty">Visible but empty</option>
<option value="Visible + has answers">Visible + has answers</option>
</select>
</div>
<div class="full">
<label for="attributes">Attributes / highlights visible (optional)</label>
<input id="attributes" type="text" placeholder="e.g. women-owned, LGBTQ-friendly" />
</div>
</div>
</div>
@@ -389,13 +421,12 @@
function buildOutput() {
return `Follow docs/agents/leonard-gbp-execution-card.md exactly.
Map this intake into the client Data Inventory GMB row.
Map this intake into the client Data Inventory GBP row.
Apply only threat trigger rules R1R3.
Do not invent fields. Do not add solutions. Do not reason beyond the execution card.
Return: updated GMB section, any threat changes, Changes Made list, Rules Fired list.
Return: updated GBP section, any threat changes, Changes Made list, Rules Fired list.
--- GBP SNAPSHOT INTAKE ---
CLIENT: ${val("client")}
SNAPSHOT_DATE: ${val("snapshot_date")}
SOURCE: ${val("source")}
@@ -412,22 +443,28 @@ ADDITIONAL_CATEGORIES: ${val("additional_categories")}
STAR_RATING: ${val("star_rating")}
REVIEW_COUNT: ${val("review_count")}
REVIEW_RESPONSES_OBSERVED: ${val("review_responses")}
REVIEW_RESPONSES_DETAIL: ${val("review_responses_detail")}
CLAIMED_VISIBLE: ${val("claimed")}
CLAIM_PROMPT_VISIBLE: ${val("claim_prompt")}
CLAIMED_STATUS: ${val("claimed")}
VERIFIED_BADGE_VISIBLE: ${val("verified")}
HOURS_LISTED: ${val("hours_listed")}
HOURS_TEXT: ${val("hours_text")}
OPEN_NOW_OBSERVED: ${val("open_now")}
BOOKING_BUTTON_PRESENT: ${val("booking_button")}
BOOKING_BUTTON_PRESENT_ON_GBP: ${val("booking_button")}
BOOKING_BUTTON_LABEL: ${val("booking_label")}
MESSAGING_BUTTON_PRESENT: ${val("messaging_button")}
OTHER_ACTION_BUTTONS: ${val("other_buttons")}
PHOTOS_PRESENT: ${val("photos_present")}
PHOTO_COUNT_APPROX: ${val("photo_count")}
POSTS_VISIBLE: ${val("posts_visible")}
QA_VISIBLE: ${val("qa_visible")}
SERVICES_LISTED: ${val("services")}
UPDATES_POSTS_STATUS: ${val("posts_status")}
MOST_RECENT_POST_DATE: ${val("recent_post")}
QA_STATUS: ${val("qa_status")}
ATTRIBUTES_HIGHLIGHTS: ${val("attributes")}
SECOND_LISTING_NEARBY: ${val("second_listing")}
SECOND_LISTING_NAMES: ${val("second_listing_names")}
@@ -439,7 +476,9 @@ RAW_NOTES: ${val("raw_notes")}
function setStatus(msg) {
$("status").textContent = msg;
if (msg) setTimeout(() => { if ($("status").textContent === msg) $("status").textContent = ""; }, 2500);
if (msg) setTimeout(() => {
if ($("status").textContent === msg) $("status").textContent = "";
}, 2500);
}
$("btnGenerate").addEventListener("click", () => {
@@ -463,7 +502,7 @@ RAW_NOTES: ${val("raw_notes")}
$("btnDownload").addEventListener("click", () => {
const text = $("output").value || buildOutput();
$("output").value = text;
const client = ( $("client").value || "client" ).trim().replace(/[^\w\-]+/g, "_") || "client";
const client = ($("client").value || "client").trim().replace(/[^\w\-]+/g, "_") || "client";
const date = $("snapshot_date").value || todayISO();
const blob = new Blob([text], { type: "text/plain;charset=utf-8" });
const a = document.createElement("a");