release: the Plasma classroom becomes stable 0.2.0

0.1.50 was taken to the church and the things a container cannot answer
were answered on the hardware: boot, autologin, the panel after a reboot,
panel and browser scaling, Wonder Ink, Parent Call opening in the corner
and reaching the sanctuary with a typed name, readable and silent
notifications, HDMI audio and the volume keys.

The promotion is a fast-forward. The experiment was cut from the
published stable source and never diverged from it, so master reaches
this work without a merge and there is one history.

One thing changed for the release. The channel rules turn around:
classroom-v2 and hyprland are the obsolete channels now and a room on
either comes home to stable, while canary — where the next development
release goes — and any channel somebody named by hand stay where they
were put. A fresh installation has always defaulted to stable.

Nothing else moved. This is the 0.1.50 that was verified, with a version
number and a channel rule.

Co-Authored-By: Claude Opus 5 <[email protected]>
This commit is contained in:
ekklesia
2026-09-13 09:15:00 -05:00
co-authored by Claude Opus 5
parent ba8768cee5
commit 8db5e8dd9f
8 changed files with 82 additions and 34 deletions
+7 -8
View File
@@ -107,8 +107,7 @@ check("the password is untouched",
check("and is never printed", "hunter2" not in output)
check("the compositor setting is gone", "COMPOSITOR" not in after)
check("and the appearance setting with it", "HYPR_APPEARANCE" not in after)
check("the channel moves off the experiment",
"CHANNEL=classroom-v2" in after)
check("the channel comes home to stable", "CHANNEL=stable" in after)
check("the room's scale is preserved", "UI_SCALE=2.0" in after)
check("and everything else is left alone",
"UPDATE_URL=https://updates.riverofglorymn.org" in after
@@ -146,13 +145,13 @@ check("the settings are added", "MQTT_ENABLED=true" in after
and "MQTT_HOST=10.40.0.2" in after and "MQTT_PORT=1883" in after)
check("no credentials are invented",
"MQTT_USERNAME" not in after and "MQTT_PASSWORD" not in after)
# stable and canary are both the sway line. A machine that has just taken
# the Plasma package and is left pointed at one of them is handed the old
# desktop back by the next release there: the upgrade undoing itself.
check("canary moves onto the v2 channel", "CHANNEL=classroom-v2" in after)
# canary is where the next development release goes. A room somebody put
# there is a room somebody meant to put there.
check("canary is left where it is", "CHANNEL=canary" in after)
after, _ = migrate("CHANNEL=stable\nUI_SCALE=1.0\n")
check("and so does stable", "CHANNEL=classroom-v2" in after)
after, _ = migrate("CHANNEL=classroom-v2\nUI_SCALE=1.0\n")
check("and the experiment's own channel comes home",
"CHANNEL=stable" in after)
print()
print("4. running it twice changes nothing the second time")
+4 -2
View File
@@ -215,8 +215,10 @@ check("Trixie validation runs before any upload", validation < first_rsync)
# upgraded room ends on the v2 channel with every setting this release
# has, exactly once, and the command a technician runs is safe to run on
# a machine that is already converged.
check("the gate checks the upgraded channel",
"'^CHANNEL=classroom-v2$'" in validation_script)
check("the gate checks a deliberate channel survives",
"'^CHANNEL=canary$'" in validation_script)
check("and that the experiment's channel comes home",
"'^CHANNEL=stable$'" in validation_script)
check("and that every new setting arrived exactly once",
"for setting in LIVE_ENABLED AUDIO_OUTPUT UI_SCALE" in validation_script)
check("and that running the migration by hand is safe",
+3 -1
View File
@@ -26,7 +26,9 @@ with tempfile.TemporaryDirectory() as tmp:
for channel in ('stable', 'canary', 'hyprland', 'classroom-v2', 'custom'):
path.write_text(original.replace('CHANNEL=classroom-v2', 'CHANNEL='+channel))
subprocess.run([sys.executable, '-c', code, str(path)], check=True, capture_output=True)
expected = channel if channel in ('classroom-v2', 'custom') else 'classroom-v2'
# The experiment's channel and hyprland come home to stable;
# everything anybody chose deliberately is left alone.
expected = 'stable' if channel in ('classroom-v2', 'hyprland') else channel
assert 'CHANNEL='+expected+'\n' in path.read_text()
assert 'MQTT_PASSWORD=literal $ and = characters\n' in path.read_text()
print('Display settings: scale bounds, config preservation, idempotence and channel migration passed.')
+6 -2
View File
@@ -158,8 +158,12 @@ check(
'OBSOLETE_KEYS = ("COMPOSITOR", "HYPR_APPEARANCE")' in migrate,
)
check(
"and comes off any channel that would undo the upgrade",
'OBSOLETE_CHANNELS = {"stable", "canary", "hyprland"}' in migrate,
"and comes off the channels that carried the experiment",
'OBSOLETE_CHANNELS = {"classroom-v2", "hyprland"}' in migrate,
)
check(
"onto the stable line, which the Plasma classroom now is",
'CHANNEL = "stable"' in migrate,
)
check(
"the rest of device.conf is rewritten line by line, not regenerated",