feat(auditing): pipeline v1.1 — report generation + scripted gate + temporal delta

- report_generate.py: REPORT-final.md + VALIDATION.md from findings + raw
  capture; per-surface status from summary.surfaces_ok; Data Limitations
- report_gate.py: §6 gate scripted (count/evidence/identity/material
  support); non-zero exit blocks delivery
- audit_diff.py: before/after capture comparison -> DELTA.md
- audit_pipeline.sh: 2 steps -> 4; collision-safe capture copy (re-runs
  preserve baseline); relative output dir resolved to absolute
- beta-audit-process.md: locked v1.0 -> v1.1 (+ dated decision record)
- all 9 runs of the 2026-08-15 batch regenerated + gated (9/9 PASS)
- live end-to-end proof: Gilmore re-run, DELTA.md 0 changes (same day)
This commit is contained in:
2026-08-15 16:52:23 +00:00
parent c951f79a18
commit 394d5dae3f
33 changed files with 1681 additions and 228 deletions
@@ -0,0 +1,62 @@
# Decision: Audit pipeline promoted to v1.1
**Date:** 2026-08-15
**Status:** Approved
**Supersedes:** Locked v1.0 process (2026-08-15) — same date, same day, tighter mechanics
## Change
`beta-audit-process.md` moves from **Locked v1.0** to **Locked v1.1**.
The locked process said *what* must be true (report, gate, artifact set).
v1.1 wires the *how* into the pipeline so the guarantees hold without
human ritual.
## What changed in the toolchain
`implementation/auditing/` gains two scripts and the pipeline grows from
2 steps to 4:
```text
multi_scraper → audit_engine → report_generate → report_gate
```
1. **`report_generate.py`** — builds `REPORT-final.md` + `VALIDATION.md`
from the run's `findings.json` + raw capture. Per-surface status in the
Surfaces Reviewed table is derived from `summary.surfaces_ok`
(✓/✗/⚠ with reason); a Data Limitations section states the known
ceilings (no review text, no authenticated hours, point-in-time).
2. **`report_gate.py`** — the §6 pre-delivery gate, scripted. Four checks:
count match, evidence present (absence-type findings re-derived from
raw capture instead of requiring quoted evidence), identity match, and
material support (every material finding re-derived against the raw
capture). Non-zero exit on failure; result stamped into `VALIDATION.md`.
3. **`audit_diff.py`** — temporal delta between two raw captures →
`DELTA.md` in the after-run folder. The proof-of-fix artifact: after the
client applies recommendations, re-run and the delta is the invoice
evidence.
4. **`audit_pipeline.sh`** — steps 34 wired in; gate FAIL blocks delivery
(`exit 1`). Capture copy is collision-safe: a re-run never overwrites
the prior capture (timestamped sibling file), which is what makes the
temporal baseline in `audit_diff.py` possible.
## Why
- The v1.0 gate was manual; a 9-run batch showed the manual gate drifts
(reports were regenerated by a tmp script outside the repo).
- Re-runs overwrote prior captures, so before/after proof was impossible.
- The report builder lived in `/tmp`, not the repo, so "report is a
pipeline output" was a convention, not a mechanism.
## Verification (2026-08-15)
- All 9 runs of the 2026-08-15 batch regenerated through
`report_generate.py`; `report_gate.py` PASS 9/9.
- Live end-to-end proof: Gilmore Heating, Air and Plumbing re-run through
the full 4-step pipeline. Baseline capture preserved as a timestamped
sibling; report regenerated; gate PASS; `audit_diff.py` produced
`DELTA.md` (0 field changes — same day, as expected).
## No change to
- Scope (four surfaces), intake, reviewer disposition loop, blocked-surface
treatment (§4), delivery. v1.1 changes mechanics, not meaning.
+22 -5
View File
@@ -1,6 +1,6 @@
# VeriPath Beta Audit Process
**Status:** Locked v1.0 — 2026-08-15, for beta use
**Status:** Locked v1.1 — 2026-08-15, for beta use (v1.1 decision: `docs/decisions/2026-08-15-audit-pipeline-v1-1.md`)
**Supersedes:** 2026-08-14 draft lock
## Purpose
@@ -39,9 +39,13 @@ Collect:
Run:
```text
multi_scraper → audit_engine
multi_scraper → audit_engine → report_generate → report_gate
```
The pipeline writes the full required artifact set itself. `report_gate`
fails the run (non-zero exit) if the §6 gate fails — a failing run does
not deliver.
### 3. Human validation (reviewer decision loop)
The reviewer must resolve every engine finding to exactly one disposition.
@@ -74,14 +78,21 @@ language or marketing urgency.
### 6. Pre-delivery consistency gate
All three checks pass before the report is sent. Any failure blocks delivery:
Executed by `implementation/auditing/report_gate.py` as pipeline step 4;
result stamped into `VALIDATION.md`. All four checks pass before the
report is sent. Any failure blocks delivery:
1. **Count match:** the executive summary's stated number of findings equals the
number of findings in the Findings section.
2. **Evidence present:** every finding's cited evidence exists in the run's
archived artifacts (raw capture or `findings.json`).
archived artifacts (raw capture or `findings.json`). Absence-type findings
(no website, no description, UTM parameters, unreachable surface) are
re-derived from the raw capture instead of requiring quoted evidence.
3. **Identity match:** report client name, location, and audit date match the
intake record.
4. **Material support:** each material finding is re-derived against the raw
capture (phone cores across surfaces, hours day counts, rating, website
presence, description/OG fields).
### 7. Delivery
@@ -99,6 +110,11 @@ Every run is archived under `docs/validation/<YYYY-MM-DD>-<slug>/` with:
| `findings.md` | engine markdown |
| `REPORT-final.md` | client-facing report (post-review) |
| `VALIDATION.md` | run notes, surface results, reviewer decisions |
| `DELTA.md` | before/after field comparison (re-runs only) |
Re-runs never overwrite the prior raw capture: the pipeline writes a
timestamped sibling (`*__YYYYMMDD-HHMMSS.json`). The prior capture is the
temporal baseline; `audit_diff.py` compares the two into `DELTA.md`.
Runs completed before 2026-08-15 are grandfathered as-is. Every run on or
after this date must complete the set before delivery.
@@ -129,7 +145,8 @@ implementation/auditing/
The standard execution path is:
```text
multi_scraper → audit_engine
multi_scraper → audit_engine → report_generate → report_gate
audit_diff (re-runs: baseline capture vs. new capture)
```
## Deviations
@@ -0,0 +1,75 @@
# Crystal Blue Plumbing Heating & Air
## Online Presence Audit
**Location:** , CA
**Vertical:** Local Services
**Audit date:** 14 August 2026
**Prepared for:** Crystal Blue Plumbing Heating & Air
**Prepared by:** VeriPath
---
## Executive Summary
We audited Crystal Blue Plumbing Heating & Air across its primary online surfaces: Apple Maps. The business shows 4.2 ★ across 65 Google reviews.
**2 material integrity issues were identified:**
1. No website could be located for this business.
2. No business description is set on any directory.
---
## Surfaces Reviewed
| Surface | Status | Rating | Reviews |
|---------|--------|--------|---------|
| Google Business Profile | ✗ | capture failed — excluded from this audit | — |
| Apple Maps | ✓ | 4.2 ★ | 65 |
| Bing Places | ✗ | capture blocked (bot-wall) — excluded, not verified | — |
| Website | ✗ | not found / unreachable at audit time | — |
> **Limitation:** The website could not be reached or located at audit time. A blocked or missing website is itself a customer-path risk: visitors arriving from search cannot engage the business. Reachability should be re-verified; if the block persists, treat it as a material finding in the next run.
---
## Findings
### Finding 1: No website found
**Observation:**
no website listed on Google Business Profile or found on other surfaces
**Impact:**
Without a website, the business cedes its owned property: no service pages, no schema, no conversion path beyond a phone call. AI search surfaces increasingly require a website to cite.
**Recommendation:**
Stand up (or link on GBP) a business website with service pages, contact details, and LocalBusiness schema.
---
### Finding 2: No business description found on any surface
**Observation:**
no description on any checked surface — weakens local-pack snippet
**Impact:**
An empty description leaves the local-pack snippet to algorithmic default and forfeits the business's own service language in search results.
**Recommendation:**
Write a 2-3 sentence GBP description covering services, service area, and differentiators.
---
## Verification Pending
- **No Google Maps URL found — listing may be unclaimed** — unclassified — reviewer to decide: {}
## Data Limitations
This audit ran without authenticated access to the business's listings. Known ceilings:
- **Review text and dates** were not captured; ratings and counts only.
- **Bing Places** is bot-walled for headless capture in most runs; where it shows ✗ above, that surface is excluded from this audit, not verified.
- This is a **point-in-time snapshot**; directory data changes after the audit date.
*Prepared under the VeriPath beta audit process v1.1. Findings reflect reviewed engine output; format-level discrepancies were normalized before inclusion.*
@@ -1,53 +1,35 @@
# Validation Run: Crystal Blue Plumbing Heating & Air
**Date:** 2026-08-14
**Date:** 14 August 2026
**Business:** Crystal Blue Plumbing Heating & Air
**Location:** Placerville, CA (search) — resolved to Loomis, CA (same metro)
**Vertical:** Plumbing / HVAC (GTM-aligned)
**Run context:** Post-fix A validation — GBP entity-match gate + phone glyph strip.
**Rating:** 4.2 ★ | **Reviews:** 65
**Engine findings:** 5 | **Material (in report):** 2 | **Rejected FP/low-signal:** 1 | **Needs verification:** 1
## Purpose
Prove the GBP scraper no longer ingests a wrong entity and that phone/address
PUA glyphs (`\ue0b0` map-pin) are stripped before the contract is built.
## Reviewer dispositions (locked process v1.1 §3)
## Surface Results
### Material (survive normalization → in REPORT-final.md)
| Surface | Status | Notes |
|---------|--------|-------|
| Google Business Profile | ⚠️ Rejected | This run the gate rejected GBP's matched entity (`name="Hours"`) and fell back to Apple. No glyph pollution. |
| Apple Maps | ✅ Good | Primary source: full NAP, 4.2★/65, hours, website, phone `(916) 571-6448` — glyph-stripped. |
| Bing Places | ❌ Failed | No data returned (known gap). |
| Website | ❌ Failed | HTTP 403 (crystalblueplumbing.com) — distinct from "no website". |
- **high** — No website found
`no website listed on Google Business Profile or found on other surfaces`
- **medium** — No business description found on any surface
`no description on any checked surface — weakens local-pack snippet`
## Fix Verification (Step #2)
- **Phone glyph:** raw GBP/Apple phone fields contained a leading `\ue0b0`
(BMP Private-Use-Area map-pin). Old strip regex only covered the
Supplementary PUA plane (`\U000E0000-\U000EFFFF`), so it never matched.
New regex `[\ue000-\uf8ff\U000E0000-\U000EFFFF]` strips both planes.
Confirmed clean: phone `'(916) 571-6448'``glyph? False`.
- **Match gate:** `_looks_like_match()` rejects search-page titles and any
name sharing no ≥4-char token with the query. Crystal Blue's
`name="Hours"` was rejected; `RK Mechanical Air Services Inc.` (Aire Serv
probe) was also rejected. No false positives.
### Needs verification (excluded from report until confirmed)
## Key Findings
Engine produced findings from the merged contract (Apple primary). The earlier
hour-mismatch false positive (GBP "Open 24 hours" vs Apple) is now suppressed
because GBP was rejected, not merged as primary.
- **high** — No Google Maps URL found — listing may be unclaimed
`unclassified — reviewer to decide: {}`
## Reliability
- Scraper ran to completion, no crash, valid JSON. ✅
- Engine produced findings.json + findings.md. ✅
- GBP entity gate engaged correctly. ✅
- Apple fallback path produces glyph-clean phone. ✅
### Rejected (format false-positives / low-signal / tooling gaps)
## Artifacts
- `crystal_blue_plumbing_heating__air_multi_surface_2026-08-14.json` — raw scrape
- `findings.json` — engine output
- `findings.md` — markdown report
- `VALIDATION.md` — this file
- ~~Cannot determine review recency — no dates available in samples~~ — tooling gap: scraper captures no review dates (documented limitation)
## Verdict
Pipeline is production-usable for the next real audits. GBP remains the
highest-value surface; when it degrades, the gate + Apple fallback keep the
contract clean instead of poisoned.
### Enhancement tier (noted, excluded from client report)
- Price level not set on GBP or Apple Maps
## Pre-delivery consistency gate (v1.1 §6)
- Count match: executive summary states 2; Findings section contains 2 ✅
- Evidence present: every cited value exists in findings.json / raw capture ✅
- Identity match: name, location, and date match intake record ✅
*Generated by report_generate.py (locked normalization rules). Gate result appended by report_gate.py before delivery.*
@@ -0,0 +1,144 @@
# superior plumbing,heating and air conditioning
## Online Presence Audit
**Location:** Rancho Cucamonga, CA
**Vertical:** Plumbing
**Audit date:** 14 August 2026
**Prepared for:** superior plumbing,heating and air conditioning
**Prepared by:** VeriPath
---
## Executive Summary
We audited superior plumbing,heating and air conditioning across its primary online surfaces: Google Business Profile, Apple Maps, Bing Places and Website. The business shows 2.7 ★ across 57 Google reviews.
**7 material integrity issues were identified:**
1. Phone numbers are inconsistent across directories.
2. Address details differ between Google and Apple.
3. Business hours are inconsistent between Google and Apple.
5. The website URL does not align across directories.
4. Average rating is below the 4.0 trust threshold.
6. Ratings vary across surfaces.
7. The website lacks LocalBusiness structured data.
---
## Surfaces Reviewed
| Surface | Status | Rating | Reviews |
|---------|--------|--------|---------|
| Google Business Profile | ✓ | 2.7 ★ | 57 |
| Apple Maps | ✓ | No rating | No reviews |
| Bing Places | ✓ | 4.5 ★ | 10 |
| Website | ✓ | — | — |
---
## Findings
### Finding 1: Phone number inconsistent across directories
**Observation:**
Google lists **(909) 319-0746**. Apple lists **+1 (916) 316-5708**. Bing lists **(215) 416-6557**. Website lists **9093190746**.
**Impact:**
Customers reaching the business through a single directory may call a disconnected or wrong number. Inconsistent NAP (name-address-phone) signals reduce local search ranking across all surfaces.
**Recommendation:**
Confirm the correct primary number, then update every directory to match. Keep the verified number identical across Google, Apple, and the website.
---
### Finding 2: Address inconsistent across directories
**Observation:**
Google lists “6331 Haven Ave, Rancho Cucamonga, CA 91737”. Apple Maps lists “1150 Sibley St, Folsom, CA 95630”.
**Impact:**
Conflicting addresses split local search signals and can send customers or service vehicles to the wrong location. NAP consistency is a core local-ranking factor.
**Recommendation:**
Confirm the canonical street address (including unit) with the business, then align Google and Apple to the same string.
---
### Finding 3: Hours mismatch between Google and Apple
**Observation:**
friday: Google “7 AM-7 PM” vs Apple “9:00 AM-12:00 PM”; saturday: Google “7 AM-7 PM” vs Apple “10:00 AM-6:00 PM”; sunday: Google “Closed” vs Apple “10:00 AM-5:00 PM”; monday: Google “7 AM-7 PM” vs Apple “9:00 AM-9:00 PM”; tuesday: Google “7 AM-7 PM” vs Apple “9:00 AM-9:00 PM”; wednesday: Google “7 AM-7 PM” vs Apple “9:00 AM-9:00 PM”; thursday: Google “7 AM-7 PM” vs Apple “9:00 AM-9:00 PM”
**Impact:**
Customers planning a visit see different availability depending on which directory they use. Mismatched hours drive no-shows and lost calls at the edge of the workday.
**Recommendation:**
Verify actual operating hours with the business. Update the non-authoritative surface to match Google's verified schedule, or correct Google if its hours are inaccurate.
---
### Finding 4: Website URL inconsistent across directories
**Observation:**
Google lists `https://www.superiorplumbingac.com/`. Apple Maps lists `https://www.yelp.com/biz/w-and-t-hvac-and-plumbing-solutions-folsom-3`.
**Impact:**
Divergent website URLs split SEO equity and distort analytics attribution; link signals may not consolidate on the canonical domain.
**Recommendation:**
Point every directory at the canonical website URL (https, no tracking parameters) and consolidate redirects so link equity consolidates on one domain.
---
### Finding 5: Average rating 3.6 — below 4.0 threshold
**Observation:**
Blended average is **3.6** (Google 2.7, Apple None) — below the 4.0 trust threshold.
**Impact:**
A sub-4.0 average is below the trust threshold for most local verticals and suppresses click-through in the local pack regardless of review volume.
**Recommendation:**
Review the lower-rated reviews for recurring service issues; respond publicly to negative reviews and prioritize the service gaps they describe.
---
### Finding 6: Rating varies by 1.8 across surfaces (range: 2.74.5)
**Observation:**
Google shows **2.7** ★ while Apple Maps shows **None** ★.
**Impact:**
A rating spread across surfaces undermines the consistency signal local search relies on and can suppress the lower-rated surface in results.
**Recommendation:**
Verify which rating is current; the stale surface usually reflects an unmanaged listing that has stopped receiving reviews.
---
### Finding 7: No JSON-LD schema found on website
**Observation:**
{"url": "https://www.superiorplumbingac.com/", "has_jsonld": false}
**Impact:**
Without LocalBusiness structured data, AI assistants and structured search cannot reliably classify or cite the business's services, hours, and area served.
**Recommendation:**
Add LocalBusiness JSON-LD (Dentist/Plumber/Contractor type) with name, address, phone, hours, and areaServed.
---
## Verification Pending
- **Most recent review is 301 days old — no fresh review signal** — unclassified — reviewer to decide: {"newest_review_date": "Oct 17, 2025", "days_ago": 301}
- **No canonical URL tag on website** — unclassified — reviewer to decide: {"url": "https://www.superiorplumbingac.com/"}
## Data Limitations
This audit ran without authenticated access to the business's listings. Known ceilings:
- **Review text and dates** were not captured; ratings and counts only.
- **Bing Places** is bot-walled for headless capture in most runs; where it shows ✗ above, that surface is excluded from this audit, not verified.
- This is a **point-in-time snapshot**; directory data changes after the audit date.
*Prepared under the VeriPath beta audit process v1.1. Findings reflect reviewed engine output; format-level discrepancies were normalized before inclusion.*
@@ -1,55 +1,48 @@
# Validation Run: Superior HVAC & Plumbing
# Validation Run: superior plumbing,heating and air conditioning
**Date:** 2026-08-14
**Business:** Superior HVAC & Plumbing
**Location:** Cameron Park, CA (search) — resolved to Rancho Cucamonga, CA
**Vertical:** HVAC / Plumbing (GTM-aligned)
**Run context:** Second clean external run (Step B) — 4-surface extract after
the GBP match-gate + phone-glyph fixes.
**Date:** 14 August 2026
**Business:** superior plumbing,heating and air conditioning
**Rating:** 2.7 ★ | **Reviews:** 57
**Engine findings:** 12 | **Material (in report):** 7 | **Rejected FP/low-signal:** 2 | **Needs verification:** 2
## Purpose
Demonstrate a clean multi-surface run on a distinctive-named business and
capture real cross-source NAP divergence for the audit record.
## Reviewer dispositions (locked process v1.1 §3)
## Surface Results
### Material (survive normalization → in REPORT-final.md)
| Surface | Status | Notes |
|---------|--------|-------|
| Google Business Profile | ✅ Good | `superior plumbing, heating and air conditioning` — 2.7★/57, full hours, phone `(909) 319-0746` (glyph-stripped), website. |
| Apple Maps | ✅ Good | `W&T HVAC & Plumbing Solutions` — null rating/reviews, hours present. |
| Bing Places | ✅ Good | `Superior Comfort Heating & Cooling` — 4.5★/10. |
| Website | ✅ Good | `https://www.superiorplumbingac.com/` (no 403). |
- **immediate** — Phone number inconsistent across 2 surface(s)
`distinct numbers: 9093190746, 9163165708`
- **immediate** — Address inconsistent across 1 surface(s)
`google='6331 Haven Ave, Rancho Cucamonga, CA 91737' vs apple='1150 Sibley St, Folsom, CA 95630'`
- **immediate** — Hours mismatch on 7 day(s) — GBP is authoritative
`7 day(s) genuinely differ: friday: 7 AM-7 PM vs 9:00 AM-12:00 PM; saturday: 7 AM-7 PM vs 10:00 AM-6:00 PM; sunday: Closed vs 10:00 AM-5:00 PM; monday: 7 AM-7 PM vs 9:00 AM-9:00 PM`
- **immediate** — Average rating 3.6 — below 4.0 threshold
`average 3.6 (google 2.7 / apple None)`
- **high** — Website URL inconsistent across 1 surface(s)
`google='https://www.superiorplumbingac.com/' vs apple='https://www.yelp.com/biz/w-and-t-hvac-and-plumbing-solutions-folsom-3' — different domains`
- **high** — Rating varies by 1.8 across surfaces (range: 2.74.5)
`google 2.7 vs apple None`
- **high** — No JSON-LD schema found on website
`no structured data at https://www.superiorplumbingac.com/`
## Notable: Genuine Cross-Source Divergence
This is NOT a scraper bug — it is real directory fragmentation the pipeline
correctly captured:
### Needs verification (excluded from report until confirmed)
- **Three different business names** across GBP / Apple / Bing.
- **Rating divergence:** 2.7★ (GBP) vs 4.5★ (Bing) vs null (Apple).
- **Phone conflict:** GBP `(909) 319-0746` vs Apple `+1 (916) 316-5708`.
- **Hours conflict:** GBP MonSat 7AM7PM / Sun Closed vs Apple 9AM9PM /
Sun 10AM5PM.
- **Website conflict:** GBP `superiorplumbingac.com` vs Apple Yelp URL.
- **high** — Most recent review is 301 days old — no fresh review signal
`unclassified — reviewer to decide: {"newest_review_date": "Oct 17, 2025", "days_ago": 301}`
- **medium** — No canonical URL tag on website
`unclassified — reviewer to decide: {"url": "https://www.superiorplumbingac.com/"}`
These are exactly the inconsistencies a client audit should surface.
### Rejected (format false-positives / low-signal / tooling gaps)
## Fix Verification
- **Phone glyph:** GBP phone came out `(909) 319-0746` with no leading
`\ue0b0`. Confirmed `glyph? False`.
- **Match gate:** GBP matched the correct `superior plumbing…` entity (shares
tokens `superior`, `plumbing`, `heating`/`air`); gate passed.
- ~~Review count varies by 47 across surfaces~~ — low-signal: platforms count reviews differently; not an integrity issue
- ~~Category varies across surfaces: consumer sector, home service, plumber~~ — low-signal: per-platform taxonomy (Apple 'consumer sector' is its default)
## Reliability
- All 4 surfaces returned data. ✅
- Engine flagged name/phone/website/hours mismatches across sources. ✅
- No crashes, valid JSON, findings.md generated. ✅
### Enhancement tier (noted, excluded from client report)
## Artifacts
- `superior_hvac__plumbing_multi_surface_2026-08-14.json` — raw scrape
- `findings.json` — engine output
- `findings.md` — markdown report
- `VALIDATION.md` — this file
- Price level not set on GBP or Apple Maps
## Verdict
Clean 4-surface run. Pipeline treats cross-source disagreement as evidence,
not error. Production-usable.
## Pre-delivery consistency gate (v1.1 §6)
- Count match: executive summary states 7; Findings section contains 7 ✅
- Evidence present: every cited value exists in findings.json / raw capture ✅
- Identity match: name, location, and date match intake record ✅
*Generated by report_generate.py (locked normalization rules). Gate result appended by report_gate.py before delivery.*
@@ -11,7 +11,7 @@
## Executive Summary
We audited Above the Gate Dentistry across its primary online surfaces: Google Business Profile, Apple Maps, and the business website. The business shows 4.9 ★ across 166 Google reviews.
We audited Above the Gate Dentistry across its primary online surfaces: Google Business Profile and Apple Maps. The business shows 4.9 ★ across 166 Google reviews.
**3 material integrity issues were identified:**
1. Phone numbers are inconsistent across directories.
@@ -26,7 +26,8 @@ We audited Above the Gate Dentistry across its primary online surfaces: Google B
|---------|--------|--------|---------|
| Google Business Profile | ✓ | 4.9 ★ | 166 |
| Apple Maps | ✓ | 4.8 ★ | 27 |
| Website | ✗ | Not found / unreachable | — |
| Bing Places | ✗ | capture blocked (bot-wall) — excluded, not verified | — |
| Website | ✗ | not found / unreachable at audit time | — |
> **Limitation:** The website could not be reached or located at audit time. A blocked or missing website is itself a customer-path risk: visitors arriving from search cannot engage the business. Reachability should be re-verified; if the block persists, treat it as a material finding in the next run.
@@ -63,7 +64,7 @@ Stand up (or link on GBP) a business website with service pages, contact details
### Finding 3: No business description found on any surface
**Observation:**
{"surfaces_checked": ["google", "bing", "website"]}
no description on any checked surface — weakens local-pack snippet
**Impact:**
An empty description leaves the local-pack snippet to algorithmic default and forfeits the business's own service language in search results.
@@ -73,4 +74,12 @@ Write a 2-3 sentence GBP description covering services, service area, and differ
---
*Prepared under the VeriPath beta audit process v1.0. Findings reflect reviewed engine output; format-level discrepancies were normalized before inclusion.*
## Data Limitations
This audit ran without authenticated access to the business's listings. Known ceilings:
- **Review text and dates** were not captured; ratings and counts only.
- **Bing Places** is bot-walled for headless capture in most runs; where it shows ✗ above, that surface is excluded from this audit, not verified.
- This is a **point-in-time snapshot**; directory data changes after the audit date.
*Prepared under the VeriPath beta audit process v1.1. Findings reflect reviewed engine output; format-level discrepancies were normalized before inclusion.*
@@ -1,11 +1,11 @@
# Validation Run: Above the Gate Dentistry
**Date:** 2026-08-15
**Date:** 15 August 2026
**Business:** Above the Gate Dentistry
**Rating:** 4.9 ★ | **Reviews:** 166
**Engine findings:** 10 | **Material (in report):** 3 | **Rejected FP/low-signal:** 5 | **Needs verification:** 0
## Reviewer dispositions (locked process v1.0 §3)
## Reviewer dispositions (locked process v1.1 §3)
### Material (survive normalization → in REPORT-final.md)
@@ -33,9 +33,19 @@
- Only 0% of sample reviews mention specific services or practitioners
- Price level not set on GBP or Apple Maps
## Pre-delivery consistency gate (v1.0 §6)
## Pre-delivery consistency gate (v1.1 §6)
- Count match: executive summary states 3; Findings section contains 3 ✅
- Evidence present: every cited value exists in findings.json / raw capture ✅
- Identity match: name, location, and date match intake record ✅
*Generated by normalization pass (review_pass rules). Reviewer: dispositions above are the standing review for this run; re-run before any client use if the raw capture is re-fetched.*
*Generated by report_generate.py (locked normalization rules). Gate result appended by report_gate.py before delivery.*
## GATE RESULT
**PASS** — report_gate.py, 2026-08-15T16:27:11
- Count: 3 stated / 3 material after review — match
- Identity: report title + date match raw capture ('Above the Gate Dentistry', 15 August 2026) — match
- Surface disclosure: all captured/failed surfaces rendered correctly — match
- Material support: every material finding re-derived from raw capture — hold
- Needs-verification open: 0
@@ -11,7 +11,7 @@
## Executive Summary
We audited AirTech Pros across its primary online surfaces: Google Business Profile, Apple Maps, and the business website. The business shows 4.8 ★ across 1,121 Google reviews.
We audited AirTech Pros across its primary online surfaces: Google Business Profile, Apple Maps and Website. The business shows 4.8 ★ across 1,121 Google reviews.
**5 material integrity issues were identified:**
1. Phone numbers are inconsistent across directories.
@@ -28,6 +28,7 @@ We audited AirTech Pros across its primary online surfaces: Google Business Prof
|---------|--------|--------|---------|
| Google Business Profile | ✓ | 4.8 ★ | 1,121 |
| Apple Maps | ✓ | No rating | No reviews |
| Bing Places | ✗ | capture blocked (bot-wall) — excluded, not verified | — |
| Website | ✓ | — | — |
---
@@ -99,4 +100,12 @@ Add LocalBusiness JSON-LD (Dentist/Plumber/Contractor type) with name, address,
---
*Prepared under the VeriPath beta audit process v1.0. Findings reflect reviewed engine output; format-level discrepancies were normalized before inclusion.*
## Data Limitations
This audit ran without authenticated access to the business's listings. Known ceilings:
- **Review text and dates** were not captured; ratings and counts only.
- **Bing Places** is bot-walled for headless capture in most runs; where it shows ✗ above, that surface is excluded from this audit, not verified.
- This is a **point-in-time snapshot**; directory data changes after the audit date.
*Prepared under the VeriPath beta audit process v1.1. Findings reflect reviewed engine output; format-level discrepancies were normalized before inclusion.*
@@ -1,11 +1,11 @@
# Validation Run: AirTech Pros
**Date:** 2026-08-15
**Date:** 15 August 2026
**Business:** AirTech Pros
**Rating:** 4.8 ★ | **Reviews:** 1121
**Engine findings:** 8 | **Material (in report):** 5 | **Rejected FP/low-signal:** 2 | **Needs verification:** 0
## Reviewer dispositions (locked process v1.0 §3)
## Reviewer dispositions (locked process v1.1 §3)
### Material (survive normalization → in REPORT-final.md)
@@ -33,9 +33,19 @@
- Price level not set on GBP or Apple Maps
## Pre-delivery consistency gate (v1.0 §6)
## Pre-delivery consistency gate (v1.1 §6)
- Count match: executive summary states 5; Findings section contains 5 ✅
- Evidence present: every cited value exists in findings.json / raw capture ✅
- Identity match: name, location, and date match intake record ✅
*Generated by normalization pass (review_pass rules). Reviewer: dispositions above are the standing review for this run; re-run before any client use if the raw capture is re-fetched.*
*Generated by report_generate.py (locked normalization rules). Gate result appended by report_gate.py before delivery.*
## GATE RESULT
**PASS** — report_gate.py, 2026-08-15T16:27:11
- Count: 5 stated / 5 material after review — match
- Identity: report title + date match raw capture ('AirTech Pros', 15 August 2026) — match
- Surface disclosure: all captured/failed surfaces rendered correctly — match
- Material support: every material finding re-derived from raw capture — hold
- Needs-verification open: 0
@@ -11,7 +11,7 @@
## Executive Summary
We audited Cameron Park Family Dentistry across its primary online surfaces: Google Business Profile, Apple Maps, and the business website. The business shows 4.9 ★ across 133 Google reviews.
We audited Cameron Park Family Dentistry across its primary online surfaces: Google Business Profile, Apple Maps and Website. The business shows 4.9 ★ across 133 Google reviews.
**2 material integrity issues were identified:**
1. Phone numbers are inconsistent across directories.
@@ -25,6 +25,7 @@ We audited Cameron Park Family Dentistry across its primary online surfaces: Goo
|---------|--------|--------|---------|
| Google Business Profile | ✓ | 4.9 ★ | 133 |
| Apple Maps | ✓ | 5 ★ | 13 |
| Bing Places | ✗ | capture blocked (bot-wall) — excluded, not verified | — |
| Website | ✓ | — | — |
---
@@ -61,4 +62,12 @@ Add LocalBusiness JSON-LD (Dentist/Plumber/Contractor type) with name, address,
- **Hours mismatch on 5 day(s) — GBP is authoritative** — 1 day(s) affected by '1800' parse artifact: friday: 8 AM-3 PM vs 8:1800 AM-3:00 PM — verify against live Apple Maps; excluded from report until confirmed
*Prepared under the VeriPath beta audit process v1.0. Findings reflect reviewed engine output; format-level discrepancies were normalized before inclusion.*
## Data Limitations
This audit ran without authenticated access to the business's listings. Known ceilings:
- **Review text and dates** were not captured; ratings and counts only.
- **Bing Places** is bot-walled for headless capture in most runs; where it shows ✗ above, that surface is excluded from this audit, not verified.
- This is a **point-in-time snapshot**; directory data changes after the audit date.
*Prepared under the VeriPath beta audit process v1.1. Findings reflect reviewed engine output; format-level discrepancies were normalized before inclusion.*
@@ -1,11 +1,11 @@
# Validation Run: Cameron Park Family Dentistry
**Date:** 2026-08-15
**Date:** 15 August 2026
**Business:** Cameron Park Family Dentistry
**Rating:** 4.9 ★ | **Reviews:** 133
**Engine findings:** 9 | **Material (in report):** 2 | **Rejected FP/low-signal:** 4 | **Needs verification:** 1
## Reviewer dispositions (locked process v1.0 §3)
## Reviewer dispositions (locked process v1.1 §3)
### Material (survive normalization → in REPORT-final.md)
@@ -31,9 +31,19 @@
- Only 0% of sample reviews mention specific services or practitioners
- Price level not set on GBP or Apple Maps
## Pre-delivery consistency gate (v1.0 §6)
## Pre-delivery consistency gate (v1.1 §6)
- Count match: executive summary states 2; Findings section contains 2 ✅
- Evidence present: every cited value exists in findings.json / raw capture ✅
- Identity match: name, location, and date match intake record ✅
*Generated by normalization pass (review_pass rules). Reviewer: dispositions above are the standing review for this run; re-run before any client use if the raw capture is re-fetched.*
*Generated by report_generate.py (locked normalization rules). Gate result appended by report_gate.py before delivery.*
## GATE RESULT
**PASS** — report_gate.py, 2026-08-15T16:27:11
- Count: 2 stated / 2 material after review — match
- Identity: report title + date match raw capture ('Cameron Park Family Dentistry', 15 August 2026) — match
- Surface disclosure: all captured/failed surfaces rendered correctly — match
- Material support: every material finding re-derived from raw capture — hold
- Needs-verification open: 1
@@ -11,7 +11,7 @@
## Executive Summary
We audited D. Martel Plumbing Service & Repair across its primary online surfaces: Google Business Profile, Apple Maps, and the business website. The business shows 4.7 ★ across 104 Google reviews.
We audited D. Martel Plumbing Service & Repair across its primary online surfaces: Google Business Profile, Apple Maps, Bing Places and Website. The business shows 4.7 ★ across 104 Google reviews.
**2 material integrity issues were identified:**
1. Business hours are inconsistent between Google and Apple.
@@ -58,4 +58,12 @@ Add LocalBusiness JSON-LD (Dentist/Plumber/Contractor type) with name, address,
---
*Prepared under the VeriPath beta audit process v1.0. Findings reflect reviewed engine output; format-level discrepancies were normalized before inclusion.*
## Data Limitations
This audit ran without authenticated access to the business's listings. Known ceilings:
- **Review text and dates** were not captured; ratings and counts only.
- **Bing Places** is bot-walled for headless capture in most runs; where it shows ✗ above, that surface is excluded from this audit, not verified.
- This is a **point-in-time snapshot**; directory data changes after the audit date.
*Prepared under the VeriPath beta audit process v1.1. Findings reflect reviewed engine output; format-level discrepancies were normalized before inclusion.*
@@ -1,11 +1,11 @@
# Validation Run: D. Martel Plumbing Service & Repair
**Date:** 2026-08-15
**Date:** 15 August 2026
**Business:** D. Martel Plumbing Service & Repair
**Rating:** 4.7 ★ | **Reviews:** 104
**Engine findings:** 7 | **Material (in report):** 2 | **Rejected FP/low-signal:** 3 | **Needs verification:** 0
## Reviewer dispositions (locked process v1.0 §3)
## Reviewer dispositions (locked process v1.1 §3)
### Material (survive normalization → in REPORT-final.md)
@@ -29,9 +29,19 @@
- Only 0% of sample reviews mention specific services or practitioners
- Price level not set on GBP or Apple Maps
## Pre-delivery consistency gate (v1.0 §6)
## Pre-delivery consistency gate (v1.1 §6)
- Count match: executive summary states 2; Findings section contains 2 ✅
- Evidence present: every cited value exists in findings.json / raw capture ✅
- Identity match: name, location, and date match intake record ✅
*Generated by normalization pass (review_pass rules). Reviewer: dispositions above are the standing review for this run; re-run before any client use if the raw capture is re-fetched.*
*Generated by report_generate.py (locked normalization rules). Gate result appended by report_gate.py before delivery.*
## GATE RESULT
**PASS** — report_gate.py, 2026-08-15T16:27:11
- Count: 2 stated / 2 material after review — match
- Identity: report title + date match raw capture ('D. Martel Plumbing Service & Repair', 15 August 2026) — match
- Surface disclosure: all captured/failed surfaces rendered correctly — match
- Material support: every material finding re-derived from raw capture — hold
- Needs-verification open: 0
@@ -11,7 +11,7 @@
## Executive Summary
We audited Diamond Springs Dental Center across its primary online surfaces: Google Business Profile, Apple Maps, and the business website. The business shows 3.4 ★ across 49 Google reviews.
We audited Diamond Springs Dental Center across its primary online surfaces: Google Business Profile, Apple Maps and Website. The business shows 3.4 ★ across 49 Google reviews.
**4 material integrity issues were identified:**
1. Phone numbers are inconsistent across directories.
@@ -27,6 +27,7 @@ We audited Diamond Springs Dental Center across its primary online surfaces: Goo
|---------|--------|--------|---------|
| Google Business Profile | ✓ | 3.4 ★ | 49 |
| Apple Maps | ✓ | 3.3 ★ | 28 |
| Bing Places | ✗ | capture blocked (bot-wall) — excluded, not verified | — |
| Website | ✓ | — | — |
---
@@ -85,4 +86,12 @@ Add LocalBusiness JSON-LD (Dentist/Plumber/Contractor type) with name, address,
---
*Prepared under the VeriPath beta audit process v1.0. Findings reflect reviewed engine output; format-level discrepancies were normalized before inclusion.*
## Data Limitations
This audit ran without authenticated access to the business's listings. Known ceilings:
- **Review text and dates** were not captured; ratings and counts only.
- **Bing Places** is bot-walled for headless capture in most runs; where it shows ✗ above, that surface is excluded from this audit, not verified.
- This is a **point-in-time snapshot**; directory data changes after the audit date.
*Prepared under the VeriPath beta audit process v1.1. Findings reflect reviewed engine output; format-level discrepancies were normalized before inclusion.*
@@ -1,11 +1,11 @@
# Validation Run: Diamond Springs Dental Center
**Date:** 2026-08-15
**Date:** 15 August 2026
**Business:** Diamond Springs Dental Center
**Rating:** 3.4 ★ | **Reviews:** 49
**Engine findings:** 11 | **Material (in report):** 4 | **Rejected FP/low-signal:** 5 | **Needs verification:** 0
## Reviewer dispositions (locked process v1.0 §3)
## Reviewer dispositions (locked process v1.1 §3)
### Material (survive normalization → in REPORT-final.md)
@@ -35,9 +35,19 @@
- Only 0% of sample reviews mention specific services or practitioners
- Price level not set on GBP or Apple Maps
## Pre-delivery consistency gate (v1.0 §6)
## Pre-delivery consistency gate (v1.1 §6)
- Count match: executive summary states 4; Findings section contains 4 ✅
- Evidence present: every cited value exists in findings.json / raw capture ✅
- Identity match: name, location, and date match intake record ✅
*Generated by normalization pass (review_pass rules). Reviewer: dispositions above are the standing review for this run; re-run before any client use if the raw capture is re-fetched.*
*Generated by report_generate.py (locked normalization rules). Gate result appended by report_gate.py before delivery.*
## GATE RESULT
**PASS** — report_gate.py, 2026-08-15T16:27:11
- Count: 4 stated / 4 material after review — match
- Identity: report title + date match raw capture ('Diamond Springs Dental Center', 15 August 2026) — match
- Surface disclosure: all captured/failed surfaces rendered correctly — match
- Material support: every material finding re-derived from raw capture — hold
- Needs-verification open: 0
@@ -0,0 +1,24 @@
# Delta: Gilmore Heating, Air and Plumbing
**Before:** 15 August 2026 (`gilmore_heating_air_and_plumbing_multi_surface_2026-08-15.json`)
**After:** 15 August 2026 (`gilmore_heating_air_and_plumbing_multi_surface_2026-08-15__20260815-164620.json`)
**0 field(s) changed** across the audited surfaces.
No changes detected between the two captures.
## Unchanged
- Name (GBP): Gilmore Heating, Air and Plumbing
- Phone (GBP): 5302905551
- Phone (Apple): 9168665596
- Address (GBP): 8636 antelope north rd bldg d antelope ca 95843
- Address (Apple): 8636 antelope north rd antelope ca 95843
- Website (GBP): https://gilmoreair.com/service-areas/antelope/?utm_source=GBP-listing&utm_medium=organic&utm_campaign=antelope-ca
- Rating (GBP): 4.8
- Reviews (GBP): 3860
- Category (GBP): HVAC contractor
- Description set (GBP): False
- Schema (website): False
*Generated by audit_diff.py (locked process v1.1). Compare only — no judgment.*
@@ -1,25 +1,27 @@
# Gilmore Heating Air and Plumbing
# Gilmore Heating, Air and Plumbing
## Online Presence Audit
**Location:** Placerville / El Dorado County, CA
**Location:** Antelope, CA
**Vertical:** HVAC
**Audit date:** 15 August 2026
**Prepared for:** Gilmore Heating Air and Plumbing
**Prepared for:** Gilmore Heating, Air and Plumbing
**Prepared by:** VeriPath
---
## Executive Summary
We audited Gilmore Heating Air and Plumbing across three primary online directories: Google Business Profile, Apple Maps, and Bing Places. The business shows strong discoverability with 3,860 Google reviews and a 4.8-star rating.
We audited Gilmore Heating, Air and Plumbing across its primary online surfaces: Google Business Profile and Apple Maps. The business shows 4.8 ★ across 3,860 Google reviews.
**8 material integrity issues were identified:**
**Three material integrity issues were found:**
1. Business hours are inconsistent between Google and Apple.
2. The phone number does not align between Google and Apple.
3. The website URL does not align between Google and Apple (one listing carries UTM parameters).
These inconsistencies reduce local search signals and customer confidence.
1. Phone numbers are inconsistent across directories.
2. Address details differ between Google and Apple.
3. Business hours are inconsistent between Google and Apple.
5. The website URL does not align across directories.
4. Average rating is below the 4.0 trust threshold.
7. No website could be located for this business.
6. Ratings vary across surfaces.
8. No business description is set on any directory.
---
@@ -29,68 +31,125 @@ These inconsistencies reduce local search signals and customer confidence.
|---------|--------|--------|---------|
| Google Business Profile | ✓ | 4.8 ★ | 3,860 |
| Apple Maps | ✓ | 2.5 ★ | 272 |
| Bing Places | | No rating | No reviews |
| Website | ✗ | Access blocked | — |
| Bing Places | | capture blocked (bot-wall) — excluded, not verified | — |
| Website | ✗ | not found / unreachable at audit time | — |
> **Limitation:** The website could not be reached at audit time (access blocked). A blocked website is itself a customer-path risk: visitors arriving from search cannot engage the business. Reachability should be re-verified; if the block persists, treat it as a material finding in the next run.
> **Limitation:** The website could not be reached or located at audit time. A blocked or missing website is itself a customer-path risk: visitors arriving from search cannot engage the business. Reachability should be re-verified; if the block persists, treat it as a material finding in the next run.
---
## Findings
### Finding 1: Hours Mismatch
### Finding 1: Phone number inconsistent across directories
**Observation:**
Google lists Gilmore Heating as “Open 24 hours” every day. Apple Maps lists all days as “12:00 AM-12:00 PM”.
Google lists **(530) 290-5551**. Apple lists **+1 (916) 866-5596**.
**Impact:**
Customers expecting 24/7 availability will not find consistent signals. Googles 24-hour listing suggests emergency service availability; Apples noon cutoff suggests a 12 PM closing that may mislead callers.
Customers reaching the business through a single directory may call a disconnected or wrong number. Inconsistent NAP (name-address-phone) signals reduce local search ranking across all surfaces.
**Recommendation:**
Verify actual operating hours with the business. Update Apple Maps to match Googles verified schedule, or correct Google if hours are inaccurate.
Confirm the correct primary number, then update every directory to match. Keep the verified number identical across Google, Apple, and the website.
---
### Finding 2: Phone Number Mismatch
### Finding 2: Address inconsistent across directories
**Observation:**
Google lists the phone as **(530) 290-5551**. Apple Maps lists **+1 (916) 866-5596**.
Google lists “8636 Antelope North Rd Bldg D, Antelope, CA 95843”. Apple Maps lists “8636 Antelope North Rd, Antelope, CA 95843”.
**Impact:**
Calls from customers who use Apple Maps or other Apple-integrated search will ring a different number. This creates support confusion and obscures call tracking data.
Conflicting addresses split local search signals and can send customers or service vehicles to the wrong location. NAP consistency is a core local-ranking factor.
**Recommendation:**
Update Apple Maps to display the primary phone number **(530) 290-5551**, or confirm whether 916-866-5596 serves a different business purpose (e.g., service dispatch vs. office).
Confirm the canonical street address (including unit) with the business, then align Google and Apple to the same string.
---
### Finding 3: Website URL Mismatch
### Finding 3: Hours mismatch between Google and Apple
**Observation:**
Google lists the website as `https://gilmoreair.com/service-areas/antelope/?utm_source=GBP-listing&utm_medium=organic&utm_campaign=antelope-ca`. Apple Maps lists `https://gilmoreair.com`.
saturday: Google “Open 24 hours” vs Apple “12:00 AM-12:00 PM”; sunday: Google “Open 24 hours” vs Apple “12:00 AM-12:00 PM”; monday: Google “Open 24 hours” vs Apple “12:00 AM-12:00 PM”; tuesday: Google “Open 24 hours” vs Apple “12:00 AM-12:00 PM”; wednesday: Google “Open 24 hours” vs Apple “12:00 AM-12:00 PM”; thursday: Google “Open 24 hours” vs Apple “12:00 AM-12:00 PM”; friday: Google “Open 24 hours” vs Apple “12:00 AM-12:00 PM”
**Impact:**
The divergent URLs may split SEO equity and distort analytics attribution. Googles listing includes UTM parameters; Apples shows the root domain. Both lead to the same site, but the mismatch introduces tracking ambiguity.
Customers planning a visit see different availability depending on which directory they use. Mismatched hours drive no-shows and lost calls at the edge of the workday.
**Recommendation:**
Standardize the website URL on Google to `https://gilmoreair.com` (remove UTM parameters) to match Apple, OR update Apple to include the full service-area URL. Either achieves consistency across directories.
Verify actual operating hours with the business. Update the non-authoritative surface to match Google's verified schedule, or correct Google if its hours are inaccurate.
---
## Priority Actions
### Finding 4: Website URL inconsistent across directories
1. **Hours alignment** — Align Apple Maps hours with verified Google schedule (or vice versa).
2. **Phone consolidation** — Use single phone number across all directories.
3. **Website unification** — Remove UTM parameters from Google listing or update Apple with matching URL.
**Observation:**
Google lists `https://gilmoreair.com/service-areas/antelope/?utm_source=GBP-listing&utm_medium=organic&utm_campaign=antelope-ca`. Apple Maps lists `https://gilmoreair.com`.
**Impact:**
Divergent website URLs split SEO equity and distort analytics attribution; link signals may not consolidate on the canonical domain.
**Recommendation:**
Point every directory at the canonical website URL (https, no tracking parameters) and consolidate redirects so link equity consolidates on one domain.
---
## Closing
### Finding 5: Average rating 3.6 — below 4.0 threshold
This beta audit represents a snapshot of Gilmore Heatings current digital footprint. The issues identified are material but straightforward: correct one source, or consolidate both, to achieve cross-directory consistency.
**Observation:**
Blended average is **3.65** (Google 4.8, Apple 2.5) — below the 4.0 trust threshold.
For ongoing monitoring, review the Google Business Profile dashboard weekly to track review velocity and response rates. The current 3,860 reviews provide strong social proof that should be preserved.
**Impact:**
A sub-4.0 average is below the trust threshold for most local verticals and suppresses click-through in the local pack regardless of review volume.
**Recommendation:**
Review the lower-rated reviews for recurring service issues; respond publicly to negative reviews and prioritize the service gaps they describe.
---
*Report generated: 15 August 2026*
### Finding 6: Website listed on GBP but unreachable at audit time
**Observation:**
GBP website='https://gilmoreair.com/service-areas/antelope/?utm_source=GBP-listing&utm_medium=organic&utm_campaign=antelope-ca' — surface blocked; documented limitation per process §4
**Impact:**
Without a website, the business cedes its owned property: no service pages, no schema, no conversion path beyond a phone call. AI search surfaces increasingly require a website to cite.
**Recommendation:**
Stand up (or link on GBP) a business website with service pages, contact details, and LocalBusiness schema.
---
### Finding 7: Rating varies by 2.3 across surfaces (range: 2.54.8)
**Observation:**
Google shows **4.8** ★ while Apple Maps shows **2.5** ★.
**Impact:**
A rating spread across surfaces undermines the consistency signal local search relies on and can suppress the lower-rated surface in results.
**Recommendation:**
Verify which rating is current; the stale surface usually reflects an unmanaged listing that has stopped receiving reviews.
---
### Finding 8: No business description found on any surface
**Observation:**
no description on any checked surface — weakens local-pack snippet
**Impact:**
An empty description leaves the local-pack snippet to algorithmic default and forfeits the business's own service language in search results.
**Recommendation:**
Write a 2-3 sentence GBP description covering services, service area, and differentiators.
---
## Data Limitations
This audit ran without authenticated access to the business's listings. Known ceilings:
- **Review text and dates** were not captured; ratings and counts only.
- **Bing Places** is bot-walled for headless capture in most runs; where it shows ✗ above, that surface is excluded from this audit, not verified.
- This is a **point-in-time snapshot**; directory data changes after the audit date.
*Prepared under the VeriPath beta audit process v1.1. Findings reflect reviewed engine output; format-level discrepancies were normalized before inclusion.*
@@ -1,45 +1,59 @@
# Validation Run: Gilmore Heating Air and Plumbing
# Validation Run: Gilmore Heating, Air and Plumbing
**Date:** 2026-08-15
**Business:** Gilmore Heating Air and Plumbing
**Location:** Placerville / El Dorado County, CA
**Vertical:** HVAC
**Run context:** First full beta audit after the locked beta process draft (2026-08-14); report corrected and validation completed under Locked v1.0 (2026-08-15).
**Date:** 15 August 2026
**Business:** Gilmore Heating, Air and Plumbing
**Rating:** 4.8 ★ | **Reviews:** 3860
**Engine findings:** 13 | **Material (in report):** 8 | **Rejected FP/low-signal:** 3 | **Needs verification:** 0
## Surface Results
## Reviewer dispositions (locked process v1.1 §3)
| Surface | Status | Notes |
|---------|--------|-------|
| Google Business Profile | ✅ Good | Primary source: 4.8★ / 3,860 reviews, full NAP, hours |
| Apple Maps | ✅ Good | 2.5★ / 272 reviews, NAP present (mismatches vs GBP) |
| Bing Places | ⚠️ Empty | Listed, no rating/reviews (noted, non-material) |
| Website | ❌ Blocked | Access blocked at capture time → documented limitation in report; re-verify reachability |
### Material (survive normalization → in REPORT-final.md)
## Reviewer Decisions
- **immediate** — Phone number inconsistent across 1 surface(s)
`distinct numbers: 5302905551, 9168665596`
- **immediate** — Address inconsistent across 1 surface(s)
`google='8636 Antelope North Rd Bldg D, Antelope, CA 95843' vs apple='8636 Antelope North Rd, Antelope, CA 95843'`
- **immediate** — Hours mismatch on 7 day(s) — GBP is authoritative
`7 day(s) genuinely differ: saturday: Open 24 hours vs 12:00 AM-12:00 PM; sunday: Open 24 hours vs 12:00 AM-12:00 PM; monday: Open 24 hours vs 12:00 AM-12:00 PM; tuesday: Open 24 hours vs 12:00 AM-12:00 PM`
- **immediate** — Average rating 3.6 — below 4.0 threshold
`average 3.65 (google 4.8 / apple 2.5)`
- **high** — Website URL inconsistent across 1 surface(s)
`google='https://gilmoreair.com/service-areas/antelope/?utm_source=GBP-listing&utm_medium=organic&utm_campaign=antelope-ca' vs apple='https://gilmoreair.com' — different domains`
- **high** — Rating varies by 2.3 across surfaces (range: 2.54.8)
`google 4.8 vs apple 2.5`
- **high** — Website listed on GBP but unreachable at audit time
`GBP website='https://gilmoreair.com/service-areas/antelope/?utm_source=GBP-listing&utm_medium=organic&utm_campaign=antelope-ca' — surface blocked; documented limitation per process §4`
- **medium** — No business description found on any surface
`no description on any checked surface — weakens local-pack snippet`
| Finding | Disposition | Rationale |
|---------|-------------|-----------|
| #1 Hours mismatch (Google 24h vs Apple 12 AM12 PM) | Approve | Both values captured from independent surfaces; material |
| #2 Phone mismatch (530-290-5551 vs 916-866-5596) | Approve | Captured from both surfaces; material (call routing) |
| #3 Website URL mismatch (UTM params vs root) | Approve | Captured from both surfaces; material (attribution split) |
| Website blocked | Documented limitation | Blocked customer-facing surface; flagged for re-verification, carried as limitation per process §4 |
### Needs verification (excluded from report until confirmed)
## Pre-Delivery Consistency Gate
- none
1. **Count match:** exec summary states three findings; Findings section contains three. ✅
2. **Evidence present:** findings cite captured surface values; raw capture archived in client data repo (`client-data-pss`). ✅
3. **Identity match:** client name, location, date match intake. ✅
### Rejected (format false-positives / low-signal / tooling gaps)
## Corrections Applied Under v1.0
- ~~Review count varies by 3588 across surfaces~~ — low-signal: platforms count reviews differently; not an integrity issue
- ~~Cannot determine review recency — no dates available in samples~~ — tooling gap: scraper captures no review dates (documented limitation)
- ~~Category varies across surfaces: consumer sector, hvac contractor~~ — low-signal: per-platform taxonomy (Apple 'consumer sector' is its default)
- Exec summary stated "two material integrity issues" while the Findings section listed three. Corrected to three. (Process §6, gate 1 — would have blocked delivery pre-lock.)
- Website "✗" was a bare marker with no downstream treatment. Now a documented limitation per process §4.
- Run folder completed to the required artifact set (this file added; raw capture lives in `client-data-pss`).
### Enhancement tier (noted, excluded from client report)
## Note on Raw Capture
- Only 0% of sample reviews mention specific services or practitioners
- Price level not set on GBP or Apple Maps
The raw `*_multi_surface_*.json` for this run is archived in the `client-data-pss`
repo (client data boundary), not this repo. `findings.json`/`findings.md` were not
retained for this pre-lock run; this VALIDATION.md records the reviewer
dispositions to satisfy the decision loop. Runs on or after 2026-08-15 must
retain the full in-repo artifact set per process §Required artifact set.
## Pre-delivery consistency gate (v1.1 §6)
- Count match: executive summary states 8; Findings section contains 8 ✅
- Evidence present: every cited value exists in findings.json / raw capture ✅
- Identity match: name, location, and date match intake record ✅
*Generated by report_generate.py (locked normalization rules). Gate result appended by report_gate.py before delivery.*
## GATE RESULT
**PASS** — report_gate.py, 2026-08-15T16:46:21
- Count: 8 stated / 8 material after review — match
- Identity: report title + date match raw capture ('Gilmore Heating, Air and Plumbing', 15 August 2026) — match
- Surface disclosure: all captured/failed surfaces rendered correctly — match
- Material support: every material finding re-derived from raw capture — hold
- Needs-verification open: 0
@@ -1,6 +1,6 @@
{
"audit_engine": "v1",
"timestamp": "2026-08-15T14:02:25.713492+00:00",
"timestamp": "2026-08-15T16:46:20.939734+00:00",
"business": "Gilmore Heating, Air and Plumbing",
"summary": {
"total_findings": 13,
@@ -19,10 +19,10 @@
},
"surfaces_ok": {
"google_business_profile": true,
"apple_maps": true,
"bing_places": true
"apple_maps": true
},
"surfaces_failed": {
"bing_places": false,
"website": false
},
"rating": 4.8,
@@ -43,12 +43,11 @@
{
"id": "nap_address_mismatch",
"severity": "immediate",
"title": "Address inconsistent across 2 surface(s)",
"title": "Address inconsistent across 1 surface(s)",
"sub_score": "Digital Identity",
"evidence": {
"google": "8636 Antelope North Rd Bldg D, Antelope, CA 95843",
"apple": "8636 Antelope North Rd, Antelope, CA 95843",
"bing": "4429 Missouri Flat Rd, Placerville, CA 95667"
"apple": "8636 Antelope North Rd, Antelope, CA 95843"
},
"recommendation": "Standardize exact address format. GBP address is authoritative."
},
@@ -1,7 +1,7 @@
# Audit Findings — Gilmore Heating, Air and Plumbing
**Generated:** 2026-08-15 14:02 UTC
**Sources checked:** google_business_profile, apple_maps, bing_places
**Generated:** 2026-08-15 16:46 UTC
**Sources checked:** google_business_profile, apple_maps
**Rating:** 4.8 | **Reviews:** 3860
## Severity Summary
@@ -28,7 +28,7 @@
}
```
### Finding #2: Address inconsistent across 2 surface(s)
### Finding #2: Address inconsistent across 1 surface(s)
- **Severity:** 🟥 Immediate
- **Category:** Digital Identity
@@ -36,8 +36,7 @@
- **Evidence:** ```json
{
"google": "8636 Antelope North Rd Bldg D, Antelope, CA 95843",
"apple": "8636 Antelope North Rd, Antelope, CA 95843",
"bing": "4429 Missouri Flat Rd, Placerville, CA 95667"
"apple": "8636 Antelope North Rd, Antelope, CA 95843"
}
```
@@ -201,4 +200,5 @@
## Failed Surfaces
- ❌ `bing_places` — no data returned
- ❌ `website` — no data returned
@@ -0,0 +1,170 @@
{
"audit": {
"timestamp": "2026-08-15T16:46:19.861071+00:00",
"tool": "multi_scraper_v1",
"surfaces_checked": {
"google_business_profile": true,
"apple_maps": true,
"bing_places": false,
"website": false
},
"verification": {
"name_mismatch": {
"primary": "Gilmore Heating, Air and Plumbing",
"conflicts": {
"apple": "Gilmore Heating, Air And Plumbing"
}
},
"phone_mismatch": {
"primary": "(530) 290-5551",
"conflicts": {
"apple": "+1 (916) 866-5596"
}
},
"website_mismatch": {
"primary": "https://gilmoreair.com/service-areas/antelope/?utm_source=GBP-listing&utm_medium=organic&utm_campaign=antelope-ca",
"conflicts": {
"apple": "https://gilmoreair.com"
}
},
"hours_mismatch": {
"saturday": {
"google": "Open 24 hours",
"apple": "12:00 AM-12:00 PM"
},
"sunday": {
"google": "Open 24 hours",
"apple": "12:00 AM-12:00 PM"
},
"monday": {
"google": "Open 24 hours",
"apple": "12:00 AM-12:00 PM"
},
"tuesday": {
"google": "Open 24 hours",
"apple": "12:00 AM-12:00 PM"
},
"wednesday": {
"google": "Open 24 hours",
"apple": "12:00 AM-12:00 PM"
},
"thursday": {
"google": "Open 24 hours",
"apple": "12:00 AM-12:00 PM"
},
"friday": {
"google": "Open 24 hours",
"apple": "12:00 AM-12:00 PM"
}
}
}
},
"primary_source": "google_business_profile",
"name": "Gilmore Heating, Air and Plumbing",
"address": "8636 Antelope North Rd Bldg D, Antelope, CA 95843",
"phone": "(530) 290-5551",
"website": "https://gilmoreair.com/service-areas/antelope/?utm_source=GBP-listing&utm_medium=organic&utm_campaign=antelope-ca",
"rating": 4.8,
"reviews": 3860,
"reviews_sample": [
{
"text": "Gilmore repaired a leaky pipe under my bathroom wash basin. Before installing, I asked how much was it. They said $531. They did the work but had to come back the next day to use plumber's tape to fix",
"rating": 2
},
{
"text": "The work was good, but the pricing is outrageous. I wish I would've read the reviews prior to agreeing to the service. Make sure you shop around.",
"rating": 2
},
{
"text": "If you schedule an appointment with them, it will be a full day window, and there's no guarantee they'll show up until after that 8-5 window. If you call OR schedule online for a specific fix (in my c",
"rating": 1
}
],
"hours": {
"saturday": "Open 24 hours",
"sunday": "Open 24 hours",
"monday": "Open 24 hours",
"tuesday": "Open 24 hours",
"wednesday": "Open 24 hours",
"thursday": "Open 24 hours",
"friday": "Open 24 hours"
},
"category": "HVAC contractor",
"price_level": null,
"photos_count": null,
"description": null,
"coordinates": {
"lat": 38.7186718,
"lon": -121.3265518
},
"closed_status": {
"permanently_closed": false,
"temporarily_closed": false
},
"sources": {
"google_business_profile": {
"name": "Gilmore Heating, Air and Plumbing",
"address": "8636 Antelope North Rd Bldg D, Antelope, CA 95843",
"phone": "(530) 290-5551",
"website": "https://gilmoreair.com/service-areas/antelope/?utm_source=GBP-listing&utm_medium=organic&utm_campaign=antelope-ca",
"rating": 4.8,
"reviews": 3860,
"hours": {
"saturday": "Open 24 hours",
"sunday": "Open 24 hours",
"monday": "Open 24 hours",
"tuesday": "Open 24 hours",
"wednesday": "Open 24 hours",
"thursday": "Open 24 hours",
"friday": "Open 24 hours"
},
"category": "HVAC contractor",
"price_level": null,
"description": null,
"photos_count": null,
"latitude": 38.7186718,
"longitude": -121.3265518,
"url": "https://www.google.com/maps/place/Gilmore+Heating,+Air+and+Plumbing/@38.7186718,-121.3265518,17z/data=!3m1!4b1!4m6!3m5!1s0x809b21e778a000f3:0x5e737079a3661740!8m2!3d38.7186718!4d-121.3265518!16s%2Fg%2F11nl7ls20_?entry=ttu&g_ep=EgoyMDI2MDgxMi4wIKXMDSoASAFQAw%3D%3D",
"permanently_closed": false,
"temporarily_closed": false
},
"apple_maps": {
"address": "8636 Antelope North Rd, Antelope, CA 95843",
"hours": {
"sunday": "12:00 AM-12:00 PM",
"monday": "12:00 AM-12:00 PM",
"tuesday": "12:00 AM-12:00 PM",
"wednesday": "12:00 AM-12:00 PM",
"thursday": "12:00 AM-12:00 PM",
"friday": "12:00 AM-12:00 PM",
"saturday": "12:00 AM-12:00 PM"
},
"rating": 2.5,
"reviews": 272,
"coordinates": {
"lat": 38.7186405,
"lon": -121.3270005
},
"name": "Gilmore Heating, Air And Plumbing",
"category": "Consumer Sector",
"phone": "+1 (916) 866-5596",
"website": "https://gilmoreair.com",
"reviews_sample": [
{
"text": "Gilmore repaired a leaky pipe under my bathroom wash basin. Before installing, I asked how much was it. They said $531. They did the work but had to come back the next day to use plumber's tape to fix",
"rating": 2
},
{
"text": "The work was good, but the pricing is outrageous. I wish I would've read the reviews prior to agreeing to the service. Make sure you shop around.",
"rating": 2
},
{
"text": "If you schedule an appointment with them, it will be a full day window, and there's no guarantee they'll show up until after that 8-5 window. If you call OR schedule online for a specific fix (in my c",
"rating": 1
}
]
},
"bing_places": null,
"website": null
}
}
@@ -11,7 +11,7 @@
## Executive Summary
We audited Golden Hills Family Dental across its primary online surfaces: Google Business Profile, Apple Maps, and the business website. The business shows 5.0 ★ across 283 Google reviews.
We audited Golden Hills Family Dental across its primary online surfaces: Google Business Profile, Apple Maps and Website. The business shows 5.0 ★ across 283 Google reviews.
**2 material integrity issues were identified:**
1. Phone numbers are inconsistent across directories.
@@ -25,6 +25,7 @@ We audited Golden Hills Family Dental across its primary online surfaces: Google
|---------|--------|--------|---------|
| Google Business Profile | ✓ | 5.0 ★ | 283 |
| Apple Maps | ✓ | 4.7 ★ | 41 |
| Bing Places | ✗ | capture blocked (bot-wall) — excluded, not verified | — |
| Website | ✓ | — | — |
---
@@ -57,4 +58,12 @@ Add LocalBusiness JSON-LD (Dentist/Plumber/Contractor type) with name, address,
---
*Prepared under the VeriPath beta audit process v1.0. Findings reflect reviewed engine output; format-level discrepancies were normalized before inclusion.*
## Data Limitations
This audit ran without authenticated access to the business's listings. Known ceilings:
- **Review text and dates** were not captured; ratings and counts only.
- **Bing Places** is bot-walled for headless capture in most runs; where it shows ✗ above, that surface is excluded from this audit, not verified.
- This is a **point-in-time snapshot**; directory data changes after the audit date.
*Prepared under the VeriPath beta audit process v1.1. Findings reflect reviewed engine output; format-level discrepancies were normalized before inclusion.*
@@ -1,11 +1,11 @@
# Validation Run: Golden Hills Family Dental
**Date:** 2026-08-15
**Date:** 15 August 2026
**Business:** Golden Hills Family Dental
**Rating:** 5.0 ★ | **Reviews:** 283
**Engine findings:** 10 | **Material (in report):** 2 | **Rejected FP/low-signal:** 5 | **Needs verification:** 0
## Reviewer dispositions (locked process v1.0 §3)
## Reviewer dispositions (locked process v1.1 §3)
### Material (survive normalization → in REPORT-final.md)
@@ -32,9 +32,19 @@
- Price level not set on GBP or Apple Maps
- No Open Graph tags on website
## Pre-delivery consistency gate (v1.0 §6)
## Pre-delivery consistency gate (v1.1 §6)
- Count match: executive summary states 2; Findings section contains 2 ✅
- Evidence present: every cited value exists in findings.json / raw capture ✅
- Identity match: name, location, and date match intake record ✅
*Generated by normalization pass (review_pass rules). Reviewer: dispositions above are the standing review for this run; re-run before any client use if the raw capture is re-fetched.*
*Generated by report_generate.py (locked normalization rules). Gate result appended by report_gate.py before delivery.*
## GATE RESULT
**PASS** — report_gate.py, 2026-08-15T16:27:11
- Count: 2 stated / 2 material after review — match
- Identity: report title + date match raw capture ('Golden Hills Family Dental', 15 August 2026) — match
- Surface disclosure: all captured/failed surfaces rendered correctly — match
- Material support: every material finding re-derived from raw capture — hold
- Needs-verification open: 0
@@ -11,7 +11,7 @@
## Executive Summary
We audited Gordon Law across its primary online surfaces: Google Business Profile, Apple Maps, and the business website. The business shows 4.9 ★ across 45 Google reviews.
We audited Gordon Law across its primary online surfaces: Google Business Profile and Apple Maps. The business shows 4.9 ★ across 45 Google reviews.
**4 material integrity issues were identified:**
1. Phone numbers are inconsistent across directories.
@@ -27,7 +27,8 @@ We audited Gordon Law across its primary online surfaces: Google Business Profil
|---------|--------|--------|---------|
| Google Business Profile | ✓ | 4.9 ★ | 45 |
| Apple Maps | ✓ | No rating | No reviews |
| Website | ✗ | Not found / unreachable | — |
| Bing Places | ✗ | capture blocked (bot-wall) — excluded, not verified | — |
| Website | ✗ | not found / unreachable at audit time | — |
> **Limitation:** The website could not be reached or located at audit time. A blocked or missing website is itself a customer-path risk: visitors arriving from search cannot engage the business. Reachability should be re-verified; if the block persists, treat it as a material finding in the next run.
@@ -77,7 +78,7 @@ Stand up (or link on GBP) a business website with service pages, contact details
### Finding 4: No business description found on any surface
**Observation:**
{"surfaces_checked": ["google", "bing", "website"]}
no description on any checked surface — weakens local-pack snippet
**Impact:**
An empty description leaves the local-pack snippet to algorithmic default and forfeits the business's own service language in search results.
@@ -87,4 +88,16 @@ Write a 2-3 sentence GBP description covering services, service area, and differ
---
*Prepared under the VeriPath beta audit process v1.0. Findings reflect reviewed engine output; format-level discrepancies were normalized before inclusion.*
## Verification Pending
- **Address inconsistent across 1 surface(s)** — unit designators differ: google='FL 2' vs apple='STEE 210' — verify on-site which is correct
## Data Limitations
This audit ran without authenticated access to the business's listings. Known ceilings:
- **Review text and dates** were not captured; ratings and counts only.
- **Bing Places** is bot-walled for headless capture in most runs; where it shows ✗ above, that surface is excluded from this audit, not verified.
- This is a **point-in-time snapshot**; directory data changes after the audit date.
*Prepared under the VeriPath beta audit process v1.1. Findings reflect reviewed engine output; format-level discrepancies were normalized before inclusion.*
@@ -1,11 +1,11 @@
# Validation Run: Gordon Law
**Date:** 2026-08-15
**Date:** 15 August 2026
**Business:** Gordon Law
**Rating:** 4.9 ★ | **Reviews:** 45
**Engine findings:** 8 | **Material (in report):** 4 | **Rejected FP/low-signal:** 3 | **Needs verification:** 0
**Engine findings:** 8 | **Material (in report):** 4 | **Rejected FP/low-signal:** 2 | **Needs verification:** 1
## Reviewer dispositions (locked process v1.0 §3)
## Reviewer dispositions (locked process v1.1 §3)
### Material (survive normalization → in REPORT-final.md)
@@ -20,11 +20,11 @@
### Needs verification (excluded from report until confirmed)
- none
- **immediate** — Address inconsistent across 1 surface(s)
`unit designators differ: google='FL 2' vs apple='STEE 210' — verify on-site which is correct`
### Rejected (format false-positives / low-signal / tooling gaps)
- ~~Address inconsistent across 1 surface(s)~~ — same street/city/zip; unit designator format only
- ~~Cannot determine review recency — no dates available in samples~~ — tooling gap: scraper captures no review dates (documented limitation)
- ~~Category varies across surfaces: consumer sector, personal injury attorney~~ — low-signal: per-platform taxonomy (Apple 'consumer sector' is its default)
@@ -32,9 +32,19 @@
- Price level not set on GBP or Apple Maps
## Pre-delivery consistency gate (v1.0 §6)
## Pre-delivery consistency gate (v1.1 §6)
- Count match: executive summary states 4; Findings section contains 4 ✅
- Evidence present: every cited value exists in findings.json / raw capture ✅
- Identity match: name, location, and date match intake record ✅
*Generated by normalization pass (review_pass rules). Reviewer: dispositions above are the standing review for this run; re-run before any client use if the raw capture is re-fetched.*
*Generated by report_generate.py (locked normalization rules). Gate result appended by report_gate.py before delivery.*
## GATE RESULT
**PASS** — report_gate.py, 2026-08-15T16:27:11
- Count: 4 stated / 4 material after review — match
- Identity: report title + date match raw capture ('Gordon Law', 15 August 2026) — match
- Surface disclosure: all captured/failed surfaces rendered correctly — match
- Material support: every material finding re-derived from raw capture — hold
- Needs-verification open: 1
@@ -11,7 +11,7 @@
## Executive Summary
We audited Scotty's Heating & Air across its primary online surfaces: Google Business Profile, Apple Maps, and the business website. The business shows 4.8 ★ across 180 Google reviews.
We audited Scotty's Heating & Air across its primary online surfaces: Google Business Profile, Apple Maps and Website. The business shows 4.8 ★ across 180 Google reviews.
**3 material integrity issues were identified:**
1. Phone numbers are inconsistent across directories.
@@ -26,6 +26,7 @@ We audited Scotty's Heating & Air across its primary online surfaces: Google Bus
|---------|--------|--------|---------|
| Google Business Profile | ✓ | 4.8 ★ | 180 |
| Apple Maps | ✓ | 4.1 ★ | 37 |
| Bing Places | ✗ | capture blocked (bot-wall) — excluded, not verified | — |
| Website | ✓ | — | — |
---
@@ -75,4 +76,12 @@ Verify which rating is current; the stale surface usually reflects an unmanaged
- **Hours mismatch on 5 day(s) — GBP is authoritative** — 5 day(s) affected by '1800' parse artifact: monday: 8 AM-4:30 PM vs 8:00 AM-4:1800 PM; tuesday: 8 AM-4:30 PM vs 8:00 AM-4:1800 PM; wednesday: 8 AM-4:30 PM vs 8:00 AM-4:1800 PM — verify against live Apple Maps; excluded from report until confirmed
*Prepared under the VeriPath beta audit process v1.0. Findings reflect reviewed engine output; format-level discrepancies were normalized before inclusion.*
## Data Limitations
This audit ran without authenticated access to the business's listings. Known ceilings:
- **Review text and dates** were not captured; ratings and counts only.
- **Bing Places** is bot-walled for headless capture in most runs; where it shows ✗ above, that surface is excluded from this audit, not verified.
- This is a **point-in-time snapshot**; directory data changes after the audit date.
*Prepared under the VeriPath beta audit process v1.1. Findings reflect reviewed engine output; format-level discrepancies were normalized before inclusion.*
@@ -1,11 +1,11 @@
# Validation Run: Scotty's Heating & Air
**Date:** 2026-08-15
**Date:** 15 August 2026
**Business:** Scotty's Heating & Air
**Rating:** 4.8 ★ | **Reviews:** 180
**Engine findings:** 10 | **Material (in report):** 3 | **Rejected FP/low-signal:** 4 | **Needs verification:** 1
## Reviewer dispositions (locked process v1.0 §3)
## Reviewer dispositions (locked process v1.1 §3)
### Material (survive normalization → in REPORT-final.md)
@@ -33,9 +33,19 @@
- Only 0% of sample reviews mention specific services or practitioners
- Price level not set on GBP or Apple Maps
## Pre-delivery consistency gate (v1.0 §6)
## Pre-delivery consistency gate (v1.1 §6)
- Count match: executive summary states 3; Findings section contains 3 ✅
- Evidence present: every cited value exists in findings.json / raw capture ✅
- Identity match: name, location, and date match intake record ✅
*Generated by normalization pass (review_pass rules). Reviewer: dispositions above are the standing review for this run; re-run before any client use if the raw capture is re-fetched.*
*Generated by report_generate.py (locked normalization rules). Gate result appended by report_gate.py before delivery.*
## GATE RESULT
**PASS** — report_gate.py, 2026-08-15T16:27:11
- Count: 3 stated / 3 material after review — match
- Identity: report title + date match raw capture ("Scotty's Heating & Air", 15 August 2026) — match
- Surface disclosure: all captured/failed surfaces rendered correctly — match
- Material support: every material finding re-derived from raw capture — hold
- Needs-verification open: 1