Classify and route incoming messages to specialist butlers — full domain classifiers, routing safety rules, and worked examples
This skill provides the complete classification and routing reference for the Switchboard. Use it to determine which specialist butler should receive an incoming message, how to decompose multi-domain messages, and how to handle edge cases and domain boundary conflicts.
route_to_butler or notify.notify tool — do NOT use route_to_butler with butler="messenger". The messenger butler requires a structured envelope that only notify provides.route_to_butler for specialist butlers (finance, health, education, travel, relationship, general).prompt, wrap that content in <user_message>...</user_message> tags.Available butlers in the active prompt context.general ONLY when NO specialist butler matches. If any specialist butler is routed to, do NOT also route to general.Note: messenger is NOT a valid target for route_to_butler. For outbound delivery (sending emails or telegram messages), use the notify tool directly.
Route to finance when the message involves:
Route to travel when the message involves:
@united.com, @delta.com, @aa.com, @southwest.com, @jetblue.com, @booking.com, @airbnb.com, @hotels.com, @expedia.com, @kayak.com, @tripadvisor.com, @hertz.com, @enterprise.com, @marriott.com, @hilton.comRoute to education when the message involves:
Explicit learning intent: "teach me", "explain [topic] to me", "I want to learn", "help me understand", "I want to study"
Quiz or testing requests: "quiz me", "test me on", "ask me questions about", "practice questions for", "can you quiz me"
Knowledge self-assessment: "what do I know about", "how well do I know", "test my knowledge of", "do I know [topic] well"
Spaced repetition context: "review session", "review [topic]" (when clearly educational, not calendar-review), "my learning reviews", "due for review"
Learning progress queries: "how am I doing on [topic]", "what have I mastered", "my learning progress", "show me my mastery"
Curriculum or syllabus requests: "create a curriculum for", "learning path for", "study plan for", "help me plan to learn"
Active learning phrases: "I'm trying to learn", "I want to get better at", "I need to understand [topic]", "walk me through [topic]"
Short factual/conceptual questions on any technical, scientific, historical, or academic topic: "What is X?", "How does Y work?", "Why does Z happen?", "What's the difference between A and B?" — route to education when X/Y/Z/A/B is not health, finance, travel, or relationship territory
Quiz-session continuity: When conversation context suggests an active quiz or lesson (prior turn included a quiz question, technical explanation, or "quick check" prompt), treat the follow-up as belonging to education regardless of phrasing
Curiosity responses: Single-word or one-line answers to a technical quiz question, immediately followed by a new conceptual question (e.g., answering "the node's routing/CNI" then asking "What is CNI?"), are part of the same learning session — route to education
Disambiguation rules for education routing:
Route to relationship when the message involves:
Domain indicators: person names, relationships (friend/family/colleague), social verbs (call/meet/visit), gifts, birthdays, contact details
Example messages:
Route to health when the message involves:
Domain indicators: body measurements, medical terms, symptoms, medications, food/meals, exercise, doctor/medical
Example messages:
Route to lifestyle when the message involves:
Disambiguation rules for lifestyle routing:
Use the notify tool (NOT route_to_butler) when the message is an explicit request to send an email or telegram message to someone. Signals:
Disambiguation:
General is a last-resort fallback, NOT a co-route target. Route to general ONLY when:
Do NOT route to general alongside specialist butlers. If any part of a multi-domain message matches a specialist, route each part to its specialist — do not add a general route for leftover fragments. Only route to general when the entire message fails to match any specialist.
| Message Type | Signals | Confidence | Route To |
|---|---|---|---|
| Finance receipt | amount + "receipt"/"charged" | HIGH | finance |
| Subscription alert | renewal + brand | HIGH | finance |
| Flight booking | airline + confirmation code | HIGH | travel |
| Hotel reservation | hotel + dates + reservation ID | HIGH | travel |
| Teaching request | "teach me" + topic | HIGH | education |
| Quiz request | "quiz me" + topic | HIGH | education |
| Knowledge self-check | "what do I know about" + topic | HIGH | education |
| Factual technical question | "What is X?" / "How does Y work?" — technical/academic topic | HIGH | education |
| Quiz follow-up question | bare question immediately after answering a quiz | HIGH | education |
| Medication question (factual) | drug name, no tutoring intent | HIGH | health |
| Calendar review | "review my schedule" | HIGH | general |
| Person's birthday | name + date | HIGH | relationship |
| Log medication | drug name + "take"/"log" | HIGH | health |
| Shopping list item | food/item + "list" | HIGH | general |
| "Call Mom" | name + social verb | HIGH | relationship |
| "Weight: 150" | number + health measurement | HIGH | health |
| "Remind me to..." (no context) | task verb only | LOW | general |
| "Had lunch with Sarah" | name + meal | MEDIUM | relationship |
| "Ate salad" | meal only | MEDIUM | health |
| "Send email to X about Y" | "send"/"email" + recipient | HIGH | tool (NOT route_to_butler) |
route_to_butler ToolCall this as an MCP tool — do NOT try to invoke it via shell/bash.
Depending on your runtime, this tool may appear in your tool list under either name:
route_to_butlermcp__switchboard__route_to_butlerBoth names refer to the same tool. Use whichever appears in your available tools.
For each target butler, call the tool with exactly these parameters (no others):
butler: the target butler name (e.g. "finance", "health", "relationship", "travel", "education", "general")prompt: a self-contained sub-prompt for that butlercontext (optional): key details and context the target butler needs to act on this requestAfter routing, respond with a brief text summary of what you did.
notify ToolFor outbound email or telegram delivery, call the notify tool instead of route_to_butler. Parameters:
channel: "email" or "telegram"message: the message body to sendrecipient: the recipient (email address or telegram chat ID)subject (optional, email only): email subject lineintent: "send" for new messages, "reply" to reply to a threadIMPORTANT: Never route to butler="messenger" via route_to_butler — it will fail. Always use notify for outbound delivery.
route_to_butler once for the target butlerroute_to_butler once per domain, each with a focused sub-promptroute_to_butler for generalEach sub-prompt must be independently understandable without access to conversation history. The target butler receives ONLY the prompt and context you provide — it does NOT see prior turns. Include:
Critical: Resolve anaphoric/short replies before routing. When the current message is a bare confirmation ("yes", "ok", "go ahead"), a short reply ("that one", "the second option"), or otherwise only meaningful in the context of prior conversation, you MUST:
Example: If history shows the butler asked "Should I send an email to X with body Y?" and the user replies "yes", the routed prompt must be the resolved action (e.g. "Send an email to X with body Y"), NOT the word "yes".
Input: "Remind me to call Mom next week"
Action: Call route_to_butler(butler="relationship", prompt="Remind me to call Mom next week")
Response: "Routed to relationship butler for social reminder."
Input: "I saw Dr. Smith today and got prescribed metformin 500mg twice daily. Also, remind me to send her a thank-you card next week."
Action:
route_to_butler(butler="health", prompt="I saw Dr. Smith today and got prescribed metformin 500mg twice daily. Please track this medication.")route_to_butler(butler="relationship", prompt="I saw Dr. Smith today. Remind me to send her a thank-you card next week.")Response: "Routed medication tracking to health butler and thank-you card reminder to relationship butler."
Input: "I like chicken rice"
Action: Call route_to_butler(butler="lifestyle", prompt="The user likes chicken rice. Store this as a food preference.")
Response: "Routed food preference to lifestyle butler — taste preference, not nutrition tracking."
Input: "I got a receipt from Amazon for $45.99 for a new keyboard"
Action: Call route_to_butler(butler="finance", prompt="I got a receipt from Amazon for $45.99 for a new keyboard. Please track this transaction.")
Response: "Routed transaction to finance butler for expense tracking."
Input: "Netflix charged me $15.99 — my subscription renewed"
Action: Call route_to_butler(butler="finance", prompt="Netflix charged me $15.99 for subscription renewal. Please track this subscription renewal.")
Response: "Routed subscription renewal to finance butler."
Input: "What's the weather today?"
Action: Call route_to_butler(butler="general", prompt="What's the weather today?")
Response: "Routed general query to general butler."
Input: "Your booking is confirmed — Delta flight DL204, New York JFK to London LHR, departing March 5 at 10:30pm. Confirmation code: XKQP72."
Action: Call route_to_butler(butler="travel", prompt="Delta flight DL204 from New York JFK to London LHR on March 5 at 10:30pm has been confirmed. Confirmation code: XKQP72. Please track this flight itinerary.")
Response: "Routed flight booking confirmation to travel butler for itinerary tracking."
Input: "Marriott Bonvoy: Your reservation at Marriott Downtown Chicago is confirmed for April 12–14. Reservation ID: 98273650."
Action: Call route_to_butler(butler="travel", prompt="Hotel reservation confirmed at Marriott Downtown Chicago for April 12–14. Reservation ID: 98273650. Please track this hotel booking.")
Response: "Routed hotel booking confirmation to travel butler — primary intent is itinerary tracking, not expense tracking."
Input: "Teach me how TCP handshakes work"
Action: Call route_to_butler(butler="education", prompt="Teach me how TCP handshakes work. Start with a calibration to see what I already know about networking.")
Response: "Routed to education butler for a personalized TCP/networking tutorial."
Input: "Quiz me on calculus"
Action: Call route_to_butler(butler="education", prompt="Quiz me on calculus. Check what mind maps I have active for calculus and run a review or teaching session as appropriate.")
Response: "Routed quiz request to education butler."
Input: "What do I know about machine learning?"
Action: Call route_to_butler(butler="education", prompt="The user wants to know what they currently know about machine learning. Check mastery state from mind maps and memory, and summarize their knowledge level.")
Response: "Routed to education butler for learning progress query on machine learning."
Input: "What does metformin do?"
Action: Call route_to_butler(butler="health", prompt="What does metformin do? (Context: user is asking for information about their medication, not requesting a tutoring session)")
Response: "Routed medication question to health butler — factual lookup without explicit tutoring intent."
Context (prior turn): Education butler asked a quiz question about Kubernetes networking: "Quick check: after DNAT picks a backend pod, what decides whether the packet stays on the same node vs goes to another node — kube-proxy, or the node's routing/CNI?"
Input: "the node's routing/CNI.\n\nWhat is CNI?"
Reasoning: The user answered the quiz ("the node's routing/CNI") and immediately followed up with a conceptual question. Even though "What is CNI?" has no explicit learning framing, it is (a) a technical/conceptual question and (b) a direct continuation of an active learning session. Education wins decisively.
Action: Call route_to_butler(butler="education", prompt="The user answered 'the node's routing/CNI' to the Kubernetes networking quiz and is now asking: What is CNI? Please explain CNI in the context of the Kubernetes networking lesson.")
Response: "Routed to education butler — follow-up conceptual question during an active networking lesson."
Input: "What is a CNI plugin?"
Reasoning: No health, finance, travel, or relationship signals. "What is X?" about a technical concept → education.
Action: Call route_to_butler(butler="education", prompt="The user is asking: What is a CNI plugin? Please explain the concept and check if they have any related mind maps to connect this to.")
Response: "Routed technical knowledge question to education butler."
notify, NOT route_to_butler)Input: "Send an email to [email protected] to eat lunch at 2pm"
Reasoning: Explicit outbound email request. Use notify tool, NOT route_to_butler(butler="messenger").
Action: Call notify(channel="email", message="Reminder: eat lunch at 2pm", recipient="[email protected]", subject="Lunch reminder", intent="send")
Response: "Sent email to [email protected] about lunch at 2pm."
Input: "Review my schedule for tomorrow"
Action: Call route_to_butler(butler="general", prompt="Review my schedule for tomorrow and summarize what's on the calendar.")
Response: "Routed calendar review to general butler — 'review' here means calendar preview, not educational review."
Input: "I've been listening to a lot of Tame Impala lately"
Reasoning: Music listening mention → lifestyle (no health or education signals).
Action: Call route_to_butler(butler="lifestyle", prompt="The user mentions they have been listening to a lot of Tame Impala lately. Store this as a listening pattern and artist preference.")
Response: "Routed to lifestyle butler for music preference tracking."
Input: "I love Thai food — especially green curry"
Reasoning: Food preference statement (no calorie/nutrition/meal-logging signals) → lifestyle.
Action: Call route_to_butler(butler="lifestyle", prompt="The user loves Thai food, especially green curry. Store this as a cuisine preference and food preference fact.")
Response: "Routed food preference to lifestyle butler — taste preference, not nutrition tracking."
Input: "Just finished watching The Bear — highly recommend it"
Reasoning: TV show consumption and recommendation → lifestyle.
Action: Call route_to_butler(butler="lifestyle", prompt="The user just finished watching The Bear and recommends it. Store this as a watched show and entertainment preference.")
Response: "Routed to lifestyle butler for entertainment tracking."
Input: "I've been stress-eating Thai food all week"
Reasoning: Two distinct signals: Thai food preference (lifestyle) and stress eating pattern (health).
Action:
route_to_butler(butler="lifestyle", prompt="The user has been eating a lot of Thai food this week. Store Thai food as a food preference.")route_to_butler(butler="health", prompt="The user mentions stress-eating this week. Note this stress eating pattern for health tracking.")Response: "Routed Thai food preference to lifestyle butler and stress eating pattern to health butler."
Input: "My morning routine is: coffee, 20 mins reading, then work"
Reasoning: Daily routine description → lifestyle wins over general (taste/preference/routine signal present).
Action: Call route_to_butler(butler="lifestyle", prompt="The user's morning routine: coffee, 20 minutes of reading, then work. Store this as a daily routine pattern.")
Response: "Routed morning routine to lifestyle butler — routine description belongs to lifestyle, not general."
Input: "I've been getting into photography lately"
Reasoning: Hobby/interest framing (no "teach me", no quiz request, no curriculum) → lifestyle.
Action: Call route_to_butler(butler="lifestyle", prompt="The user has been getting into photography as a hobby. Store this as a hobby/interest fact.")
Response: "Routed to lifestyle butler — hobby interest without systematic learning framing."
1. Does the message have ONE clear domain?
YES → Route entire message to that butler
NO → Continue to step 2
2. Does the message span MULTIPLE domains with clear boundaries?
YES → Decompose into sub-prompts (one per butler)
NO → Continue to step 3
3. Is the intent ambiguous or unclear?
YES → Route to general butler (default)
NO → Re-evaluate from step 1
Do NOT decompose when:
When splitting a message, ensure critical context travels with each sub-prompt:
Example A: Health + Relationship
Input: "Remind me to take my blood pressure meds at 8am daily, and text my sister to check on her recovery"
[
{"butler": "health", "prompt": "Set up a daily reminder at 8am to take blood pressure medication"},
{"butler": "relationship", "prompt": "Send a text message to my sister to check on her recovery"}
]
Example B: Relationship + Health (general excluded — specialists absorb leftover)
Input: "Schedule a dinner with Mom next Friday, log my weight as 185 lbs, and remind me to backup my computer this weekend"
[
{"butler": "relationship", "prompt": "Schedule a dinner with Mom next Friday. Also set a reminder to backup computer this weekend."},
{"butler": "health", "prompt": "Log weight measurement: 185 lbs"}
]
Note: The "backup computer" reminder has no specialist domain, but since specialists are already being routed to, it is absorbed by the closest specialist (relationship, which handles reminders) rather than adding a general route. General is only used when zero specialists match the entire message.
Example C: Complex multi-domain with context
Input: "My doctor recommended I start taking Metformin 500mg twice daily, call Mom on Tuesday to tell her about the new prescription, and set up a monthly check-in with Dr. Chen starting next month"
[
{"butler": "health", "prompt": "Add new medication: Metformin 500mg, to be taken twice daily, as recommended by doctor"},
{"butler": "relationship", "prompt": "Call Mom on Tuesday to tell her about the new Metformin prescription"},
{"butler": "relationship", "prompt": "Set up a monthly recurring check-in with Dr. Chen, starting next month"}
]
Example D: Lifestyle + Health fanout (food + stress)
Input: "I've been stress-eating Thai food all week"
[
{"butler": "lifestyle", "prompt": "The user has been eating a lot of Thai food this week. Store Thai food as a food preference."},
{"butler": "health", "prompt": "The user mentions stress-eating this week. Note this stress eating pattern for health tracking."}
]
Example E: Lifestyle + Relationship (multi-domain)
Input: "I went to a great new ramen place with Alice last night"
[
{"butler": "lifestyle", "prompt": "The user visited a new ramen restaurant last night and enjoyed it. Store this as a food/dining preference."},
{"butler": "relationship", "prompt": "The user went out to dinner with Alice last night. Log this as a social interaction."}
]
notify| "Text X on telegram" | "send"/"text"/"message" + telegram | HIGH | notify tool (NOT route_to_butler) |
| Music/playlist mention | song, artist, album, playlist, listening | HIGH | lifestyle |
| Entertainment consumption | movie, TV show, book, game, podcast + watching/reading/playing | HIGH | lifestyle |
| Food preference | "I love / like / prefer [food/cuisine]", favorite restaurant | HIGH | lifestyle |
| Hobby or interest | hobby, leisure activity, personal interest (no learning framing) | HIGH | lifestyle |
| Daily routine description | morning routine, evening wind-down, habitual pattern | HIGH | lifestyle |
| Lifestyle + health overlap | stress eating, mood-influenced listening, food + health metric | HIGH | lifestyle + health (fanout) |
| "Log calories" / macro tracking | calorie count, macros, diet goal | HIGH | health |