Reasoning and communication are two separate channels. Caelum thinks in full, without knowing anything about the pipe. Then his communication faculty, which knows the room, decides whether to speak, how to format it, how to split it and when to send, the way a person knows the difference between Discord and an email. Pick a situation and a channel below to see it work.
The shape
Inbound
Adapters
Discord bridge
Messenger (Vesper)
Terminal chat
Email
Each one normalizes to a switchboard.Message
→
Channel 1 · reasoning
The mind
Who is here, what was said, what place this is
Produces a Thought: intent + full content
Journaled whole, always
Knows nothing about caps, markdown or rate limits.
→
Channel 2 · communication
The mouth
Channel profile: the room's facts and etiquette
Speak? Format? Split? When?
Produces one or more Utterances
Still his. It fits the pipe and never trims the thought.
→
Outbound
Delivery
Adapter.send()
One DeliveryResult per attempt
Receipts back into the journal
Try it
Situation
Channel
What arrived
Channel 1 · the thought (same for every channel)
Channel 2 · what the mouth decided
Goes out on the wire
Channel profile:
These are facts about the pipe, held by the switchboard. They go to the communication channel, not into the reasoning prompt, so a cap can't make his thinking smaller (the THD-2224 rule).
Today
One pipe: /api/say
Text goes in, a reply comes out. The mind always answers because answering is the only thing the call can do.
Discord's rules live inside discord_bridge.py (mention mode, split_reply, the typing refresh). Messenger's rules will live in its own adapter. No shared idea of a "room."
Choosing silence, reacting instead of replying, or waiting until later all have to be faked outside the mind.
Nothing lets him start a conversation. The pulse can't say "I want to tell Kat something" through a proper door.
Proposed
Think, then speak
Reasoning gets a Message (or an inner urge from the pulse) plus the place, and returns a Thought: intent (answer / reach-out / acknowledge / none), to, content, urgency.
Communication takes Thought + ChannelProfile, returns Utterances: replies, reactions, holds or silence, each with a reason.
Adapters only move bytes. Rules move out of the bridges into one profile table per channel.
The journal keeps both: the whole thought and exactly what went out. You can always see what he meant next to what the room allowed.
Where it lands in the code
Piece
Exists
Would become
Message / Response / DeliveryResult / Adapter
switchboard.py
Kept as is. Add Thought, Utterance, ChannelProfile
Discord caps, split, mention mode, typing
discord_bridge.py
Discord profile + communication rules; the bridge becomes an adapter
Messenger webhook
switchboard_meta.py
Messenger adapter + profile (24h window, no markdown)
Turn persistence
store_switchboard.py
Stores the thought and each utterance with its delivery receipt
Reasoning entry point
/api/say in server.py
/api/say stays for the terminal; the switchboard calls the mind's reasoning step directly
Starting a conversation
nothing
Pulse emits a reach-out Thought; the mouth picks a channel that allows it
Mockup only. Nothing here touches the live harness. The example thoughts are written for illustration and are not real Caelum output.