Handbook Site
Linear: RYR-238 — training-manual live role; RYR-243 — security hardening (2026-07-23 vault→Linear audit) Verification correction (2026-07-24): /agent migration is DEAD — ccpj#179 closed 2026-05-08, superseded by MR!236 (verified); the Sales Team Playbook is canonical in the vault. Handbook hardening (RYR-243): Access gate is live/enforcing; only the deploy.py creds→1Password migration remains open (
keychain.pystill shellssecurity find-generic-password— verified). (RYR-238 canceled, RYR-243)handbook.rycolston.com — multi-tenant static site hosting setter handbooks, the shared agent script book, and the shared agent workbook. One Cloudflare Pages project, three audiences.
Why
The site serves three audiences from one stack: per-setter 30-day workbooks, the agent script book (the words), and the agent workbook (the practice). Same Cloudflare Pages project, same Cloudflare Access pool, zero new infra to host any of them. Reuses build, deploy, and partials resolver.
Script book and workbook move together. Same section numbers. When a script changes, the workbook chapter for that script changes in the same MR. That coupling is the whole point — agents don't get scripts they can't practice.
Current state
Site is live. Setter handbooks at /<agent-slug>/<setter-slug>/. Agent script book at /agent-scripts/. Agent workbook at /workbook/ (added 2026-04-28 via MRs !591 / !592 in the 8-section format: goal, beats, words, blank-page drill, cloze drills, objection branches, self-scoring rubric, Loom submission). Sales Operational Playbook decision tree at /playbook/ (added 2026-05-17, MR !109 — interactive flowchart generated from the _recording/ SOPs). Flat handbook read of the same SOPs at /sops/ (added 2026-05-28 — build_sop_handbook() in build_playbook.py; uses the canonical template + sidebar TOC for design-system consistency; linked from admin landing + per-agent chip strip + setter nav). Work-Product Forms section added to admin landing linking the Offer Processing Tally form (68MLMO) — also a chip on per-agent dashboards. "Your Board" chip added 2026-06-04 (MR !345) — links each agent to their own Work-Product Gateway board; per-agent board_url in content/<agent>/_agent.yaml, conditional chip in the always-on strip (dashboard + every level page), omitted when an agent has no board.
New routes + surfaces (2026-06-13 to 06-15). The 50OS Path now renders on the handbook (2026-06-13) — goal cards, Your Cycle, modules, cycle view, and gate — so the 50OS coaching curriculum is live as handbook pages, not just a plan. The agent onboarding MVP shipped 2026-06-14 — a Start Here landing, a first-run experience, and an activation drip email; the Start Here kickoff 1:1 books with the coach (Ry), not the agent. The coach surface went live 2026-06-14 to 06-15 — an Access-gated /coach/ page plus a coach card showing each agent's Closings + active listings; it is the front end of The Game Plan (/api/coach gated under the same coach Access app). And per-agent scheduler links were added 2026-06-15 across setter tools + agent dashboards, pointing at the new field scheduler at schedule.rycolston.com (Ryan's setters' booking link swapped over first).
Pending migration designed but not yet executed: /agent/ namespace + Sales Playbook. Spec and plan reviewed by plan-reviewer 3 times, approved. 5 phases, 22 tasks, ~4 MRs. Source of truth for playbook content moves out of Obsidian into shared/partials/agent/playbook/*.md. (2026-05-30 caveat: this plan predates the "vault is canonical" decision for the training manual — moving its source out of Obsidian is now an open question, folded into the manual's-live-role decision in Open issues below.)
Recruiting-call audio clips shipped 2026-05-21. Inline ▶ buttons next to each beat in the §12.3 + §12.5 script (Anthony Lee's handbook first). Authoring is a {{AUDIO: name}} shortcode that expands at build time to a <button> referencing MP3s hosted at audio.handbook.rycolston.com (R2 bucket handbook-audio). Strict known-clip allowlist makes typos fail the build. One shared <audio> element per page so only one clip plays at a time; reset on 404 so unrecorded clips don't get stuck. §12.3 (11 clips) live; §12.5 (6 clips) names reserved but recording pending. Reusable pattern documented in domains/handbook-rycolston-com/CLAUDE.md; new R2 entry logged in Reference/Web Properties.md.
- Status: in-flight
- Last update: 2026-06-20 — ABS List shipped (handbook
/abs/page +pos-fub-absshim, mirrors each agent's FUBABStag; see Decisions log). Prior: 2026-06-17 — Marissa's practice-offer library grew 32 → 55 (enrolled 23 executed offers sourced + side-verified from her Gmail inbox; see Decisions log). Prior: 2026-06-15 — 50OS Path surfaces, the agent onboarding MVP (Start Here + activation drip), the Access-gated/coach/surface, and per-agent links to the newschedule.rycolston.comfield scheduler all shipped this week (see "New routes + surfaces" above). Prior: 2026-06-13 setter-ramp redesign +docs/BLUEPRINT.mdcurrent-state map (MRs !515, !524, !525) - Blocked on: nothing —
/agent/migration ready to execute when prioritized
Next 3 actions
- Resume
/agent/migration from Phase 0 (Permissions Pre-Approval), then start Phase 1 / Task 1 per the plan. - Verify
_drafts/build-fail behavior still works as expected after recent template changes. - Audit deploy commands —
python deploy.py --skip-accessfor content iteration, fulldeploy.pyafter registry change.
Decisions log
- 2026-06-20 — ABS List shipped (handbook page +
pos-fub-absshim). New "ABS List" asset card (L1-L3) → gated/abs/page that mirrors each agent's Follow Up BossABStag: shows their ABS-tagged contacts (name · stage · last-contact, most-stale-first), searches their contacts, and adds/removes the tag live. Both directions stay in sync; the copy tells agents the literal tag isABS. Flow: browser →functions/api/abs.js(reads verified Cloudflare Access email, HMAC-signs) → public Cloud Run shimpos-fub-abs(https://pos-fub-abs-uvqirrk5la-uc.a.run.app; HMAC token is the auth, ±300s freshness; email→fub_user_idviamaster_data.agent_hub; every read/write scoped to the agent's own contacts). Secrets: FUB key stays in SM; shared HMAC key = SM secretfub-abs-signing-key= CF Pages envFUB_ABS_SIGNING_KEY(+FUB_ABS_SHIM_URL), production + preview. MRs: !657 feature / !659 tfvars bootstrap / !660 copy (surface theABStag) / !664 deploy-doc lessons. Built subagent-driven (TDD + per-task + whole-branch review). Live read verified for 4 agents (empty lists — none tagged yet); search verified against live FUB; write path unit-proven, live add/remove deferred (needs an agent's own contact). Ry himself shows "not linked" — he isn't a producing-agent row inagent_hub; use/abs/?subject=<agent-email>(admin override) to view an agent's list. Design spec: 2026-06-19-abs-list-design. Bootstrap lessons:~/rylobasic/infra/cloud-run-services/deploys.md. - 2026-06-17 — Marissa's practice-offer library: 32 → 55 (enrolled 23 from her Gmail inbox). Cross-referenced every "executed contract" thread in
[email protected]againstoffers.yaml; enrolled the 23 not already present that had a real executed-contract PDF. Provenance the manifest doesn't capture: a later cancellation/termination does not disqualify (the executed offer still happened = a valid drill); skipped settlement/closing-only threads, one buyer-side deal, and a foundation-repair contract. Side verified against Orchard's own "Sellside/Buyside Closing" survey + "BWO/NHUC" internal codes, not keyword guessing (the noisy guess would have mislabeled several seller deals as buyer): 21 seller, 2 buyer (3204 Kingdom + 8389 Rockhopper, both new-construction purchases). Email shells use the authentic TC emails (extraction artifacts cleaned) for production fidelity. Pushed to R2 box + deployed to gated prod; all 23 verified rendering the correct side pill on the live index. Pre-2025 offers are unreachable — Marissa's mailbox holds no mail before spring 2025 (the work inbox starts 2024). - 2026-06-13 —
docs/BLUEPRINT.mdis the current-state map; keeping it true is mandatory. The system had a stalearchitecture.md, an orientation README, and an ops-only CLAUDE.md, but nothing captured the curriculum/ramp state or a "what changed when" record. Addeddocs/BLUEPRINT.md(render-target inventory, source-of-truth pointers, the live ramp snapshot, the 12-week program design, a dated decision log). Maintenance rule (wired into CLAUDE.md + README): any change to curriculum, gates, quotas, render targets, or structure must update the BLUEPRINT snapshot and add a dated Decision Log entry in the same MR.architecture.mdis superseded. - Portfolio organization framework
- 2026-06-04 — Offer library has ONE canonical home (private R2 bucket
handbook-offers). The practice-offer content is gitignored PII, so it was replicated as untracked files across working copies with no shared source; a prod deploy from a worktree holding 7 of 32 offers regressed the live library to 7. Nowscripts/offers_store.py(push/pull/status) stores one object per offer in R2, anddeploy.pypulls the full set before every prod build. Operating rules: deploy from the MAIN checkout only (never a worktree); runoffers_store.py pushafterenroll_offer.py; the bulk PII upload is operator-run (a data-exfil guard blocks an agent from doing it). $0/mo (R2 free tier). Full detail in the project CLAUDE.md section "The offer library has ONE home".
Open issues
- GitLab: rylobasic/ccpj#179 —
/agent/namespace + Sales Playbook migration - Execute Phase 1 / Task 1 of the migration plan
- Decide on project rename (current folder name
setter-workbook-siteis now too narrow) - Migrate source into the monorepo — done 2026-05-17, MR !108 →
~/rylobasic/domains/handbook-rycolston-com/ - Follow-up: switch
deploy.pyCloudflare creds from macOS Keychain (security find-generic-password) to 1Password (op item get), matchingcustomer-journey+feedback_local_runners_read_sm - Follow-up: pre-existing test rot —
tests/test_build.py(6 failed) +test_tally_mapping.py(8 errors) fail on missing tmp-fixtureshared/agent-script-template.md; baseline-confirmed identical in the archived original, NOT a migration regression. Fix fixtures. - Follow-up RESOLVED 2026-05-17: live Cloudflare Pages project name verified via
wrangler pages project list— project name ishandbook(serveshandbook-a44.pages.dev+handbook.rycolston.com).handbook-a44is only the auto-assigned.pages.devhost, not the project name.deploy.py --project-name=handbookis correct; no change needed. - Build the interactive SOP decision-tree page (Sales Operational Playbooks) as a new gated route — SHIPPED 2026-05-17, MR !109, live at
/playbook/; see Sales Operational Playbooks - Follow-up (next session): verified only against the byte-identical build artifact via headless Chrome — NOT the live gated URL.
playwright-personalMCP is now global (2026-05-17); after a session restart, run a real Playwright pass onhttps://handbook.rycolston.com/playbook/to confirm the Cloudflare Access sign-in + interactive behavior end-to-end. See reference_mcp_servers. - 2026-05-30 — Decide the training manual's live role (the open premise from the playbook deep-dive). The vault Sales Team Playbook (career path, listing presentation, script bank, mindset) is published nowhere agents can read it — the live
/playbook/+/sops/are operational SOPs only. The long-planned/agent/migration (ccpj#179, above) is option B. Options: A vault-only source (agents get it only via 50OS/50os/modules); B publish a curated subset live = the/agent/migration; C author the deferred Listing Consult SOP from the manual's kitchen-table section so/playbook/stops dead-ending there. See 2026-05-30-playbook-50os-reconciliation.
References
- Memory:
~/.claude/projects/-Users-rycolston/memory/project_handbook_site.md - Code home:
~/rylobasic/domains/handbook-rycolston-com/(migrated into the monorepo 2026-05-17, MR !108; old~/CCPJ/projects/setter-workbook-site/archived/frozen — never edit_source/) - Current-state map (read to understand what exists + what changed when):
~/rylobasic/domains/handbook-rycolston-com/docs/BLUEPRINT.md— keep it current per the maintenance rule (update snapshot + decision log in the same MR as any curriculum/gate/structure change). - Project CLAUDE.md (read first before editing):
~/rylobasic/domains/handbook-rycolston-com/CLAUDE.md - Migration spec:
~/CCPJ/projects/Idea-Inbox/design/2026-04-28-sales-playbook-migration-design.md - Migration plan:
~/CCPJ/projects/Idea-Inbox/implementation-ready/2026-04-28-sales-playbook-migration-plan.md - Setter Workbook System (parent template flow): Setter Workbook System
- Curriculum prose: Real Estate - Curriculum — the 9-chapter narrative companion to the per-level Path pages on this site. Each chapter has a "Where this fits on your Path" callout that maps the chapter to its L1-L5 gate.
-
Live URL: https://handbook.rycolston.com
-
2026-07-01 — Hardened (MR !1017, prod-deployed, 4 gates verified): promotion gate sees untracked files; front-door dual-hostname assertion (2026-06-09 leak class); inactive setters out of _roster.js; JWKS kid-miss refetch; agent_slug validation pre-write; generated _admins.js (BLUEPRINT row in !1021).