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

The reminder is the request. Body headers route it to one of four execution paths.
ModeTriggerReminder ends asUse case
Interactive(no header)Completed — work continues in Ghostty.Hand off a task to a real terminal session you'll attend to.
Capturecapture: trueCompleted — output appended to body.Headless one-shot. "What does this module do?" → answer back inside the reminder.
Chatchat: trueUnchecked 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.
Fixerchat: true + fixer: trueSame 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

One chat turn. The session id persists in the reminder body — close + reopen + new `you:` block resumes the same conversation.

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.

Fixer is not a panacea. Auto-escalation only catches errors that throw all the way out of a subsystem. Silent drift (reminders disappearing, wrong field synced) won't trigger it — that's what rbridge lint is for.

Common configuration

Env varDefaultPurpose
RBRIDGE_CLAUDE_LIST / RBRIDGE_CODEX_LISTClaude: Sessions / Codex: SessionsRename 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.appTerminal 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_S1800Hard kill for capture subprocesses.
RBRIDGE_SESSIONS_TIMEOUT_S900Hard 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.