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
@@ -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.*