data(validation): Crystal Blue Plumbing — first external run + GBP quality gate

Raw multi-surface JSON, engine findings (json+md), and VALIDATION.md for the
Crystal Blue Plumbing Heating & Air run. Demonstrates the GBP match gate
rejecting a wrong entity and falling back to Apple with a glyph-clean phone
('+1 (916) 571-6448').
This commit is contained in:
Leonard (VeriPath Agent)
2026-08-14 20:32:01 +00:00
parent 63a24dde3a
commit c461fc5fa9
5 changed files with 229 additions and 62 deletions
@@ -2,60 +2,52 @@
**Date:** 2026-08-14
**Business:** Crystal Blue Plumbing Heating & Air
**Location:** Placerville, CA (actual: Loomis, CA same metro area)
**Why chosen:** Plumbing/HVAC (GTM vertical), Placerville/Cameron Park area, never audited before, multi-location chain (tests GBP disambiguation)
**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.
## Pipeline Execution
```
multi_scraper.py → audit_engine.py → findings.json + findings.md
```
## 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.
## Surface Results
| Surface | Status | Notes |
|---------|--------|-------|
| Google Business Profile | ⚠️ Degraded | Returned `name: "Hours"`, null address, null phone. GBP matched wrong entity. |
| Apple Maps | ✅ Good | Full NAP, 4.2★/65 reviews, hours, website URL, phone |
| Bing Places | ❌ Failed | Returned no data |
| Website | ❌ Failed | HTTP 403 Forbidden (crystalblueplumbing.com) |
| 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". |
## Key Findings (5 total)
## 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.
| # | Severity | Finding | Verdict |
|---|----------|---------|---------|
| 1 | 🟥 Immediate | Hours mismatch (GBP vs Apple) | **FALSE POSITIVE** — GBP from wrong entity |
| 2 | 🟧 High | No website found | PARTIALLY FALSE — URL exists but 403 |
| 3 | 🟨 Medium | Review dates unavailable | VALID |
| 4 | 🟨 Medium | No description | VALID |
| 5 | 🟩 Enhancement | No price level | VALID |
## 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.
## Issues Observed
### 1. GBP Entity Disambiguation (CRITICAL)
GBP scraper returned `name: "Hours"` with null address. Matched wrong GBP listing. Fallback to Apple Maps saved the audit.
### 2. Apple Maps Hours Parsing
`12:00 AM-12:00 PM` for all days — likely parsing "Open 24 hours" as midnight-to-noon.
### 3. Website 403 Not Distinguished From "No Website"
Should be separate findings: "no_website" vs "website_unreachable".
### 4. Hours Mismatch With Degraded Source
Engine flagged hours mismatch but GBP data was garbage. Mismatch detection should skip degraded sources.
## Verdict
Pipeline works end-to-end but findings not yet trustworthy without human review. GBP scraper is the biggest risk.
**Before production:**
1. GBP entity validation (name match + address present)
2. Hours comparison skip degraded sources
3. Website 403 → distinct finding
4. Apple Maps hours parsing audit
## 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. ✅
## Artifacts
- `multi_surface_2026-08-14.json` — raw scraped data (4KB)
- `findings.json` — engine output (3KB)
- `findings.md` — markdown report (2.5KB)
- `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
## 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.