Some Wonder Ink lesson links are a download rather than a page: the server sends the PDF as an attachment, so there is nothing for a tab to show and the file lands on disk. In this room that is the same as it not arriving. There is no file manager, no application launcher and no downloads bar, on purpose, and a teacher is not going to open a maintenance terminal to print a Christmas tree. 0.2.1 downloaded the worksheet, said so in a notification, and left it somewhere unreachable. Found on the canary machine with a real lesson. So a download that completes, and really is a PDF, opens as another tab. Rendering is the engine's own viewer — the same PDFium Chrome uses — so there is no second rendering library and no separate application. That was verified against a completed local file rather than assumed from the remote case: PdfViewerEnabled was already on, and a local file: URL is a different question. WHAT IS REFUSED. A completed download is not a usable worksheet. HTML that a server called .pdf, an empty file, an unreadable one: all refused on the first five bytes rather than on the name, because the alternative is a blank tab that says nothing. An interrupted download says it did not finish and to try again — and that needed stateChanged rather than isFinishedChanged, which is not emitted for an interrupted download at all. Connected to the obvious signal, this said nothing whatsoever about a worksheet that failed to arrive, which is the one case a teacher most needs told about. Measured. WHICH LOCAL FILES. Exactly the ones the window opened itself. Opening a worksheet adds one resolved path to a list, and the page's acceptNavigationRequest refuses every file: URL that is not on it. Chromium already refuses to let a remote page reach file: — verified with a link, a location.href, and a link to a worksheet that had been downloaded but not opened by the shell, all refused — so this is the second lock rather than the only one. It is here because the first one is somebody else's. Two Qt defaults are turned off beside it: LocalContentCanAccessFileUrls, which is on by default and would let a local document read other local documents, and its remote counterpart. Print to File is removed from the print dialog, because choosing it enables a path with a "..." button, which is a file chooser, in a room whose whole design is that there is no file chooser. The PDF viewer's own menus were audited: two-page view, annotations, present, properties, and nothing that opens or saves anywhere a teacher chooses. AND THE BROWSER IS NOT INVOLVED. The handler is connected to Wonder Ink's own profile, so it only ever sees downloads that started in a Wonder Ink tab. Nothing inspects a filename, nothing watches a directory, and Chrome — a separate application with a separate profile — is untouched: classroom-browser and the Chrome policies are byte-identical to stable 0.2.0. Worksheets go to ~/Downloads/Wonder Ink, which is tidiness and mostly the security argument: it is the only place one can come from. Only PDFs. Anything else downloads, says so, and is still unreachable; that limitation and two small follow-ups are written down rather than built, and nothing downloaded is ever executed. Measured from the package on a rebooted machine, and again on one upgraded from the published 0.2.1: the click-to-tab workflow end to end, a name with spaces and brackets, multi-page navigation, printing to Elmer, closing the worksheet without closing the lesson, and the four refusals. 120 convergence checks and 24 worksheet checks pass on both. Cookies are still session-only, the Present-view autoplay fix still works, fullscreen still comes back maximised, and there is still no address bar and no new-tab button. Co-Authored-By: Claude Opus 5 <[email protected]>
9.0 KiB
9.0 KiB
Screenshots from the classroom v2 experiment
All 1920×1080, captured with grim from a real running session in the
container lab. See ../classroom-v2-experiment.md.
The desktop
v2-idle-desktop |
the idle desktop: the wallpaper, one bar, nothing else |
v2-from-package |
the same desktop, produced by installing the .deb on a clean machine |
v2-dark-bar, v2-light-bar |
the bar in both themes |
v2-theme-compare |
the two, one above the other |
v2-testpage |
a maximised browser, edge to edge above the bar |
v2-wonderink |
Wonder Ink as an application, in its own profile |
Application state
state-1-closed |
both launchers closed: no indicator |
state-3-behind |
one active (teal), one running behind it (grey) |
state-4-minimized |
minimised — measured identical to behind, which is why minimise was removed as a route |
state-5-restored |
back |
v2-both-apps |
both applications, one button each, from the packaged install |
labelled-tasks |
the labelled task manager, evaluated and rejected: it shows changing page titles rather than application names |
Wonder Ink with tabs
0.2.1. A teacher prepares a lesson across several tabs, and none of a browser's other furniture is on the screen.
wonderink-tabs |
[ Lesson ] [ Video ] [ Activity ] — the second and third opened by the lesson itself, one through target=_blank and one through window.open |
wonderink-one-tab |
one tab, and no strip at all: the room looks exactly like the application this replaced |
wonderink-tab-closed |
the middle tab closed; the other two carry on |
wonderink-fullscreen |
a lesson's video over the whole display, panel and tab strip included |
wonderink-after-fullscreen |
and back, maximised above the bar, tabs intact — the bug this caught left the window 200 pixels wide in the corner |
wonderink-context-menu |
the whole of the right-click menu: back, forward, reload, print. No view-source, no save-page, no new window |
wonderink-print-dialog |
a lesson calling window.print(), landing on the room's own Elmer queue |
wonderink-and-browser |
the point of the split, in one picture: Chrome in front with its address bar, Wonder Ink a separate button beside it |
wonderink-autoplay, wonderink-autoplay-control |
the Present-view autoplay failure reproduced and then not reproduced: an unmuted video started by a script with no gesture, blocked at Chrome's default and playing as shipped |
wonderink-packaged |
the packaged shell against the real app.wonderink.org, launched from the .deb on a rebooted machine |
wonderink-disabled |
WONDERINK_ENABLED=false — no lesson button, the browser and the disc player where they were |
Wonder Ink worksheets
0.2.2. A lesson link that downloads a PDF comes back as a tab, and nothing else about the room's locks moves.
pdf-opened |
the worksheet a click downloaded, open as a tab beside the lesson and actually rendered — three pages, not a blank frame |
pdf-page2 |
page 2 of 3: multi-page navigation inside the tab |
pdf-spaces |
Leader Guide, Week 1 (Advent).pdf — spaces, a comma and brackets, through the download and into a tab |
pdf-print |
printing the worksheet, on the room's own Elmer queue |
pdf-closed-then-page |
the worksheet tab closed, the lesson still there and still working, and an ordinary target=_blank tab beside it |
pdf-broken |
HTML the server called .pdf: refused on its contents, with a message, and no blank tab |
pdf-interrupted |
a download that did not finish, saying so. The first version of this said nothing at all |
pdf-guard |
three attempts to reach a local file from the page — a link, a script, and a link to a worksheet that was downloaded but not opened by the shell. All refused |
pdf-dotmenu |
the whole of the PDF viewer's overflow menu, audited: two-page view, annotations, present, properties. No open, no save-as, no external link |
pdf-after-save |
the viewer's own download button: straight to Wonder Ink's directory with a notification, no file chooser and no duplicate tab |
pdf-autoplay-preserved |
the 0.2.1 Present-view autoplay fix, still working on the packaged 0.2.2 |
Parent Call
pc-icon-vs-notifications |
the Parent Call mark beside Plasma's notification bell — the comparison that decided it |
pc-mark |
the mark at 32, 48 and 64px, beside the two marks it replaced |
pc-panel |
the whole bar: Parent Call left, applications centre, status right |
pc-ready |
the card, ready, in approval mode |
pc-waiting |
waiting for a volunteer to approve |
pc-sent |
Sent to sanctuary — never "displayed" |
pc-rejected |
not approved, offering Try again |
pc-off |
the coordinator's mode is off |
pc-nobroker |
the broker is unreachable |
pc-typed |
a name in the field |
icon-candidates-2 |
sixteen Breeze person icons at real panel size, none of which meant Parent Call |
DVD
dvd-panel |
DVD in the row with the applications, out of the status area |
dvd-cover |
the DVD launcher's tooltip on the packaged install |
v2-dvd-overlay, v2-layershell |
the loading cover: a gtk-layer-shell overlay under KWin |
Windows
v2-secondary-window |
a window a page opened, floating over an untouched browser, with its own close button |
v2-print-dialog |
the system print dialog, over the page that raised it, offering only Elmer |
v2-fullscreen |
fullscreen video: the whole display, panel covered |
v2-layershell |
a gtk-layer-shell overlay under KWin — what the DVD loading cover is made of |
v2-notification-crop |
a notification card, top right |
Administration
admin-terminal |
the maintenance terminal, opened by its chord's action |
admin-terminal-bar |
the bar with the terminal open, and after closing it: a task button while it runs, no launcher ever |
Reliability and lockdown
recovery-after-8-kills |
the panel after eight consecutive SIGKILLs |
recovery-after-kwin-kill |
the session after KWin was killed twice; the application window survived |
recover-panel |
the bar rebuilt from the layout script after its configuration was deleted |
lock-desktop-rmb |
right-clicking the wallpaper: no menu |
lock-panel-rmb |
right-clicking the bar: no menu |
lock-krunner |
KRunner asked for, and not there |
The migration
migration-before |
what a real room got when it upgraded: stock Debian Plasma, kickoff, a pager, a system tray, the Debian wallpaper. Reproduced in the lab by taking one line out of the harness. |
migration-after |
the same machine after the fix — a Hyprland-era install, upgraded, rebooted |
migration-after-bar |
its bar, at the size a teacher sees it |
migration-parent-call |
Parent Call on the migrated machine, saying it cannot reach the church network rather than pretending it can |
theme-light-live, theme-light-after-logout |
the room's own light theme, and the same room after logging out and back in. The first attempt at this pass lost it. |
The rooms themselves
v2-from-package |
the classroom with the church's own wallpaper and the real Wonder Ink mark |
wonderink-icon |
the same mark as a running application's button |
display-settings |
the hidden display-size dialog, saying that saving needs an administrator |
scale-200, scale-200-notification, scale-200-chrome |
the room at 200%: the panel, a notification card, and the browser, all doubled together |
notification-style |
the notification card on the classroom's own Plasma style |
osd-volume |
Plasma's volume display, which the room keeps |
osd-shellpackage |
the custom one, which rendered correctly and cost the panel |
pc-unreachable, pc-not-configured |
Parent Call telling a broker it cannot reach from one that was never set up |
dvd-absent-bar |
the bar on a machine with no optical drive |
A morning in the rooms
pc-no-mode |
Parent Call ready against a broker with no retained mode — the state that used to say the room was never set up |
pc-bottom-left, pc-200-package |
the card anchored bottom-left at 100% and at 200% |
notif-package-100, notif-package-200 |
the notification card at both scales, from Classroom |
notif-13pt, notif-15pt |
the two font sizes that were weighed for it |
pc-typed-layer |
the card gone: the lab's keyboard tool closes it, which is why typing is still a bench test |
Failures, kept
| — | keyboard injection never reached the nested session, so every interaction in this experiment was driven by the pointer. It is why Parent Call has never had a real key pressed into it, and why that is the first bench test. |
m-closed, m-minimized |
the pair whose pixels were sampled to show that Plasma draws minimised and closed differently, but minimised and behind the same |