Sales Operational Playbooks
Linear: RYR-226 — remaining SOPs + 9 admin work-product forms (2026-07-23 vault→Linear audit) Verification correction (2026-07-24): SOP recording: 7 numbered SOPs not-started (04/06/07/08/09/10/11) + Listing Consult deferred (not "3"). The 9 admin work-product forms design is SUPERSEDED — 2 of 4 process types moved to automatic completion-derivation, forms 7RM1VZ/b5vK8L retired (commit 991dfa69, 2026-07-21). (RYR-226)
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.
Handbook-style SOP read at /sops/ — SHIPPED 2026-05-28
Companion view to the /playbook/ interactive decision tree. Same _recording/ source
files, rendered as a flat top-to-bottom read with a sidebar TOC. For when someone wants
to scan or search the SOPs without clicking through nodes.
- Live URL: https://handbook.rycolston.com/sops/ (CF Access gated, same as
/playbook/) - Builder:
build_sop_handbook()indomains/handbook-rycolston-com/build_playbook.py(reuses the sameNODEStable the interactive view does — single source of truth for "which SOPs are recorded" and what order they render in) - Inherits design system: uses the standard
template.htmlshell, sidebar layout,toc-row/toc-l2/toc-titleclasses, andstyle.css. Sidebar subtitle"Listing Legends Handbook"matches/agent-scripts/and/workbook/. - Nav discoverability:
- Admin landing — both views listed under "Sales Operational Playbook" section
- Per-agent dashboards (chip strip) —
Playbook (tree)+Playbook (read)chips - Setter pages (left nav) —
Playbook (tree)+Playbook (read)links - Work-Product Forms discoverability (same deploy):
- Admin landing — new "Work-Product Forms" section with the Offer Processing form
- Per-agent chip strip —
Offer Processing Formchip linking to https://tally.so/r/68MLMO
Offer Processing Work-Product Log (Tally form) — SHIPPED 2026-05-28
The structured admin-side capture for processing an incoming offer doc. Replaces ad-hoc note-taking with a single canonical form whose schema encodes every TREC §1–§22 branch (financing types, POA options, lease types, addenda checklist, broker fields, etc.).
- Live form (canonical): https://tally.so/r/68MLMO (Tally id
68MLMO) - Recipient copies: every submission auto-emails the submitter a
PDF of their answers. Wired via the schema's
respondent_email_pdfblock — resolves to the form'ssubmitted_by_emailfield UUID on every build, so it survives--force-newrebuilds. - Schema authority:
rylobasic/domains/handbook-rycolston-com/tally/offer-processing-work-product-schema.json(111 fields, 45 conditional rules — full SHOW/HIDE matrix). - Field-list reference doc:
tally/offer-processing-redesign-field-list.mdin the same folder — what each field means + the scenario test matrix. - Builder cookbook:
tally/BUILDING_FORMS.md(+CONDITIONAL_LOGIC.md,CALCULATED_FIELDS.mdsiblings) — every Tally API gotcha discovered during this build, including the four shapes reverse-engineered API-only on 2026-05-28: DROPDOWN, CHECKBOX (multi-select), conditional show on TEXT blocks, and theCONTAINScomparison (there is noIS_CHECKED). - Builder:
rylobasic/domains/handbook-rycolston-com/build_tally_form.pyis now a general schema → Tally REST POST/PATCH compiler with knobs for page breaks, settings, conditional logic (HIDE/SHOW + IS/IS_NOT/CONTAINS/ DOES_NOT_CONTAIN), initial-hidden fields, calculated fields, and respondent-email-pdf wiring. - Pilot history: old pilot form
68pX0k(simple-field v1) was deleted during the swap to v2; today's 4 real submissions live on68MLMO.
Open / next:
- Wire Tally → Google Sheets push (UI step, per Tally form) so submissions land in a queryable sheet automatically.
- Record the admin-side Offer Processing SOP itself (pass-1 checklist)
so the operational steps that surround the form (when to fill it,
where the PDF goes, downstream handoffs) live in
_recording/. - Design + build the next 9 admin-side work-product forms (1 Compliance Log + 4 process types × 2 forms each). Marissa's SOP-Questionnaire answers due Sunday are the input for those 8.
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. - 2026-05-28 — Admin work-product capture goes through Tally forms generated by a schema-driven builder (
build_tally_form.py), not bespoke per-form code. Schema is the source of truth; live form is rebuildable from it including respondent-email PDF wiring. - 2026-05-28 — In-form Total Sales Price killed; computed downstream in the hub sheet (Cash Portion + Principal + 2nd Mortgage Principal if Conv+Yes). Tally calc lifecycle is unverified and the in-form
@vardisplay didn't render; sheet formula is deterministic + auditable. (Calc-field shape is still documented for future use inCALCULATED_FIELDS.md.) - 2026-05-28 — Offer Processing form pilot
68pX0kdeleted;68MLMOis the canonical URL going forward. - 2026-05-28 — Two render targets for the SOP corpus:
/playbook/(interactive tree, teaching/triage mode) and/sops/(flat handbook read, scan/search mode). Both built from the same_recording/source; sharedNODEStable inbuild_playbook.pydefines order. Linked from admin landing, per-agent dashboards, and setter pages. - 2026-05-30 — Confirmed these operational SOPs and the Sales Team Playbook training manual are distinct artifacts: manual = curriculum / the-why (now vault-canonical); these = operational decision tree (live). The stale in-monorepo copy of the manual + its print script were deleted (MR !225); these operational SOPs are unaffected and remain canonical in
rylobasic.
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
- Record Offer Processing SOP (admin-side pass-1 checklist; the Tally form is the work-product capture, the SOP is the surrounding steps)
- Wire Offer Processing Tally form → Google Sheets (Tally UI integration step, per form)
- Design + build 9 more admin work-product forms (1 Compliance Log + 4 process types × 2 forms each) — input: Marissa's SOP-Questionnaire answers due Sunday
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, vault-canonical as of 2026-05-30):
~/bigbrainremote/Work/Sales Team Playbook/Sales Team Playbook.md— the in-monorepo copyrylobasic/systems/sales-playbook/Sales-Team-Playbook.mdwas deleted (MR !225) after it silently drifted; the operational SOPs inrylobasic/systems/sales-playbook/remain canonical there. See 2026-05-30-playbook-50os-reconciliation. - 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.