One Event, Up to Four Rings
Coop tells Dad about delegated work in plain lines, and until 2026-10-23 it often told him the same thing several times. A worker replied; a second later Coop sent the same words again as blocked; a minute after that the Coop chief parked the item for Dad, or escalated it. Each line was correct on its own, each had its own outbox row, and each reached both Master Chief and Dad's phone. In the week to 2026-10-22, of 486 Coop lines about a work item, 201 were followed within 120 s by a newer line about the same item, and 124 of those repeated it word for word. Beside them sat 185 lines of session plumbing, and flapping chats were the loudest of those: the Chief held 99 "worker session disconnected" lines since 2026-10-07, one todo's worker announced seven times in three nights, and five in a single minute during the 2026-10-22 move.
The morning the Chief's half was fixed, Dad asked for the phone too:
"텔레그램 쪽 중복 알림도 하나로 합쳐."
"Merge the duplicate alerts on the Telegram side into one, too."
— 아빠 (Dad), 2026-10-23, translated from Korean
This lesson is the machinery behind that sentence: plumbing kept out, item lines settled, the newest kept, and a held line delivered by Pippa herself.
Plumbing Never Enters
The first rule is a filter. Some of Coop's lines are about a worker session, not about work: a session came up, dropped, exited or was enrolled, an invitation expired or was declined, a follow-up could not be delivered. Those stay in Coop and on Telegram, and the Chief reads them with the coop tool when she is asked. chief_doors.COOP_INFO_REASONS lists them, keyed by the reason Coop sends and valued by the head its notifier writes, so coop_info_only recognizes such a line by Coop's own reason, or by its head when the engine sends none:
| Coop's reason | The line's head |
|---|---|
remote_session_ready | remote session ready |
session_disconnected | worker session disconnected |
session_exited | worker session exited |
take_adopted | chat enrolled |
assignment_expired | assignment setup expired |
invitation_declined | invitation declined |
invitation_expired | invitation not accepted |
followup_undelivered | follow-up not delivered |
Settle, Then Supersede
The second rule is a window. The door reads the item from the line's head ([Coop] … : todo #N, through coop_item) and hands the Chief's outbox a group, coop:todo #N, and a settle of 120 s (COOP_SETTLE_SECONDS). report() writes the row with a not_before that far ahead and returns at once, because nobody should wait two minutes for a line. When a new row arrives for the same group, every older row of it still owed is marked superseded_by the new key. The drainer lands only rows whose window has passed and that nothing replaced, and it checks once more after its select, since a newer line can arrive in between.
Three details make it safe rather than merely quiet. Only a new row supersedes: Coop's engine retries a notify until it is answered, and a retry of an older line must never take the place of what came after it. A retry of a superseded row returns nothing and never lands. And a superseded row is not deleted. It stays in the outbox with superseded_by set, a record of what was said and what replaced it, and Coop keeps every line as well. Only the Chief's replay keeps just the last.
Telegram settles the same way (3097f620). A line about an item is held in coop_notify_sent as held, with its text, its group and its not_before, and a newer line for the item marks a held one superseded. A line about no item still goes at once, reserved and sent as before.
A Held Line Is Pippa's to Deliver
Holding a line changes who owns it. The door answers Coop's engine at once with settling, and the engine settles its outbox row: it will not retry. So Pippa must. One sender per database, _telegram_sender, wakes when the earliest held line is due. It reserves each due row as sending before it calls Telegram, so a superseding line that arrived a moment earlier wins, and a restart mid-send can never send the same row twice. A delivered row becomes sent. A failed send goes back to held with its not_before moved 60 s on (TELEGRAM_RETRY_SECONDS), and after 30 attempts (TELEGRAM_MAX_ATTEMPTS) it is failed and logged as an error. A read timeout counts as a failed send here too, though Telegram may already have shown the line, so that case can ring again a minute later. At startup resume_held_notifications turns any row a restart left as sending into uncertain, never to be sent again, and delivers what still waits. The Master Chief copy is durable either way, which is why at most once is the right side to err on after a crash, the same choice Track 5, lesson 4, "Blockers Loud, Success Quiet", made for follow-ups. It shares that lesson's gap too: a send whose answer never came back is retried, never counted as uncertain.
A Belt for Repeats
Settling folds lines about one item that arrive close together. A chat that flaps every few hours is another shape: the same line, far apart. Its real fix was Coop's own (cwkCoop d917c51, #599, M3): a loss already announced, with no report or note since, is not announced again, and an adapter decides nothing until a failure has lasted 60 s. Pippa's door wears a belt as well (7a993593). An attention line identical, whitespace aside, to one Telegram carried in the last 30 minutes is answered as delivered, with repeat_of naming the earlier row in that answer, recorded under its own row as repeat (the row keeps the line's hash, not which row it repeated), and sent nowhere, Master Chief included. Past 30 minutes the same line is news again.
What It Bought, and What It Costs
Replayed over the week before the gate (Track 2, lesson 6, "The Chief Is a Sanctuary", has the whole table), the Chief's 671 Coop lines become 285, none of them plumbing. In tokens that is about 1% of a Dad turn, because compaction already kept those lines small; the gain is in the reading. For Dad's phone the gain is the point: one event, one ring, and the ring carries the latest word on the item, usually the one that asks something of him (the park, the escalation), not the reply before it. The price is time and machinery. A result about a work item now reaches the phone up to two minutes after Coop wrote it, and Pippa now owns a retry loop and a small state machine (held, sending, sent, superseded, failed, uncertain, repeat) that the door used to leave to Coop's engine.