ChatMaestro · Scenarios · Enrollee

Message the Experimenter

Enrollee / Experimenter  A human-to-human channel alongside the study, never part of the conversation being measured.
Screens  Enrollee messages enrollee-messages-panel.htmlMessages console experimenter-messages.htmlWatch-drawer watch-drawer.html
Writes  the message messageone row per reader message_recipient
Key fields  who it's for target_kind: direct / cohort / everyone / operatorthe group target_cohort_idthe run run_idread receipt read_at

1 · Given / When / Then

Human wording first; the exact table/field in mono.
Given
A run is live. Messaging is always available, so there is no per-experiment switch to enable. Both parties are attached to the run (run_enrollment for enrollees, and staff through the run).
When
An enrollee uses the Enrollee-messages Screen to reach whoever is running the study (target_kind = operator). Staff use the Messages console to write to one person (direct), a whole group (cohort with target_cohort_id), or everyone in the run (everyone).
Then
One message row is written with its run_id and sender_id, and one message_recipient row per person who should see it, each carrying its own read_at. This channel is deliberately out-of-band: it is not part of the conversation the models see, it is never graded, and it produces no chat_round. Talking to an enrollee can never quietly alter their condition. A null read_at is how staff see who has not read an announcement.
writes message, message_recipient
Variations and exceptions
If…Then…
Staff watching an enrollee want to change the nudge or model set-up of the live runNot possible: those definitions are locked (RESTRICT) while any run references them. Watching allows observing and operating — pause, withdraw, message — and nothing more.
A group message is sent, and someone is added to the group afterwardsThey do not receive it: recipients are resolved from cohort_member at send time.
The run is purgedIts messages go with it, because message.run_id is set.
Acceptance testGiven a live run, When an enrollee sends to the operator and staff broadcast to everyone, Then two message rows exist with target_kind operator and everyone, recipients are materialized, and no chat_round was created.

2 · The Journey, Screen by Screen

Two entry points, one message record, read receipts on both.
Who is writing? Enrollee → run staff target_kind = operator Staff → one / group / all direct · cohort · everyone Messages panel Enrollee-messages Screen Messages console Experimenter-messages Screen Delivered & tracked message_recipient.read_at the condition is untouched enrollee staff

3 · In Plain English

Sometimes an enrollee needs to say something to a human: the task is unclear, something broke, or they want out. That is what this channel is for.

The important part is what it is not. It sits completely outside the experiment. Nothing said here is fed to the AI, nothing is scored, and nothing about it changes the conditions the enrollee is being tested under. Staff can watch a session and talk to the person in it, but they cannot reach in and change the study while it runs, which would silently invalidate the data.

Staff can write to one person, to a whole group, or to everyone in a run, and can see who has actually read it.

Fits the schema cleanly. message + message_recipient are entirely separate from chat_round — that separation is what keeps the channel out-of-band.