diff --git a/docs/clients/phoenix-salons/README.md b/docs/clients/phoenix-salons/README.md index cbc142f..50f7b47 100644 --- a/docs/clients/phoenix-salons/README.md +++ b/docs/clients/phoenix-salons/README.md @@ -20,3 +20,5 @@ |------|-------|-------| | 2026-08-05 | 1a | Baseline repo created, cold audit pending | | 2026-08-05 | 1a | Snapshot 1 ingested — R1-R6 applied (no threats fired) | + +- **Call log:** `call-log.md` — every client touch, newest first. Hours gate state lives here. diff --git a/docs/clients/phoenix-salons/call-log.md b/docs/clients/phoenix-salons/call-log.md new file mode 100644 index 0000000..a3068b0 --- /dev/null +++ b/docs/clients/phoenix-salons/call-log.md @@ -0,0 +1,55 @@ +# Phoenix Salon + Spa — Call Log + +Conventions: one entry per client touch, newest first. Every entry has: date, participants, items discussed (status per item), actions (owner + due), notes. Hours items carry the gate state explicitly. + +--- + +## 2026-08-17 — Findings call (v1 workflow) + +**Participants:** Tony, Ashley Thornhill (owner) +**Duration:** ~14 min +**Evidence basis:** 4-surface capture 2026-08-16/17 (`extractions/phoenix_salon__spa_multi_surface_2026-08-17.json`); original audit 2026-08-13 + +### Items discussed + +| # | Item | Status after call | +|---|---|---| +| 1 | Website SSR: initial HTML 13 words (Lovable Vite SPA, no SSR) | **OPEN** — fix assigned to Tony | +| 2 | Hours: all surfaces disagree | **OPEN** — gate not passed (see below) | +| 3 | Rebrand residue: "La Mae" in 6 locations | **OPEN** — owner to request directory changes | +| 4 | GBP gaps: no posts, no Q&A, no price band | **OPEN** — we draft, Ashley posts | + +### HOURS — GATE NOT PASSED (non-negotiable) + +Call claimed hours were settled ("the posted hours on GBP reflect what you've already decided"). **This is not a lock.** No written numbers were captured. Conflicts from the 2026-08-17 capture: + +| Day | GBP | Website (JSON-LD) | Conflict | +|---|---|---|---| +| Mon–Fri | 9:00 AM – 6:00 PM | 9:00 AM – 7:00 PM | **OPEN — close time** | +| Saturday | 9:00 AM – 6:00 PM | 9:00 AM – 5:00 PM | **OPEN — close time** | +| Sunday | Closed | 9:00 AM – 5:00 PM (open) | **OPEN — open vs closed** | + +Apple Maps (10:00 AM – 6:00 PM daily incl. Sunday) and Yelp (per 08-13: Mon–Fri 9–7, Sat 9–7, Sun closed) also in conflict; not re-verified 08-17 (Apple is process-gated, Yelp headless-blocked) — re-verify before fixing either. + +Canonical record `hours.regular_hours` was marked `verified/tier_1` from a 2026-08-16 handoff with no owner-written numbers on file → **demoted to OPEN, tier_2, 2026-08-17.** + +**Next action (FIRST gate on next touch):** text Ashley — "Confirming final hours, please send written: Mon __, Tue __, Wed __, Thu __, Fri __, Sat __, Sun __." Written numbers in → record updated → gate passed. **Monitoring handoff is blocked until this closes.** + +### Actions from call + +| # | Action | Owner | Due | +|---|---|---|---| +| 1 | Hours: written confirmation of all 7 days | Ashley (Tony sends the ask) | next touch, GATE | +| 2 | Lovable SSR fix: paste SSR prompt to Lovable AI → Publish → re-crawl, before/after word count | Tony | Phase 2 | +| 3 | Rebrand residue (6 locations: CityFeet, BestProsInTown slug, Facebook bio, Yelp "formerly La Mae", Vagaro review, directory listing): list is 4 days old and Yelp is headless-blocked — re-verify each before touching; then Ashley requests name changes on directories she controls | Tony (verify + drafts), Ashley (directory requests) | Phase 2 | +| 4 | GBP posts + Q&A + price band: draft content, Ashley posts (GBP is her profile) | Tony (draft), Ashley (post) | Phase 2 | +| 5 | Cost log: minutes per fix, started on first fix | Tony | Phase 2 | + +### Notes + +- Call ran v1 (pre-workflow). GEO/AEO education was delivered on call — should have been the one-pager. Not repeating. +- No pricing discussed (no economics-v1.md for Phoenix yet; pricing module not in script — rule followed). +- Audit timeline for narrative (do not mislabel on future calls): June 2026 (~45/100) → July 23 (82/100, post-Lovable-rebuild) → Aug 6 (68/100) → Aug 13 (VeriPath-era GBP audit) → Aug 16–17 (4-surface + GEO). Scores use different rubrics; never quote cross-rubric numbers to the owner. + +--- + diff --git a/docs/clients/phoenix-salons/canonical-business-record-v0.1.1.json b/docs/clients/phoenix-salons/canonical-business-record-v0.1.2.json similarity index 89% rename from docs/clients/phoenix-salons/canonical-business-record-v0.1.1.json rename to docs/clients/phoenix-salons/canonical-business-record-v0.1.2.json index 74bc543..9da73d5 100644 --- a/docs/clients/phoenix-salons/canonical-business-record-v0.1.1.json +++ b/docs/clients/phoenix-salons/canonical-business-record-v0.1.2.json @@ -1,6 +1,6 @@ { "record_id": "VP-001-phoenix-salon-spa-v0.1.1", - "record_version": "0.1.1", + "record_version": "v0.1.2", "record_type": "canonical_business_record", "system": { "authority": "veripath", @@ -141,8 +141,8 @@ "Sat": "09:00-18:00", "Sun": "closed" }, - "status": "verified", - "evidence_tier": "tier_1", + "status": "open", + "evidence_tier": "tier_2", "observed_at": "2026-08-16T00:00:00Z", "verified_at": "2026-08-16T10:30:00Z", "fresh_until": "2026-09-16T00:00:00Z", @@ -150,7 +150,7 @@ "sources": [ "owner ground truth (Ashley) via Leonard handoff 2026-08-16" ], - "notes": "Updated from previous Sat 09:00-15:00. Owner confirmed Mon\u2013Sat 9\u20136, Sun closed. This is now the authoritative baseline for all surface diffs." + "notes": "REOPENED 2026-08-17: 2026-08-17 capture shows conflicts GBP Mon-Sat 9-6 / website (JSON-LD) Mon-Fri 9-7 Sat-Sun 9-5 / Apple 10-6 daily incl Sun / Yelp (08-13) Mon-Fri 9-7 Sat 9-7 Sun closed. 2026-08-17 findings call claimed verbal settlement but no written numbers were captured, so the hours GATE (client-call-workflow-v2.md, rule 3) was not passed. Owner-written confirmation of all 7 days required before status returns to verified and before any monitoring handoff." }, "by_appointment_only": { "value": true, @@ -430,7 +430,7 @@ { "field": "hours.regular_hours", "description": "Owner ground truth conflicts with all public surfaces", - "owner_truth": "Mon\u2013Sat 9\u20136, Sun closed", + "owner_truth": "Mon–Sat 9–6, Sun closed", "website": "Mon-Fri 9-7, Sat-Sun 9-5", "yelp": "Mon-Fri 9-7, Sat 9-7, Sun closed", "gbp": "NOT_VERIFIED against owner truth", @@ -457,6 +457,19 @@ "action_risk": "low", "status": "unresolved", "discovered_at": "2026-08-05T00:00:00Z" + }, + { + "id": "hours-surfaces-2026-08-17", + "field": "hours.regular_hours", + "status": "open", + "evidence": { + "gbp": "Mon-Sat 09:00-18:00, Sun closed", + "website": "Mon-Fri 09:00-19:00, Sat-Sun 09:00-17:00 (JSON-LD, 2026-08-17)", + "apple_maps": "daily 10:00-18:00 incl Sunday (2026-08-17)", + "yelp": "Mon-Fri 09:00-19:00, Sat 09:00-19:00, Sun closed (2026-08-13, not re-verified)" + }, + "owner_truth": null, + "resolution_required": "Owner-written confirmation of all 7 days (hours GATE). No written numbers = stays open." } ], "approvals": [], @@ -471,6 +484,12 @@ "action": "updated", "field": "hours.regular_hours", "detail": "Corrected Saturday hours from 09:00-15:00 to 09:00-18:00 per owner ground truth. Source: Leonard handoff 2026-08-16. This is now the authoritative baseline for all surface diffs." + }, + { + "date": "2026-08-17", + "field": "hours.regular_hours", + "detail": "Reopened hours: demoted verified/tier_1 to open/tier_2. 2026-08-17 capture conflicts (GBP Mon-Sat 9-6 vs website Mon-Fri 9-7 Sat-Sun 9-5) were not locked on the 2026-08-17 call despite verbal 'settled' claim; no written numbers on file. Hours GATE per client-call-workflow-v2.md. Prior baseline Mon-Sat 9-6 Sun closed set 2026-08-16 from Leonard handoff — superseded until owner confirms in writing.", + "source": "2026-08-17 findings call + multi_surface_2026-08-17 capture" } ] -} \ No newline at end of file +} diff --git a/docs/clients/phoenix-salons/data-inventory-v1.md b/docs/clients/phoenix-salons/data-inventory-v1.md index b2da719..b20d40d 100644 --- a/docs/clients/phoenix-salons/data-inventory-v1.md +++ b/docs/clients/phoenix-salons/data-inventory-v1.md @@ -41,6 +41,8 @@ Establish ground truth of the client's digital presence. No analysis or diagnosi - **Notes / Gaps:** Booking button observed on GBP ("Book online"); destination not yet confirmed - **Snapshot Location:** `client-data-pss/raw/booking/` +**Hours status:** OPEN — all four surfaces disagree (2026-08-17 capture: GBP Mon–Sat 9–6 · website Mon–Fri 9–7, Sat–Sun 9–5 · Apple 10–6 daily incl Sun · Yelp 08-13 Mon–Fri 9–7, Sat 9–7, Sun closed). Owner-written confirmation of all 7 days required before status changes (hours GATE, `client-call-workflow-v2.md`). Canonical record `hours.regular_hours` demoted to open/tier_2 on 2026-08-17. + ## Summary of Gaps / Blockers - Services, posts, Q&A not yet observed on GBP - Claim status unknown — needs owner access or deeper verification diff --git a/docs/operations/client-call-workflow-v2.md b/docs/operations/client-call-workflow-v2.md new file mode 100644 index 0000000..279ebf3 --- /dev/null +++ b/docs/operations/client-call-workflow-v2.md @@ -0,0 +1,59 @@ +# Client Call Workflow v2 + +**Status:** Active +**Effective:** 2026-08-17 +**Replaces:** ad-hoc findings calls (v1, first run 2026-08-17 with Phoenix Salon + Spa — see lessons learned, `docs/clients/phoenix-salons/call-log.md`) +**Applies to:** all clients, all audit-adjacent calls + +--- + +## Operating rules (binding) + +1. **Closed-loop rule.** If it's not in the script, it's not on the call. The script is generated from the canonical record the day before. No "I'll look that up" items — any item that isn't verified and in the script is deferred to Phase 2. +2. **Evidence standard.** On call, state only what has been re-verified in the last 48 hours. Headless-blocked or stale surface → say "I will re-verify before we touch it" and mark it pending in the call log. +3. **Hours GATE.** Hours are a gate, not a finding. Day-by-day table with BLANKS where surfaces conflict. Verbal lock of all seven days is required, then written confirmation to the owner within 2 hours, then record update. No written numbers = item stays OPEN. Full stop. No monitoring handoff while hours are OPEN. +4. **Pricing.** Either the economics guide's 7-question module is in the script (§3 of `docs/architecture/economics-pricing-execution-guide-v1.md`) or pricing is not discussed. No improvisation. +5. **Education is a one-pager, not a call topic.** Concepts the owner didn't know about (GEO, AEO, llms.txt) go in the written follow-up. +6. **Cost log.** Minutes spent per fix, recorded in the call log / fix log. Becomes the first real price anchor (Tier 2 validation for the economics model). + +--- + +## PHASE 0 — Pre-call (day before, mostly automated) + +1. `multi_scraper` capture, all 4 surfaces → `extractions/_.json` +2. Update `docs/clients//` canonical record: hours table (every day × every surface, **BLANKS where conflict**), old-name list (live-verified or marked "re-verify"), SSR word count, rating/review counts, open items +3. Send pre-call owner form (`docs/operations/templates/pre-call-owner-form.md`), 24–48h out +4. Generate call script FROM the record. Check the closed-loop rule: every item in the script is verified <48h. GATE check: hours table present with blanks where unresolved. + +## PHASE 1 — Call (~15 min; presentation, not discovery) + +1. **Open:** locked good news (NAP + rating), 30 seconds. +2. **Findings** in fixed order: finding → business impact → what we do → owner. +3. **Hours GATE:** read the table day by day, blanks visible. Owner gives all seven days. Verbal lock recorded verbatim. +4. **Close:** exact next actions with owners and dates. +5. **Immediately after (within 2h):** text/email with the locked numbers + education one-pager. +6. Call log entry created the same day (convention: `docs/clients//call-log.md`). + +## PHASE 2 — Fix (the PoC) + +1. Action list from the call; owners assigned at the call. +2. Re-capture after every fix. Before/after numbers in the report. +3. **Cost log:** minutes per fix → first real price anchor. + +## PHASE 3 — Monitoring (retainer begins) + +Explicit handoff: audit phase ends, monitoring begins. The record defines: +- surfaces watched +- frequency +- alert thresholds + +`multi_scraper` on schedule, diff vs record, drift flagged. **Entry condition: hours item CLOSED with written numbers.** No exception. + +--- + +## Lessons from v1 (2026-08-17 Phoenix call) + +- Education inside the findings call was a design error → rule 5. +- Hours asked as a question, closed as "verbal lock" with no numbers → rule 3. +- Audit timeline mislabeled (June and July audits exist; Aug 13 is not "the original") → timeline lives in the call log, not in call memory. +- Owner assignments must be explicit per finding (who fixes, who posts, who just approves). diff --git a/docs/operations/templates/pre-call-owner-form.md b/docs/operations/templates/pre-call-owner-form.md new file mode 100644 index 0000000..6783cba --- /dev/null +++ b/docs/operations/templates/pre-call-owner-form.md @@ -0,0 +1,43 @@ +# Pre-Call Owner Form (standard template) + +**Client:** {client} +**Call date:** {date} +**Send:** 24–48h before the call. Owner answers; her answers feed the call script (Phase 0, step 4). + +--- + +## 1. Hours (the gate — every day, no ranges) + +| Day | Opens | Closes | Open/Closed | +|---|---|---|---| +| Monday | | | | +| Tuesday | | | | +| Wednesday | | | | +| Thursday | | | | +| Friday | | | | +| Saturday | | | | +| Sunday | | | | + +If any day varies by season or staff, note it here: ________________ + +## 2. Booking + +- How do customers book? (Vagaro link / phone / walk-in / other): ________________ +- Do you want to be found by "near me" searches? yes / no + +## 3. What matters most + +- Which pages on the website matter most to you? (e.g. services, booking, contact): ________________ + +## 4. Known issues + +- Anything you already know is wrong or broken that we should check? ________________ + +## 5. What's a win for you + +- In your own words, what would make this call worth your time? ________________ + +--- + +**Owner notes (optional):** +