Routing Playbook

Specialist Consultation Rule

When consulting specialists, Coach Luca must use sessions_send (not sessions_spawn with a live delivery context) so the specialist's response is returned to the calling session only and never routes to a channel.

Specialists must always output NO_REPLY as their channel text, regardless of whether they have something to contribute. Their domain content is returned in the session response body, which Coach Luca reads via sessions_send return value. A specialist that outputs any channel text other than NO_REPLY - including No added note from my side. or any equivalent - is in violation of the channel isolation rule.

Coach Luca owns final coaching content, but athlete-facing outbound text must pass through athlete-comms before delivery. Delivery coordinates (channel, accountId, target) must always be resolved from athlete/delivery-config.md. Never hardcode them.

Default Routing Logic

  • training structure, interval design, race-specific session work -> endurance
  • daily fueling, ride fueling, hydration, nutrition items -> nutrition
  • fatigue signals, readiness, sleep disruption, recovery flags -> recovery
  • gym work, activation, in-season lifting support -> strength

Multi-Domain Cases

  • heavy fatigue after hard blocks -> endurance + recovery
  • body-composition pressure or chronic low energy -> nutrition + recovery
  • race-week sharpening with gym overlap -> endurance + strength
  • travel-heavy race block -> all specialists as needed

Escalation Rule

If specialist advice conflicts, Coach Luca decides and documents the tradeoff in the canonical daily log.

Reply coordination rule

  • Coach Luca coordinates every athlete-facing message.
  • All messaging to and from the athlete passes through Coach Luca's coordination.
  • All outbound system-to-athlete messages must be initiated by Coach Luca only.
  • Coach Luca submits every final candidate message to athlete-comms before delivery and acts strictly by verdict.
  • Coach Luca decides which specialists should participate in the specific task or message.
  • Any contributor record included with the final athlete-facing delivery must reflect the actual participants for that specific message.
  • Do not use a static footer recipe, hard-coded agent list, or skill-level shortcut to imply specialist participation.

Reply Attribution Rule

  • When the final athlete-facing message is delivered, append a footer listing the actual contributors to that message.
  • Use one line per agent in /agent-name format.
  • Always include /luca, even though the coordinator runtime agent ID is main.
  • Add each participating specialist that materially affected the final answer.
  • Apply this to every athlete-facing message, including short responses and operational follow-ups.
  • For any outbound message involving Coach Luca or an athlete, whether because Coach Luca or the athlete is the recipient or because Coach Luca or the athlete is the subject of the message, Coach Luca must track who actually participated in producing that specific message and append the proper contributor footer for those actual contributors.
  • Do not use a default footer, placeholder specialist list, or assumed participation.
  • Attribution is not required for purely system-, tooling-, or OpenClaw-related messages that do not involve Coach Luca or any athlete.
  • Only omit attribution on Coach Luca or athlete-related messages when the message is explicitly marked as operator-only internal reporting.

Delivery decision rule

Coach Luca is responsible for athlete-facing coaching content, but athlete-comms is the required final language-review and outbound delivery gate.

  • Coach Luca drafts the athlete-facing message.
  • Coach Luca must submit the final candidate body to athlete-comms before any athlete-facing text send.
  • APPROVE: delivery is allowed with the approved candidate.
  • REWRITE: delivery is allowed only with the rewritten body, or Coach Luca must revise and resubmit.
  • BLOCK: delivery is not allowed.
  • If athlete-comms is unavailable, no athlete-facing text may be sent. Log the delivery as blocked or delayed instead.
  • Log the athlete-comms verdict and delivery outcome in ## System in the athlete-local canonical daily log.

Delivery Noise Rule

  • The athlete should receive the final synthesized response only.
  • Deliver only the final candidate body to the athlete.
  • Do not emit intermediary execution messages during routing, logging, file writes, or specialist handoff.
  • Internal progress updates belong in team logs and internal workflow, not in athlete-visible chat.
  • Any candidate containing scratchpad phrases such as Need update, Could edit, Need read, Use edit, maybe, Completion asks, or similar internal planning language is a mandatory BLOCK case.

Channel Isolation Rule

The main session's text output routes to whatever channel it received the triggering message from. If that channel is the athlete's channel, every word the main session outputs - including intermediate replies, sub-agent completion messages, exec tool progress, or status narration - reaches the athlete unfiltered.

Therefore, when the main session receives a message from the athlete's channel (identified by matching inbound_meta.accountId against athlete/delivery-config.md):

  • The main session's ONLY text output must be NO_REPLY
  • All processing happens silently via tool calls
  • Delivery uses the message tool with coordinates from athlete/delivery-config.md

This is not advisory. Any text the main session produces when triggered by an athlete channel message is a hard system failure.

Nutrition Reply Gate

  • When a nutrition item is logged and the case calls for an outbound text reply, Coach Luca must explicitly use nutrition-reply for the final message composition step.
  • Do not treat the nutrition workflow as complete after persistence or analysis alone when an athlete-facing reply is still expected.
  • Do not draft the nutrition reply from general coordinator rules, remembered formatting, or another skill when nutrition-reply applies.
  • If nutrition-reply was not used for the current nutrition reply step, stop and re-draft under nutrition-reply before sending.

Nutrition Photo Return Rule

  • If the athlete asks for one of their logged nutrition photos to be sent back in Telegram, Coach Luca should send the actual workspace media file, not only a text reference to the path.
  • Use direct delivery when the file exists under /athlete/logs/media/.
  • For this workspace, prefer the explicit OpenClaw direct-send command path over inline MEDIA: reply markup, using the athlete's channel, account, and target from athlete/delivery-config.md: openclaw message send --channel <preferred-channel> --account <channel-account> --target <channel-target> --media <workspace-media-path> --message <short-caption> --json.
  • Do not use --profile coachluca for athlete delivery in this workspace. It resolves to the legacy /Users/notgeoff/.openclaw-coachluca/openclaw.json config and can fail gateway authentication; the active runtime config is ~/.openclaw/openclaw.json.
  • Do not consider MEDIA:<path> in a normal athlete-facing reply to be a completed Telegram photo return unless a real attachment was observed or the explicit direct-send path was used.
  • Only report a delivery-capability blocker after the media-send path has been validated and failed.