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

@@ -1,10 +1,22 @@
[Desktop Entry]
Type=Application
Name=Parent Call
Comment=Ask for a child's parent to come to the room
Comment=Ask the sanctuary to call a child's parent to this room
# Breeze's own, and deliberately not a bell.
#
# The previous mark was a bell, which sat two inches from Plasma's
# notification bell in the same bar and meant something entirely
# different. A handset with an outgoing arrow cannot be mistaken for an
# alert: it reads as placing a call, and the arrow says the call leaves
# this room. No stock Breeze icon combines a person with a call, so the
# unambiguous half was chosen over the half that could be read as user
# settings — which is what two grey people on a panel look like.
Icon=call-outgoing
Exec=/usr/local/bin/classroom-parent-call
Icon=ekklesia-parent-call
Terminal=false
Categories=Utility;
StartupNotify=false
NoDisplay=false
StartupNotify=true
StartupWMClass=classroom-parent-call
# Never in an application list. It is reached from the bar, and it is not
# one of the room's applications.
NoDisplay=true
+21 -3
View File
@@ -1,6 +1,6 @@
# Window rules.
#
# There is one, and it is about video.
# There are two: one about video, one about the Parent Call card.
#
# Everything else the classroom used to arrange by hand is ordinary window
# manager behaviour and needs no rule: a dialog stays in front of the window
@@ -17,8 +17,8 @@
# 314-line window arbiter was doing.
[General]
count=1
rules=classroom-video
count=2
rules=classroom-video,classroom-parent-call
[classroom-video]
Description=Video is an appliance screen, not a window
@@ -30,3 +30,21 @@ wmclassmatch=3
wmclasscomplete=false
noborder=true
noborderrule=2
[classroom-parent-call]
Description=Parent Call is a quick action, not a window
wmclass=classroom-parent-call
wmclassmatch=1
wmclasscomplete=false
# It is not an application, so it does not belong in the row of them. The
# button that opened it is already in the bar.
skiptaskbar=true
skiptaskbarrule=2
skipswitcher=true
skipswitcherrule=2
skippager=true
skippagerrule=2
# In front of the lesson a teacher was reading when they pressed the
# button, rather than behind it.
above=true
aboverule=2