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,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