Merge pull request 'To-be 45 §5: the operator-channel holder reads open state before it speaks (issue 271)' (#326) from fix/271-channel-reads-open-state-before-it-speaks into main

This commit was merged in pull request #326.
This commit is contained in:
2026-10-12 19:15:34 +00:00
@@ -6,6 +6,7 @@ updated: 2026-10-12
decisions:
- "ADR 0325"
- "ADR 0323"
- "ADR 0318"
- "ADR 0314"
- "ADR 0293"
- "ADR 0289"
@@ -379,7 +380,30 @@ section; to-be 46 §13 builds what follows from it.
(warning); on `condition-cleared`, by editing the first message where the channel can. A silenced
condition sends nothing. Urgent goes to both channels; warning to the desktop notifier when the
operator's session is there, otherwise to Telegram.
*Amended 2026-10-12, ADR 0318:* **history is never news.** On start, every ten minutes, and at once
when an event older than its last reading arrives, the holder reads the open conditions from the
controller and takes them as its state; an event is acted on only when it is newer than that reading
(five seconds of clock slack) and its own `at` is no more than ten minutes old — otherwise it is
recorded as state and never said as its own message. While the controller cannot be read, the `at`
test alone decides, and the reading is asked for again until it is had. Every close, drop, fold into
a digest and hold under the cap is recorded in the holder's own history. A condition open in the
holder's state but absent from the controller's open set ended while the holder was away, and is
closed quietly: edited where a channel can, never sent to wake a desktop. A clearing of something
never said says nothing, and a message still waiting is dropped the moment its clearing is read.
Every urgent condition a reading finds open and unsaid is named once, together, in one digest; when
the grace minute ends, or at once when the reading is not a start's, each still open and
unacknowledged is then sent as its own message with its answers, under the cap. A grace minute
follows every start or reassignment: nothing is sent in it except that one digest, not even a fresh
urgent event.
- **Rate:** at most twenty messages an hour; the excess is folded into one message naming them all.
*Amended 2026-10-12, ADR 0318:* a channel holds what it has to say for thirty seconds from the first
item and sends it together — alone as itself, several as one digest of headlines, one line each, with
no answers; a message that offers answers is never folded into a digest but sent on its own, and an
urgent item breaks a thirty-second quiet at once, except inside the grace minute. The desktop keeps a
gentler rhythm than Telegram: a warning reaches it at most once every fifteen minutes; an urgent
message is never held to that rhythm, and still goes to both channels. Reaching the cap is said once,
in its own message; what it holds back, urgent included, waits until the hour allows, when each
message that offers answers is sent on its own with them and only the rest goes as one digest.
- **What may leave the mesh:** roles and words. A message carrying an address, a path or anything
shaped like a secret is refused by the holder and raises `channel-refused` instead.
*Amended:* the mesh's own machine names may appear too; a concrete detail travels as a reference only