Files
Classroom_Desktop/docs/screenshots/README.md
T
ekklesiaandClaude Opus 5 5f2a9098c1 fix: a worksheet a lesson downloads comes back as a tab
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]>
2026-09-19 22:40:16 -05:00

158 lines
9.0 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 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](../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 |