docs: Option C — client call workflow v2, Phoenix call log, hours GATE reopened
- docs/operations/client-call-workflow-v2.md: PHASE 0-3 with binding rules (closed-loop rule, evidence standard, hours GATE, pricing module gate, one-pager education, cost log) - docs/operations/templates/pre-call-owner-form.md: standard 5-question form - docs/clients/phoenix-salons/call-log.md: 2026-08-17 entry; hours GATE NOT PASSED (Mon-Fri 6v7, Sat 5v6, Sun open/closed all OPEN); actions + owners - canonical record v0.1.1 -> v0.1.2: hours demoted verified/tier_1 to open/tier_2, conflict entry added, change history recorded - data-inventory-v1.md: hours status OPEN block - README.md: call-log pointer
This commit is contained in:
@@ -20,3 +20,5 @@
|
|||||||
|------|-------|-------|
|
|------|-------|-------|
|
||||||
| 2026-08-05 | 1a | Baseline repo created, cold audit pending |
|
| 2026-08-05 | 1a | Baseline repo created, cold audit pending |
|
||||||
| 2026-08-05 | 1a | Snapshot 1 ingested — R1-R6 applied (no threats fired) |
|
| 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.
|
||||||
|
|||||||
@@ -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.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
+25
-6
@@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"record_id": "VP-001-phoenix-salon-spa-v0.1.1",
|
"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",
|
"record_type": "canonical_business_record",
|
||||||
"system": {
|
"system": {
|
||||||
"authority": "veripath",
|
"authority": "veripath",
|
||||||
@@ -141,8 +141,8 @@
|
|||||||
"Sat": "09:00-18:00",
|
"Sat": "09:00-18:00",
|
||||||
"Sun": "closed"
|
"Sun": "closed"
|
||||||
},
|
},
|
||||||
"status": "verified",
|
"status": "open",
|
||||||
"evidence_tier": "tier_1",
|
"evidence_tier": "tier_2",
|
||||||
"observed_at": "2026-08-16T00:00:00Z",
|
"observed_at": "2026-08-16T00:00:00Z",
|
||||||
"verified_at": "2026-08-16T10:30:00Z",
|
"verified_at": "2026-08-16T10:30:00Z",
|
||||||
"fresh_until": "2026-09-16T00:00:00Z",
|
"fresh_until": "2026-09-16T00:00:00Z",
|
||||||
@@ -150,7 +150,7 @@
|
|||||||
"sources": [
|
"sources": [
|
||||||
"owner ground truth (Ashley) via Leonard handoff 2026-08-16"
|
"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": {
|
"by_appointment_only": {
|
||||||
"value": true,
|
"value": true,
|
||||||
@@ -430,7 +430,7 @@
|
|||||||
{
|
{
|
||||||
"field": "hours.regular_hours",
|
"field": "hours.regular_hours",
|
||||||
"description": "Owner ground truth conflicts with all public surfaces",
|
"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",
|
"website": "Mon-Fri 9-7, Sat-Sun 9-5",
|
||||||
"yelp": "Mon-Fri 9-7, Sat 9-7, Sun closed",
|
"yelp": "Mon-Fri 9-7, Sat 9-7, Sun closed",
|
||||||
"gbp": "NOT_VERIFIED against owner truth",
|
"gbp": "NOT_VERIFIED against owner truth",
|
||||||
@@ -457,6 +457,19 @@
|
|||||||
"action_risk": "low",
|
"action_risk": "low",
|
||||||
"status": "unresolved",
|
"status": "unresolved",
|
||||||
"discovered_at": "2026-08-05T00:00:00Z"
|
"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": [],
|
"approvals": [],
|
||||||
@@ -471,6 +484,12 @@
|
|||||||
"action": "updated",
|
"action": "updated",
|
||||||
"field": "hours.regular_hours",
|
"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."
|
"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"
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
@@ -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
|
- **Notes / Gaps:** Booking button observed on GBP ("Book online"); destination not yet confirmed
|
||||||
- **Snapshot Location:** `client-data-pss/raw/booking/`
|
- **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
|
## Summary of Gaps / Blockers
|
||||||
- Services, posts, Q&A not yet observed on GBP
|
- Services, posts, Q&A not yet observed on GBP
|
||||||
- Claim status unknown — needs owner access or deeper verification
|
- Claim status unknown — needs owner access or deeper verification
|
||||||
|
|||||||
@@ -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/<client>_<date>.json`
|
||||||
|
2. Update `docs/clients/<client>/` 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/<client>/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).
|
||||||
@@ -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):**
|
||||||
|
|
||||||
Reference in New Issue
Block a user