A fleet of Grok bots runs the clock and talks to the world. Claude Code keeps the record and makes the judgment calls. They never call each other's APIs. They trade Markdown files in one shared Drive folder, and each file has exactly one writer.
Play a day to see every scheduled handoff fire in order, or pick a protocol to step through one exchange. Each moving dot is one file or message.
One routing rule decides where every new job goes. It removed nine areas where both systems did the same work.
/ritualCLAUDE.md rules (~80 lines), a memory index, skill descriptions. Status is read on demand, never injected.state/, to-grok/from-cloud/, or one Gmail draftstate/ and to-grok/from-grok/, its own Drive folder, a weekly setup doc for Claudetask: … to any bot.127.0.0.1:8766, the Obsidian task board/weekly (~25 min) and a 💾 Save after editsIntake runs every morning without you. Work changes hands six times a week through the mailbox. Your fixed time is one Sunday review.
| When (PT) | Ritual | Owner | Output |
|---|---|---|---|
| Daily 06:30 | Morning digest (chats, X, newspaper) | Grok | Digest room post |
| Daily 06:30 → 07:00 | Newsletter digest → relay | Claude cloud → Grok | from-cloud/ file → chat block |
| Weekdays 07:52 · 09:02 | Task reminder · CRM nudge | Grok | 1:1 chat; drafts only |
| Mon · Wed · Fri 07:00 | Weekly goals check-in | Grok | 1:1 chat |
| Fri 07:30 | Funding radar | Claude cloud | Gmail draft |
| Fri 08:00 → 08:30 | Podcast + video scan → relay | Claude cloud → Grok | from-cloud/ file → chat block |
| Fri 08:00 | Setup doc refresh (bot roster, schedules) | Grok | Doc that Claude reads before building anything |
| Sun 15:00 → 21:00 | Rollup → /weekly → intake | Grok → Claude → Grok | from-grok/ → to-grok/ |
| Any session | /decide · /coaching · /invest · /write · /endsession | Claude | Decision log, drafts, approved writes |
| After edits | 💾 Save | You → Claude scripts | Task sync, git commit, state/ |
Files, not APIs. Every handoff is a Markdown file with a small header. Folders say who writes; the header says what it is.
| Folder | Writer | Readers |
|---|---|---|
state/ | Claude (laptop) only | Grok, cloud routines |
to-grok/ | Claude | Grok |
from-grok/ | Grok | Claude |
from-grok/tasks/ | Shared; rules settle conflicts | Both |
from-cloud/ | Cloud routines | Grok relay |
*/done/ | The recipient moves handled files here | Archive |
---
id: req-20XX0101-weekly-context
from: claude-local # claude-cloud | grok
to: grok
type: request # state | request | reply | fyi
# task | capture | rollup | digest
project: domain-3
created: 20XX-01-01T19:30-08:00
status: open # open | done | current
reply_to: … # replies only
lane: This Week # tasks only: board lane
---
Runs only when you press 💾 Save. A file and a card are matched by the card's detail line - grok: <id>. Done wins on either side. Nothing is ever deleted.
| Drive file | Board card | Result |
|---|---|---|
| open | none | New card in the From Grok lane. A card with the same title adopts the file instead. |
| open | open | The file's lane: follows the card's lane. |
| open | done | The file moves to done/ with status: done and a close date. |
| done | open | Both were done last time: you reopened it, so the file comes back. Otherwise Grok closed it: the card is checked. |
| missing | open | The card is flagged ⚑. Nothing else changes. |
| none | open, tagged #grok | A new file is written for Grok and the card gets its id line. Private tags never leave the laptop. |
Safety: the board is written only if every untouched line survives in order and the editor did not save mid-run. Files changed in the last 60 s wait for the next Save. A dry run shows the pending changes as a badge on the Save button.
--- id: 20XX-01-01-state-now from: claude-local to: grok, claude-cloud type: state status: current --- # Current column — open cards ## Goal 2 · Domain 2 - Project B · In Progress — next: outcome X by date Y ## Goal 1 · Domain 1 - (private)
--- id: task-20XX0101-book-venue from: grok to: claude type: task source: Domain bot D4 project: domain-4 due: 20XX-02 status: open lane: This Month --- Book the venue for event Z.
No database, no message queue, no server in the cloud. Plain files, a synced folder, local git and a 400-line Python server do the work.
Rules that matter are enforced by code, not by asking the model to remember. Trust moves one rung right only after a workflow runs cleanly for weeks.
/endsession and /weekly writestrust grows → you hear less · sending a message never leaves L0
| Risk | Control | Enforced by |
|---|---|---|
Destructive shell (rm -rf, force-push, hard reset) | Blocked with a reason | PreToolUse hook |
| Sending mail, pushing code, sharing files | Always asks | Permission rules |
Secrets (.env, tokens) | Never readable | Deny rules + .gitignore |
| Private domains leaking to bots | Allowlist export; deny-term redaction; private tags never synced | Export and sync scripts |
| Two writers clobbering a file | One writer per folder; sha check on save | Folder contract + server (409) |
| Lost edits | Backups before every write; local git commit on Save | Server |
| Hand edits overwritten by scripts | Hand moves are final; scripts never recompute them | Rules + dry run |
| Silent routine failure | Relay posts "did not deliver" after a recheck | Grok relay contract |
Each version removed work before it added any. The current design has one hook, one sync trigger and one shared folder.