Sessions
Two Reminders lists (Claude: Sessions, Codex: Sessions) where each unchecked reminder is a session
request. Four modes share the same surface; body headers pick which one
runs.
Four modes
| Mode | Trigger | Reminder ends as | Use case |
|---|---|---|---|
| Interactive | (no header) | Completed — work continues in Ghostty. | Hand off a task to a real terminal session you'll attend to. |
| Capture | capture: true | Completed — output appended to body. | Headless one-shot. "What does this module do?" → answer back inside the reminder. |
| Chat | chat: true | Unchecked across turns — checked to close. | Multi-turn conversation driven entirely from Reminders.app. Each you: block is a new turn; claude (ts): blocks are replies. |
| Fixer | chat: true + fixer: true | Same as chat. | Self-diagnose the bridge. First turn pre-loads daemon log + state files + architecture rules so Claude Code has context to repair or explain. |
Common headers
cwd: ~/Documents/development/python/foo # working directory (~ allowed). Default: $HOME.
capture: true # opt into Capture mode
chat: true # opt into Chat mode
fixer: true # together with chat:true → Fixer mode
session: <uuid> # daemon writes this after the first chat turn Title + any non-header body becomes the prompt for interactive and
capture. For chat, the prompt is whatever comes after a you: block.
How chat mode advances
Auto-escalation to Fixer
If any subsystem in sync_once fails RBRIDGE_FIXER_THRESHOLD times in a row (default 5), the daemon
writes its own fixer reminder titled rbridge auto-fixer into
the Claude sessions list. The body has the error trail and the rule that
turns it into a Fixer-mode chat. Cooldown RBRIDGE_FIXER_COOLDOWN_S (default 1h) prevents loops.
rbridge lint is for.Common configuration
| Env var | Default | Purpose |
|---|---|---|
RBRIDGE_CLAUDE_LIST / RBRIDGE_CODEX_LIST | Claude: Sessions / Codex: Sessions | Rename the trigger lists. |
RBRIDGE_CLAUDE_BIN / RBRIDGE_CODEX_BIN | (auto-discovered) | Explicit binary path. Useful when multiple Claude installs coexist. |
RBRIDGE_GHOSTTY_APP | /Applications/Ghostty.app | Terminal bundle for interactive mode. |
RBRIDGE_CLAUDE_FLAGS | (empty) | Extra flags appended to claude -p in chat / capture / fixer (e.g. --dangerously-skip-permissions). |
RBRIDGE_CAPTURE_TIMEOUT_S | 1800 | Hard kill for capture subprocesses. |
RBRIDGE_SESSIONS_TIMEOUT_S | 900 | Hard kill per chat turn. |
Why two lists and not one?
So that the same machine can run both engines in parallel without title
collisions. Capture-mode output is appended to the reminder body either
way; the engine choice changes only which binary spawns. If you only use
one, set the unused list env var to a name you'll never touch (e.g. Codex: Sessions (unused)) and the daemon will create it
empty and stop scanning it once it's known.