From 2a7ab71d64abe4df368a4f061a2d776432085cd5 Mon Sep 17 00:00:00 2001 From: Claude Date: Sat, 8 Aug 2026 23:12:56 +0000 Subject: [PATCH 01/14] Add second Codex handoff: Phase 4 + trades review + skills install Supersedes the seed handoff (mission complete at 450f25d). Self-contained work order for the Mac session: Phase 4 reality-check protocol with integrity rules and drift-fix policy, trades-list review, full text of the three mined skills for local install, and the report-back template that closes the loop with cloud sessions. Co-Authored-By: Claude Fable 5 Claude-Session: https://claude.ai/code/session_017SgKh5sTzx4rjanwEAXtfc --- handoffs/2026-08-08-codex-phase4-handoff.md | 269 ++++++++++++++++++++ 1 file changed, 269 insertions(+) create mode 100644 handoffs/2026-08-08-codex-phase4-handoff.md diff --git a/handoffs/2026-08-08-codex-phase4-handoff.md b/handoffs/2026-08-08-codex-phase4-handoff.md new file mode 100644 index 0000000..2bd2baf --- /dev/null +++ b/handoffs/2026-08-08-codex-phase4-handoff.md @@ -0,0 +1,269 @@ +--- +date: 2026-08-08 +type: handoff +project: the-guild +audience: codex (local session on Brandon's Mac) +task: Phase 4 reality check + trades review + skills install +from: claude.ai/code remote session (build-phase session) +supersedes: handoffs/2026-08-08-codex-repo-seed-handoff.md (seed mission COMPLETE at 450f25d) +--- + +# HANDOFF → CODEX #2 — Phase 4 + Mac-side lane — 2026-08-08 + +You are the local agent with Brandon's credentials and his Mac. Your seed +mission is complete (guild-visibility-probe pushed at `450f25da`, 4/4 tests). +This handoff is your next work order. It is self-contained: you cannot read +the Guild's workspace repo (different GitHub account), so everything you +need is in this file or in the probe repo you CAN reach. + +## Context in five sentences + +The Guild sells local businesses a **measured appearance rate** in AI +answers — "named in X of 10 asks" — never a guaranteed ranking. The probe +you seeded is the measurement instrument; it has never run against the live +OpenAI API. Your Mission 1 is the Phase 4 reality check that proves the +instrument tells the truth. Missions 2–3 are small: adjust the trades list +with Brandon, and install three skills into the local skills directories. +Everything you do is reported back to Brandon, who relays to the cloud +Claude session for journaling — you two cannot see each other's repos. + +## Operating facts + +- Repo: `brandonwadepackard-cell/guild-visibility-probe`, branch `main`. + `git pull` before starting — do not assume your clone is current. +- Engine: OpenAI **Responses API** with the `web_search` tool + (`probe/engine.py`); extraction pass is a second, cheap call. Model via + `OPENAI_MODEL` env (default `gpt-4o-mini`), samples via + `SAMPLES_PER_RUN` (default 10), `DAILY_RUN_LIMIT` (default 50) is the + accident brake. Cost ≈ ten search asks + ten tiny extractions per + report — well under $1. +- Storage: SQLite, append-only by design. There is deliberately no code + path that edits or deletes a saved run. Do not add one. + +## The four integrity rules (never weaken these, even to make a run pass) + +1. **Search-on, always.** Every ask goes through web search. Bare-model + answers are stale and would never reflect fix work. +2. **No partial runs, no deletions, no cherry-picking.** A run with any + failed sample is invalid, and stays saved as invalid. +3. **Apples to apples.** Re-runs reuse the baseline's exact question, + model, and sample count automatically. Model changes get footnoted. +4. **Humans backstop name matching.** A false "0 of 10" from a name + mismatch is the worst failure; raw answers stay visible, corrections + are append-only overrides. + +If the OpenAI API surface has drifted since build (tool naming, response +shape), fix forward in normal commits with clear messages — never by +loosening a rule. Push fixes to `main` and record the SHAs for the report. + +## MISSION 1 — Phase 4 reality check (PRE-AUTHORIZED by Brandon) + +Setup: +1. `git pull` → fresh venv → `pip install -r requirements.txt` → + `python -m pytest tests/ -v` (expect 4 passed). +2. `cp .env.example .env`; ask Brandon to paste his billing-enabled + `OPENAI_API_KEY`. The key lives ONLY in `.env` (gitignored). Never + commit it, never echo it into logs or output. +3. Smoke run ONE business first (any real local business Brandon names): + `python cli.py "Business Name" trade "Town, ST"`. If it errors, this is + where API drift shows up — fix forward, re-run, commit. + +The check (after smoke passes): +4. Ask Brandon for **5 real businesses he personally knows** — name, + trade, town + state. Spread across trades if possible. +5. Run each once. Record every run ID and score. +6. **Direction verification with Brandon:** for each business, ask him + "does this score point the same direction as reality?" (a business he + knows is well-known should score high; obscure should score low). + PASS = same direction on **≥4 of 5**. +7. **Calibration pair:** run a known national franchise location (should + score HIGH) and a brand-new/tiny business (should score ~0). Both + behaving = the instrument isn't just noise. +8. While you're in there: have Brandon click through the web UI once + (`uvicorn app:app --reload`, passcode from `.env`) — report page loads, + raw answers visible, manual-correction flow works. + +Rules during runs: no re-rolling a run because the number looks wrong +(that IS the data — AI answers are stochastic; frequency is the product). +If a sample fails mid-run, the run marks invalid — diagnose, fix, run +again as a NEW run. All runs stay in the database. + +## MISSION 2 — Trades list review (plan item A3, with Brandon) + +`probe/questions.yaml` ships with 10 starter trades (plumber, hvac, +roofer, electrician, landscaper, pest_control, dentist, chiropractor, +restaurant, barber). With Brandon, add/cut for his chosen territory. One +line per trade; the question must always include `{town}` and read like a +real customer ask ("Who should I call for a plumber in {town}?" — town +values always include the state). Commit and push the edited list. + +## MISSION 3 — Install the three mined skills (standing lane) + +Create one folder per skill in `~/.claude/skills/` AND `~/.codex/skills/` +(both, if both exist on this Mac), file named `SKILL.md`, exact contents +below. After installing, validate `appearance-rate-probe` against the +probe repo's README — they should agree; if they don't, the README wins +and report the discrepancy. + +### ~/.claude/skills/appearance-rate-probe/SKILL.md + +```markdown +--- +name: appearance-rate-probe +description: "Use when measuring, proving, or selling AI visibility for any business: never trust one AI answer; sample N times with search-grounded asks, count appearances, report the percentage, and lock before/after configs so comparisons stay apples-to-apples." +type: doctrine-workflow +domain: AI visibility / GEO +source_artifact: "guild-visibility-probe repo + 2026-08-07 Guild session" +confidence: HIGH +delegation_ready: true +--- + +# Appearance-Rate Probe + +## Purpose +Turn "what does AI say about this business" into an honest, sellable, repeatable number. + +## Core Doctrine +1. One AI answer is a coin flip. Identical prompts almost never return identical + business lists; only frequency across repeated asks is real. +2. Sell the odds, prove the delta, never promise the coin flip. The unit of + proof is appearance rate: "named in X of N asks." +3. Search-on, always. Bare-model answers come from stale training data and will + never reflect fix work. Every ask must be web-search grounded. +4. No partial runs, no deletions, no cherry-picking. A run with any failed + sample is invalid. Saved runs are append-only. Corrections are append-only + overrides shown alongside originals. +5. Apples to apples. A before/after is valid only with identical question, + sample count, and model. Lock the baseline config; footnote model changes. +6. Humans backstop name matching. A false "0 of N" from a name mismatch is the + worst possible failure; always show raw answers and allow one-click + correction with a note. + +## Workflow +1. Define the customer question per trade ("Who should I call for a plumber in + {Town, ST}?"). Always include the state. +2. Ask N=10 independent, search-grounded times. Record every raw answer. +3. Extract business names per answer; fuzzy-match the target (strip + apostrophes/punctuation/suffix noise; containment; ~0.9 similarity). +4. Score: appearances / N. Tally every other business named (competitor list). + "No recommendation given" is its own outcome, not a miss (common for clinics). +5. Re-run later with the locked config. Two runs = the before/after page. + +## Stop Conditions +- Never present a single screenshot as proof. +- Never guarantee a ranking, placement, or specific score. +``` + +### ~/.claude/skills/four-elements-sales-scripts/SKILL.md + +```markdown +--- +name: four-elements-sales-scripts +description: "Use when writing, editing, or drilling The Guild's doorstep sales scripts: read the buyer's element (Fire/Earth/Water/Air), pull the matching script, and keep every line inside FLEXX doctrine — answer discipline, receipts before closes, demo inside 60 seconds, the honest no-guarantee line." +type: identity-workflow +domain: door sales / The Guild +source_artifact: "Sales Script Book artifact (panel-ID editable) + 2026-08-07 session" +confidence: HIGH +delegation_ready: true +--- + +# Four Elements Sales Scripts + +## Core Doctrine (Table Rules — locked) +1. Answer discipline: answer exactly what was asked, then stop. Price gets a + straight number the moment it's asked. Dodging price is a forbidden move. +2. Receipts before closes: every buyer question opens a thread; a nod or + "makes sense" closes it. Never close over an open thread. +3. The demo is the script: AI asked about their business, on a phone, inside + 60 seconds. Best version: their phone, their thumbs. +4. The honest line, said like a weapon: "Anyone who guarantees a ranking is + lying to you. I guarantee the work and a before/after you can hold." + +## The Element Read (first 30 seconds) +- FIRE — competitive, decisive, rival on the brain → Rivalry script: show who + AI recommends instead; one-per-trade-per-area exclusivity; binary close. +- EARTH — analytical, wants paper → Numbers script: two-stage (gatekeeper → + booked sit-down), sampled report on the desk, calendar close not card close. +- WATER — been burned, arms crossed → Been-burned script: lead with what we + won't promise; flat price, no contract, local; two-visit callback close. +- AIR — curious, phone in hand → First-mover script: demo on THEIR phone; + the new-Yellow-Pages window; identity close ("the shop the robot brags about"). + +## Editing Protocol +Scripts live in one place (the Script Book artifact). Every panel has an ID +(F-03, W-05...). Edits happen by naming the panel. Table Rules are doctrine — +edit with care. Script lines are Brandon's to rewrite freely. + +## Training Loop +Load the four buyers as FLEXX roleplay personas (FLEXX stays a separate +product; the Guild is just a user). Drill until the Water callback close and +the Fire silence-after-demo are muscle memory. +``` + +### ~/.claude/skills/cold-outreach-legality-gate/SKILL.md + +```markdown +--- +name: cold-outreach-legality-gate +description: "Use before ANY outbound campaign, automation, or list purchase: run the channel-legality gate so no cold list is ever touched by AI voice, SMS, or ringless voicemail, and every legal channel is used with its required scrub." +type: doctrine +domain: outreach compliance (US) +source_artifact: "2026-08-07 Guild session compliance research" +confidence: HIGH +delegation_ready: true +--- + +# Cold Outreach Legality Gate + +## The Gate (cold lists = no consent on file) +ALLOWED: direct mail (unrestricted) · cold email (CAN-SPAM opt-out rules: +honest headers, physical address, working unsubscribe, separate sending +domains) · live human calls (AFTER National DNC scrub — business cells are +presumptively residential per Chennette v. Porch.com) · door knocking · +uploading lists as ad-platform custom audiences. + +FORBIDDEN on cold lists: AI/prerecorded voice calls (FCC 2024: AI voice = +robocall; consent required) · SMS/MMS (prior express written consent; +$500–$1,500 per text) · ringless voicemail (treated as calls; settlements +exist). + +## After Consent Is Captured (form fill, inbound call, QR scan) +AI voice callbacks, SMS follow-up, and automation are all legal on that +contact. The machine: humans open cold doors; AI never lets a warm lead go +stale. Capture consent language at every intake point; keep records 4+ years. + +## Stop Conditions +- Any plan that dials or texts a purchased/scraped list with automation: stop + and redesign. No exceptions for "but it's B2B." +- State wrinkles (TX registration + bond, FL FTSA, quiet hours): check before + entering a new state. +``` + +## Rules (all missions) + +- Never commit `.env`, keys, or passcodes. Never echo the key. +- Only touch `brandonwadepackard-cell/guild-visibility-probe` and the local + skills directories. Nothing under `abcnuts` (you can't reach it anyway). +- No force pushes. No new repos. No probe v2 features (video audits, PDF + export, multi-engine, GHL integration are deliberately out of scope). +- The stochastic scores are the product, not a bug to fix. + +## Report back to Brandon (he relays it to the cloud Claude session) + +Have Brandon paste this block, filled in, to Claude: + +``` +Phase 4 results: +- Smoke run: +- Businesses (name / trade / town / score / run-id): + 1..5 +- Direction verdict: /5 match Brandon's read → +- Calibration: franchise , new-biz +- Web UI check: +- Trades list: +- Skills installed: ; README validation: +``` + +Claude then journals the results and updates the build-phase plan. If +Phase 4 PASSES, the probe is cleared for customer baselines and the next +gate is Brandon's territory decision (B1) and the GHL funnel (B2). From 75a598a16fe89786fa9acad771d32be82e94b3f2 Mon Sep 17 00:00:00 2001 From: Claude Date: Sun, 9 Aug 2026 20:17:29 +0000 Subject: [PATCH 02/14] Direction lock: Lehi sprint plan, revised plan and Codex handoff, canonical handoff Applies Brandon's confirmed decisions: wedge->ladder->referral flywheel; door demo is subscription ChatGPT on the prospect's phone; the paid API probe becomes a deferred internal proof lane (no key, no paid calls this phase); territory Lehi, Utah. Revises the build plan and Codex handoff accordingly (probe calibration no longer the launch gate; skills install deduplicated to the canonical ~/Projects/skills store), adds the Lehi 20-door sprint plan with the door-demo procedure and pass/fail evidence, fixes the one honesty violation on the price card, records probe state (main 450f25d, gpt-5.6-terra, 8/8 tests), and issues the 2026-08-09 canonical handoff superseding 8/7. Co-Authored-By: Claude Fable 5 Claude-Session: https://claude.ai/code/session_017SgKh5sTzx4rjanwEAXtfc --- handoffs/2026-08-08-codex-phase4-handoff.md | 219 +++++++++----------- handoffs/2026-08-09-guild-handoff.md | 95 +++++++++ journal/2026-08-09-direction-lock.md | 65 ++++++ plans/2026-08-08-build-phase-plan.md | 119 +++++------ plans/2026-08-09-lehi-learn-sprint.md | 125 +++++++++++ playbooks/price-card-print.html | 2 +- 6 files changed, 442 insertions(+), 183 deletions(-) create mode 100644 handoffs/2026-08-09-guild-handoff.md create mode 100644 journal/2026-08-09-direction-lock.md create mode 100644 plans/2026-08-09-lehi-learn-sprint.md diff --git a/handoffs/2026-08-08-codex-phase4-handoff.md b/handoffs/2026-08-08-codex-phase4-handoff.md index 2bd2baf..4a489fb 100644 --- a/handoffs/2026-08-08-codex-phase4-handoff.md +++ b/handoffs/2026-08-08-codex-phase4-handoff.md @@ -1,111 +1,79 @@ --- date: 2026-08-08 +revised: 2026-08-09 (direction lock — Phase 4 deferred, missions reordered) type: handoff project: the-guild audience: codex (local session on Brandon's Mac) -task: Phase 4 reality check + trades review + skills install +task: Lehi trades list + skills dedupe now; probe calibration DEFERRED until first close from: claude.ai/code remote session (build-phase session) -supersedes: handoffs/2026-08-08-codex-repo-seed-handoff.md (seed mission COMPLETE at 450f25d) +supersedes: handoffs/2026-08-08-codex-repo-seed-handoff.md (seed mission COMPLETE) --- -# HANDOFF → CODEX #2 — Phase 4 + Mac-side lane — 2026-08-08 - -You are the local agent with Brandon's credentials and his Mac. Your seed -mission is complete (guild-visibility-probe pushed at `450f25da`, 4/4 tests). -This handoff is your next work order. It is self-contained: you cannot read -the Guild's workspace repo (different GitHub account), so everything you -need is in this file or in the probe repo you CAN reach. - -## Context in five sentences - -The Guild sells local businesses a **measured appearance rate** in AI -answers — "named in X of 10 asks" — never a guaranteed ranking. The probe -you seeded is the measurement instrument; it has never run against the live -OpenAI API. Your Mission 1 is the Phase 4 reality check that proves the -instrument tells the truth. Missions 2–3 are small: adjust the trades list -with Brandon, and install three skills into the local skills directories. -Everything you do is reported back to Brandon, who relays to the cloud -Claude session for journaling — you two cannot see each other's repos. - -## Operating facts - -- Repo: `brandonwadepackard-cell/guild-visibility-probe`, branch `main`. - `git pull` before starting — do not assume your clone is current. -- Engine: OpenAI **Responses API** with the `web_search` tool - (`probe/engine.py`); extraction pass is a second, cheap call. Model via - `OPENAI_MODEL` env (default `gpt-4o-mini`), samples via - `SAMPLES_PER_RUN` (default 10), `DAILY_RUN_LIMIT` (default 50) is the - accident brake. Cost ≈ ten search asks + ten tiny extractions per - report — well under $1. -- Storage: SQLite, append-only by design. There is deliberately no code - path that edits or deletes a saved run. Do not add one. - -## The four integrity rules (never weaken these, even to make a run pass) - -1. **Search-on, always.** Every ask goes through web search. Bare-model - answers are stale and would never reflect fix work. -2. **No partial runs, no deletions, no cherry-picking.** A run with any - failed sample is invalid, and stays saved as invalid. -3. **Apples to apples.** Re-runs reuse the baseline's exact question, - model, and sample count automatically. Model changes get footnoted. -4. **Humans backstop name matching.** A false "0 of 10" from a name - mismatch is the worst failure; raw answers stay visible, corrections - are append-only overrides. - -If the OpenAI API surface has drifted since build (tool naming, response -shape), fix forward in normal commits with clear messages — never by -loosening a rule. Push fixes to `main` and record the SHAs for the report. - -## MISSION 1 — Phase 4 reality check (PRE-AUTHORIZED by Brandon) - -Setup: -1. `git pull` → fresh venv → `pip install -r requirements.txt` → - `python -m pytest tests/ -v` (expect 4 passed). -2. `cp .env.example .env`; ask Brandon to paste his billing-enabled - `OPENAI_API_KEY`. The key lives ONLY in `.env` (gitignored). Never - commit it, never echo it into logs or output. -3. Smoke run ONE business first (any real local business Brandon names): - `python cli.py "Business Name" trade "Town, ST"`. If it errors, this is - where API drift shows up — fix forward, re-run, commit. - -The check (after smoke passes): -4. Ask Brandon for **5 real businesses he personally knows** — name, - trade, town + state. Spread across trades if possible. -5. Run each once. Record every run ID and score. -6. **Direction verification with Brandon:** for each business, ask him - "does this score point the same direction as reality?" (a business he - knows is well-known should score high; obscure should score low). - PASS = same direction on **≥4 of 5**. -7. **Calibration pair:** run a known national franchise location (should - score HIGH) and a brand-new/tiny business (should score ~0). Both - behaving = the instrument isn't just noise. -8. While you're in there: have Brandon click through the web UI once - (`uvicorn app:app --reload`, passcode from `.env`) — report page loads, - raw answers visible, manual-correction flow works. - -Rules during runs: no re-rolling a run because the number looks wrong -(that IS the data — AI answers are stochastic; frequency is the product). -If a sample fails mid-run, the run marks invalid — diagnose, fix, run -again as a NEW run. All runs stay in the database. - -## MISSION 2 — Trades list review (plan item A3, with Brandon) - -`probe/questions.yaml` ships with 10 starter trades (plumber, hvac, -roofer, electrician, landscaper, pest_control, dentist, chiropractor, -restaurant, barber). With Brandon, add/cut for his chosen territory. One -line per trade; the question must always include `{town}` and read like a -real customer ask ("Who should I call for a plumber in {town}?" — town -values always include the state). Commit and push the edited list. - -## MISSION 3 — Install the three mined skills (standing lane) - -Create one folder per skill in `~/.claude/skills/` AND `~/.codex/skills/` -(both, if both exist on this Mac), file named `SKILL.md`, exact contents -below. After installing, validate `appearance-rate-probe` against the -probe repo's README — they should agree; if they don't, the README wins -and report the discrepancy. - -### ~/.claude/skills/appearance-rate-probe/SKILL.md +# HANDOFF → CODEX #2 (revised) — Mac-side lane — 2026-08-09 + +You are the local agent with Brandon's credentials and his Mac. Seed +mission complete. This revision reflects Brandon's locked direction of +2026-08-09 — read the DEFERRED section carefully: the API calibration +that was previously Mission 1 is **no longer the next gate**. + +## Direction lock (Brandon's authority — do not reopen) + +- The first-door demo is **ordinary subscription ChatGPT on the + prospect's phone**. The paid Responses-API probe is a separate INTERNAL + baseline/proof lane, not a pre-door blocker. +- **Do not request an API key. Do not make paid API calls.** The probe + lane activates at the first close, or when Brandon explicitly says so. +- First learn-sprint territory: **Lehi, Utah**. +- Approved playbook and price tiers stand; invent no new scripts, tiers, + legal architecture, or automation. + +## Probe state of record (confirmed by Brandon, 2026-08-09) + +- Repo: `brandonwadepackard-cell/guild-visibility-probe`, `main` at + `450f25da0f049f84f96d93ef6460be27e5375a1c`. +- Default model: `gpt-5.6-terra`. Tests: **8/8 passing**. +- The search-required and invalid-run protections are load-bearing + doctrine. **Do not revert or weaken them** — not for convenience, not + to make a future run pass, not in any refactor. + +## MISSION 1 — Lehi trades list (do now, with Brandon) + +`git pull` first. Tune `probe/questions.yaml` to the Lehi first wave +(see cohort table in the workspace repo's +`plans/2026-08-09-lehi-learn-sprint.md`; Brandon can read it to you — +you cannot reach that repo): + +- Priority 1: hvac, plumber, electrician +- Priority 2: sprinkler/landscaper, pest_control, garage_door +- Priority 3: roofer, auto_repair, barber +- Hold for wave two: dentist, chiropractor, restaurant (keep the lines, + they cost nothing — just ensure wave-one trades are all present). + +One line per trade; question must read like a real customer ask and +include `{town}`; town values always carry the state ("Lehi, UT"). +Commit and push. This costs zero API calls — it's a YAML edit. + +## MISSION 2 — Skills install, deduplicated (do once) + +On this Mac, `~/.claude/skills` and `~/.codex/skills` both point to the +same canonical store: **`~/Projects/skills`**. Therefore: + +- Install each skill ONCE into `~/Projects/skills//SKILL.md`. + Never write separate copies into the two pointer paths — that creates + the duplicate problem this instruction exists to prevent. +- Before installing, check whether a skill of the same name already + exists in the canonical store; if so, reconcile (newest doctrine wins, + note what changed) rather than blindly overwrite. +- After installing, run the canonical backup workflow for + `~/Projects/skills` (the store's established backup routine on this + Mac). Any future skill work follows this same pattern: canonical + store, dedupe once, backup. + +The three skills, exact contents (validate `appearance-rate-probe` +against the probe repo README after install — if they disagree, the +README wins; report the discrepancy): + +### ~/Projects/skills/appearance-rate-probe/SKILL.md ```markdown --- @@ -154,7 +122,7 @@ Turn "what does AI say about this business" into an honest, sellable, repeatable - Never guarantee a ranking, placement, or specific score. ``` -### ~/.claude/skills/four-elements-sales-scripts/SKILL.md +### ~/Projects/skills/four-elements-sales-scripts/SKILL.md ```markdown --- @@ -200,7 +168,7 @@ product; the Guild is just a user). Drill until the Water callback close and the Fire silence-after-demo are muscle memory. ``` -### ~/.claude/skills/cold-outreach-legality-gate/SKILL.md +### ~/Projects/skills/cold-outreach-legality-gate/SKILL.md ```markdown --- @@ -239,31 +207,34 @@ stale. Capture consent language at every intake point; keep records 4+ years. entering a new state. ``` -## Rules (all missions) +## DEFERRED — probe calibration + customer baselines (do NOT start) + +Previously "Phase 4." It activates ONLY when Brandon says "first close" +or explicitly triggers the probe lane. Until then: no `.env` key, no +paid calls, no calibration runs. When activated, the protocol is: +smoke run one business → five known businesses hand-verified with +Brandon (≥4/5 same direction) → franchise-high / new-biz-zero +calibration pair → web UI click-through → then the first real customer +baseline within the week promised at the close. Integrity rules +(search-on, no partial runs, append-only, locked baselines) apply +unchanged; fix API drift forward in normal commits, never by weakening +a rule. Stochastic scores are the product, not a bug. -- Never commit `.env`, keys, or passcodes. Never echo the key. -- Only touch `brandonwadepackard-cell/guild-visibility-probe` and the local - skills directories. Nothing under `abcnuts` (you can't reach it anyway). -- No force pushes. No new repos. No probe v2 features (video audits, PDF - export, multi-engine, GHL integration are deliberately out of scope). -- The stochastic scores are the product, not a bug to fix. +## Rules (all missions) -## Report back to Brandon (he relays it to the cloud Claude session) +- Never commit `.env`, keys, or passcodes. +- Only touch `brandonwadepackard-cell/guild-visibility-probe` and + `~/Projects/skills`. Nothing under `abcnuts` (unreachable anyway). +- No force pushes. No new repos. No probe v2 features. -Have Brandon paste this block, filled in, to Claude: +## Report back to Brandon (he relays to the cloud Claude session) ``` -Phase 4 results: -- Smoke run: -- Businesses (name / trade / town / score / run-id): - 1..5 -- Direction verdict: /5 match Brandon's read → -- Calibration: franchise , new-biz -- Web UI check: -- Trades list: -- Skills installed: ; README validation: +Mac lane results: +- Trades list: +- Skills: ; dedupe check: ; backup workflow: ; + README validation: +- Probe lane: NOT activated (per direction lock) | activated by Brandon + on : ``` - -Claude then journals the results and updates the build-phase plan. If -Phase 4 PASSES, the probe is cleared for customer baselines and the next -gate is Brandon's territory decision (B1) and the GHL funnel (B2). diff --git a/handoffs/2026-08-09-guild-handoff.md b/handoffs/2026-08-09-guild-handoff.md new file mode 100644 index 0000000..b69df0f --- /dev/null +++ b/handoffs/2026-08-09-guild-handoff.md @@ -0,0 +1,95 @@ +--- +date: 2026-08-09 +type: handoff +project: the-guild +status: active +from: claude.ai/code remote session (build-phase + direction-lock session) +supersedes: handoffs/2026-08-07-guild-handoff.md +--- + +# HANDOFF — The Guild — 2026-08-09 (canonical) + +Read this cold and you can continue. Everything below is verified state +or Brandon's explicit decision — receipts cited per line. + +## 1. Mission state in one paragraph + +The Guild sells local businesses measure → improve → prove: a measured +AI appearance rate, the fix work, and a before/after report — guaranteeing +only the work and the report, never placement or score. The business shape +is wedge → ladder → referral flywheel; the small offer is customer +acquisition. Strategy is CLOSED, the toolchain is BUILT, and the next +actions are physical: GHL funnel build, card printing, and the first +20-door learn sprint in **Lehi, Utah**. The door demo is ordinary +subscription ChatGPT on the prospect's own phone; the paid API probe is +an internal proof lane that activates at the first close — until then no +API key, no paid calls. + +## 2. State of assets (receipts) + +| Asset | Where | State | +|---|---|---| +| Probe MVP | `brandonwadepackard-cell/guild-visibility-probe` `main` @ `450f25da0f049f84f96d93ef6460be27e5375a1c` | live; default `gpt-5.6-terra`; 8/8 tests (Brandon-confirmed 2026-08-09); search-required + invalid-run protections intact | +| Journals, handoffs, playbook, plans | `abcnuts/claude-code-workspace` `main` @ `e0d801b` + PR #6 (draft, unmerged) | durable custody | +| Fulfillment playbook v1 + price tiers | `playbooks/fulfillment-playbook-v1.md` | **approved** by Brandon | +| Build plan (revised) | `plans/2026-08-08-build-phase-plan.md` | active | +| Lehi sprint plan | `plans/2026-08-09-lehi-learn-sprint.md` | ready-when-funnel-live | +| GHL build sheet + consent language | `playbooks/ghl-funnel-build-sheet.md` | ready to execute | +| Price card (honesty-fixed) | `playbooks/price-card-print.html` + artifact 9302a24e-24a1-48b2-8e29-aa83476edcea | print-ready minus phone/QR | +| One-pager v2 / Script Book v1 | artifacts d51a71b4… / c6c4dfb3… | live (from 8/7) | +| Codex Mac work order | `handoffs/2026-08-08-codex-phase4-handoff.md` (revised) | trades list + skills dedupe now; probe lane deferred | + +## 3. Locked decisions (authority: Brandon, 8/7 + 8/9 — do not reopen) + +- Wedge → ladder → referral flywheel; small offer = acquisition. +- Door demo = subscription ChatGPT, prospect's phone, live. Probe = internal + proof lane, activates at first close. No key/no paid calls until then. +- Prices $497 / $997 / $149-mo, fee credits toward month one. Approved. +- Territory: Lehi, Utah. +- Promise language: measure → improve → prove; the no-guarantee line is + doctrine. Customer-facing text never says or implies "we make AI say + your name," guaranteed placement, or guaranteed score. +- Channels: humans open cold doors; AI touches only consented contacts; + never AI voice/SMS/RVM on cold lists. Voice = rent (GHL $97 inbound). +- FLEXX separate. No new scripts, tiers, legal architecture, or + automation beyond what's approved. +- Mac skills: canonical store `~/Projects/skills` (both skill dirs point + there); dedupe once; canonical backup workflow. + +## 4. Next actions (all Brandon's world; docs are ready) + +1. **GHL funnel build** — follow `playbooks/ghl-funnel-build-sheet.md`; + buy a Utah (801/385) number; pass the 5-step test incl. the + unchecked-box negative test. +2. **Print cards** — drop the new Guild line + QR into the card, print. +3. **Joey dry run** — lanes 1–3 + 5 on a friendly business, timed. +4. **Lehi sprint** — 20 doors per `plans/2026-08-09-lehi-learn-sprint.md`. + Output: close-rate by cohort + complete objection log in GHL. +5. Crew decisions before first dollar: rev split, referral reward. + +## 5. Unavoidable blockers (only these) + +GHL login (funnel) · print shop + payment (cards) · physical doors +(sprint) · Brandon's crew (splits). Nothing is blocked on cloud sessions, +Codex, repos, or API billing. + +## 6. Session-type capabilities (learned the hard way, still true) + +- Cloud Claude authenticates GitHub as `abcnuts`; cannot create repos + (403 by platform design), cannot reach `brandonwadepackard-cell` repos; + mid-session repo attach, Drive writes, send_later are approval-walled. +- Codex on the Mac holds Brandon's credentials: it owns the probe repo + and `~/Projects/skills`. +- Handoffs between the two travel through Brandon (chat file drops + + this repo). + +## 7. Re-entry points (say one of these to a Claude session) + +1. **"GHL is live"** → verify test protocol results, journal, clear N1. +2. **"Sprint results: …"** (+ GHL export) → mine objections, pricing + verdict, script edits by panel ID, wave-two cohorts. +3. **"First close"** → activate the probe lane: Codex calibration + protocol + customer baseline within the week. + +Recommended next move: N1, the GHL build — every other lane queues +behind the phone number. diff --git a/journal/2026-08-09-direction-lock.md b/journal/2026-08-09-direction-lock.md new file mode 100644 index 0000000..7a3a261 --- /dev/null +++ b/journal/2026-08-09-direction-lock.md @@ -0,0 +1,65 @@ +--- +date: 2026-08-09 +type: log +project: the-guild +status: source +tags: +- type/log +- project/the-guild +- direction-lock +--- + +# 2026-08-09 — Direction Lock — Brandon's Confirmed Decisions + +Brandon confirmed the governing direction. These carry decision authority; +do not reopen. + +## Locked + +1. **Business shape:** wedge → ladder → referral flywheel. The small offer + is customer acquisition, not the whole business. +2. **Door demo = ordinary subscription ChatGPT on the prospect's phone,** + live in front of them. The paid Responses-API probe is a separate + INTERNAL baseline/before-after proof lane. It is NOT a pre-door + blocker. No API key requests and no paid API calls in this phase — + the probe lane activates at first close or on Brandon's explicit + trigger. +3. Fulfillment playbook v1 and price tiers ($497/$997/$149-mo): approved. +4. First learn-sprint territory: **Lehi, Utah.** + +## Corrections applied this session (receipts) + +- `plans/2026-08-08-build-phase-plan.md` revised: Phase 4 API calibration + removed as launch gate → deferred lane; territory recorded; gating + items now GHL build → cards → dry run → Lehi sprint. +- `plans/2026-08-09-lehi-learn-sprint.md` created: first-wave scope, + trade cohorts, ChatGPT-on-their-phone demo procedure with honest + handling of both outcomes, GHL recording spec (adds demo_result + field), pass/fail evidence after 20 doors. +- `handoffs/2026-08-08-codex-phase4-handoff.md` revised: missions + reordered (Lehi trades list, then skills), Phase 4 explicitly + DEFERRED with no-key/no-paid-calls rule, duplicate skill install + removed — canonical store is `~/Projects/skills` (both + `~/.claude/skills` and `~/.codex/skills` point there); install once, + reconcile on conflict, run the canonical backup workflow. +- `playbooks/price-card-print.html`: "We work to make it yours" → + "We measure where you stand, do the work, and prove what changed" + (honesty rule: measure → improve → prove; guarantee only the work and + the report). Artifact republished at the same URL. Repo-wide scan + found no other customer-facing violations. + +## Probe state of record (per Brandon, 2026-08-09) + +`brandonwadepackard-cell/guild-visibility-probe`, `main` at +`450f25da0f049f84f96d93ef6460be27e5375a1c`, default model +`gpt-5.6-terra`, tests 8/8 passing. Search-required and invalid-run +protections intact and to remain so. + +## Next actions (in order) + +1. GHL funnel build (Brandon + build sheet) — the gating item. +2. Price card print once the Guild line exists. +3. Joey dry run (lanes 1–3 + 5, timed). +4. Lehi 20-door sprint per the sprint plan. + +Not next: OpenAI billing, probe calibration, new scripts/tiers/automation. diff --git a/plans/2026-08-08-build-phase-plan.md b/plans/2026-08-08-build-phase-plan.md index 58b2a6f..6f41064 100644 --- a/plans/2026-08-08-build-phase-plan.md +++ b/plans/2026-08-08-build-phase-plan.md @@ -1,82 +1,85 @@ --- date: 2026-08-08 +revised: 2026-08-09 (direction lock — Brandon's confirmed decisions) type: plan project: the-guild status: active -horizon: through first learn sprint (~Aug 22) -evidence: journal/2026-08-08-ai-visibility-sweep-synthesis.md, handoffs/2026-08-07-guild-handoff.md +horizon: through first Lehi learn sprint +evidence: journal/2026-08-08-ai-visibility-sweep-synthesis.md, journal/2026-08-09-direction-lock.md --- -# Guild Build-Phase Plan — 2026-08-08 +# Guild Build-Phase Plan — revised 2026-08-09 -Everything left between today and the first close-rate data. Three phases, -each with owners and pass/fail gates. Doctrine: sell the odds, prove the -delta, never promise the coin flip. +Doctrine: sell the odds, prove the delta, never promise the coin flip. +Customer-facing language is measure → improve → prove; we guarantee only +the work and the report. -## Phase A — Prove the probe (this weekend, Aug 8–10) +## Locked by Brandon, 2026-08-09 (do not reopen) + +1. **Business shape:** wedge → ladder → referral flywheel. The small offer + is customer acquisition, not the whole business. +2. **The door demo is ordinary subscription ChatGPT on the prospect's own + phone**, live. The paid Responses-API probe is a separate INTERNAL + baseline/before-after proof lane — it is NOT a pre-door blocker, and no + API key is requested and no paid API calls are made in this phase. +3. Fulfillment playbook v1 and the $497/$997/$149-mo tiers: approved as-is. +4. **First learn-sprint territory: Lehi, Utah.** + +## NOW — build the machine (gating items, in order) | # | Item | Owner | Gate | |---|------|-------|------| -| A1 | Merge PR #4 (sweep + playbook + this plan) | Brandon | merged | -| A2 | Phase 4 reality check via Codex: key into `.env`, 5 real businesses, phone verification | Brandon + Codex | ≥4/5 same direction as phone; franchise scores high; new business ~0 | -| A3 | Review the 10 starter trades in `probe/questions.yaml`; add/cut for our market | Brandon | list matches territory plan | +| N1 | GHL sealed funnel per `playbooks/ghl-funnel-build-sheet.md` — AI Employee inbound, consent capture, speed-to-lead. Buy a Utah (801/385) number | Brandon | 5-step test protocol passes, incl. the unchecked-box negative test | +| N2 | Price card print — fill Guild line + QR from N1 into `playbooks/price-card-print.html`, then print | Brandon | cards in hand | +| N3 | Joey dry run: playbook lanes 1–3 + 5 on one friendly business, timed (Step 0's probe baseline is deferred with the probe lane) | Joey + Brandon | checklist done once; hours-per-client written down | +| N4 | Crew decisions: rev split across the seven; referral reward now vs later — the flywheel needs the referral answer | Brandon + crew | decided before first outside dollar | -If Phase 4 fails calibration: Codex fixes forward (API drift is the likely -cause) — integrity rules are never loosened to make a run pass. Report the -five scores back to a Claude session for journaling either way. +## SPRINT — Lehi, Utah (when N1 + N2 pass) -## Phase B — Build the machine (week of Aug 11) +Full sprint plan: `plans/2026-08-09-lehi-learn-sprint.md` — first-wave +scope, trade cohorts, the ChatGPT-on-their-phone demo procedure, GHL +recording spec, and pass/fail evidence after the first reps. -| # | Item | Owner | Gate | -|---|------|-------|------| -| B1 | **Territory decision** — pick the starting town(s). Blocks C entirely; decide by Mon Aug 11 | Brandon | named territory written down | -| B2 | GHL sealed funnel: AI Employee ($97/mo) inbound on the Guild line; consent language on every form/QR; <60s callback on consented leads | Brandon | test call answered + booking lands + consent stored | -| B3 | Price card print: $497/$997/$149-mo, fee-credit mechanic, honest-line footer (content locked since 8/7) | Brandon | cards in hand | -| B4 | Playbook dry run: Joey reads playbook v1, then Step 0 + Lanes 1–3 + 5 on one friendly business, timing each lane | Joey + Brandon | full checklist done once; hours-per-client number written down | -| B5 | Crew decisions: rev split across the seven; referral reward now vs later | Brandon + crew | decided before first outside dollar | - -The B4 timing number matters: it converts the playbook into capacity math -(clients per week Joey can fulfill) before we promise anything at doors. - -## Phase C — Learn sprint (week of Aug 17, or when A2 + B1–B3 pass) - -- 20-door week in the chosen territory. Cohorts: 10 doors pitched at $497, - 10 at $997. Element read on every doorstep; scripts by the book; every - objection logged in GHL with the door's element. -- Every close: consent captured on the spot → funnel takes over; baseline - probe run same day → proof clock starts. -- Output (the whole point): close-rate by price point + objection log. - This is data nobody else in the market has. It confirms or resets pricing, - and the objections feed script edits by panel ID. - -## Standing lane (parallel, no deadline) - -- Install the three mined skills on the Mac (`appearance-rate-probe` first, - then `four-elements-sales-scripts`, `cold-outreach-legality-gate`). -- 90-day re-probe calendar reminders — starts with customer #1. -- Account consolidation (`abcnuts` vs `-cell`) — someday; needs `abcnuts` - credentials; blocks nothing. -- Clinics vertical — parked until door data exists (AI hedges health - queries; entry route is the directory layer). +## DEFERRED LANE — internal probe (activates at first close) + +The probe repo is live and healthy: `brandonwadepackard-cell/ +guild-visibility-probe`, `main` at `450f25da0f049f84f96d93ef6460be27e5375a1c`, +default model `gpt-5.6-terra`, tests 8/8 (state confirmed by Brandon +2026-08-09). Search-required and invalid-run protections stay as-is. + +- Trigger: **first close** (a customer baseline is the first real need) or + Brandon explicitly activating it. Not before. +- Until then: no API key requests, no paid API calls, no calibration gate. +- When triggered: Codex runs the calibration + first baselines per + `handoffs/2026-08-08-codex-phase4-handoff.md` (revised). + +## Standing lane (no deadline) + +- Codex Mac lane: Lehi trades list in `questions.yaml`; skills dedupe — + ONE canonical install into `~/Projects/skills` (both skill dirs point + there), canonical backup workflow, no duplicate copies. +- 90-day re-probe reminders — starts with customer #1. +- Account consolidation (`abcnuts` vs `-cell`) — someday; blocks nothing. +- Clinics vertical — parked until door data exists. ## Ownership map -- **Brandon:** merges, decisions (territory, splits, referral), GHL build, - print, doors. -- **Joey:** fulfillment playbook mastery + dry run + capacity number. -- **Codex (Mac):** Phase 4 run; probe fixes if API drifted. -- **Claude sessions:** journaling, research sweeps on demand, script-book - edits by panel ID, next-session continuity. Cannot: create repos, touch - `-cell` account, run the probe (no key in cloud). +- **Brandon:** GHL build, number purchase, print, crew decisions, doors. +- **Joey:** playbook mastery, dry run, capacity number, fulfillment. +- **Codex (Mac):** trades list, skills dedupe; probe lane when activated. +- **Claude sessions:** journaling, sweeps on demand, doc/plan upkeep, + continuity. Cannot: GHL login, printing, doors, `-cell` repo access. ## Not in this plan, on purpose -DIY voice stack · AI voice/SMS/RVM to cold lists (legality gate) · schema -"magic" and ranking guarantees (evidence: sweep) · probe v2 features · -FLEXX work · clinics · account consolidation · new tooling purchases. +DIY voice stack · AI voice/SMS/RVM to cold lists (legality gate) · +schema "magic" or any guaranteed-placement language · new scripts, tiers, +legal architecture, or automation beyond what is approved · probe v2 +features · FLEXX work · clinics · account consolidation · new tooling. ## Re-entry points for the next session -1. "Phase 4 results: …" → journal the scores, update this plan. -2. "Territory is X" → finalize trades list, sprint checklist. -3. "Sprint done" → skill-mine the objection log; pricing verdict. +1. "GHL is live" → verify N1 test protocol results, journal it. +2. "Sprint results: …" → mine the objection log; pricing verdict. +3. "First close" / "activate the probe lane" → probe calibration + + customer baseline flow via Codex. diff --git a/plans/2026-08-09-lehi-learn-sprint.md b/plans/2026-08-09-lehi-learn-sprint.md new file mode 100644 index 0000000..21bdc91 --- /dev/null +++ b/plans/2026-08-09-lehi-learn-sprint.md @@ -0,0 +1,125 @@ +--- +date: 2026-08-09 +type: sprint-plan +project: the-guild +status: ready-when-funnel-live +territory: Lehi, Utah +prerequisites: GHL funnel live (N1), cards printed (N2) +--- + +# Lehi Learn Sprint — First-Wave Plan + +Twenty doors in Lehi, Utah. The output is data: close-rate by price point +and the objection log. Doctrine on every doorstep: measure → improve → +prove; guarantee only the work and the report. + +## Why Lehi plays differently (walk in knowing this) + +Lehi sits in Utah County — the home turf of the American door-to-door +industry (pest control, alarms, solar all recruit and sell here). Two +consequences: + +1. **Owners are pitch-literate.** Expect a high share of WATER reads + (been-burned, arms crossed) and fast pattern-matching to "another + door guy." The honest no-guarantee line is the pattern-break — lead + with what we won't promise sooner than the script book's default. +2. **Fast-growth market.** New rooftops and new businesses every quarter + mean AI answers churn — being measured beats being established. That's + the FIRE/AIR angle for newer shops competing with legacy names. + +## First-wave scope + +- **20 doors, one week.** Cohorts locked: 10 pitched at $497, 10 at $997, + assigned by alternating door BEFORE the knock — never by the driveway. +- Geography: Lehi city proper — Main Street / State Street corridor for + storefronts, plus the trades' shops and yards off Pioneer Crossing and + SR-92 approaches. Skip Silicon Slopes office towers — wrong buyer. +- Every door logged, including no-answers. The dataset only works + complete — same integrity rule as everything else. + +## Trade cohorts (first wave) + +Home services first — highest "who do I call" AI-query fit, dense in +Utah County, owner reachable at the shop: + +| Priority | Trades | Why | +|---|---|---| +| 1 | HVAC · plumbing · electrical | Emergency "who do I call" queries; hot/cold climate; owner-operated shops | +| 2 | Sprinkler/landscape · pest control · garage door | Utah-dense trades; seasonal urgency now (August) | +| 3 | Roofing · auto repair · barber | Roofers post-storm; walk-in retail for demo practice | + +Dentists/chiropractors/restaurants: hold for wave two — clinic-adjacent +AI hedging and lunch-rush timing complicate the first reps. (Trades list +in `probe/questions.yaml` gets tuned to this table — Codex Mac lane.) + +## The door demo — ChatGPT on THEIR phone (locked procedure) + +The demo is ordinary subscription ChatGPT, live, their thumbs. No API, +no probe, no staging. Best case their phone; Brandon's phone is the +fallback if they won't install or don't have it. + +1. Element read first 30 seconds (script book governs the pitch itself). +2. Ask permission: "Grab your phone — I want to show you something about + your business, takes 45 seconds." +3. They open ChatGPT (App Store install if needed and they're willing; + otherwise fallback phone). Web search on if the toggle is visible. +4. **They type or dictate:** "Who should I call for a [their trade] in + Lehi, Utah?" — their trade, exact wording, their thumbs on the send. +5. Read the answer together, out loud, whatever it says. + +Handling the two outcomes — honestly, per doctrine: + +- **They're not in the answer:** "That's who's getting the call instead + of you. And here's the honest part — one ask is one flip of the coin. + We measure it properly: ten separate asks, counted. Then we do the + work, measure again in ninety days, and you hold both reports." +- **They ARE in the answer:** "Good — today's flip went your way. It + doesn't always; the answer changes ask to ask. We measure the real + rate, and the monthly plan is how you stay there as this stuff moves." + +Forbidden at the door: re-rolling the demo until it "shows the right +thing" · promising the demo will or won't show anyone · any wording that +implies we make the AI say their name or guarantee placement or score. +The demo shows what the AI says today; the offer is measure → improve → +prove. + +## What to record in GHL (per door, 60 seconds, in the truck) + +Fields per `playbooks/ghl-funnel-build-sheet.md` appendix, plus one: + +- door_element (Fire/Earth/Water/Air/unread) · price_cohort ($497/$997) +- outcome (closed / callback set / soft no / hard no / no answer) +- **demo_result: appeared / didn't appear / no-recommendation / not shown** +- objection_1 (dropdown) + objection_verbatim (their exact words) +- demo_shown (y/n) · notes + +## On a close + +- Consent captured at the table (the funnel's verbatim checkbox — their + thumb checks it). Funnel takes over from there. +- Fulfillment starts per approved playbook v1. The internal probe + baseline is part of the proof lane — **first close is what activates + that lane** (Brandon triggers it; until then no API key, no paid calls). + Promise the customer a measured baseline "within the week," which the + activated lane comfortably meets. + +## Pass/fail evidence after the first reps + +Hard gate (sprint validity): **all 20 doors logged, complete fields** — +an incomplete dataset is an invalid run, same as the probe. + +Read after 20 doors (learn gates, not success guarantees): + +- **Demo lands:** demo_shown on ≥50% of real conversations (door answered, + owner present). Below that → the ask-permission line needs work before + more doors, not more doors. +- **Offer signal:** ≥3 sit-downs booked or ≥1 close across 20 doors → + continue to the next 20 at the same prices. Zero sits AND zero closes → + stop, mine the objection log with a Claude session before spending + more doors. +- **Cohort read:** close/sit rate by $497 vs $997 cohort + objection mix + by element → the pricing verdict input. 20 doors is a small sample; + treat differences as direction, not proof — the next 20 confirm. + +Bring "Sprint results: …" with the GHL export to a Claude session and it +gets mined: pricing verdict, script edits by panel ID, wave-two cohorts. diff --git a/playbooks/price-card-print.html b/playbooks/price-card-print.html index b5b1320..e5b48a5 100644 --- a/playbooks/price-card-print.html +++ b/playbooks/price-card-print.html @@ -139,7 +139,7 @@

Same question, ten asks, 90 days later. Two reports side by side. You keep both.

-
45% of people now ask AI to find local businesses — up from 6% a year ago. The AI recommends about 1 business in 50. We work to make it yours.
+
45% of people now ask AI to find local businesses — up from 6% a year ago. The AI recommends about 1 business in 50. We measure where you stand, do the work, and prove what changed.
The Guild
From 86bbc10049940b7fb2d12c8ec7eba16cda21b4d4 Mon Sep 17 00:00:00 2001 From: Claude Date: Sun, 9 Aug 2026 20:23:26 +0000 Subject: [PATCH 03/14] Verification corrections: two door-script lines, skills install removed from launch scope MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Door script no longer overclaims causation from one answer or implies a visibility guarantee. Skill creation/install is removed from the Codex work order and canonical handoff as a launch item — the mined skills are deferred reference only in the skill-mining register; the canonical ~/Projects/skills store rule stands for future skill work only. Co-Authored-By: Claude Fable 5 Claude-Session: https://claude.ai/code/session_017SgKh5sTzx4rjanwEAXtfc --- handoffs/2026-08-08-codex-phase4-handoff.md | 187 +++----------------- handoffs/2026-08-09-guild-handoff.md | 9 +- journal/2026-08-09-direction-lock.md | 24 ++- plans/2026-08-08-build-phase-plan.md | 7 +- plans/2026-08-09-lehi-learn-sprint.md | 8 +- 5 files changed, 57 insertions(+), 178 deletions(-) diff --git a/handoffs/2026-08-08-codex-phase4-handoff.md b/handoffs/2026-08-08-codex-phase4-handoff.md index 4a489fb..0a7dfc2 100644 --- a/handoffs/2026-08-08-codex-phase4-handoff.md +++ b/handoffs/2026-08-08-codex-phase4-handoff.md @@ -1,10 +1,10 @@ --- date: 2026-08-08 -revised: 2026-08-09 (direction lock — Phase 4 deferred, missions reordered) +revised: 2026-08-09 (direction lock + verification follow-up — skills install removed, Phase 4 deferred) type: handoff project: the-guild audience: codex (local session on Brandon's Mac) -task: Lehi trades list + skills dedupe now; probe calibration DEFERRED until first close +task: Lehi trades list now; skills and probe calibration DEFERRED from: claude.ai/code remote session (build-phase session) supersedes: handoffs/2026-08-08-codex-repo-seed-handoff.md (seed mission COMPLETE) --- @@ -13,8 +13,9 @@ supersedes: handoffs/2026-08-08-codex-repo-seed-handoff.md (seed mission COMPLET You are the local agent with Brandon's credentials and his Mac. Seed mission complete. This revision reflects Brandon's locked direction of -2026-08-09 — read the DEFERRED section carefully: the API calibration -that was previously Mission 1 is **no longer the next gate**. +2026-08-09: exactly ONE active mission (the Lehi trades list). The API +calibration and the skill installs are both DEFERRED — read those +sections before doing anything beyond Mission 1. ## Direction lock (Brandon's authority — do not reopen) @@ -23,6 +24,8 @@ that was previously Mission 1 is **no longer the next gate**. baseline/proof lane, not a pre-door blocker. - **Do not request an API key. Do not make paid API calls.** The probe lane activates at the first close, or when Brandon explicitly says so. +- **Do not create or install skills.** Skill work is deferred reference, + not a launch gate. - First learn-sprint territory: **Lehi, Utah**. - Approved playbook and price tiers stand; invent no new scripts, tiers, legal architecture, or automation. @@ -36,10 +39,10 @@ that was previously Mission 1 is **no longer the next gate**. doctrine. **Do not revert or weaken them** — not for convenience, not to make a future run pass, not in any refactor. -## MISSION 1 — Lehi trades list (do now, with Brandon) +## MISSION 1 (the only active mission) — Lehi trades list `git pull` first. Tune `probe/questions.yaml` to the Lehi first wave -(see cohort table in the workspace repo's +(cohort table lives in the workspace repo's `plans/2026-08-09-lehi-learn-sprint.md`; Brandon can read it to you — you cannot reach that repo): @@ -53,159 +56,18 @@ One line per trade; question must read like a real customer ask and include `{town}`; town values always carry the state ("Lehi, UT"). Commit and push. This costs zero API calls — it's a YAML edit. -## MISSION 2 — Skills install, deduplicated (do once) +## DEFERRED — skills (reference only; do NOT create or install) -On this Mac, `~/.claude/skills` and `~/.codex/skills` both point to the -same canonical store: **`~/Projects/skills`**. Therefore: - -- Install each skill ONCE into `~/Projects/skills//SKILL.md`. - Never write separate copies into the two pointer paths — that creates - the duplicate problem this instruction exists to prevent. -- Before installing, check whether a skill of the same name already - exists in the canonical store; if so, reconcile (newest doctrine wins, - note what changed) rather than blindly overwrite. -- After installing, run the canonical backup workflow for - `~/Projects/skills` (the store's established backup routine on this - Mac). Any future skill work follows this same pattern: canonical - store, dedupe once, backup. - -The three skills, exact contents (validate `appearance-rate-probe` -against the probe repo README after install — if they disagree, the -README wins; report the discrepancy): - -### ~/Projects/skills/appearance-rate-probe/SKILL.md - -```markdown ---- -name: appearance-rate-probe -description: "Use when measuring, proving, or selling AI visibility for any business: never trust one AI answer; sample N times with search-grounded asks, count appearances, report the percentage, and lock before/after configs so comparisons stay apples-to-apples." -type: doctrine-workflow -domain: AI visibility / GEO -source_artifact: "guild-visibility-probe repo + 2026-08-07 Guild session" -confidence: HIGH -delegation_ready: true ---- - -# Appearance-Rate Probe - -## Purpose -Turn "what does AI say about this business" into an honest, sellable, repeatable number. - -## Core Doctrine -1. One AI answer is a coin flip. Identical prompts almost never return identical - business lists; only frequency across repeated asks is real. -2. Sell the odds, prove the delta, never promise the coin flip. The unit of - proof is appearance rate: "named in X of N asks." -3. Search-on, always. Bare-model answers come from stale training data and will - never reflect fix work. Every ask must be web-search grounded. -4. No partial runs, no deletions, no cherry-picking. A run with any failed - sample is invalid. Saved runs are append-only. Corrections are append-only - overrides shown alongside originals. -5. Apples to apples. A before/after is valid only with identical question, - sample count, and model. Lock the baseline config; footnote model changes. -6. Humans backstop name matching. A false "0 of N" from a name mismatch is the - worst possible failure; always show raw answers and allow one-click - correction with a note. - -## Workflow -1. Define the customer question per trade ("Who should I call for a plumber in - {Town, ST}?"). Always include the state. -2. Ask N=10 independent, search-grounded times. Record every raw answer. -3. Extract business names per answer; fuzzy-match the target (strip - apostrophes/punctuation/suffix noise; containment; ~0.9 similarity). -4. Score: appearances / N. Tally every other business named (competitor list). - "No recommendation given" is its own outcome, not a miss (common for clinics). -5. Re-run later with the locked config. Two runs = the before/after page. - -## Stop Conditions -- Never present a single screenshot as proof. -- Never guarantee a ranking, placement, or specific score. -``` - -### ~/Projects/skills/four-elements-sales-scripts/SKILL.md - -```markdown ---- -name: four-elements-sales-scripts -description: "Use when writing, editing, or drilling The Guild's doorstep sales scripts: read the buyer's element (Fire/Earth/Water/Air), pull the matching script, and keep every line inside FLEXX doctrine — answer discipline, receipts before closes, demo inside 60 seconds, the honest no-guarantee line." -type: identity-workflow -domain: door sales / The Guild -source_artifact: "Sales Script Book artifact (panel-ID editable) + 2026-08-07 session" -confidence: HIGH -delegation_ready: true ---- - -# Four Elements Sales Scripts - -## Core Doctrine (Table Rules — locked) -1. Answer discipline: answer exactly what was asked, then stop. Price gets a - straight number the moment it's asked. Dodging price is a forbidden move. -2. Receipts before closes: every buyer question opens a thread; a nod or - "makes sense" closes it. Never close over an open thread. -3. The demo is the script: AI asked about their business, on a phone, inside - 60 seconds. Best version: their phone, their thumbs. -4. The honest line, said like a weapon: "Anyone who guarantees a ranking is - lying to you. I guarantee the work and a before/after you can hold." - -## The Element Read (first 30 seconds) -- FIRE — competitive, decisive, rival on the brain → Rivalry script: show who - AI recommends instead; one-per-trade-per-area exclusivity; binary close. -- EARTH — analytical, wants paper → Numbers script: two-stage (gatekeeper → - booked sit-down), sampled report on the desk, calendar close not card close. -- WATER — been burned, arms crossed → Been-burned script: lead with what we - won't promise; flat price, no contract, local; two-visit callback close. -- AIR — curious, phone in hand → First-mover script: demo on THEIR phone; - the new-Yellow-Pages window; identity close ("the shop the robot brags about"). - -## Editing Protocol -Scripts live in one place (the Script Book artifact). Every panel has an ID -(F-03, W-05...). Edits happen by naming the panel. Table Rules are doctrine — -edit with care. Script lines are Brandon's to rewrite freely. - -## Training Loop -Load the four buyers as FLEXX roleplay personas (FLEXX stays a separate -product; the Guild is just a user). Drill until the Water callback close and -the Fire silence-after-demo are muscle memory. -``` - -### ~/Projects/skills/cold-outreach-legality-gate/SKILL.md - -```markdown ---- -name: cold-outreach-legality-gate -description: "Use before ANY outbound campaign, automation, or list purchase: run the channel-legality gate so no cold list is ever touched by AI voice, SMS, or ringless voicemail, and every legal channel is used with its required scrub." -type: doctrine -domain: outreach compliance (US) -source_artifact: "2026-08-07 Guild session compliance research" -confidence: HIGH -delegation_ready: true ---- - -# Cold Outreach Legality Gate - -## The Gate (cold lists = no consent on file) -ALLOWED: direct mail (unrestricted) · cold email (CAN-SPAM opt-out rules: -honest headers, physical address, working unsubscribe, separate sending -domains) · live human calls (AFTER National DNC scrub — business cells are -presumptively residential per Chennette v. Porch.com) · door knocking · -uploading lists as ad-platform custom audiences. - -FORBIDDEN on cold lists: AI/prerecorded voice calls (FCC 2024: AI voice = -robocall; consent required) · SMS/MMS (prior express written consent; -$500–$1,500 per text) · ringless voicemail (treated as calls; settlements -exist). - -## After Consent Is Captured (form fill, inbound call, QR scan) -AI voice callbacks, SMS follow-up, and automation are all legal on that -contact. The machine: humans open cold doors; AI never lets a warm lead go -stale. Capture consent language at every intake point; keep records 4+ years. - -## Stop Conditions -- Any plan that dials or texts a purchased/scraped list with automation: stop - and redesign. No exceptions for "but it's B2B." -- State wrinkles (TX registration + bond, FL FTSA, quiet hours): check before - entering a new state. -``` +The three mined skills (`appearance-rate-probe`, +`four-elements-sales-scripts`, `cold-outreach-legality-gate`) are +deferred reference material, not launch work. Their full text lives in +the workspace repo at `journal/2026-08-07-skill-mining-register.md` +(reachable through Brandon). If Brandon explicitly triggers skill work +later, the standing rules for it are: this Mac's `~/.claude/skills` and +`~/.codex/skills` both point to the canonical store +**`~/Projects/skills`** — install once into the canonical store only, +reconcile (never blindly overwrite) if a same-named skill exists, and +run the store's canonical backup workflow. Until that trigger: nothing. ## DEFERRED — probe calibration + customer baselines (do NOT start) @@ -223,8 +85,9 @@ a rule. Stochastic scores are the product, not a bug. ## Rules (all missions) - Never commit `.env`, keys, or passcodes. -- Only touch `brandonwadepackard-cell/guild-visibility-probe` and - `~/Projects/skills`. Nothing under `abcnuts` (unreachable anyway). +- Only touch `brandonwadepackard-cell/guild-visibility-probe`. + Nothing under `abcnuts` (unreachable anyway); no skills directories + unless Brandon triggers skill work. - No force pushes. No new repos. No probe v2 features. ## Report back to Brandon (he relays to the cloud Claude session) @@ -232,9 +95,7 @@ a rule. Stochastic scores are the product, not a bug. ``` Mac lane results: - Trades list: -- Skills: ; dedupe check: ; backup workflow: ; - README validation: - Probe lane: NOT activated (per direction lock) | activated by Brandon on : +- Skills: deferred, none created (per direction lock) ``` diff --git a/handoffs/2026-08-09-guild-handoff.md b/handoffs/2026-08-09-guild-handoff.md index b69df0f..5372232 100644 --- a/handoffs/2026-08-09-guild-handoff.md +++ b/handoffs/2026-08-09-guild-handoff.md @@ -37,7 +37,7 @@ API key, no paid calls. | GHL build sheet + consent language | `playbooks/ghl-funnel-build-sheet.md` | ready to execute | | Price card (honesty-fixed) | `playbooks/price-card-print.html` + artifact 9302a24e-24a1-48b2-8e29-aa83476edcea | print-ready minus phone/QR | | One-pager v2 / Script Book v1 | artifacts d51a71b4… / c6c4dfb3… | live (from 8/7) | -| Codex Mac work order | `handoffs/2026-08-08-codex-phase4-handoff.md` (revised) | trades list + skills dedupe now; probe lane deferred | +| Codex Mac work order | `handoffs/2026-08-08-codex-phase4-handoff.md` (revised) | trades list now; skills (reference only) + probe lane deferred | ## 3. Locked decisions (authority: Brandon, 8/7 + 8/9 — do not reopen) @@ -53,8 +53,11 @@ API key, no paid calls. never AI voice/SMS/RVM on cold lists. Voice = rent (GHL $97 inbound). - FLEXX separate. No new scripts, tiers, legal architecture, or automation beyond what's approved. -- Mac skills: canonical store `~/Projects/skills` (both skill dirs point - there); dedupe once; canonical backup workflow. +- Skill creation/install: deferred — not a launch item; the mined skills + are reference only (`journal/2026-08-07-skill-mining-register.md`). + Any future skill work Brandon triggers uses the canonical + `~/Projects/skills` store (both skill dirs point there), dedupes once, + and runs the canonical backup workflow. ## 4. Next actions (all Brandon's world; docs are ready) diff --git a/journal/2026-08-09-direction-lock.md b/journal/2026-08-09-direction-lock.md index 7a3a261..a732e98 100644 --- a/journal/2026-08-09-direction-lock.md +++ b/journal/2026-08-09-direction-lock.md @@ -36,18 +36,30 @@ do not reopen. trade cohorts, ChatGPT-on-their-phone demo procedure with honest handling of both outcomes, GHL recording spec (adds demo_result field), pass/fail evidence after 20 doors. -- `handoffs/2026-08-08-codex-phase4-handoff.md` revised: missions - reordered (Lehi trades list, then skills), Phase 4 explicitly - DEFERRED with no-key/no-paid-calls rule, duplicate skill install - removed — canonical store is `~/Projects/skills` (both - `~/.claude/skills` and `~/.codex/skills` point there); install once, - reconcile on conflict, run the canonical backup workflow. +- `handoffs/2026-08-08-codex-phase4-handoff.md` revised: Lehi trades + list is the only active mission; Phase 4 explicitly DEFERRED with + no-key/no-paid-calls rule. - `playbooks/price-card-print.html`: "We work to make it yours" → "We measure where you stand, do the work, and prove what changed" (honesty rule: measure → improve → prove; guarantee only the work and the report). Artifact republished at the same URL. Repo-wide scan found no other customer-facing violations. +## Verification follow-up corrections (same day, Brandon's review) + +1. Lehi sprint plan door script: "That's who's getting the call instead + of you" → "That's who ChatGPT named in this answer instead of you" + (one answer proves naming, not call-flow). +2. Same file: "the monthly plan is how you stay there…" → "the monthly + plan is how we keep doing the work and remeasure as it changes" + (no implied visibility guarantee). +3. Skill creation/install removed from the Codex work order and canonical + handoff entirely — the mined skills are deferred reference only + (`journal/2026-08-07-skill-mining-register.md`), not a launch gate. + No skills are to be created. The canonical-store rule + (`~/Projects/skills`, dedupe once, canonical backup) stands for any + future skill work Brandon explicitly triggers. + ## Probe state of record (per Brandon, 2026-08-09) `brandonwadepackard-cell/guild-visibility-probe`, `main` at diff --git a/plans/2026-08-08-build-phase-plan.md b/plans/2026-08-08-build-phase-plan.md index 6f41064..aa59639 100644 --- a/plans/2026-08-08-build-phase-plan.md +++ b/plans/2026-08-08-build-phase-plan.md @@ -55,9 +55,10 @@ default model `gpt-5.6-terra`, tests 8/8 (state confirmed by Brandon ## Standing lane (no deadline) -- Codex Mac lane: Lehi trades list in `questions.yaml`; skills dedupe — - ONE canonical install into `~/Projects/skills` (both skill dirs point - there), canonical backup workflow, no duplicate copies. +- Codex Mac lane: Lehi trades list in `questions.yaml`. Skill + creation/install is deferred (reference only, not a launch item); any + future skill work uses the canonical `~/Projects/skills` store, dedupes + once, canonical backup workflow. - 90-day re-probe reminders — starts with customer #1. - Account consolidation (`abcnuts` vs `-cell`) — someday; blocks nothing. - Clinics vertical — parked until door data exists. diff --git a/plans/2026-08-09-lehi-learn-sprint.md b/plans/2026-08-09-lehi-learn-sprint.md index 21bdc91..6b4f8e9 100644 --- a/plans/2026-08-09-lehi-learn-sprint.md +++ b/plans/2026-08-09-lehi-learn-sprint.md @@ -69,13 +69,15 @@ fallback if they won't install or don't have it. Handling the two outcomes — honestly, per doctrine: -- **They're not in the answer:** "That's who's getting the call instead - of you. And here's the honest part — one ask is one flip of the coin. +- **They're not in the answer:** "That's who ChatGPT named in this + answer instead of you. And here's the honest part — one ask is one + flip of the coin. We measure it properly: ten separate asks, counted. Then we do the work, measure again in ninety days, and you hold both reports." - **They ARE in the answer:** "Good — today's flip went your way. It doesn't always; the answer changes ask to ask. We measure the real - rate, and the monthly plan is how you stay there as this stuff moves." + rate, and the monthly plan is how we keep doing the work and + remeasure as it changes." Forbidden at the door: re-rolling the demo until it "shows the right thing" · promising the demo will or won't show anyone · any wording that From db6ec121724fecb31b81d562c7e74791ab73cd18 Mon Sep 17 00:00:00 2001 From: Claude Date: Sun, 9 Aug 2026 20:25:50 +0000 Subject: [PATCH 04/14] Record Codex-lane completion: probe main at 0e455bf, Lehi trades in Updates stale probe receipts across the canonical handoff, Codex work order, build plan, and direction-lock journal: main now 0e455bfd200da0d3f64892c6f6915de9cb77d882 with sprinkler, garage_door, auto_repair added to questions.yaml; 8/8 tests, import and secret scan clean, repo private. Codex launch lane marked complete with no remaining task; skills and paid API lane stay deferred, unchanged. Co-Authored-By: Claude Fable 5 Claude-Session: https://claude.ai/code/session_017SgKh5sTzx4rjanwEAXtfc --- handoffs/2026-08-08-codex-phase4-handoff.md | 43 +++++++++------------ handoffs/2026-08-09-guild-handoff.md | 4 +- journal/2026-08-09-direction-lock.md | 15 +++++-- plans/2026-08-08-build-phase-plan.md | 17 ++++---- 4 files changed, 43 insertions(+), 36 deletions(-) diff --git a/handoffs/2026-08-08-codex-phase4-handoff.md b/handoffs/2026-08-08-codex-phase4-handoff.md index 0a7dfc2..6d66310 100644 --- a/handoffs/2026-08-08-codex-phase4-handoff.md +++ b/handoffs/2026-08-08-codex-phase4-handoff.md @@ -1,10 +1,10 @@ --- date: 2026-08-08 -revised: 2026-08-09 (direction lock + verification follow-up — skills install removed, Phase 4 deferred) +revised: 2026-08-09 (direction lock + verification follow-up; Mission 1 COMPLETE same day) type: handoff project: the-guild audience: codex (local session on Brandon's Mac) -task: Lehi trades list now; skills and probe calibration DEFERRED +task: COMPLETE — no active Codex launch task; skills and probe calibration DEFERRED from: claude.ai/code remote session (build-phase session) supersedes: handoffs/2026-08-08-codex-repo-seed-handoff.md (seed mission COMPLETE) --- @@ -32,29 +32,25 @@ sections before doing anything beyond Mission 1. ## Probe state of record (confirmed by Brandon, 2026-08-09) -- Repo: `brandonwadepackard-cell/guild-visibility-probe`, `main` at - `450f25da0f049f84f96d93ef6460be27e5375a1c`. -- Default model: `gpt-5.6-terra`. Tests: **8/8 passing**. +- Repo: `brandonwadepackard-cell/guild-visibility-probe` (private), + `main` at `0e455bfd200da0d3f64892c6f6915de9cb77d882`. +- Default model: `gpt-5.6-terra`. Tests: **8/8 passing**; `import app, + cli` clean; secret scan clean. +- `probe/questions.yaml` carries the Lehi wave-one trades (sprinkler, + garage_door, auto_repair added alongside the original ten). - The search-required and invalid-run protections are load-bearing doctrine. **Do not revert or weaken them** — not for convenience, not to make a future run pass, not in any refactor. -## MISSION 1 (the only active mission) — Lehi trades list +## MISSION 1 — Lehi trades list — ✅ COMPLETE (2026-08-09) -`git pull` first. Tune `probe/questions.yaml` to the Lehi first wave -(cohort table lives in the workspace repo's -`plans/2026-08-09-lehi-learn-sprint.md`; Brandon can read it to you — -you cannot reach that repo): - -- Priority 1: hvac, plumber, electrician -- Priority 2: sprinkler/landscaper, pest_control, garage_door -- Priority 3: roofer, auto_repair, barber -- Hold for wave two: dentist, chiropractor, restaurant (keep the lines, - they cost nothing — just ensure wave-one trades are all present). - -One line per trade; question must read like a real customer ask and -include `{town}`; town values always carry the state ("Lehi, UT"). -Commit and push. This costs zero API calls — it's a YAML edit. +Receipt: `probe/questions.yaml` updated with exactly sprinkler, +garage_door, auto_repair (wave-one set now complete alongside the +original ten trades); pushed to `main` @ +`0e455bfd200da0d3f64892c6f6915de9cb77d882`; pytest 8/8; `import app, +cli` clean; secret scan clean; repo confirmed private. **No remaining +Codex launch task.** Both remaining lanes below stay deferred until +Brandon explicitly triggers them. ## DEFERRED — skills (reference only; do NOT create or install) @@ -93,9 +89,8 @@ a rule. Stochastic scores are the product, not a bug. ## Report back to Brandon (he relays to the cloud Claude session) ``` -Mac lane results: -- Trades list: -- Probe lane: NOT activated (per direction lock) | activated by Brandon - on : +Mac lane results (reported 2026-08-09): +- Trades list: COMPLETE — main @ 0e455bfd200da0d3f64892c6f6915de9cb77d882 +- Probe lane: NOT activated (per direction lock) - Skills: deferred, none created (per direction lock) ``` diff --git a/handoffs/2026-08-09-guild-handoff.md b/handoffs/2026-08-09-guild-handoff.md index 5372232..e709318 100644 --- a/handoffs/2026-08-09-guild-handoff.md +++ b/handoffs/2026-08-09-guild-handoff.md @@ -29,7 +29,7 @@ API key, no paid calls. | Asset | Where | State | |---|---|---| -| Probe MVP | `brandonwadepackard-cell/guild-visibility-probe` `main` @ `450f25da0f049f84f96d93ef6460be27e5375a1c` | live; default `gpt-5.6-terra`; 8/8 tests (Brandon-confirmed 2026-08-09); search-required + invalid-run protections intact | +| Probe MVP | `brandonwadepackard-cell/guild-visibility-probe` (private) `main` @ `0e455bfd200da0d3f64892c6f6915de9cb77d882` | live; default `gpt-5.6-terra`; 8/8 tests; import + secret scan clean; Lehi wave-one trades in `questions.yaml` (added sprinkler, garage_door, auto_repair) — Brandon-confirmed 2026-08-09; search-required + invalid-run protections intact | | Journals, handoffs, playbook, plans | `abcnuts/claude-code-workspace` `main` @ `e0d801b` + PR #6 (draft, unmerged) | durable custody | | Fulfillment playbook v1 + price tiers | `playbooks/fulfillment-playbook-v1.md` | **approved** by Brandon | | Build plan (revised) | `plans/2026-08-08-build-phase-plan.md` | active | @@ -37,7 +37,7 @@ API key, no paid calls. | GHL build sheet + consent language | `playbooks/ghl-funnel-build-sheet.md` | ready to execute | | Price card (honesty-fixed) | `playbooks/price-card-print.html` + artifact 9302a24e-24a1-48b2-8e29-aa83476edcea | print-ready minus phone/QR | | One-pager v2 / Script Book v1 | artifacts d51a71b4… / c6c4dfb3… | live (from 8/7) | -| Codex Mac work order | `handoffs/2026-08-08-codex-phase4-handoff.md` (revised) | trades list now; skills (reference only) + probe lane deferred | +| Codex Mac work order | `handoffs/2026-08-08-codex-phase4-handoff.md` (revised) | **COMPLETE** — Lehi trades list done @ `0e455bfd`; no remaining Codex launch task; skills (reference only) + probe lane deferred | ## 3. Locked decisions (authority: Brandon, 8/7 + 8/9 — do not reopen) diff --git a/journal/2026-08-09-direction-lock.md b/journal/2026-08-09-direction-lock.md index a732e98..a2d87d4 100644 --- a/journal/2026-08-09-direction-lock.md +++ b/journal/2026-08-09-direction-lock.md @@ -60,13 +60,22 @@ do not reopen. (`~/Projects/skills`, dedupe once, canonical backup) stands for any future skill work Brandon explicitly triggers. -## Probe state of record (per Brandon, 2026-08-09) +## Probe state of record (per Brandon, 2026-08-09 — updated same day) -`brandonwadepackard-cell/guild-visibility-probe`, `main` at -`450f25da0f049f84f96d93ef6460be27e5375a1c`, default model +`brandonwadepackard-cell/guild-visibility-probe` (private), `main` at +`0e455bfd200da0d3f64892c6f6915de9cb77d882`, default model `gpt-5.6-terra`, tests 8/8 passing. Search-required and invalid-run protections intact and to remain so. +## Codex-local lane COMPLETE (2026-08-09, Brandon's receipt) + +`probe/questions.yaml` updated with exactly sprinkler, garage_door, +auto_repair (Lehi wave-one set complete); pushed to `main` @ +`0e455bfd200da0d3f64892c6f6915de9cb77d882`; pytest 8/8; `import app, +cli` clean; secret scan clean; repo confirmed private. No remaining +Codex launch task. Skills and the paid API lane remain deferred, +unchanged. + ## Next actions (in order) 1. GHL funnel build (Brandon + build sheet) — the gating item. diff --git a/plans/2026-08-08-build-phase-plan.md b/plans/2026-08-08-build-phase-plan.md index aa59639..8b4f5a4 100644 --- a/plans/2026-08-08-build-phase-plan.md +++ b/plans/2026-08-08-build-phase-plan.md @@ -43,9 +43,11 @@ recording spec, and pass/fail evidence after the first reps. ## DEFERRED LANE — internal probe (activates at first close) The probe repo is live and healthy: `brandonwadepackard-cell/ -guild-visibility-probe`, `main` at `450f25da0f049f84f96d93ef6460be27e5375a1c`, -default model `gpt-5.6-terra`, tests 8/8 (state confirmed by Brandon -2026-08-09). Search-required and invalid-run protections stay as-is. +guild-visibility-probe` (private), `main` at +`0e455bfd200da0d3f64892c6f6915de9cb77d882`, default model +`gpt-5.6-terra`, tests 8/8, Lehi wave-one trades in `questions.yaml` +(state confirmed by Brandon 2026-08-09). Search-required and invalid-run +protections stay as-is. - Trigger: **first close** (a customer baseline is the first real need) or Brandon explicitly activating it. Not before. @@ -55,10 +57,11 @@ default model `gpt-5.6-terra`, tests 8/8 (state confirmed by Brandon ## Standing lane (no deadline) -- Codex Mac lane: Lehi trades list in `questions.yaml`. Skill - creation/install is deferred (reference only, not a launch item); any - future skill work uses the canonical `~/Projects/skills` store, dedupes - once, canonical backup workflow. +- Codex Mac lane: ✅ COMPLETE (Lehi trades list @ `0e455bfd`) — no + remaining Codex launch task. Skill creation/install stays deferred + (reference only, not a launch item); any future skill work uses the + canonical `~/Projects/skills` store, dedupes once, canonical backup + workflow. - 90-day re-probe reminders — starts with customer #1. - Account consolidation (`abcnuts` vs `-cell`) — someday; blocks nothing. - Clinics vertical — parked until door data exists. From d09f33691479eec06bfdc308463a44549af62dea Mon Sep 17 00:00:00 2001 From: Claude Date: Sun, 9 Aug 2026 21:29:39 +0000 Subject: [PATCH 05/14] Lean correction: zero-cost first-sprint path, GHL demoted to post-signal spec Brandon verified no Guild GHL account exists; the only HighLevel access on the Mac is a location-scoped client sub-account integration that is off-limits for Guild use. Removes the GHL login/funnel/number launch prerequisite as a false assumption. Adds the offline Lehi field log (self-contained HTML, localStorage autosave, progress /20, escaped CSV export, typed-RESET-gated erase, no network calls; 40/40 Playwright behavioral checks) plus a CSV header template as the canonical record for the first 20 doors. Sprint plan, build plan, canonical handoff, journal, and funnel build sheet reconciled: funnel, dedicated number, and card printing are post-signal procurement after a close; prices, doctrine, cohorts, demo wording, and evidence gates unchanged. Co-Authored-By: Claude Fable 5 Claude-Session: https://claude.ai/code/session_017SgKh5sTzx4rjanwEAXtfc --- handoffs/2026-08-09-guild-handoff.md | 66 +++-- journal/2026-08-09-direction-lock.md | 35 ++- plans/2026-08-08-build-phase-plan.md | 50 +++- plans/2026-08-09-lehi-learn-sprint.md | 36 ++- playbooks/ghl-funnel-build-sheet.md | 14 +- playbooks/lehi-field-log-template.csv | 1 + playbooks/lehi-field-log.html | 373 ++++++++++++++++++++++++++ 7 files changed, 516 insertions(+), 59 deletions(-) create mode 100644 playbooks/lehi-field-log-template.csv create mode 100644 playbooks/lehi-field-log.html diff --git a/handoffs/2026-08-09-guild-handoff.md b/handoffs/2026-08-09-guild-handoff.md index e709318..2882760 100644 --- a/handoffs/2026-08-09-guild-handoff.md +++ b/handoffs/2026-08-09-guild-handoff.md @@ -19,11 +19,13 @@ AI appearance rate, the fix work, and a before/after report — guaranteeing only the work and the report, never placement or score. The business shape is wedge → ladder → referral flywheel; the small offer is customer acquisition. Strategy is CLOSED, the toolchain is BUILT, and the next -actions are physical: GHL funnel build, card printing, and the first -20-door learn sprint in **Lehi, Utah**. The door demo is ordinary -subscription ChatGPT on the prospect's own phone; the paid API probe is -an internal proof lane that activates at the first close — until then no -API key, no paid calls. +action is the first 20-door learn sprint in **Lehi, Utah** — run +zero-cost: the door demo is ordinary subscription ChatGPT on the +prospect's own phone, and the offline field log is the canonical record. +No Guild GHL account exists (verified 8/9) — funnel, dedicated number, +and printed cards are post-signal procurement AFTER a close, not launch +prerequisites. The paid API probe is an internal proof lane that +activates at the first close — until then no API key, no paid calls. ## 2. State of assets (receipts) @@ -34,8 +36,9 @@ API key, no paid calls. | Fulfillment playbook v1 + price tiers | `playbooks/fulfillment-playbook-v1.md` | **approved** by Brandon | | Build plan (revised) | `plans/2026-08-08-build-phase-plan.md` | active | | Lehi sprint plan | `plans/2026-08-09-lehi-learn-sprint.md` | ready-when-funnel-live | -| GHL build sheet + consent language | `playbooks/ghl-funnel-build-sheet.md` | ready to execute | -| Price card (honesty-fixed) | `playbooks/price-card-print.html` + artifact 9302a24e-24a1-48b2-8e29-aa83476edcea | print-ready minus phone/QR | +| **Offline field log (canonical sprint record)** | `playbooks/lehi-field-log.html` + `lehi-field-log-template.csv` + private artifact e52d93c2-62b6-464c-9c9b-8c6eb0208edb | verified: 40/40 behavioral checks — offline, localStorage, CSV export, gated reset, zero network calls | +| Funnel build sheet + consent language | `playbooks/ghl-funnel-build-sheet.md` | spec only — procurement deferred until after a close | +| Price card (honesty-fixed) | `playbooks/price-card-print.html` + artifact 9302a24e-24a1-48b2-8e29-aa83476edcea | post-signal — print after a number exists | | One-pager v2 / Script Book v1 | artifacts d51a71b4… / c6c4dfb3… | live (from 8/7) | | Codex Mac work order | `handoffs/2026-08-08-codex-phase4-handoff.md` (revised) | **COMPLETE** — Lehi trades list done @ `0e455bfd`; no remaining Codex launch task; skills (reference only) + probe lane deferred | @@ -59,22 +62,35 @@ API key, no paid calls. `~/Projects/skills` store (both skill dirs point there), dedupes once, and runs the canonical backup workflow. -## 4. Next actions (all Brandon's world; docs are ready) +## 4. Next actions (all Brandon's world; docs and tools are ready) -1. **GHL funnel build** — follow `playbooks/ghl-funnel-build-sheet.md`; - buy a Utah (801/385) number; pass the 5-step test incl. the - unchecked-box negative test. -2. **Print cards** — drop the new Guild line + QR into the card, print. -3. **Joey dry run** — lanes 1–3 + 5 on a friendly business, timed. -4. **Lehi sprint** — 20 doors per `plans/2026-08-09-lehi-learn-sprint.md`. - Output: close-rate by cohort + complete objection log in GHL. -5. Crew decisions before first dollar: rev split, referral reward. +1. **Field log check** — open the field log on the phone (artifact + e52d93c2-62b6-464c-9c9b-8c6eb0208edb, or save the HTML file to the + phone for fully-offline use), save a test entry, export CSV, reset. +2. **Joey dry run** — lanes 1–3 + 5 on a friendly business, timed. +3. **Lehi sprint** — 20 doors per `plans/2026-08-09-lehi-learn-sprint.md`, + zero-cost. Output: close-rate by cohort + complete field-log CSV. +4. Crew decisions before first dollar: rev split, referral reward. + +Post-signal (AFTER a close, procurement decisions — not launch items): +funnel per the build sheet · dedicated line + QR · card printing · +probe-lane activation. ## 5. Unavoidable blockers (only these) -GHL login (funnel) · print shop + payment (cards) · physical doors -(sprint) · Brandon's crew (splits). Nothing is blocked on cloud sessions, -Codex, repos, or API billing. +Physical doors in Lehi (the sprint) · Brandon's crew (splits). That is +the whole list — nothing is blocked on logins, printing, repos, cloud +sessions, Codex, or any purchase. + +## 5b. GHL reality (verified by Brandon, 2026-08-09) + +No personal/Guild GoHighLevel account exists — Mac browser and connected +mail show no account, signup, or billing evidence. The only live +HighLevel access on the Mac is a location-scoped integration into a +client's sub-account: a separate client system, explicitly OFF-LIMITS +for Guild use. The earlier "GHL login/build" prerequisite was a false +assumption, removed. No account creation, trial, number purchase, or +paid service in this phase. ## 6. Session-type capabilities (learned the hard way, still true) @@ -88,11 +104,11 @@ Codex, repos, or API billing. ## 7. Re-entry points (say one of these to a Claude session) -1. **"GHL is live"** → verify test protocol results, journal, clear N1. -2. **"Sprint results: …"** (+ GHL export) → mine objections, pricing +1. **"Sprint results: …"** (+ field-log CSV) → mine objections, pricing verdict, script edits by panel ID, wave-two cohorts. -3. **"First close"** → activate the probe lane: Codex calibration - protocol + customer baseline within the week. +2. **"First close"** → activates BOTH deferred lanes: the probe (Codex + calibration + customer baseline within the week) and the funnel + procurement decision (build sheet is the ready spec). -Recommended next move: N1, the GHL build — every other lane queues -behind the phone number. +Recommended next move: the doors themselves — field log on the phone, +ChatGPT demo ready, twenty knocks in Lehi. Nothing else is in the way. diff --git a/journal/2026-08-09-direction-lock.md b/journal/2026-08-09-direction-lock.md index a2d87d4..0a8d4a7 100644 --- a/journal/2026-08-09-direction-lock.md +++ b/journal/2026-08-09-direction-lock.md @@ -76,11 +76,36 @@ cli` clean; secret scan clean; repo confirmed private. No remaining Codex launch task. Skills and the paid API lane remain deferred, unchanged. +## Lean correction (Brandon-verified authority, 2026-08-09) + +- **No personal/Guild GoHighLevel account exists** — Mac browser and + connected mail show no account/signup/billing evidence. The only live + HighLevel access on the Mac is a location-scoped integration into a + client's sub-account: a separate client system, explicitly OFF-LIMITS + for Guild use. The "GHL login/build" launch prerequisite was a false + assumption and is removed from the first-sprint path. +- No GHL account creation, trial, number purchase, or paid service in + this phase. GHL (or equivalent) is a post-validation procurement + decision AFTER a close; `playbooks/ghl-funnel-build-sheet.md` remains + the ready spec for that day. +- Cards and a dedicated line/QR are post-signal infrastructure, not + prerequisites for the first 20 doors. Prices and doctrine unchanged. +- **Zero-cost first-sprint path built:** `playbooks/lehi-field-log.html` + — self-contained offline field log (no backend, login, libraries, or + network calls; localStorage autosave; progress /20; CSV export with + proper escaping; typed-RESET-gated erase; business info only, no + customer PII) + `playbooks/lehi-field-log-template.csv` fallback. + Verified with a 40/40 Playwright behavioral pass (persistence, draft + restore, CSV escaping incl. quotes/newlines, gated reset, 390px + layout, zero external requests). Private artifact: + e52d93c2-62b6-464c-9c9b-8c6eb0208edb. + ## Next actions (in order) -1. GHL funnel build (Brandon + build sheet) — the gating item. -2. Price card print once the Guild line exists. -3. Joey dry run (lanes 1–3 + 5, timed). -4. Lehi 20-door sprint per the sprint plan. +1. Field log on the phone; test entry, export, reset. +2. Joey dry run (lanes 1–3 + 5, timed). +3. Lehi 20-door sprint — field log is the canonical record. +4. Crew decisions before first dollar. -Not next: OpenAI billing, probe calibration, new scripts/tiers/automation. +Not next: any purchase (GHL, number, printing until post-signal), OpenAI +billing, probe calibration, new scripts/tiers/automation. diff --git a/plans/2026-08-08-build-phase-plan.md b/plans/2026-08-08-build-phase-plan.md index 8b4f5a4..7fcb39b 100644 --- a/plans/2026-08-08-build-phase-plan.md +++ b/plans/2026-08-08-build-phase-plan.md @@ -25,20 +25,40 @@ the work and the report. 3. Fulfillment playbook v1 and the $497/$997/$149-mo tiers: approved as-is. 4. **First learn-sprint territory: Lehi, Utah.** -## NOW — build the machine (gating items, in order) +## LEAN CORRECTION (Brandon-verified, 2026-08-09) + +No Guild GoHighLevel account exists — the prior "GHL login/build" launch +prerequisite was a false assumption and is removed from the first-sprint +path. The only live HighLevel access on Brandon's Mac is a +location-scoped integration into a client's sub-account: a separate +client system, **off-limits for Guild use**. Do not create a GHL +account, start a trial, buy a phone number, or create any paid service +in this phase. The first 20 doors run zero-cost. + +## NOW — the zero-cost first-sprint path | # | Item | Owner | Gate | |---|------|-------|------| -| N1 | GHL sealed funnel per `playbooks/ghl-funnel-build-sheet.md` — AI Employee inbound, consent capture, speed-to-lead. Buy a Utah (801/385) number | Brandon | 5-step test protocol passes, incl. the unchecked-box negative test | -| N2 | Price card print — fill Guild line + QR from N1 into `playbooks/price-card-print.html`, then print | Brandon | cards in hand | -| N3 | Joey dry run: playbook lanes 1–3 + 5 on one friendly business, timed (Step 0's probe baseline is deferred with the probe lane) | Joey + Brandon | checklist done once; hours-per-client written down | -| N4 | Crew decisions: rev split across the seven; referral reward now vs later — the flywheel needs the referral answer | Brandon + crew | decided before first outside dollar | +| N1 | Field log on the phone: open `playbooks/lehi-field-log.html` (or its private artifact), confirm it saves and exports | Brandon | test entry saved + CSV exported, then reset | +| N2 | Joey dry run: playbook lanes 1–3 + 5 on one friendly business, timed (Step 0's probe baseline is deferred with the probe lane) | Joey + Brandon | checklist done once; hours-per-client written down | +| N3 | Crew decisions: rev split across the seven; referral reward now vs later — the flywheel needs the referral answer | Brandon + crew | decided before first outside dollar | -## SPRINT — Lehi, Utah (when N1 + N2 pass) +## SPRINT — Lehi, Utah (ready now; needs only a phone and doors) Full sprint plan: `plans/2026-08-09-lehi-learn-sprint.md` — first-wave -scope, trade cohorts, the ChatGPT-on-their-phone demo procedure, GHL -recording spec, and pass/fail evidence after the first reps. +scope, trade cohorts, the ChatGPT-on-their-phone demo procedure, the +offline field-log recording spec, and pass/fail evidence after the +first reps. The field log is the canonical record for the first 20 +doors. + +## POST-SIGNAL INFRASTRUCTURE (procure after a close, not before) + +- GHL (or equivalent) funnel: a purchasing decision AFTER the first + close. `playbooks/ghl-funnel-build-sheet.md` is the ready spec for + that day (consent language, test protocol) — spec, not prerequisite. +- Price cards + dedicated line/QR: post-signal. The card source + (`playbooks/price-card-print.html`) stays print-ready with + placeholders until a number exists. ## DEFERRED LANE — internal probe (activates at first close) @@ -68,11 +88,13 @@ protections stay as-is. ## Ownership map -- **Brandon:** GHL build, number purchase, print, crew decisions, doors. +- **Brandon:** doors, crew decisions; post-signal procurement (funnel, + number, print) after the first close. - **Joey:** playbook mastery, dry run, capacity number, fulfillment. - **Codex (Mac):** trades list, skills dedupe; probe lane when activated. - **Claude sessions:** journaling, sweeps on demand, doc/plan upkeep, - continuity. Cannot: GHL login, printing, doors, `-cell` repo access. + continuity. Cannot: printing, doors, `-cell` repo access, any paid + procurement. ## Not in this plan, on purpose @@ -83,7 +105,7 @@ features · FLEXX work · clinics · account consolidation · new tooling. ## Re-entry points for the next session -1. "GHL is live" → verify N1 test protocol results, journal it. -2. "Sprint results: …" → mine the objection log; pricing verdict. -3. "First close" / "activate the probe lane" → probe calibration + - customer baseline flow via Codex. +1. "Sprint results: …" (+ field-log CSV) → mine the objection log; + pricing verdict; wave-two cohorts. +2. "First close" → activates BOTH deferred lanes: the probe (calibration + + customer baseline via Codex) and the funnel procurement decision. diff --git a/plans/2026-08-09-lehi-learn-sprint.md b/plans/2026-08-09-lehi-learn-sprint.md index 6b4f8e9..82b3284 100644 --- a/plans/2026-08-09-lehi-learn-sprint.md +++ b/plans/2026-08-09-lehi-learn-sprint.md @@ -4,7 +4,7 @@ type: sprint-plan project: the-guild status: ready-when-funnel-live territory: Lehi, Utah -prerequisites: GHL funnel live (N1), cards printed (N2) +prerequisites: a phone with subscription ChatGPT + the offline field log (playbooks/lehi-field-log.html) — no paid infrastructure --- # Lehi Learn Sprint — First-Wave Plan @@ -85,20 +85,33 @@ implies we make the AI say their name or guarantee placement or score. The demo shows what the AI says today; the offer is measure → improve → prove. -## What to record in GHL (per door, 60 seconds, in the truck) +## What to record (canonical: the offline field log, per door, 60 seconds) -Fields per `playbooks/ghl-funnel-build-sheet.md` appendix, plus one: +**`playbooks/lehi-field-log.html` is the canonical record for the first +20 doors.** It runs offline on the phone — no backend, no login, no +network — autosaves locally, tracks progress out of 20, and exports CSV +(`playbooks/lehi-field-log-template.csv` is the same header as a +paper/spreadsheet fallback). Fields per door: -- door_element (Fire/Earth/Water/Air/unread) · price_cohort ($497/$997) +- door number · timestamp (auto) · business name · trade +- price_cohort ($497/$997) · demo_shown (y/n) +- **demo_result: present / absent / not run** - outcome (closed / callback set / soft no / hard no / no answer) -- **demo_result: appeared / didn't appear / no-recommendation / not shown** -- objection_1 (dropdown) + objection_verbatim (their exact words) -- demo_shown (y/n) · notes +- element read (Fire/Earth/Water/Air/unread) · notes with objection + verbatim · optional callback date + +No customer PII goes in the log — business info only. Export the CSV at +the end of each day. ## On a close -- Consent captured at the table (the funnel's verbatim checkbox — their - thumb checks it). Funnel takes over from there. +- Consent captured at the table using the approved verbatim consent + language (`playbooks/ghl-funnel-build-sheet.md` §3) on a simple form — + paper or a notes form on their phone; keep the record. Follow-up is + human and manual until infrastructure exists. +- **A close is the procurement trigger.** GHL (or equivalent) becomes a + post-validation purchasing decision AFTER the first close — the build + sheet is the ready spec for that day. It is not a launch prerequisite. - Fulfillment starts per approved playbook v1. The internal probe baseline is part of the proof lane — **first close is what activates that lane** (Brandon triggers it; until then no API key, no paid calls). @@ -123,5 +136,6 @@ Read after 20 doors (learn gates, not success guarantees): by element → the pricing verdict input. 20 doors is a small sample; treat differences as direction, not proof — the next 20 confirm. -Bring "Sprint results: …" with the GHL export to a Claude session and it -gets mined: pricing verdict, script edits by panel ID, wave-two cohorts. +Bring "Sprint results: …" with the field-log CSV to a Claude session and +it gets mined: pricing verdict, script edits by panel ID, wave-two +cohorts. diff --git a/playbooks/ghl-funnel-build-sheet.md b/playbooks/ghl-funnel-build-sheet.md index 6a9635f..85692ce 100644 --- a/playbooks/ghl-funnel-build-sheet.md +++ b/playbooks/ghl-funnel-build-sheet.md @@ -2,12 +2,18 @@ date: 2026-08-08 type: build-sheet project: the-guild -status: ready-to-build -plan-item: B2 (with C sprint-kit appendix) -owner: Brandon (build), Claude (spec) +status: spec only — procurement deferred until after a close (2026-08-09 lean correction) +plan-item: post-signal infrastructure +owner: Brandon (build, when procured), Claude (spec) --- -# GHL Sealed Funnel — Build Sheet (Plan item B2) +# GHL Sealed Funnel — Build Sheet (post-signal spec) + +> **Status (2026-08-09):** No Guild GHL account exists; this sheet is +> the ready spec for the procurement decision that follows the first +> close. It is NOT a launch prerequisite. The first 20 doors run +> zero-cost with the offline field log. The §3 consent language is used +> at closes now (paper or phone form). Everything to configure, in order, with the exact consent language. Gate: test call answered + booking lands + consent stored. diff --git a/playbooks/lehi-field-log-template.csv b/playbooks/lehi-field-log-template.csv new file mode 100644 index 0000000..dbfc801 --- /dev/null +++ b/playbooks/lehi-field-log-template.csv @@ -0,0 +1 @@ +door_number,timestamp,business_name,trade,price_cohort,demo_shown,demo_result,outcome,objection_element,notes,callback_date diff --git a/playbooks/lehi-field-log.html b/playbooks/lehi-field-log.html new file mode 100644 index 0000000..154c4cb --- /dev/null +++ b/playbooks/lehi-field-log.html @@ -0,0 +1,373 @@ + + + + + +Lehi Field Log — 20 Doors + + + +

Lehi Field Log — 20 Doors

+

Offline. Saves on this device only. Export CSV at day's end. Every door gets logged, including no-answers.

+ +
0 / 20 doors
+
$497: 0 · $997: 0 · closed: 0
+ +
+
+ This door +
+
+ + +
+
+ + +
+
+ + + + + +
+ + +
+
+ + +
+ + +
+ + +
+ + + +
+ + +
+ + + + + +
+ + +
+ + + + + +
+ + + + + + + +

Business info only — no customer names, numbers, or personal details in this log.

+ + +
+
+
+ +

Logged doors

+

Nothing yet. First door of twenty.

+ +
+ +
+ Reset (erases ALL entries) +

This deletes every logged door from this device permanently. Export the CSV first. Type RESET to arm the button.

+ + +
+
+ +
The Guild · Lehi learn sprint · doctrine: every door logged, no cherry-picking · measure → improve → prove
+ + + + From c35e81913d86dbd918328de7a0ebdfaedd5a930a Mon Sep 17 00:00:00 2001 From: Claude Date: Sun, 9 Aug 2026 21:36:16 +0000 Subject: [PATCH 06/14] Protocol-integrity fixes for the field log Doors enforced 1-20 and unique (duplicates rejected, progress counts unique doors, saves lock behind a sprint-complete state after 20). Price cohort is derived from door parity (odd $497 / even $997), displayed read-only, never manually selectable; price_cohort export preserved. Demo consistency enforced by UI locks (no -> result locked to not-run; yes -> not-run unselectable, present/absent required; switching clears incompatible state) plus a second guard in submit validation; novalidate added so the JS guards give uniform rejection messages. CSV export now door-sorted. Behavioral suite extended and green at 71/71, covering duplicate/out-of-range/21st-entry rejection, completion lock persistence, cohort derivation in UI and CSV, and both invalid demo combinations. Receipts updated in the canonical handoff and direction-lock journal. Co-Authored-By: Claude Fable 5 Claude-Session: https://claude.ai/code/session_017SgKh5sTzx4rjanwEAXtfc --- handoffs/2026-08-09-guild-handoff.md | 4 +- journal/2026-08-09-direction-lock.md | 18 ++- plans/2026-08-09-lehi-learn-sprint.md | 2 +- playbooks/lehi-field-log.html | 171 +++++++++++++++++++------- 4 files changed, 141 insertions(+), 54 deletions(-) diff --git a/handoffs/2026-08-09-guild-handoff.md b/handoffs/2026-08-09-guild-handoff.md index 2882760..5caa6d8 100644 --- a/handoffs/2026-08-09-guild-handoff.md +++ b/handoffs/2026-08-09-guild-handoff.md @@ -35,8 +35,8 @@ activates at the first close — until then no API key, no paid calls. | Journals, handoffs, playbook, plans | `abcnuts/claude-code-workspace` `main` @ `e0d801b` + PR #6 (draft, unmerged) | durable custody | | Fulfillment playbook v1 + price tiers | `playbooks/fulfillment-playbook-v1.md` | **approved** by Brandon | | Build plan (revised) | `plans/2026-08-08-build-phase-plan.md` | active | -| Lehi sprint plan | `plans/2026-08-09-lehi-learn-sprint.md` | ready-when-funnel-live | -| **Offline field log (canonical sprint record)** | `playbooks/lehi-field-log.html` + `lehi-field-log-template.csv` + private artifact e52d93c2-62b6-464c-9c9b-8c6eb0208edb | verified: 40/40 behavioral checks — offline, localStorage, CSV export, gated reset, zero network calls | +| Lehi sprint plan | `plans/2026-08-09-lehi-learn-sprint.md` | ready now — zero-cost, needs only a phone and doors | +| **Offline field log (canonical sprint record)** | `playbooks/lehi-field-log.html` + `lehi-field-log-template.csv` + private artifact e52d93c2-62b6-464c-9c9b-8c6eb0208edb | verified: 71/71 behavioral checks — protocol-enforced (doors 1–20 unique, completion lock at 20, derived cohorts, demo-consistency locks), offline, localStorage, escaped CSV, gated reset, zero network calls | | Funnel build sheet + consent language | `playbooks/ghl-funnel-build-sheet.md` | spec only — procurement deferred until after a close | | Price card (honesty-fixed) | `playbooks/price-card-print.html` + artifact 9302a24e-24a1-48b2-8e29-aa83476edcea | post-signal — print after a number exists | | One-pager v2 / Script Book v1 | artifacts d51a71b4… / c6c4dfb3… | live (from 8/7) | diff --git a/journal/2026-08-09-direction-lock.md b/journal/2026-08-09-direction-lock.md index 0a8d4a7..1fbccaf 100644 --- a/journal/2026-08-09-direction-lock.md +++ b/journal/2026-08-09-direction-lock.md @@ -95,10 +95,20 @@ unchanged. network calls; localStorage autosave; progress /20; CSV export with proper escaping; typed-RESET-gated erase; business info only, no customer PII) + `playbooks/lehi-field-log-template.csv` fallback. - Verified with a 40/40 Playwright behavioral pass (persistence, draft - restore, CSV escaping incl. quotes/newlines, gated reset, 390px - layout, zero external requests). Private artifact: - e52d93c2-62b6-464c-9c9b-8c6eb0208edb. + Private artifact: e52d93c2-62b6-464c-9c9b-8c6eb0208edb. +- **Protocol-integrity revision (same day, independent verification):** + door number enforced 1–20 with duplicate rejection and a completion + lock after 20 unique doors (progress counts unique doors); price + cohort is derived from door parity (odd $497 / even $997), displayed + read-only, never manually selectable, still exported as + `price_cohort`; demo consistency enforced by UI locks (no → result + locked to "not run"; yes → "not run" unselectable, Present/Absent + required; switching clears incompatible state) with a second guard in + submit validation. Verified with a **71/71 Playwright behavioral + pass** covering duplicate rejection, out-of-range rejection, + 21st-entry rejection and completion lock, cohort derivation in UI and + CSV, both invalid demo combinations, persistence, draft restore, CSV + escaping, gated reset, 390px layout, and zero external requests. ## Next actions (in order) diff --git a/plans/2026-08-09-lehi-learn-sprint.md b/plans/2026-08-09-lehi-learn-sprint.md index 82b3284..fd07ee4 100644 --- a/plans/2026-08-09-lehi-learn-sprint.md +++ b/plans/2026-08-09-lehi-learn-sprint.md @@ -2,7 +2,7 @@ date: 2026-08-09 type: sprint-plan project: the-guild -status: ready-when-funnel-live +status: ready-now-zero-cost territory: Lehi, Utah prerequisites: a phone with subscription ChatGPT + the offline field log (playbooks/lehi-field-log.html) — no paid infrastructure --- diff --git a/playbooks/lehi-field-log.html b/playbooks/lehi-field-log.html index 154c4cb..571d47e 100644 --- a/playbooks/lehi-field-log.html +++ b/playbooks/lehi-field-log.html @@ -28,8 +28,11 @@ .bar { background: var(--steel); height: 100%; width: 0%; transition: width 0.2s; } .bar-label { position: absolute; inset: 0; display: flex; align-items: center; justify-content: center; font-size: 0.78rem; font-weight: 700; color: var(--ink); } .cohorts { font-size: 0.75rem; color: var(--muted); text-align: center; margin-bottom: 0.9rem; font-variant-numeric: tabular-nums; } + .complete-banner { display: none; background: var(--good-soft); border: 2px solid var(--good); color: var(--good); font-weight: 800; font-size: 0.95rem; text-align: center; padding: 0.7rem; margin-bottom: 0.9rem; } + .complete-banner.show { display: block; } fieldset { border: 2px solid var(--ink); padding: 0.75rem; margin: 0 0 1rem; } + fieldset:disabled { opacity: 0.55; } legend { font-size: 0.72rem; font-weight: 800; letter-spacing: 0.12em; text-transform: uppercase; color: var(--steel); padding: 0 0.3rem; } label { display: block; font-size: 0.72rem; font-weight: 700; letter-spacing: 0.05em; text-transform: uppercase; color: var(--muted); margin: 0.65rem 0 0.2rem; } label:first-of-type { margin-top: 0; } @@ -45,6 +48,11 @@ border: 1.5px solid var(--ink); background: var(--paper); color: var(--ink); cursor: pointer; } .seg button.on { background: var(--steel); border-color: var(--steel); color: #FFFFFF; } + .seg button:disabled { opacity: 0.35; cursor: not-allowed; } + .cohort-display { + font-size: 1.25rem; font-weight: 850; color: var(--steel); background: var(--steel-soft); + border: 2px solid var(--steel); text-align: center; padding: 0.45rem; font-variant-numeric: tabular-nums; + } .hint { font-size: 0.72rem; color: var(--amber); font-weight: 600; margin-top: 0.2rem; } .pii { font-size: 0.72rem; color: var(--muted); margin-top: 0.65rem; } @@ -52,7 +60,7 @@ width: 100%; padding: 0.85rem; font-size: 1.05rem; font-weight: 800; letter-spacing: 0.03em; background: var(--good); color: #FFFFFF; border: 2px solid var(--good); cursor: pointer; margin-top: 0.9rem; } - .save-btn:disabled { background: var(--line); border-color: var(--line); color: var(--muted); } + .save-btn:disabled { background: var(--line); border-color: var(--line); color: var(--muted); cursor: not-allowed; } .msg { font-size: 0.8rem; font-weight: 700; margin-top: 0.4rem; min-height: 1.1rem; } .msg.ok { color: var(--good); } .msg.err { color: var(--danger); } @@ -76,18 +84,19 @@

Lehi Field Log — 20 Doors

-

Offline. Saves on this device only. Export CSV at day's end. Every door gets logged, including no-answers.

+

Offline. Saves on this device only. Export CSV at day's end. Every door 1–20 gets logged exactly once, including no-answers.

0 / 20 doors
$497: 0 · $997: 0 · closed: 0
+
SPRINT COMPLETE — all 20 doors logged. Export the CSV.
-
-
+ +
This door
- - + +
@@ -104,12 +113,8 @@

Lehi Field Log — 20 Doors

- -
- - -
-
+ +
$497
@@ -123,6 +128,7 @@

Lehi Field Log — 20 Doors

+
Pick "Demo shown" first — result options follow it.
@@ -149,10 +155,9 @@

Lehi Field Log — 20 Doors

Business info only — no customer names, numbers, or personal details in this log.

- - -
+ +

Logged doors

@@ -168,7 +173,7 @@

Logged doors

-
The Guild · Lehi learn sprint · doctrine: every door logged, no cherry-picking · measure → improve → prove
+
The Guild · Lehi learn sprint · doctrine: every door logged once, no cherry-picking · measure → improve → prove
From ca253d688b8af9a437fbd0adfbf8b932b71393b3 Mon Sep 17 00:00:00 2001 From: Claude Date: Sun, 9 Aug 2026 22:41:29 +0000 Subject: [PATCH 07/14] Guild Command Center: unified phone-first cockpit for the Lehi sprint One self-contained file with five in-page views: COMMAND (mission, phases, zero-cost readiness), WORKFLOW (door flow with locked honest wording + fulfillment lanes tagged by tier), LOG (the full field log on the same localStorage keys), CLIENT (prospect-facing presentation mode with editable prompt, honest present/absent reads, and the current door's locked price only), RESULTS (live stats with the correct demo-rate denominator and a decision gate that never labels a partial run). Resolves the measurement schema mismatch by adding owner_present and sit_down_booked with enforced truth cascades and non-destructive legacy migration; CSV header and template updated. Committed behavioral suite (playbooks/tests/command-center-smoke.js) passes 126/126 at 390px and desktop, including zero-external-request and guarantee-language checks. Sprint plan, build plan, canonical handoff, and journal now point to the Command Center as the canonical first-sprint surface; the standalone field log is demoted to emergency fallback. Co-Authored-By: Claude Fable 5 Claude-Session: https://claude.ai/code/session_017SgKh5sTzx4rjanwEAXtfc --- handoffs/2026-08-09-guild-handoff.md | 12 +- journal/2026-08-09-direction-lock.md | 37 +- plans/2026-08-08-build-phase-plan.md | 11 +- plans/2026-08-09-lehi-learn-sprint.md | 35 +- playbooks/guild-command-center.html | 1067 +++++++++++++++++++++++ playbooks/lehi-field-log-template.csv | 2 +- playbooks/tests/command-center-smoke.js | 354 ++++++++ 7 files changed, 1498 insertions(+), 20 deletions(-) create mode 100644 playbooks/guild-command-center.html create mode 100644 playbooks/tests/command-center-smoke.js diff --git a/handoffs/2026-08-09-guild-handoff.md b/handoffs/2026-08-09-guild-handoff.md index 5caa6d8..813e326 100644 --- a/handoffs/2026-08-09-guild-handoff.md +++ b/handoffs/2026-08-09-guild-handoff.md @@ -36,7 +36,8 @@ activates at the first close — until then no API key, no paid calls. | Fulfillment playbook v1 + price tiers | `playbooks/fulfillment-playbook-v1.md` | **approved** by Brandon | | Build plan (revised) | `plans/2026-08-08-build-phase-plan.md` | active | | Lehi sprint plan | `plans/2026-08-09-lehi-learn-sprint.md` | ready now — zero-cost, needs only a phone and doors | -| **Offline field log (canonical sprint record)** | `playbooks/lehi-field-log.html` + `lehi-field-log-template.csv` + private artifact e52d93c2-62b6-464c-9c9b-8c6eb0208edb | verified: 71/71 behavioral checks — protocol-enforced (doors 1–20 unique, completion lock at 20, derived cohorts, demo-consistency locks), offline, localStorage, escaped CSV, gated reset, zero network calls | +| **Guild Command Center (canonical first-sprint surface)** | `playbooks/guild-command-center.html` + committed test `playbooks/tests/command-center-smoke.js` + private artifact d2fe8d92-9c56-4a56-bb3a-20f91a8f4cb7 | verified: 126/126 behavioral checks at 390px + desktop — five views (command/workflow/log/client/results), full field-log integrity contract, owner_present + sit_down_booked schema with truth cascades, legacy migration, correct demo-rate denominator, no-verdict-on-partial-runs gate, client honesty copy scan, zero network calls | +| Offline field log (EMERGENCY fallback only) | `playbooks/lehi-field-log.html` + `lehi-field-log-template.csv` + private artifact e52d93c2-62b6-464c-9c9b-8c6eb0208edb | pre-schema-revision (lacks owner/sit-down fields); entries logged there read as incomplete in the results gate | | Funnel build sheet + consent language | `playbooks/ghl-funnel-build-sheet.md` | spec only — procurement deferred until after a close | | Price card (honesty-fixed) | `playbooks/price-card-print.html` + artifact 9302a24e-24a1-48b2-8e29-aa83476edcea | post-signal — print after a number exists | | One-pager v2 / Script Book v1 | artifacts d51a71b4… / c6c4dfb3… | live (from 8/7) | @@ -64,9 +65,12 @@ activates at the first close — until then no API key, no paid calls. ## 4. Next actions (all Brandon's world; docs and tools are ready) -1. **Field log check** — open the field log on the phone (artifact - e52d93c2-62b6-464c-9c9b-8c6eb0208edb, or save the HTML file to the - phone for fully-offline use), save a test entry, export CSV, reset. +1. **Command Center check** — open it on the phone (artifact + d2fe8d92-9c56-4a56-bb3a-20f91a8f4cb7, or save + `playbooks/guild-command-center.html` to the phone for fully-offline + use), save a test door in LOG, export CSV, reset. It is the single + front door: plan (COMMAND), door script (WORKFLOW), record (LOG), + prospect presentation (CLIENT), and live gates (RESULTS). 2. **Joey dry run** — lanes 1–3 + 5 on a friendly business, timed. 3. **Lehi sprint** — 20 doors per `plans/2026-08-09-lehi-learn-sprint.md`, zero-cost. Output: close-rate by cohort + complete field-log CSV. diff --git a/journal/2026-08-09-direction-lock.md b/journal/2026-08-09-direction-lock.md index 1fbccaf..507675f 100644 --- a/journal/2026-08-09-direction-lock.md +++ b/journal/2026-08-09-direction-lock.md @@ -110,9 +110,44 @@ unchanged. CSV, both invalid demo combinations, persistence, draft restore, CSV escaping, gated reset, 390px layout, and zero external requests. +## Guild Command Center built (2026-08-09, authorized) + +- **`playbooks/guild-command-center.html`** — one self-contained, + phone-first cockpit (no libraries, backend, login, or network calls; + sticky bottom nav on phone, rail on desktop): COMMAND (mission, + phases with you-are-here, zero-cost readiness, immediate sequence), + WORKFLOW (8-step door flow with the locked honest PRESENT/ABSENT + wording + fulfillment lanes tagged $497/$997/$149-mo), LOG (the full + field log, same localStorage keys), CLIENT (6-card presentation mode + for the prospect's hands — editable prompt, copyable question, + honest interpretation, tier for the current door, no internal + experiment language), RESULTS (live counts, correct-denominator demo + rate, cohort direction, and a decision gate that never labels a + partial run). Private artifact d2fe8d92-9c56-4a56-bb3a-20f91a8f4cb7. +- **Schema mismatch resolved:** the documented learn gates required + "demo rate among answered owner-present conversations" and "sit-downs + booked" — fields the log couldn't record. Added `owner_present` + (yes/no/not applicable) and `sit_down_booked` (yes/no) with enforced + truth cascades ("no answer" forces N/A + demo not run + sit no; + leaving "no answer" clears the forced values for fresh answers; + sit-down=yes requires a conversation). CSV header + template updated. + Legacy fallback-logger entries migrate non-destructively at read time + (no-answer doors derive their values; answered doors export empty + owner/sit fields and are flagged incomplete by the gate — the run + cannot be judged until every entry is complete). +- **Verified: 126/126 behavioral checks** via the committed suite + `playbooks/tests/command-center-smoke.js`, run at 390×844 and + 1280×800: navigation + client-mode chrome, all prior field-log + integrity behaviors, the new cascades, migration, denominator math, + both complete-run gate verdicts, partial-run no-verdict, tier + mapping, client copy honesty scan, zero external requests, no + horizontal overflow. +- The standalone `lehi-field-log.html` is demoted to EMERGENCY fallback + (pre-revision schema; its entries read incomplete in the gate). + ## Next actions (in order) -1. Field log on the phone; test entry, export, reset. +1. Command Center on the phone; test door in LOG, export, reset. 2. Joey dry run (lanes 1–3 + 5, timed). 3. Lehi 20-door sprint — field log is the canonical record. 4. Crew decisions before first dollar. diff --git a/plans/2026-08-08-build-phase-plan.md b/plans/2026-08-08-build-phase-plan.md index 7fcb39b..661160e 100644 --- a/plans/2026-08-08-build-phase-plan.md +++ b/plans/2026-08-08-build-phase-plan.md @@ -39,7 +39,7 @@ in this phase. The first 20 doors run zero-cost. | # | Item | Owner | Gate | |---|------|-------|------| -| N1 | Field log on the phone: open `playbooks/lehi-field-log.html` (or its private artifact), confirm it saves and exports | Brandon | test entry saved + CSV exported, then reset | +| N1 | Command Center on the phone: open `playbooks/guild-command-center.html` (private artifact d2fe8d92-…), save a test door in LOG, export CSV, reset | Brandon | test entry saved + CSV exported, then reset | | N2 | Joey dry run: playbook lanes 1–3 + 5 on one friendly business, timed (Step 0's probe baseline is deferred with the probe lane) | Joey + Brandon | checklist done once; hours-per-client written down | | N3 | Crew decisions: rev split across the seven; referral reward now vs later — the flywheel needs the referral answer | Brandon + crew | decided before first outside dollar | @@ -47,9 +47,12 @@ in this phase. The first 20 doors run zero-cost. Full sprint plan: `plans/2026-08-09-lehi-learn-sprint.md` — first-wave scope, trade cohorts, the ChatGPT-on-their-phone demo procedure, the -offline field-log recording spec, and pass/fail evidence after the -first reps. The field log is the canonical record for the first 20 -doors. +recording spec, and pass/fail evidence after the first reps. The +**Guild Command Center** (`playbooks/guild-command-center.html`) is the +canonical first-sprint surface — plan, workflow, log, client +presentation, and results in one offline file; its LOG view is the +canonical record. `playbooks/lehi-field-log.html` is an emergency +fallback only. ## POST-SIGNAL INFRASTRUCTURE (procure after a close, not before) diff --git a/plans/2026-08-09-lehi-learn-sprint.md b/plans/2026-08-09-lehi-learn-sprint.md index fd07ee4..de857c8 100644 --- a/plans/2026-08-09-lehi-learn-sprint.md +++ b/plans/2026-08-09-lehi-learn-sprint.md @@ -4,7 +4,7 @@ type: sprint-plan project: the-guild status: ready-now-zero-cost territory: Lehi, Utah -prerequisites: a phone with subscription ChatGPT + the offline field log (playbooks/lehi-field-log.html) — no paid infrastructure +prerequisites: a phone with subscription ChatGPT + the Guild Command Center (playbooks/guild-command-center.html) — no paid infrastructure --- # Lehi Learn Sprint — First-Wave Plan @@ -85,23 +85,34 @@ implies we make the AI say their name or guarantee placement or score. The demo shows what the AI says today; the offer is measure → improve → prove. -## What to record (canonical: the offline field log, per door, 60 seconds) +## What to record (canonical: the Command Center LOG view, per door, 60 seconds) -**`playbooks/lehi-field-log.html` is the canonical record for the first -20 doors.** It runs offline on the phone — no backend, no login, no -network — autosaves locally, tracks progress out of 20, and exports CSV -(`playbooks/lehi-field-log-template.csv` is the same header as a -paper/spreadsheet fallback). Fields per door: +**`playbooks/guild-command-center.html` is the canonical first-sprint +surface** — plan, door workflow, field log, client presentation, and +live results in one offline file (private artifact +d2fe8d92-9c56-4a56-bb3a-20f91a8f4cb7). Its LOG view is the canonical +record for the first 20 doors: offline, localStorage autosave, progress +out of 20, escaped CSV export (`playbooks/lehi-field-log-template.csv` +is the same header as a paper/spreadsheet fallback). Fields per door: - door number · timestamp (auto) · business name · trade -- price_cohort ($497/$997) · demo_shown (y/n) -- **demo_result: present / absent / not run** +- price_cohort ($497/$997, derived from door parity — locked) - outcome (closed / callback set / soft no / hard no / no answer) +- **owner_present (yes / no / not applicable)** +- demo_shown (y/n) · **demo_result: present / absent / not run** +- **sit_down_booked (yes / no)** - element read (Fire/Earth/Water/Air/unread) · notes with objection verbatim · optional callback date +Truth rules the log enforces: "no answer" forces owner_present=N/A, +demo_shown=no, demo_result=not run, sit_down_booked=no; a sit-down can +only be "yes" when a conversation happened; a shown demo must record +Present or Absent, never "not run." + No customer PII goes in the log — business info only. Export the CSV at -the end of each day. +the end of each day. `playbooks/lehi-field-log.html` remains an +EMERGENCY fallback only: it predates the owner/sit-down fields, and +entries logged there will read as incomplete in the results gate. ## On a close @@ -123,6 +134,10 @@ the end of each day. Hard gate (sprint validity): **all 20 doors logged, complete fields** — an incomplete dataset is an invalid run, same as the probe. +The Command Center's RESULTS view computes these gates automatically +with the correct denominators, and refuses any verdict until the run is +complete — a partial or incomplete run is never labeled pass or fail. + Read after 20 doors (learn gates, not success guarantees): - **Demo lands:** demo_shown on ≥50% of real conversations (door answered, diff --git a/playbooks/guild-command-center.html b/playbooks/guild-command-center.html new file mode 100644 index 0000000..b6a1e24 --- /dev/null +++ b/playbooks/guild-command-center.html @@ -0,0 +1,1067 @@ + + + + + +Guild Command Center + + + + +
+ LEHI PILOT + 0 / 20 + Prepare + +
+ +
+ + +
+

Command

+

Measure → improve → prove. Sell the odds, prove the delta, never promise the coin flip. We guarantee only the work and the report.

+ +
+

Mission: The Guild sells local businesses a measured AI appearance rate — the wedge. The small offer buys a customer; the ladder and the referral flywheel build the business. First market: Lehi, Utah, twenty doors, zero cost.

+
+ +

What happens next

+
+
Prepare
Phone check · field log test · Joey dry run
+
20-door learn sprint
Lehi · alternating price cohorts · every door logged
+
First close
Consent on paper · triggers baseline + procurement decisions
+
Baseline + fulfillment
Internal probe baseline · playbook lanes
+
90-day remeasure
Same question, same count — the before/after they hold
+
Referral flywheel
Proven customers recruit the next doors
+
+ +

Ready now — zero cost

+
+
+ Subscription ChatGPT + A phone + This field log + Physical doors +
+
+ Funnel — after first close + Probe baseline — after first close + Printed cards — after a number exists +
+

The second row isn't missing — it's deliberately parked until a close proves the offer.

+
+ +

Immediate sequence

+
+
    +
  1. Phone check: save a test door in LOG, export the CSV, reset.
  2. +
  3. Joey dry run: fulfillment lanes 1–3 + 5 on a friendly business, timed.
  4. +
  5. Twenty doors in Lehi — the WORKFLOW view is the script.
  6. +
  7. Crew decision before the first dollar: rev split + referral reward.
  8. +
+
+
+ + +
+

Workflow

+

The door, step by step

+ +
1Approach + element read +

First 30 seconds: read the buyer — Fire (rival on the brain), Earth (wants paper), Water (been burned), Air (curious, phone out). The script book governs the pitch itself.

+
+
2Ask permission +

"Grab your phone — I want to show you something about your business. Takes 45 seconds."

+
+
3They open ChatGPT +

Their phone, their thumbs. If they don't have it or won't install: your phone is the fallback. Web search on if the toggle is visible. Switch to the CLIENT view and hand them the screen.

+
+
4Ask the real local question +

"Who should I call for a [their trade] in Lehi, Utah?"

Their trade, exact wording, they hit send. Never re-roll the answer.

+
+
5Record what happened +

Present, absent, or not run — it goes in the LOG exactly as it happened. The demo shows what the AI says today; nothing more.

+
+
6Explain it honestly +
+

If they're ABSENT:

+

"Today, ChatGPT named other businesses in this answer — not you. And here's the honest part: one ask is one flip of the coin. The answer changes from ask to ask. We measure the real number — ten separate asks, counted — do the work, and measure again in ninety days. You hold both reports."

+

If they're PRESENT:

+

"Good — today's answer went your way. It doesn't always: the same question gets different answers ask to ask. We measure your real rate, keep doing the work, and remeasure as it changes — so you're not betting on one lucky answer."

+

One answer never proves a ranking, a rate, or where calls go. Only the sampled number is real.

+
+
+
7Offer the locked price +

The CLIENT view shows this door's price and what's included. Say the number straight the moment price comes up. No guarantee of placement or score — the work and the reports are what's promised.

+
+
8Log outcome + follow-up +

Outcome, owner present, sit-down booked, element, their exact objection words, callback date if any. On a close: consent language on paper, and fulfillment begins per the playbook below.

+
+ +

After a close — fulfillment lanes (playbook v1)

+
+
$497 + $997Intake + internal baseline measurement (probe lane activates at first close)
+
$497 + $997Google Business Profile: claim, complete every field, photos, respond to reviews
+
$497 + $997Yelp: claim + complete + respond — never solicit Yelp reviews (policy)
+
$497 + $997ChatGPT stack: Foursquare claim, Bing Places via GBP import, Bing Webmaster Tools, crawlability
+
$497 + $997NAP consistency sweep: one canonical name/address/phone everywhere
+
$997Review engine — Google-first asks, no incentives, no gating, FTC-clean
+
$997Website + local mentions: service-town pages, best-of list pitches
+
$997Midpoint check + printed before/after report
+
$497 + $99790-day remeasure with the locked baseline config
+
$149/moStay Visible: monthly measurement, every review answered, listing patrol, quarterly refresh
+

Setup fee credits toward the first month. We do not sell schema markup as AI magic, and we never guarantee a ranking, placement, or score.

+
+
+ + +
+

Field Log — 20 Doors

+

Offline. Saves on this device only. Every door 1–20 logged exactly once, including no-answers. Export CSV at day's end.

+ +
0 / 20 doors
+
$497: 0 · $997: 0 · closed: 0
+
SPRINT COMPLETE — all 20 doors logged. See RESULTS and export the CSV.
+ +
+
+ This door +
+
+ + +
+
+ + +
+
+ + + + + +
$497
+ + +
+ + + + + +
+ + +
+ + + +
+
N/A applies only to no-answer doors.
+ + +
+ + +
+ + +
+ + + +
+
Pick "Demo shown" first — result options follow it.
+ + +
+ + +
+ + +
+ + + + + +
+ + + + + + + +

Business info only — no customer names, numbers, or personal details in this log.

+
+ +
+
+ +

Logged doors

+

Nothing yet. First door of twenty.

+ +
+ +
+ Reset (erases ALL entries) +

This deletes every logged door from this device permanently. Export the CSV first. Type RESET to arm the button.

+ + +
+
+
Doctrine: every door logged once, no cherry-picking · fallback logger: playbooks/lehi-field-log.html (emergency only — it lacks the owner/sit-down fields)
+
+ + +
+

Results

+
+
RUN INCOMPLETE
+

Gates evaluate only on a complete run: all 20 unique doors with complete entries. Partial data never produces a pass or fail.

+
+ +

Counts

+
+ +

Demo rate (correct denominator)

+
+ +

Outcomes

+
+ +

Cohorts — direction only, not proof

+
+ +

Trades + elements

+
+ +

Callbacks due

+
+ +
+ +
+
+ +
+ + +
+ +
+
STEP 1 OF 6
+ +
+

Let's ask your ChatGPT.

+

Not ours — yours. Same app your customers use.

+ + + + + + +
+
+ +
+

Type this in — your thumbs.

+
Who should I call for a plumber in Lehi, Utah?
+ +

+
+
+ +
+

What did it say?

+

Read the answer together. Is your business in it?

+
+ + +
+
+
+ +
+

Here's the honest read.

+

+

What we sell is the real number: we ask ten separate times, count how often you're named, do the work, then measure again in ninety days. You hold both reports.

+
+
+ +
+

What we improve.

+

The places the AI actually reads about you:

+
+ Google profileYelpBing + FoursquareAppleYour website + Reviews, done legallyWrong info fixed +
+

Claimed, corrected, complete — then measured again.

+
+
+ +
+

One flat price. No contract on setup.

+
$497 setup
+
    +

    $149/month after keeps it measured and maintained: monthly check, every review answered, listing patrol. Your setup fee credits toward the first month.

    +

    If that's fair, we can start this week — I'll take your business info and the work begins. You'll have the first measured report in hand within days.

    +

    "Anyone who guarantees a ranking is lying to you. I guarantee the work — and a before/after report you can hold."

    +
    +
    +
    +
    + + + + + + diff --git a/playbooks/lehi-field-log-template.csv b/playbooks/lehi-field-log-template.csv index dbfc801..414bc6e 100644 --- a/playbooks/lehi-field-log-template.csv +++ b/playbooks/lehi-field-log-template.csv @@ -1 +1 @@ -door_number,timestamp,business_name,trade,price_cohort,demo_shown,demo_result,outcome,objection_element,notes,callback_date +door_number,timestamp,business_name,trade,price_cohort,owner_present,demo_shown,demo_result,outcome,sit_down_booked,objection_element,notes,callback_date diff --git a/playbooks/tests/command-center-smoke.js b/playbooks/tests/command-center-smoke.js new file mode 100644 index 0000000..572eb02 --- /dev/null +++ b/playbooks/tests/command-center-smoke.js @@ -0,0 +1,354 @@ +/* + * Behavioral smoke suite for playbooks/guild-command-center.html + * + * Run: npm install playwright (Chromium required; uses /opt/pw-browsers/chromium + * when present, otherwise Playwright's own browser) + * node playbooks/tests/command-center-smoke.js + * + * Proves: view navigation (incl. client presentation mode), zero external + * requests, no horizontal overflow at 390px and desktop, the full field-log + * integrity contract (doors 1-20 unique, duplicate/out-of-range/21st-entry + * rejection, completion lock, derived cohorts, demo-consistency locks, draft + * + reload persistence, escaped CSV, typed-RESET gate), the owner_present / + * sit_down_booked schema with its truth cascades, legacy-entry migration, + * the RESULTS denominator (demos among answered owner-present conversations), + * partial-run INVALID, both 20-door gate verdicts, client-view honesty copy, + * tier mapping, and a customer-facing guarantee-language scan. + */ +const { chromium } = require("playwright"); +const path = require("path"); +const fs = require("fs"); + +const FILE = "file://" + path.resolve(__dirname, "..", "guild-command-center.html"); +const CHROMIUM = "/opt/pw-browsers/chromium"; +const results = []; +function check(name, ok, detail) { + results.push((ok ? "PASS" : "FAIL") + " " + name + (detail ? " (" + detail + ")" : "")); + if (!ok) process.exitCode = 1; +} + +function entry(door, over) { + const base = { + door_number: door, timestamp: "2026-08-10 09:00", business_name: "Biz " + door, + trade: "hvac", price_cohort: door % 2 === 1 ? "$497" : "$997", + owner_present: "yes", demo_shown: "yes", demo_result: "absent", + outcome: "soft no", sit_down_booked: "no", objection_element: "water", + notes: "", callback_date: "" + }; + return Object.assign(base, over || {}); +} +function noAnswer(door) { + return entry(door, { owner_present: "not applicable", demo_shown: "no", demo_result: "not run", outcome: "no answer", sit_down_booked: "no", objection_element: "unread" }); +} +async function seed(page, entries) { + await page.evaluate((data) => { + localStorage.setItem("lehi-field-log-v1", JSON.stringify(data)); + localStorage.removeItem("lehi-field-log-draft-v1"); + }, entries); + await page.reload(); +} +async function nav(page, view) { await page.click(`#tabbar button[data-view="${view}"]`); } + +async function saveDoor(page, o) { + if (o.door != null) await page.fill("#door", String(o.door)); + await page.selectOption("#trade", o.trade || "plumber"); + if (o.biz) await page.fill("#biz", o.biz); + await page.click(`#outcome button[data-v="${o.outcome || "soft no"}"]`); + if ((o.outcome || "soft no") !== "no answer") { + await page.click(`#ownerPresent button[data-v="${o.owner || "yes"}"]`); + await page.click(`#demoShown button[data-v="${o.demoShown || "yes"}"]`); + if ((o.demoShown || "yes") === "yes") await page.click(`#demoResult button[data-v="${o.demoResult || "absent"}"]`); + await page.click(`#sitDown button[data-v="${o.sit || "no"}"]`); + } + await page.click(`#element button[data-v="${o.element || "water"}"]`); + if (o.notes) await page.fill("#notes", o.notes); + if (o.cb) await page.fill("#cb", o.cb); + await page.click("#saveBtn"); +} + +(async () => { + const launchOpts = fs.existsSync(CHROMIUM) ? { executablePath: CHROMIUM } : {}; + const browser = await chromium.launch(launchOpts); + + /* ================= MOBILE (390px) — full suite ================= */ + const ctx = await browser.newContext({ viewport: { width: 390, height: 844 }, acceptDownloads: true }); + const page = await ctx.newPage(); + const external = []; + page.on("request", (r) => { if (!r.url().startsWith("file://")) external.push(r.url()); }); + await page.goto(FILE); + check("m: page loads with title", (await page.title()) === "Guild Command Center"); + + // ---- Top status + navigation ---- + for (const id of ["topProgress","topPhase","nextMoveBtn","tabbar"]) { + check("m: #" + id + " present", await page.locator("#" + id).count() === 1); + } + check("m: starts on COMMAND", await page.locator("#view-command").evaluate(v => v.classList.contains("on"))); + check("m: phase pill starts Prepare", (await page.locator("#topPhase").textContent()) === "Prepare"); + check("m: next move says START DOOR 1", (await page.locator("#nextMoveBtn").textContent()).includes("START DOOR 1")); + check("m: COMMAND marks Prepare as current", await page.locator('.phase[data-phase="0"] .youarehere').count() === 1); + check("m: post-close chips labeled later", (await page.locator(".chip.later").count()) === 3); + + for (const v of ["workflow","log","results","command"]) { + await nav(page, v); + check("m: nav to " + v.toUpperCase(), await page.locator("#view-" + v).evaluate(el => el.classList.contains("on"))); + } + check("m: no page navigation occurred", page.url().startsWith("file://")); + + // NEXT MOVE routes to LOG when incomplete + await page.click("#nextMoveBtn"); + check("m: NEXT MOVE routes to LOG", await page.locator("#view-log").evaluate(v => v.classList.contains("on"))); + + // ---- CLIENT presentation mode ---- + await nav(page, "client"); + check("m: client view on", await page.locator("#view-client").evaluate(v => v.classList.contains("on"))); + check("m: client mode hides tabbar", await page.locator("#tabbar").evaluate(t => getComputedStyle(t).display === "none")); + check("m: client mode hides topbar", await page.locator(".topbar").evaluate(t => getComputedStyle(t).display === "none")); + check("m: client price maps door 1 → $497", (await page.locator("#cPrice").textContent()).includes("$497")); + await page.selectOption("#cTrade", "pest control company"); + await page.fill("#cTown", "Lehi, Utah"); + await page.click("#cNext0"); + check("m: prompt uses trade + town", (await page.locator("#cPrompt").textContent()) === "Who should I call for a pest control company in Lehi, Utah?"); + await page.click("#cCopy"); + const copyFeedback = await page.waitForFunction( + () => (document.getElementById("cCopyMsg").textContent || "").length > 0, null, { timeout: 5000 } + ).then(() => true, () => false); + check("m: copy gives feedback", copyFeedback); + await page.click("#cNext1"); + await page.click("#cAbsent"); + const absentText = await page.locator("#cInterpBody").textContent(); + check("m: ABSENT copy says one answer proves nothing", absentText.includes("one flip of the coin") && absentText.includes("doesn't prove")); + await page.click("#cBack3"); + await page.click("#cPresent"); + const presentText = await page.locator("#cInterpBody").textContent(); + check("m: PRESENT copy warns it doesn't always", presentText.includes("doesn't always") && presentText.includes("never proves")); + await page.click("#cNext3"); await page.click("#cNext4"); + check("m: $497 tier lists 4 inclusions", (await page.locator("#cIncludes li").count()) === 4); + check("m: honest line present on offer card", (await page.locator(".honest-foot").textContent()).includes("guarantee the work")); + check("m: no cohort/experiment language in client view", !/cohort|experiment|odd door|even door/i.test(await page.locator("#view-client").innerText())); + await page.click("#clientExit"); + check("m: client exit returns to operator", await page.locator("#view-command").evaluate(v => v.classList.contains("on"))); + + // ---- Customer-facing copy scan (guarantee violations) ---- + const clientCopy = await page.locator("#view-client").innerText(); + const scrubbed = clientCopy.replace(/Anyone who guarantees a ranking is lying to you\. I guarantee the work[^"]*"/g, ""); + check("m: client copy has no guarantee violations", + !/(we (?:will |’ll |'ll )?make (?:the )?AI|guarantee[sd]? (?:a |your )?(?:rank|placement|score|result|spot)|you will (?:show up|appear|rank)|#1 in ChatGPT)/i.test(scrubbed)); + + // ---- LOG: structure ---- + await nav(page, "log"); + for (const id of ["door","trade","biz","notes","cb","cohortDisplay","outcome","ownerPresent","demoShown","demoResult","sitDown","element","saveBtn","exportBtn","resetBtn","resetConfirm","completeBanner"]) { + check("m: log #" + id + " present", await page.locator("#" + id).count() === 1); + } + check("m: trades include wave-one set", (await page.locator("#trade option").allTextContents()).join("|").includes("sprinkler")); + check("m: door bounded 1-20 in markup", await page.locator('#door[min="1"][max="20"]').count() === 1); + check("m: no manual cohort control", (await page.locator("#cohortDisplay button").count()) === 0); + check("m: door 1 derives $497", (await page.locator("#cohortDisplay").textContent()).includes("$497")); + await page.fill("#door", "2"); + check("m: door 2 derives $997", (await page.locator("#cohortDisplay").textContent()).includes("$997")); + await page.fill("#door", "1"); + + // ---- Cascades ---- + check("m: owner N/A disabled by default", await page.locator('#ownerPresent button[data-v="not applicable"]').isDisabled()); + check("m: demo result locked before demoShown", await page.locator('#demoResult button[data-v="present"]').isDisabled()); + await page.click('#outcome button[data-v="no answer"]'); + check("m: no-answer forces owner N/A", await page.locator('#ownerPresent button[data-v="not applicable"]').evaluate(b => b.classList.contains("on"))); + check("m: no-answer locks owner group", await page.locator('#ownerPresent button[data-v="yes"]').isDisabled()); + check("m: no-answer forces demo no", await page.locator('#demoShown button[data-v="no"]').evaluate(b => b.classList.contains("on"))); + check("m: no-answer forces not run", await page.locator('#demoResult button[data-v="not run"]').evaluate(b => b.classList.contains("on"))); + check("m: no-answer forces sit no", await page.locator('#sitDown button[data-v="no"]').evaluate(b => b.classList.contains("on"))); + check("m: no-answer locks sit group", await page.locator('#sitDown button[data-v="yes"]').isDisabled()); + await page.click('#outcome button[data-v="soft no"]'); + check("m: leaving no-answer unlocks owner", !(await page.locator('#ownerPresent button[data-v="yes"]').isDisabled())); + check("m: leaving no-answer clears owner N/A", await page.locator('#ownerPresent button[data-v="not applicable"]').evaluate(b => !b.classList.contains("on"))); + check("m: leaving no-answer unlocks sit", !(await page.locator('#sitDown button[data-v="yes"]').isDisabled())); + await page.click('#demoShown button[data-v="no"]'); + check("m: demo=no forces not run", await page.locator('#demoResult button[data-v="not run"]').evaluate(b => b.classList.contains("on"))); + check("m: demo=no locks present", await page.locator('#demoResult button[data-v="present"]').isDisabled()); + await page.click('#demoShown button[data-v="yes"]'); + check("m: switch to yes clears not-run", await page.locator('#demoResult button[data-v="not run"]').evaluate(b => !b.classList.contains("on"))); + check("m: yes disables not-run", await page.locator('#demoResult button[data-v="not run"]').isDisabled()); + + // ---- Validation guards ---- + await page.click('#ownerPresent button[data-v="yes"]'); + await page.click('#outcome button[data-v="soft no"]'); + await page.selectOption("#trade", "plumber"); + await page.click('#element button[data-v="water"]'); + await page.click("#saveBtn"); // demo=yes but no result picked + check("m: yes without result rejected", (await page.locator(".msg.err").textContent()).includes("Present or Absent")); + await page.click('#demoResult button[data-v="absent"]'); + await page.click("#saveBtn"); // sit-down not picked + check("m: missing sit-down rejected", (await page.locator(".msg.err").textContent()).includes("Sit-down")); + await page.fill("#door", "0"); + await page.click('#sitDown button[data-v="no"]'); + await page.click("#saveBtn"); + check("m: door 0 rejected", (await page.locator(".msg.err").textContent()).includes("1–20")); + await page.fill("#door", "21"); + await page.click("#saveBtn"); + check("m: door 21 rejected", (await page.locator(".msg.err").textContent()).includes("1–20")); + check("m: no entries after rejects", (await page.locator("#barLabel").textContent()).trim() === "0 / 20 doors"); + + // ---- Valid save with CSV-hostile text ---- + await page.fill("#door", "1"); + await page.fill("#biz", 'Joe\'s "Plumbing", LLC'); + await page.fill("#notes", 'said "another door guy",\nburned by SEO before'); + await page.fill("#cb", "2026-08-12"); + await page.click("#saveBtn"); + check("m: door 1 saved", (await page.locator(".msg.ok").textContent()).includes("Door 1 saved")); + check("m: progress 1/20", (await page.locator("#barLabel").textContent()).trim() === "1 / 20 doors"); + check("m: tally $497:1", (await page.locator("#cohorts").textContent()).includes("$497: 1")); + check("m: door auto-advances to 2", (await page.inputValue("#door")) === "2"); + check("m: entry shows owner + sit in meta", (await page.locator(".entry .meta").first().textContent()).includes("owner yes")); + check("m: top progress updates", (await page.locator("#topProgress").textContent()) === "1 / 20"); + + // ---- Duplicate ---- + await saveDoor(page, { door: 1, outcome: "no answer", element: "unread" }); + check("m: duplicate door 1 rejected", (await page.locator(".msg.err").textContent()).includes("already logged")); + + // ---- Shared data: RESULTS + CLIENT see the same store ---- + await nav(page, "results"); + check("m: RESULTS counts the saved door", (await page.locator("#statGrid").textContent()).includes("1")); + check("m: RESULTS gate incomplete", (await page.locator("#gateVerdict").textContent()).includes("INCOMPLETE")); + await nav(page, "client"); + check("m: CLIENT price follows next door 2 → $997", (await page.locator("#cPrice").textContent()).includes("$997")); + await page.click("#clientExit"); + await nav(page, "log"); + + // ---- Persistence + draft ---- + await page.reload(); + check("m: entry persists after reload", (await page.locator("#barLabel").textContent()).trim() === "1 / 20 doors"); + await nav(page, "log"); + await page.fill("#notes", "draft-survives-reload"); + await page.waitForTimeout(100); + await page.reload(); + await nav(page, "log"); + check("m: draft restored after reload", (await page.inputValue("#notes")) === "draft-survives-reload"); + + // ---- CSV ---- + const [dl1] = await Promise.all([page.waitForEvent("download"), page.click("#exportBtn")]); + const csv1 = fs.readFileSync(await dl1.path(), "utf8"); + check("m: csv header includes new fields in order", + csv1.split("\r\n")[0] === "door_number,timestamp,business_name,trade,price_cohort,owner_present,demo_shown,demo_result,outcome,sit_down_booked,objection_element,notes,callback_date"); + check("m: csv escapes embedded quotes", csv1.includes('"Joe\'s ""Plumbing"", LLC"')); + check("m: csv preserves newline in quoted note", csv1.includes('"said ""another door guy"",\nburned by SEO before"')); + check("m: csv row carries owner+sit values", /\$497,yes,yes,absent,soft no,no/.test(csv1)); + + // ---- Legacy migration (fallback-logger entries) ---- + await seed(page, [ + { door_number: 1, timestamp: "2026-08-10 08:00", business_name: "Legacy Shop", trade: "plumber", price_cohort: "$497", demo_shown: "yes", demo_result: "absent", outcome: "soft no", objection_element: "water", notes: "", callback_date: "" }, + { door_number: 2, timestamp: "2026-08-10 08:10", business_name: "", trade: "hvac", price_cohort: "$997", demo_shown: "no", demo_result: "not run", outcome: "no answer", objection_element: "unread", notes: "", callback_date: "" } + ]); + check("m: legacy entries still count", (await page.locator("#topProgress").textContent()) === "2 / 20"); + await nav(page, "log"); + check("m: legacy answered door shows owner —", (await page.locator(".entry .meta").allTextContents()).some(t => t.includes("owner —"))); + const [dl2] = await Promise.all([page.waitForEvent("download"), page.click("#exportBtn")]); + const csv2 = fs.readFileSync(await dl2.path(), "utf8"); + check("m: legacy no-answer exports derived N/A", /^2,.*not applicable,no,not run,no answer,no/m.test(csv2)); + check("m: legacy answered exports empty owner", /^1,[^\n]*\$497,,yes,absent,soft no,,water/m.test(csv2)); + await nav(page, "results"); + check("m: legacy incomplete flagged in gate", (await page.locator("#gateDetail").textContent()).includes("missing owner-present")); + + // ---- Denominator correctness (partial data, no verdict) ---- + await seed(page, [ + entry(1, { owner_present: "yes", demo_shown: "yes", demo_result: "present" }), + entry(2, { owner_present: "yes", demo_shown: "no", demo_result: "not run" }), + entry(3, { owner_present: "no", demo_shown: "yes", demo_result: "absent" }), + noAnswer(4) + ]); + await nav(page, "results"); + const demoCard = await page.locator("#demoRateCard").textContent(); + check("m: demo denominator = owner-present answered (2)", demoCard.includes("of 2 owner conversations")); + check("m: demo numerator = 1 → 50%", demoCard.includes("50%")); + check("m: partial run stays no-verdict", (await page.locator("#gateVerdict").textContent()).includes("no verdict")); + + // ---- Complete 20: PASS scenario ---- + const passSet = []; + for (let d = 1; d <= 20; d++) { + if (d <= 4) passSet.push(noAnswer(d)); + else if (d <= 14) passSet.push(entry(d, { + owner_present: "yes", + demo_shown: d <= 10 ? "yes" : "no", + demo_result: d <= 10 ? (d % 2 ? "present" : "absent") : "not run", + outcome: d === 5 ? "closed" : (d <= 8 ? "callback set" : "soft no"), + sit_down_booked: d >= 6 && d <= 8 ? "yes" : "no" + })); + else passSet.push(entry(d, { owner_present: "no", demo_shown: "no", demo_result: "not run" })); + } + await seed(page, passSet); + await nav(page, "results"); + check("m: complete-run gate PASS", (await page.locator("#gateVerdict").textContent()).includes("LEARN GATES MET")); + check("m: PASS detail uses owner denominator", (await page.locator("#gateDetail").textContent()).includes("of 10 owner conversations")); + check("m: cohort card labeled direction only", (await page.locator("#cohortCard").textContent()).includes("direction")); + check("m: log locks at completion", await page.locator("#saveBtn").isDisabled()); + check("m: phase advances to First close", (await page.locator("#topPhase").textContent()) === "First close"); + check("m: NEXT MOVE routes to results at 20", (await page.locator("#nextMoveBtn").textContent()).includes("RESULTS")); + await nav(page, "log"); + await page.evaluate(() => document.getElementById("f").requestSubmit()); + check("m: 21st save rejected", (await page.locator(".msg.err").textContent()).includes("Sprint complete")); + check("m: entry count stays 20", await page.evaluate(() => JSON.parse(localStorage.getItem("lehi-field-log-v1")).length) === 20); + + // ---- Complete 20: ATTENTION scenario ---- + const missSet = []; + for (let d = 1; d <= 20; d++) { + if (d <= 4) missSet.push(noAnswer(d)); + else if (d <= 14) missSet.push(entry(d, { + owner_present: "yes", + demo_shown: d <= 6 ? "yes" : "no", + demo_result: d <= 6 ? "absent" : "not run", + outcome: "soft no", sit_down_booked: d === 5 ? "yes" : "no" + })); + else missSet.push(entry(d, { owner_present: "no", demo_shown: "no", demo_result: "not run" })); + } + await seed(page, missSet); + await nav(page, "results"); + check("m: gates-not-met verdict", (await page.locator("#gateVerdict").textContent()).includes("GATES NOT MET")); + const missDetail = await page.locator("#gateDetail").textContent(); + check("m: miss detail names demo gate", missDetail.includes("<50%")); + check("m: miss detail names offer gate", missDetail.includes("sit-downs")); + + // ---- Reset (typed gate) from RESULTS-shared store via LOG ---- + await nav(page, "log"); + await page.click(".reset-box summary"); + check("m: reset disabled before typing", await page.locator("#resetBtn").isDisabled()); + await page.fill("#resetConfirm", "reset"); + check("m: reset disabled wrong case", await page.locator("#resetBtn").isDisabled()); + await page.fill("#resetConfirm", "RESET"); + check("m: reset armed by RESET", !(await page.locator("#resetBtn").isDisabled())); + await page.click("#resetBtn"); + check("m: reset clears to 0/20", (await page.locator("#barLabel").textContent()).trim() === "0 / 20 doors"); + check("m: reset re-enables save", !(await page.locator("#saveBtn").isDisabled())); + await page.reload(); + check("m: reset persists", (await page.locator("#topProgress").textContent()) === "0 / 20"); + + // ---- Overflow + network (mobile) ---- + for (const v of ["command","workflow","log","results"]) { + await nav(page, v); + const w = await page.evaluate(() => document.documentElement.scrollWidth); + check("m: no horizontal overflow on " + v, w <= 390, "scrollWidth=" + w); + } + await nav(page, "client"); + const wc = await page.evaluate(() => document.documentElement.scrollWidth); + check("m: no horizontal overflow on client", wc <= 390, "scrollWidth=" + wc); + check("m: zero external requests (mobile)", external.length === 0, external.join(", ") || "none"); + await ctx.close(); + + /* ================= DESKTOP (1280px) ================= */ + const dctx = await browser.newContext({ viewport: { width: 1280, height: 800 } }); + const dpage = await dctx.newPage(); + const dexternal = []; + dpage.on("request", (r) => { if (!r.url().startsWith("file://")) dexternal.push(r.url()); }); + await dpage.goto(FILE); + check("d: loads at desktop", (await dpage.title()) === "Guild Command Center"); + check("d: rail is vertical at desktop", await dpage.locator("#tabbar").evaluate(t => getComputedStyle(t).flexDirection === "column")); + for (const v of ["workflow","log","results","command"]) { + await dpage.click(`#tabbar button[data-view="${v}"]`); + check("d: nav to " + v, await dpage.locator("#view-" + v).evaluate(el => el.classList.contains("on"))); + } + const dw = await dpage.evaluate(() => document.documentElement.scrollWidth); + check("d: no horizontal overflow", dw <= 1280, "scrollWidth=" + dw); + check("d: zero external requests (desktop)", dexternal.length === 0, dexternal.join(", ") || "none"); + await dctx.close(); + + await browser.close(); + console.log(results.join("\n")); + console.log(results.filter(r => r.startsWith("FAIL")).length + " failures / " + results.length + " checks"); +})().catch(e => { console.error("SMOKE CRASH:", e); process.exit(1); }); From c5f25cb6b05cb41490014d2a3f73587aac2cb64f Mon Sep 17 00:00:00 2001 From: Claude Date: Sun, 9 Aug 2026 22:45:41 +0000 Subject: [PATCH 08/14] Command Center drift fixes: active-door price sync, approved close timeframe CLIENT price now derives from the LOG's active door (a valid unlogged 1-20 in the door input) with nextDoor() fallback and TARGET at completion, so out-of-sequence doors present the correct locked price. Close copy corrected from 'within days' to the approved 'within the week'. Committed regression checks added (active door 2 -> $997 and door 5 -> $497 before any saves, plus copy assertions); suite green at 130/130 on mobile and desktop across two consecutive runs. Co-Authored-By: Claude Fable 5 Claude-Session: https://claude.ai/code/session_017SgKh5sTzx4rjanwEAXtfc --- handoffs/2026-08-09-guild-handoff.md | 2 +- journal/2026-08-09-direction-lock.md | 7 ++++++- playbooks/guild-command-center.html | 12 +++++++++--- playbooks/tests/command-center-smoke.js | 19 +++++++++++++++++++ 4 files changed, 35 insertions(+), 5 deletions(-) diff --git a/handoffs/2026-08-09-guild-handoff.md b/handoffs/2026-08-09-guild-handoff.md index 813e326..b8c61ea 100644 --- a/handoffs/2026-08-09-guild-handoff.md +++ b/handoffs/2026-08-09-guild-handoff.md @@ -36,7 +36,7 @@ activates at the first close — until then no API key, no paid calls. | Fulfillment playbook v1 + price tiers | `playbooks/fulfillment-playbook-v1.md` | **approved** by Brandon | | Build plan (revised) | `plans/2026-08-08-build-phase-plan.md` | active | | Lehi sprint plan | `plans/2026-08-09-lehi-learn-sprint.md` | ready now — zero-cost, needs only a phone and doors | -| **Guild Command Center (canonical first-sprint surface)** | `playbooks/guild-command-center.html` + committed test `playbooks/tests/command-center-smoke.js` + private artifact d2fe8d92-9c56-4a56-bb3a-20f91a8f4cb7 | verified: 126/126 behavioral checks at 390px + desktop — five views (command/workflow/log/client/results), full field-log integrity contract, owner_present + sit_down_booked schema with truth cascades, legacy migration, correct demo-rate denominator, no-verdict-on-partial-runs gate, client honesty copy scan, zero network calls | +| **Guild Command Center (canonical first-sprint surface)** | `playbooks/guild-command-center.html` + committed test `playbooks/tests/command-center-smoke.js` + private artifact d2fe8d92-9c56-4a56-bb3a-20f91a8f4cb7 | verified: 130/130 behavioral checks at 390px + desktop — five views (command/workflow/log/client/results), full field-log integrity contract, owner_present + sit_down_booked schema with truth cascades, legacy migration, correct demo-rate denominator, no-verdict-on-partial-runs gate, active-door price sync, approved-timeframe close copy, client honesty copy scan, zero network calls | | Offline field log (EMERGENCY fallback only) | `playbooks/lehi-field-log.html` + `lehi-field-log-template.csv` + private artifact e52d93c2-62b6-464c-9c9b-8c6eb0208edb | pre-schema-revision (lacks owner/sit-down fields); entries logged there read as incomplete in the results gate | | Funnel build sheet + consent language | `playbooks/ghl-funnel-build-sheet.md` | spec only — procurement deferred until after a close | | Price card (honesty-fixed) | `playbooks/price-card-print.html` + artifact 9302a24e-24a1-48b2-8e29-aa83476edcea | post-signal — print after a number exists | diff --git a/journal/2026-08-09-direction-lock.md b/journal/2026-08-09-direction-lock.md index 507675f..e8b10c3 100644 --- a/journal/2026-08-09-direction-lock.md +++ b/journal/2026-08-09-direction-lock.md @@ -135,7 +135,12 @@ unchanged. (no-answer doors derive their values; answered doors export empty owner/sit fields and are flagged incomplete by the gate — the run cannot be judged until every entry is complete). -- **Verified: 126/126 behavioral checks** via the committed suite +- **Verification drift fixes (same day):** CLIENT price now follows the + LOG's active door (valid unlogged 1–20) with nextDoor() fallback, so + out-of-sequence doors show the correct locked price; close copy + corrected to the approved "within the week" timeframe, with committed + copy assertions preventing regression. +- **Verified: 130/130 behavioral checks** via the committed suite `playbooks/tests/command-center-smoke.js`, run at 390×844 and 1280×800: navigation + client-mode chrome, all prior field-log integrity behaviors, the new cascades, migration, denominator math, diff --git a/playbooks/guild-command-center.html b/playbooks/guild-command-center.html index b6a1e24..9031ee5 100644 --- a/playbooks/guild-command-center.html +++ b/playbooks/guild-command-center.html @@ -510,7 +510,7 @@

    One flat price. No contract on setup.

    $497 setup

      $149/month after keeps it measured and maintained: monthly check, every review answered, listing patrol. Your setup fee credits toward the first month.

      -

      If that's fair, we can start this week — I'll take your business info and the work begins. You'll have the first measured report in hand within days.

      +

      If that's fair, we can start this week — I'll take your business info and the work begins. You'll have the first measured report in hand within the week.

      "Anyone who guarantees a ranking is lying to you. I guarantee the work — and a before/after report you can hold."

      @@ -1005,9 +1005,15 @@

      One flat price. No contract on setup.

      var town = $("cTown").value.trim() || "Lehi, Utah"; $("cPrompt").textContent = "Who should I call for a " + $("cTrade").value + " in " + town + "?"; } + function activeDoor() { + // The door being worked: the LOG's current door number when it is a + // valid unlogged 1-20, else the next unlogged door (TARGET at completion). + var n = parseInt($("door").value, 10); + if (n >= 1 && n <= TARGET && !loggedDoors()[n]) return n; + return nextDoor() || TARGET; + } function syncClientPrice() { - // Price for the door being worked = the next unlogged door's locked cohort. - var nd = nextDoor() || TARGET; + var nd = activeDoor(); var price = cohortFor(nd); $("cPrice").textContent = price + " setup"; var inc497 = [ diff --git a/playbooks/tests/command-center-smoke.js b/playbooks/tests/command-center-smoke.js index 572eb02..8ee83e7 100644 --- a/playbooks/tests/command-center-smoke.js +++ b/playbooks/tests/command-center-smoke.js @@ -104,6 +104,22 @@ async function saveDoor(page, o) { check("m: client mode hides tabbar", await page.locator("#tabbar").evaluate(t => getComputedStyle(t).display === "none")); check("m: client mode hides topbar", await page.locator(".topbar").evaluate(t => getComputedStyle(t).display === "none")); check("m: client price maps door 1 → $497", (await page.locator("#cPrice").textContent()).includes("$497")); + // Active-door regression: CLIENT must follow the LOG's selected door, not + // merely nextDoor() — matters when doors are worked out of sequence. + await page.click("#clientExit"); + await nav(page, "log"); + await page.fill("#door", "2"); + await nav(page, "client"); + check("m: active door 2 (no saves) → CLIENT $997", (await page.locator("#cPrice").textContent()).includes("$997")); + await page.click("#clientExit"); + await nav(page, "log"); + await page.fill("#door", "5"); + await nav(page, "client"); + check("m: active door 5 (no saves) → CLIENT $497", (await page.locator("#cPrice").textContent()).includes("$497")); + await page.click("#clientExit"); + await nav(page, "log"); + await page.fill("#door", "1"); + await nav(page, "client"); await page.selectOption("#cTrade", "pest control company"); await page.fill("#cTown", "Lehi, Utah"); await page.click("#cNext0"); @@ -124,6 +140,9 @@ async function saveDoor(page, o) { await page.click("#cNext3"); await page.click("#cNext4"); check("m: $497 tier lists 4 inclusions", (await page.locator("#cIncludes li").count()) === 4); check("m: honest line present on offer card", (await page.locator(".honest-foot").textContent()).includes("guarantee the work")); + const closeCopy = await page.locator("#cClose").textContent(); + check("m: close copy promises the approved timeframe", closeCopy.includes("within the week")); + check("m: close copy does not say within days", !/within days/i.test(closeCopy)); check("m: no cohort/experiment language in client view", !/cohort|experiment|odd door|even door/i.test(await page.locator("#view-client").innerText())); await page.click("#clientExit"); check("m: client exit returns to operator", await page.locator("#view-command").evaluate(v => v.classList.contains("on"))); From ff79f94bceb6b8f3370b81abb2eaf020d38cd7a9 Mon Sep 17 00:00:00 2001 From: abcnuts Date: Sun, 9 Aug 2026 17:51:15 -0600 Subject: [PATCH 09/14] Ship installable offline Guild Command Center PWA --- .gitignore | 4 + package-lock.json | 62 +++++++ package.json | 15 ++ playbooks/guild-command-center.html | 232 +++++++++++++++++++++++- playbooks/tests/command-center-smoke.js | 8 +- pwa/README.md | 37 ++++ pwa/_headers | 24 +++ pwa/icons/icon-192.png | Bin 0 -> 10348 bytes pwa/icons/icon-512.png | Bin 0 -> 32909 bytes pwa/icons/icon-maskable-512.png | Bin 0 -> 32909 bytes pwa/icons/icon-source.svg | 7 + pwa/manifest.webmanifest | 34 ++++ pwa/sw.js | 60 ++++++ pwa/tests/pwa-smoke.js | 111 ++++++++++++ scripts/build-guild-pwa.sh | 18 ++ 15 files changed, 607 insertions(+), 5 deletions(-) create mode 100644 .gitignore create mode 100644 package-lock.json create mode 100644 package.json create mode 100644 pwa/README.md create mode 100644 pwa/_headers create mode 100644 pwa/icons/icon-192.png create mode 100644 pwa/icons/icon-512.png create mode 100644 pwa/icons/icon-maskable-512.png create mode 100644 pwa/icons/icon-source.svg create mode 100644 pwa/manifest.webmanifest create mode 100644 pwa/sw.js create mode 100644 pwa/tests/pwa-smoke.js create mode 100644 scripts/build-guild-pwa.sh diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..a7e5733 --- /dev/null +++ b/.gitignore @@ -0,0 +1,4 @@ +node_modules/ +dist/ +.DS_Store + diff --git a/package-lock.json b/package-lock.json new file mode 100644 index 0000000..2b53df5 --- /dev/null +++ b/package-lock.json @@ -0,0 +1,62 @@ +{ + "name": "guild-command-center", + "version": "1.0.0", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "guild-command-center", + "version": "1.0.0", + "devDependencies": { + "playwright": "1.62.1" + } + }, + "node_modules/fsevents": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", + "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/playwright": { + "version": "1.62.1", + "resolved": "https://registry.npmjs.org/playwright/-/playwright-1.62.1.tgz", + "integrity": "sha512-0M+L3LAD8/nm554LOla9Ayx0j0tmFZ0FBcoQ7F1VuVHpM/XpiC8RcDzBQB8W5+hA8L22THxELzeF+2WcUzvcLg==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "playwright-core": "1.62.1" + }, + "bin": { + "playwright": "cli.js" + }, + "engines": { + "node": ">=20" + }, + "optionalDependencies": { + "fsevents": "2.3.2" + } + }, + "node_modules/playwright-core": { + "version": "1.62.1", + "resolved": "https://registry.npmjs.org/playwright-core/-/playwright-core-1.62.1.tgz", + "integrity": "sha512-wPYSwEBJY9GHraISXqyqtx0na0LpO3XEX7jNDhntbex7tzUS7kLnZsOlFruFJB4Hi/rhDMjXGqHewDZ68nYZVw==", + "dev": true, + "license": "Apache-2.0", + "bin": { + "playwright-core": "cli.js" + }, + "engines": { + "node": ">=20" + } + } + } +} diff --git a/package.json b/package.json new file mode 100644 index 0000000..ae0bdf1 --- /dev/null +++ b/package.json @@ -0,0 +1,15 @@ +{ + "name": "guild-command-center", + "private": true, + "version": "1.0.0", + "description": "Offline-first field command center for The Guild's Lehi learn sprint.", + "scripts": { + "build": "bash scripts/build-guild-pwa.sh", + "test:command-center": "node playbooks/tests/command-center-smoke.js", + "test:pwa": "node pwa/tests/pwa-smoke.js", + "test": "npm run test:command-center && npm run test:pwa" + }, + "devDependencies": { + "playwright": "1.62.1" + } +} diff --git a/playbooks/guild-command-center.html b/playbooks/guild-command-center.html index 9031ee5..b0d9b91 100644 --- a/playbooks/guild-command-center.html +++ b/playbooks/guild-command-center.html @@ -3,6 +3,14 @@ + + + + + + + + Guild Command Center