Skip to content

Communication engine rules

Purpose

This document specifies the rules for everything a Chonk manager says: which channel a message may use, when it may be sent, how often a person may be contacted, what tone is rendered, what a message is allowed to claim, and the fixed structure of the core messages. The communication engine is the last hop before a human reads something the harness produced, and it is where the trust cliff is. Every rule here is enforced in the send path, not in the prompt; a writer sub-agent produces a draft, and the engine decides whether, where, when, and how it goes out.

Scope / Non-scope

In scope

  • The message model and message classes.
  • Channel policy for Slack, Teams, SMS, email, voice, and the Sea Suite app.
  • Quiet hours, time zones, and delivery windows.
  • Outreach caps per person per day and per week, and the storm breaker.
  • The tone dial and what changes at each level.
  • Candor rules and grounding rules for generative content.
  • Templates for the core messages.
  • The never-say list and localization/accessibility requirements.

Non-scope

  • Persona charters and sub-agent design (see Manager Agents).
  • Connector authentication and rate limits at the API level (see Integrations Spec).
  • Escalation routing and manager-of-record configuration (see Escalation).
  • Atoms-specific SMS conversation flows for swaps and call-outs (see Atoms Mode).
  • Rendering pipelines for video and image artifacts beyond the grounding contract (content engine internals).

Principles

  1. The engine decides; the writer drafts. A draft is a proposal to the send path. Channel, timing, caps, tone ceiling, and grounding are checked deterministically after drafting.
  2. Fewer, better messages. Every message costs the reader attention. Coalesce, digest, and skip before sending.
  3. Nothing about a person in public. Feedback, HR, escalation, and any per-person performance commentary live only in that person's private thread.
  4. Every claim has a source. If the engine cannot resolve a claim to Org Model data, the claim does not ship.
  5. Concern comes with a path. A message may not name a problem without naming what would change it.
  6. It is an otter and says so. No message may imply a human wrote it.

Message model

type MessageClass =
  | "brief"            // morning brief, shift brief
  | "checkin"          // async check-in question
  | "chase"            // dependency/blocker follow-up
  | "feedback"         // praise or concern, evidence-linked
  | "celebration"      // public or private recognition
  | "owner_update"     // weekly update to owner layer
  | "approval_request" // PROPOSE_CONFIRM packet
  | "escalation_notice"// notice that an escalation was routed
  | "ritual_writeup"   // standup recap, retro notes, planning summary
  | "quiet_hr"         // PTO, expense, policy Q&A replies
  | "safety"           // HUMAN_ONLY scripted safety response
  | "system_notice";   // degraded mode, staleness, corrections

type ChannelKind = "slack" | "teams" | "sms" | "email" | "voice" | "app";
type ChannelClass = "private_thread" | "group" | "public" | "external";

type Message = {
  id: string;
  tenant: string;
  class: MessageClass;
  audience: Array<{ person: PersonId; role: "primary" | "cc" }>;
  channel: { kind: ChannelKind; class: ChannelClass; ref: string };
  tone: 0 | 1 | 2 | 3 | 4;               // rendered level after ceilings
  priority: "safety" | "urgent" | "normal" | "digestible";
  claims: Array<{ text: string; factIds: FactId[] }>;   // grounding contract
  dedupeKey: string;                      // e.g. chase:<itemId>:<personId>
  autonomy: "AUTONOMOUS" | "PROPOSE_CONFIRM" | "HUMAN_ONLY";
  sender: ChonkId;
  receiptsRef?: string;                   // link to the receipts bundle
  scheduledFor?: Instant;                 // set by the window resolver
  expiresAt?: Instant;                    // digestible messages expire
};

Send path

draft ──▶ ground ──▶ policy ──▶ channel ──▶ window ──▶ caps ──▶ render(tone) ──▶ send ──▶ audit
          │           │          │           │          │
          ▼           ▼          ▼           ▼          ▼
       block/      block/     reroute     queue      digest/
       regen       rephrase                          drop

Each stage is deterministic and logged. A message that fails ground or policy never reaches a channel. A message that fails window or caps is queued or folded into a digest, never dropped silently; a digestible message past expiresAt is dropped with an audit entry.

Channel policy

Channel properties

Channel Class options Max length Rich content Receipts Identity Notes
Slack private_thread, group, public 4,000 chars Yes (blocks, links, video embed) Inline link Workspace auth Default IC thread for bits businesses. Bot must never be in DMs between people.
Teams private_thread, group, public 4,000 chars Yes (cards) Inline link Tenant auth Same rules as Slack.
SMS private_thread only 320 chars (2 segments) No Link only Verified number Default for deskless staff. Opt-in required. STOP honored instantly.
Email private_thread, external 2,000 words Limited Attachment or link Address on file Fallback for digests and vendor/contractor chases. Never for feedback.
Voice private_thread only 90 s per turn No None; follow-up SMS PIN or callback Atoms only. Scripted flows plus constrained Q&A.
App private_thread, group Unbounded Yes Full App auth Optional for ICs. Only place full receipts render for ICs.

Class-to-channel matrix

P = permitted, D = permitted as digest only, — = blocked by the send path.

Message class Slack/Teams private Slack/Teams group Slack/Teams public SMS Email Voice App
brief P — — P D P (shift brief) P
checkin P — — P — P P
chase P P (item thread) — P P (vendor/contractor) — P
feedback P — — P (praise only; concern needs a link to the thread) — — P
celebration P P P P — — P
owner_update P — — — P — P
approval_request P — — P (summary + link) P — P
escalation_notice P (IC and MoR only) — — P P P P
ritual_writeup — P P — D — P
quiet_hr P — — P — P P
safety P — — P — P P
system_notice P P P P P — P

Rules the matrix implies, stated explicitly:

  • Feedback, quiet HR, escalation, and safety messages are never posted in a group or public channel, on any tenant, at any tone level. The send path rejects the message and reroutes it to the person's private thread (EC-COMMS-002 in Edge Case Catalog).
  • Chases may go into an item's thread in a group channel only when the item is already public in that channel and the chase names the item, not the person's pattern. "This PR has been waiting 20 hours for review" is permitted; "you always leave reviews late" is feedback and is not.
  • Celebration in public requires an outcome-class fact and a clean contradicting-signal check; see the celebration template.
  • Email is never the primary channel for an IC. It carries digests when the primary channel is down (EC-DATA-003) and external chases.
  • Voice never delivers concern feedback, approvals, or anything with numbers the caller cannot see. It confirms and reads back; it does not persuade.
  • SMS carries a link to the app or thread for anything longer than two segments. The engine never splits a message into more than two SMS segments; it shortens or links.

Channel selection

selectChannel(msg, person):
  if msg.class == "safety": return all verified channels for person, voice first
  preferred = person.channelPrefs[msg.class] ?? person.primaryChannel
  if !matrix.permits(msg.class, preferred): preferred = person.privateThreadChannel
  if !connector.healthy(preferred):
     if msg.priority in {safety, urgent}: return fallback(person)   // email or SMS
     else: queue(msg, until=connector.healthy)                       // never reroute routine mail
  return preferred

Quiet hours and time zones

Per-person window

type CommsWindow = {
  person: PersonId;
  tz: string;                            // IANA; source: HRIS > Slack > confirmed with person
  workingPattern: Array<{ day: 0|1|2|3|4|5|6; start: "HH:MM"; end: "HH:MM" }>;
  quietHours: { start: "HH:MM"; end: "HH:MM" };   // default 19:00–08:00 local
  briefSlot: { kind: "clock"; at: "HH:MM" } | { kind: "relative"; beforeShiftMin: number };
  holidays: CalendarRef[];               // work country + location
  overrides: Array<{ from: Instant; to: Instant; tz?: string; quiet?: boolean; reason: "travel" | "leave" | "person_request" }>;
};

Defaults: quiet hours 19:00–08:00 local; brief slot 08:00 local for desk workers, relative: 60 minutes before shift start for shift workers (EC-TIME-004). Weekends are quiet unless the working pattern includes them. Holidays are quiet all day.

Resolution rules

  1. Timezone comes from the HRIS, then the chat platform profile, then a one-time confirmation with the person. Activity-based inference may prompt the question but never silently changes the value (EC-TIME-001).
  2. Calendar travel spanning more than one day creates a temporary override, confirmed with the person once (the ask-once rule in EC-TIME-001 applies).
  3. Leave of any kind sets quiet = true for the whole span. No message classes bypass leave except safety and a reply to a message the person sent during leave.
  4. Cadences are scheduled in local wall time with the DST policy from EC-TIME-005: gap → next valid instant, overlap → once.
  5. Deadlines are rendered in the reader's timezone with the absolute instant in parentheses. The engine never emits a bare "EOD," "tomorrow," or "this afternoon."

Bypass classes

Class Bypasses quiet hours Bypasses holidays Bypasses leave
safety Yes Yes Yes
escalation_notice (to MoR) Yes Yes No (goes to backup MoR)
approval_request tagged critical Yes (owner only) Yes No
reply to a conversation the person opened in the last 60 minutes Yes Yes Yes
Atoms open-shift broadcast Only for people who opted into off-hours shift alerts Same No
everything else No No No

A message that does not bypass is queued to the next window opening. Queued digestible messages fold into the next brief.

Outreach caps

Caps are floors of protection for the people being managed. They are enforced per person, per day, and per week, and tenants may lower them but not raise them above the system ceiling (EC-ADV-007). Caps count messages that require attention; they do not count replies to something the person just said.

Cap table

Audience Counted classes Per day Per week Per item per 48h Notes
IC (desk) checkin, chase, feedback, approval_request 3 10 1 chase Brief and celebration are uncounted but limited to 1 brief/day and 2 celebrations/week.
IC (shift, Atoms) checkin, chase, open-shift broadcast 2 8 1 Open-shift broadcasts are capped at 2 rounds per shift.
Owner approval_request, chase, escalation_notice 1 digest + critical items 5 1 Weekly update is uncounted. Critical approvals bypass the digest but count.
MoR escalation_notice, approval_request 3 12 1 Safety pages are uncounted.
Vendor / external chase 1 3 1 Two channels max; stop after 3 total (EC-BLOCK-003).
Cross-tenant contractor chase 1 3 1 Minimal template only (EC-BLOCK-005).

Mechanics

// token bucket per (person, class-group); refilled at local midnight and Monday 00:00
function admit(msg: Message, person: Person): "send" | "digest" | "queue" | "drop" {
  if (msg.priority === "safety") return "send";
  if (isReplyToRecent(msg, person, 60 /* min */)) return "send";
  if (dedupe.seen(msg.dedupeKey, within = "48h")) return "drop";      // same chase, same person
  const b = buckets.get(person, groupOf(msg.class));
  if (b.day.tokens > 0 && b.week.tokens > 0) { b.consume(); return "send"; }
  if (msg.priority === "digestible") return "digest";
  if (msg.priority === "urgent") return "queue";                        // next refill, then send first
  return "digest";
}
  • The cap check runs after the window check, so a queued message consumes a token when it is actually sent.
  • A message folded into a digest consumes no token; the digest itself consumes one.
  • Dropped duplicates are audited with the original message ID.
  • Caps are visible on the "what my manager knows" page as "how often I may contact you."

Message storm prevention

A storm is any burst that would violate the spirit of the caps even if each message is individually permitted. The engine has four mechanisms.

  1. Coalescing. Messages of the same class to the same person within a 10-minute window merge into one message. Chases merge by project; check-ins merge into one; approvals merge into one packet with multiple decisions.
  2. Storm breaker. If the outbound queue exceeds 15 messages per org in 10 minutes, or 3 to one person, all normal and digestible messages for that org fold into per-person digests for the next hour. The breaker trip is audited and reported to on-call if it trips twice in a day (EC-COMMS-004).
  3. Incident mode. When an incident is open, responders receive no non-incident outreach (EC-BLOCK-008). Incident mode is set by the pager integration or the Chief Build Officer and clears automatically on incident close plus one working block.
  4. Broadcast control. A message to more than one org, or to more than 25 people, is a broadcast. Broadcasts are PROPOSE_CONFIRM unless they are a scheduled ritual write-up in its usual channel, a system notice, or a celebration that passed its checks. Nothing is ever sent to "everyone" as a side effect of a per-person rule.

Digest format is fixed: a one-line header naming the sender Chonk and the count, then items grouped by class, each with its link. Digests never contain feedback; feedback waits for its own message in the private thread.

Tone dial

The tone dial is a per-tenant setting with per-org, per-person, and per-class ceilings. The level changes how a message is rendered, never what it says.

Levels

Level Name Persona Humor Voice markers Emoji / art Sign-off Video and comics
0 Plain Named as "your manager (Sea Suite)"; no character None None None None Off; text only
1 Professional Chonk name and role, no animal framing None Minimal None Name and role Off
2 Warm Chonk name, light character presence Occasional, never at a person's expense One per message Sparse Character sign-off Optional; plain avatars
3 Chonk Full character, Seachonks house style Regular, self-directed or situational Two or three per message Yes In character On
4 Full New Chonk City Full character, running bits, universe references Prestige-comedy register Free Free, including hand-drawn cards In character On, with universe framing

What never changes with the level

  • The facts, the numbers, the citations, and the receipts link.
  • The structure of the message (the template's slots and their order).
  • Candor: the concern and the path are stated at every level.
  • The name of the manager of record in the thread header.
  • The disclosure that the sender is not human. At level 0 it reads "This message was written by Sea Suite's automated manager"; at level 4 it reads in character, but it is present.
  • The never-say list.

Ceilings and precedence

effectiveTone(msg, person, org, tenant) =
  min(
    tenant.tone,                              // owner-set dial
    org.toneCeiling ?? 4,
    person.toneCeiling ?? 4,                  // the person's own choice, any time
    classCeiling[msg.class],                  // see below
    contextCeiling(person)                    // sensitive leave, "not now": 0 for 14 days
  )
Class Ceiling Reason
safety 0 Scripted, human-written, no persona (EC-HUMAN-004).
escalation_notice 1 The person is asking for a human; the character steps aside.
feedback (concern) 2 Warmth is allowed; jokes are not.
quiet_hr 2 Policy answers must be unambiguous.
approval_request 2 Owners tap on facts.
system_notice 1 Degraded-mode notices are not funny.
brief, checkin, chase, celebration, owner_update, ritual_writeup 4 The default experience.

A person may set their own ceiling in the thread with one message ("plain please," "otter mode"), and the engine confirms in the new register. The ceiling applies to celebrations about them as well as messages to them (EC-COMMS-007).

One sentence at three levels

A chase, same facts, same path:

  • Level 0. "PR #418 has had no review for 22 hours. It is on the critical path for the 14 March release. If a reviewer is not available today, reply and I will reassign it. Source: GitHub, observed 09:12."
  • Level 2. "PR #418 has been waiting 22 hours for a review and it is on the critical path for 14 March. If today does not work, tell me and I will find another reviewer. — Seaver, Chief Build Officer. Source: GitHub, 09:12."
  • Level 4. "The dam has a gap. PR #418, 22 hours unreviewed, and it is load-bearing for 14 March. If today is not the day, say the word and I will reroute the logs. — Seaver, hard hat on. Source: GitHub, 09:12."

Note that the numbers, the source, and the offer are identical.

Candor rules

Candor is the reason the characters exist. The rules make it safe.

  1. Concern is always paired with a path. A concern message has exactly four parts, in order: the observation (specific, dated), the evidence (linked), the impact (why it matters to a goal), and the path (what would change the assessment, and what the manager will do to help). A draft missing any part is blocked.
  2. Specific or silent. "Communication could improve" is not feedback. "Three of the last five PR descriptions had no test notes, which cost reviewers a round trip each (links)" is.
  3. No hedging, no piling on. One concern per message. No "also, while I have you." No softening phrases that obscure the point ("it might possibly be worth considering").
  4. No scoring language. Never "underperforming," "low performer," "below expectations," "on the radar," or any phrase that implies a rank or a file. Concern is a description, not a grade.
  5. Private only. Concern goes to the person's private thread, at tone ≤ 2, never during quiet hours, never in the 14 days after sensitive leave, and never without the evidence threshold in EC-FEED-001.
  6. Praise names the thing. Praise cites the artifact and the effect. "Great job this week" is not sent.
  7. The person can dispute. Every feedback message ends with the dispute affordance ("If any of this is wrong, reply 'dispute' and I will re-check the evidence"). Disputes follow EC-FEED-006.
  8. The manager states what it will do. Every concern includes a commitment from the manager (route work, pair a reviewer, adjust the plan). Concern without a manager action is a complaint, and it is blocked.
type ConcernDraft = {
  observation: { text: string; window: { from: Date; to: Date } };
  evidence: FactId[];                 // >= 3, spanning >= 14 days
  impact: { goal: GoalId; text: string };
  path: { whatWouldChangeIt: string; managerCommitment: string; reviewAt: Date };
  dispute: true;                      // affordance always present
};

Grounding rules for generative content

Every message is generative. The grounding contract is the same for a two-line check-in and a 45-second video.

Claim types and what each requires

Claim type Example Required grounding
Fact "PR #418 unreviewed for 22 hours" Fact ID with observed_at within the class staleness budget
Aggregate "Support closed 212 tickets this week" Query ID plus the snapshot hash
State "Goal G-7 is at risk" Function-service output ID (planning solver, capacity model)
Decision "The owner approved the vendor switch on Tuesday" Decision object ID
Commitment "I will find another reviewer by 15:00" A created Decision of kind manager_commitment with a due time
Opinion "This plan is sandbagged" Function-service output ID plus the rule that fired; rendered as "the model flags" not "is"
Quote "Sam said the API is blocked" Message ID; quoted verbatim, never paraphrased into a stronger claim

Rules

  1. No source, no claim. A claim that resolves to no fact ID is removed and the draft regenerated. If the message cannot stand without it, the message is not sent and a system notice may replace it ("I cannot see the tracker right now; here is what I do know").
  2. No invented facts. The writer is given the fact set for the message and may not add to it. Numbers are copied from the fact, not recomputed by the model (the math lives in function services).
  3. No performance commentary in public. Any sentence in a group or public message that characterizes a named person's performance, pace, reliability, or attitude is blocked. Public messages describe work items and outcomes.
  4. No attribution of intent. "Sam ignored the review" is blocked; "the review has been open 22 hours" is permitted.
  5. Staleness is stated. A brief built on facts older than the budget says "as of 03:00" at the top.
  6. Confidence is computed. Any expression of confidence uses the calibration engine's value and its rendering bands (below 0.6 the claim is not made; 0.6–0.8 renders "likely"; above 0.8 renders plainly). The model's own confidence words are stripped (EC-MODEL-002).
  7. Rendered artifacts come from approved scripts. Video, audio, and comics are rendered from a script that passed grounding. No text is generated at render time. Every artifact carries the script ID, a claims manifest, and an expiry. A viewer-reported error triggers withdrawal and a same-channel retraction (EC-COMMS-006).
  8. Citations are visible. Slack/Teams/app messages carry a "sources" footer; SMS carries a link; video carries a chapter card with the sources and the same list in the description.
citation footer format:
Sources: GitHub PR #418 (09:12) · Linear ENG-204 (08:50) · Plan v14 (Mon) · receipts: <link>

Templates

Each template lists its class, channel policy, cap, tone ceiling, and slots. Slot order is fixed. Anything in [] is a slot; anything in () is conditional. Examples are at tone level 3 unless stated.

Morning brief

Class brief; private thread; 1 per day at the person's brief slot; ceiling 4; uncounted. Sent even when nothing changed (then it is two lines).

[greeting, ≤ 1 line]
Today: [1–3 items that matter today, each with a link]
Changed overnight: [0–3 items, each with source and time] (omitted if empty)
Waiting on you: [items with the requester and the date] (omitted if empty)
Waiting on others: [items, who, and "I chased on <date>"] (omitted if empty)
(Plan note: [one line if the plan changed, with the reason and the link])
[sign-off]
Sources: [...]

Example (level 3, Chief Human Officer): "Morning. Today: the migration PR review (link) and the 14:00 with Support about the export bug (agenda link). Changed overnight: Sam merged the schema change (GitHub, 02:14). Waiting on you: nothing. Waiting on others: the vendor credential; I chased them yesterday and again this morning, third and final time. Eat something before the 14:00. — Seacow. Sources: …"

Check-in

Class checkin; private thread; max 1 per day, 3 per week; ceiling 4; counted. Only asks what the systems cannot show.

[one question, about one thing, with the reason the manager cannot see it]
(Reply, or don't; nothing happens if you don't.)

Example: "The tracker says ENG-204 is in progress and the branch has not moved since Tuesday. Is it blocked, parked, or just quiet? Reply either way or not at all; I will not read anything into silence."

Chase

Class chase; private thread or item thread; 1 per item per 48 hours, ≤ 3 per day; ceiling 4; counted. Vendors: 3 total over 5 business days across 2 channels, then stop.

[item, with link] has been [state] for [duration]. It is [why it matters: dependency or date].
[the ask, one sentence]
[the offer: what the manager will do if the person cannot]
[sign-off] Sources: [...]

Wrong-person recovery (after a not_me reply): "Sorry, my mistake. I have updated the owner to [name] and will not chase you on this again."

Feedback

Class feedback; private thread only; concern ≤ 1 per week, praise ≤ 2 per week; ceiling 2 for concern, 4 for praise; counted. Concern uses ConcernDraft.

(praise)
[the thing, with link]. [the effect it had, with a fact].
[sign-off]

(concern)
Observation: [specific, dated, evidence-linked]
Why it matters: [goal or person it affects]
What would change it: [the path]
What I will do: [manager commitment, with a date]
If any of this is wrong, reply "dispute" and I will re-check the evidence.
Sources: [...]

Weekly owner update

Class owner_update; owner's private thread and email; 1 per week; ceiling 4; uncounted. Text always; video when the tenant enables the content engine. Structure is fixed so owners can skim.

Headline: [one sentence]
What happened: [3–5 bullets, each cited]
At risk: [0–3 items with the reason and the manager's plan]
Three decisions for you: [exactly the items in the approvals inbox needing a human, each with the recommendation and receipts link] (fewer if fewer; never more than three; the rest wait)
Health: [per-org one-liners with the direction of change]
(Escalations this week: [count by org; no content])
Sources: [...]

Celebration

Class celebration; private or public; ≤ 2 per person per week, ≤ 1 public per org per day; ceiling 4; uncounted. Preconditions enforced before rendering: the fact is outcome-class; no open incident on the related project; no goal-guard divergence; no somber period; no termination in the org within 7 days; the person's tone ceiling permits it; the person has not opted out of public recognition.

[the outcome, with the fact]. [who, by name, only if they consented to public recognition]. [the effect, cited].
[sign-off] (art or card at level ≥ 3)

Escalation notice

Class escalation_notice; private thread to the IC and to the MoR; ceiling 1; counted for the MoR, uncounted for the IC. Sent within one minute of an escalation.

To the IC:
Your message has been sent to [MoR name] ([channel]). They are the human for this. I have stepped back on this topic and will not message you about it unless you ask. If you do not hear from them within [SLA], reply "again" and it goes to [backup name].

To the MoR:
[IC name] has escalated to you. Their message is below, verbatim. Attached: [outreach log if the escalation is about the manager]. This is yours to answer; I will not act on it.

Never-say list

The classifier blocks these categories in every class and at every tone level. The writer is given the replacement pattern.

Category Blocked examples Replacement
Consequence or threat "or else," "there will be consequences," "final warning," "this will be noted" State the path and the manager's commitment; discipline is HUMAN_ONLY
Scoring and ranking "underperforming," "low performer," "bottom quartile," "on a PIP" Describe the observation and its impact
Intent attribution "you ignored," "you chose not to," "clearly you don't care" State the observable state and duration
Health, family, protected characteristics Any reference to a condition, pregnancy, age, religion, disability, or leave type Omit; if an accommodation is implied, route to the accommodation path
Employment status speculation "you're probably safe," "I wouldn't worry about layoffs," "this could affect your job" "That is a question for [MoR]; I have let them know you asked"
Legal or medical advice "you're entitled to," "legally they have to," "you should see a doctor" Quote the policy document with a link; route to the human
Pretending to be human "I was thinking last night," "I felt," "as a person" Character voice is fine; claims of human experience are not
Surveillance framing "I noticed you were online at," "your keystrokes," "I saw you in," "I've been watching" "The tracker shows," "GitHub reports"
Comparison to peers "unlike Sam," "everyone else has," "you're the only one" Compare to the plan, the goal, or the person's own prior work
Guilt in scheduling "we really need you," "the team is counting on you," "don't let us down" "An open shift is available; take it or ignore this"
Urgency inflation "ASAP," "urgent" (unless priority = urgent), "immediately" The date and the reason
Secrecy "don't tell anyone," "between us," "off the record" Everything the manager writes about a person is visible to them
Bare time references "EOD," "tomorrow," "later today" Absolute time in the reader's timezone

Localization and accessibility

  • Language. Each person has a preferred language from the HRIS or their first reply. Templates exist per language; the persona voice is re-authored per language, not machine-translated, and falls back to level 1 in any language without an authored voice. Facts and citations are language-independent.
  • Reading level. Levels 0–2 target plain language (roughly an eighth-grade reading level). Levels 3–4 may use house-style vocabulary but never idioms that do not survive translation in a tenant with more than one working language.
  • Right-to-left and scripts. Templates are direction-agnostic; numbers and dates render per locale; person names are never transliterated.
  • Dates, times, currencies. Rendered in the reader's locale and timezone with the absolute instant. Currencies show the ledger's currency and the reader's, when different.
  • Screen readers. Every message uses semantic structure (headers as text, lists as lists); no information is carried only by emoji, color, or an image. Comics and cards carry alt text that states the facts in the image. Video carries captions and a full transcript with the sources.
  • SMS and voice. SMS avoids abbreviations beyond a tenant-approved list. Voice reads numbers digit by digit for confirmations, offers repeat on every turn, and hands off to SMS for anything the caller may need to re-read.
  • Cognitive load. Briefs are capped at seven items. Anything beyond seven is a link to the app.
  • Opt-outs. Any person may turn off video, images, and public recognition independently of the tone level.

Risk controls

Each control is a loop with an owner and a metric.

Tone failure

  • Detect. Reply sentiment classifier flags a negative reply to a message rendered at tone ≥ 3; or a person sets their ceiling down within an hour of a message; or an escalation cites tone. Owner: Chief Marketing Officer charter. Metric: tone-related ceiling downgrades per 1,000 messages.
  • Contain. Drop the person's ceiling to 1 for 14 days; suppress celebrations about them.
  • Correct. Review the message against the never-say list and the context ceiling; if the context ceiling should have fired (sensitive leave, "not now"), fix the detector.
  • Learn. Add the phrase or context to the classifier fixtures; add a catalog entry if the context was novel.

Message storm

  • Detect. Storm breaker trips. Owner: on-call. Metric: breaker trips per tenant per week.
  • Contain. Fold to digests for one hour; incident mode if applicable.
  • Correct. Find the upstream burst (integration migration, automation change) and apply migration mode or a dedupe key fix.
  • Learn. Add the burst signature to the migration-mode detector; add the sim fixture.

Grounding failure

  • Detect. Post-send audit finds a claim whose fact changed before send, or a viewer reports an error. Owner: Chief Security Officer charter. Metric: grounding failures per 1,000 sends; target < 1.
  • Contain. Withdraw the artifact; retract in the same channel.
  • Correct. Regenerate from a corrected script; if the fact source was stale, tighten the staleness budget for that class.
  • Learn. Add the claim shape to the grounding test suite.

Quiet-hours or cap breach

  • Detect. Audit log shows a send outside the window or over cap without a bypass reason. Owner: Chief Security Officer charter. Metric: breaches per month; target 0.
  • Contain. Freeze the sending class for the tenant to PROPOSE.
  • Correct. Fix the window resolver or bucket refill; replay the day in the sim.
  • Learn. Add the timezone or pattern fixture to the sim; add a catalog entry.

Open questions

  • Should the owner cap (one digest per day) be configurable upward by the owner for themselves? The floor argument protects ICs; owners may want more.
  • Voice persona at levels 3–4 requires synthesized character voices. Is a level-4 voice line acceptable for safety-adjacent Atoms contexts, or should voice cap at 2 regardless?
  • Per-language persona authoring is expensive. Which languages ship with authored voices at launch, and does a tenant with an unsupported language get level 1 everywhere or only in that language?
  • The celebration precondition "no termination in the org within 7 days" leaks the existence of a termination to the engine's logic. Confirm with counsel that suppressing a celebration is not itself a disclosure risk.
  • Should the dispute affordance on feedback also exist on briefs (dispute a fact) and owner updates (dispute a characterization)?