Sales Operational Playbooks
One-line description. The operational SOP book agents follow for every part of the sales job — captured by structured recording sessions with Ry, stored as checklists in the rylobasic monorepo, and rendered as an interactive decision tree at
handbook.rycolston.com/playbook/for coaching.
Why
When coaching agents there was no source of truth for "what is the exact sequence of steps for this part of the job." The existing Sales-Team-Playbook.md is curriculum (the why and the what); this project is the operational layer — ordered, branchable checklists an agent or a new hire can execute without interpretation. New and existing agents alike work off the same spine.
The capture method is deliberately two-pass: pass 1 gets every step out as a bare checklist (no scripts, no purpose, no failure notes); pass 2 enriches later. "Get the information out first, organize later." Recording is Ry talking through a real workflow while Claude captures, reads back, and asks "then what?" + outcomes — never reorganizing the spine mid-capture.
Current state
- Status: in-flight (pass 1 capture ongoing)
- Last update: 2026-05-17
- Blocked on: nothing
System captured: "New Consultation Scheduled" — two tracks: - ISA-Initiated (ISA schedules the consult; booking is ISA-owned, upstream, out of scope) — recorded. - Agent-Initiated (agent schedules the consult themselves) — not started; gets its own entry SOP.
Pass-1 SOPs recorded & merged to main (ISA-Initiated track):
1. New Consultation Scheduled (was "New Lead Intake") — 01-new-lead-intake.md
2. Intro Call Protocol — 02-intro-call-protocol.md
3. Pre-Appointment Protocol — 03-pre-appointment-protocol.md
4. Appointment Confirmation Protocol — 04-appointment-confirmation-protocol.md
5. No-Show Path — no-show-path.md
6. Cancelled Appointment Protocol — cancelled-appointment-protocol.md
7. Long-Term Nurture Sequence — long-term-nurture-sequence.md
8. Do Not Contact (true terminal) — do-not-contact.md
Every SOP has a mandatory ## When to run this gate (+ explicit "Do NOT run this if…") and a mandatory ## Outcomes block. No dead-ends — every outcome routes to a recorded SOP, the deferred consult, or a true terminal.
Glossary (load-bearing): scheduled / set = appointment on the calendar, not yet held. Booked = the consult HELD and the seller SIGNED the representation agreement (the conversion). Never conflate.
Deferred: The Listing Consult — intentionally NOT interview-captured. Agents do it differently; Ry will shadow his best agent on a live consult and author it from observed reality. It is the system's convergence/payoff SOP; "→ The Listing Consult" outcomes are parked on this decision, not dead-ends.
Interactive decision tree — SHIPPED 2026-05-17 (MR !109). Live and gated at https://handbook.rycolston.com/playbook/. Self-contained pan/zoom flowchart of the ISA-Initiated track; click any node → side panel with that SOP's full checklist + Outcomes, rendered at build time from the real _recording/ markdown (content never duplicated). Color by state (recorded green / deferred grey / referenced amber / terminal red); loop-back edges dashed. Inherits the existing app-scoped Cloudflare Access gating — no registry.yaml/sync_access.py change. Code: domains/handbook-rycolston-com/build_playbook.py (+ wired into build.py, linked from admin landing, +5 tests).
Next 3 actions
- First, post-restart: run a real Playwright pass on the live gated
https://handbook.rycolston.com/playbook/(not the build artifact) — click nodes, open panels, dark mode, verify the Cloudflare Access sign-in lands on the page.playwright-personalMCP is now global (2026-05-17); its--storage-stateprofile may already hold the Access cookie. See reference_mcp_servers. - Record ISA Lead Qualification Protocol (likely the true upstream entry of the ISA track — may reframe where SOP #1 begins) and Agent Lead Qualification Protocol.
- Open the Agent-Initiated track entry SOP. (Also pending: The Listing Consult — shadow best agent on a live consult, then author it.)
SOP Decision-Tree Visual — SHIPPED 2026-05-17
Built, merged (MR !109), deployed, and verified live + gated at https://handbook.rycolston.com/playbook/.
- What shipped: self-contained, interactive pan/zoom flowchart of the
ISA-Initiated track. Each SOP = a node; click → side panel with that
SOP's full checklist + Outcomes, rendered at build time from the real
_recording/markdown via the existing pandoc pipeline (no content duplication). Color by state (recorded green / deferred grey / referenced amber / terminal red); loop-back edges dashed. Theme toggle, reset view, legend. - Where: new
/playbook/route in the handbook site.domains/handbook-rycolston-com/build_playbook.py, wired intobuild.py'sbuild_all(), linked from the admin landing. Zero external deps. +5 tests (tests/test_playbook.py). - Gating: Cloudflare Access is app-scoped, not path-scoped
(
sync_access.py), so the new route inherited gating automatically — noregistry.yaml/sync_access.pychange;deploy.py --skip-accesswas sufficient. - CF project-name risk RESOLVED: verified via
wrangler pages project list— the live Pages project name ishandbook(it serveshandbook-a44.pages.dev+handbook.rycolston.com). "handbook-a44" is only the auto-assigned.pages.devhost, NOT the project name.deploy.py --project-name=handbookis correct. - The Listing Consult / Lead Qualification: shown greyed (deferred / referenced-not-yet-recorded), with explanatory side panels — not recorded nodes, not dead-ends.
Decisions log
- 2026-05-16 — Two-pass method; pass 1 = checklist only.
- 2026-05-17 — Every SOP requires
## When to run this+## Outcomes; no dead-ends. - 2026-05-17 — System is "New Consultation Scheduled" with ISA-Initiated + Agent-Initiated tracks; booking is ISA-owned and out of scope.
- 2026-05-17 —
booked≠scheduledglossary locked in INDEX. - 2026-05-17 — The Listing Consult deferred to observe-then-author (shadow best agent).
- 2026-05-17 — Visual decision tree to live under
handbook.rycolston.com, interactive clickable style. - 2026-05-17 — Decision-tree page SHIPPED (MR !109): self-contained, zero-dep, generated from real
_recording/SOPs; inherits app-scoped Access; deployed to/playbook/. - 2026-05-17 — CF Pages project-name ambiguity resolved by evidence: project name is
handbook;handbook-a44is the pages.dev host. No deploy.py change needed.
Open issues
- Interactive decision-tree visual under handbook.rycolston.com — SHIPPED 2026-05-17, MR !109, live at
/playbook/ - ISA Lead Qualification Protocol (pass 1)
- Agent Lead Qualification Protocol (pass 1)
- Agent-Initiated track entry SOP (pass 1)
- The Listing Consult — author after shadowing best agent
- Pass 2 enrichment (purpose, scripts, definition of done, common failures) — after capture is complete
- Organize-later pass: physical file renames, spine vs. discovered-flow reconciliation
References
- Code home:
~/rylobasic/systems/sales-playbook/operational-playbooks/_recording/ - Recording index / source of truth:
_recording/INDEX.md(spine + handoff table + RESUME HERE + glossary) - Worktree (all git work):
/Users/rycolston/rylobasic-wt/agent-sopon branchagent-sop-recording - Curriculum (distinct):
~/rylobasic/systems/sales-playbook/Sales-Team-Playbook.md - Merged MRs: !73, !78, !86, !94, !101, !105, !106, !107 (SOP recording); !109 — decision-tree page (rylobasic/rylobasic)
- Live decision tree: https://handbook.rycolston.com/playbook/ (gated)
- Decision-tree code:
~/rylobasic/domains/handbook-rycolston-com/build_playbook.py+tests/test_playbook.py - Visual host precedent:
customer-journey.rycolston.com(Cloudflare Pages flow visualizer) - Related projects: Handbook Site, Onboarding SOP Remediation, Listing Legends Daily Practice
Commit discipline (repo CI)
Commits to rylobasic must be conventional (docs(sales-playbook): …) with NO Co-Authored-By / "Generated with Claude Code" line — repo CI commit-message-lint hard-rejects bot attribution. Per completed SOP: branch off origin/main in the worktree → commit → push to agent-sop-recording → glab mr create → glab mr merge --auto-merge. Never run git in the shared ~/rylobasic tree.