Files
veripath/docs/validation/2026-08-14-crystal-blue-plumbing/VALIDATION.md
T

2.3 KiB

Validation Run: Crystal Blue Plumbing Heating & Air

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)

Pipeline Execution

multi_scraper.py → audit_engine.py → findings.json + findings.md

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)

Key Findings (5 total)

# 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

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

Artifacts

  • multi_surface_2026-08-14.json — raw scraped data (4KB)
  • findings.json — engine output (3KB)
  • findings.md — markdown report (2.5KB)
  • VALIDATION.md — this file