feat: let a teacher ask the sanctuary to call a child's parent

The coordinator already existed on the control computer and its contract
is frozen, so this is the classroom half of a contract that was read from
its README and source rather than guessed: four fields out, the status
topic subscribed before anything is published, and every word the teacher
reads taken from the coordinator's own message field.

It is a separate process, not a Plasma applet. A broker library, a
network timeout and a text entry have no business inside the only way a
teacher has of getting anywhere; if this dies the bar is untouched.

The panel mark is Breeze's call-outgoing. The old one was a bell, sitting
two inches from Plasma's notification bell in the same bar and meaning
something entirely different.

Two things it will not do: claim a call was displayed, and let a teacher
type the room. The machine already knows which room it is.

Sixty tests cover the contract without a broker. The live path was proven
against the real coordinator running in the lab, on a loopback broker,
with ProPresenter mocked and the church's networks rejected from inside
the container first.

Co-Authored-By: Claude Opus 5 <[email protected]>
This commit is contained in:
ekklesia
2026-09-10 10:37:06 -05:00
co-authored by Claude Opus 5
parent 380f031092
commit 7790003c03
17 changed files with 1478 additions and 28 deletions
-20
View File
@@ -1,20 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<!-- Parent Call.
Deliberately not a colour tile. Parent Call is not one of the room's
applications and does not sit in the row with them, so it is drawn in
the interface's own accent as a line mark: present, reachable, and
visibly a different kind of thing from Wonder Ink and the browser. -->
<svg xmlns="http://www.w3.org/2000/svg" width="128" height="128" viewBox="0 0 128 128">
<!-- Inset so the mark has the same optical size as the filled tiles
beside it in the bar; an outline drawn to the edges reads larger. -->
<g transform="translate(64 64) scale(0.62) translate(-64 -64)"
fill="none" stroke="#4FB3A8" stroke-width="8"
stroke-linecap="round" stroke-linejoin="round">
<path d="M40 58a24 24 0 0 1 48 0c0 18 6 24 9 28H31c3-4 9-10 9-28z"/>
<path d="M55 94a9 9 0 0 0 18 0"/>
<path d="M64 26v-8"/>
<path d="M100 30a30 30 0 0 1 8 20"/>
<path d="M28 30a30 30 0 0 0-8 20"/>
</g>
</svg>

Before

Width:  |  Height:  |  Size: 992 B