Accept one post-sweep CI artifact on both Debian 13 x86_64 and
Ubuntu 24.04 LTS x86_64, in clean GNOME graphical accounts with no
FUSE or system Tesseract. Keep one result record per distro. A container,
mock portal, another distro, or an earlier artifact cannot fill these rows.
Use pass, fail, blocked, or pending; attach an observation or evidence
path to every completed row. A missing required portal is a blocker.
Download Addict-<version>-x86_64-handoff from a successful CI run containing
the completed 5.6 changes. Record the run URL, attempt, full source commit,
artifact name and image SHA-256. Follow the
handoff verification, including tar,
image and corresponding-source checksums and executable mode. Keep the full
handoff, not just the executable. Run the package checker from that revision:
scripts/check-appimage.sh /absolute/path/to/Addict-0.1.1-x86_64.AppImageCreate disposable VM snapshots and a dedicated graphical test account. Use
the real desktop session bus and normal HOME/XDG paths for capture and login
tests. Stop other Addict installations in that account. Do not use
dbus-run-session, private runtime directories, a mock portal or forced
extraction variables. Leave DeepL and configured OCR executable overrides
unset. Do not replace required portal backends or install system Tesseract to
make a failed row pass.
In each graphical session, retain the output of:
cat /etc/os-release
uname -a
gnome-shell --version
printf 'session=%s desktop=%s\n' "$XDG_SESSION_TYPE" "$XDG_CURRENT_DESKTOP"
ls -l /dev/fuse
dpkg-query -W -f='${binary:Package} ${Status} ${Version}\n' 'fuse*' 'libfuse*' 'tesseract*' 'xdg-desktop-portal*'
command -v tesseract
find /usr/share /usr/local/share -type d -name tessdata -print 2>/dev/null
env | sort | rg '^(APPIMAGE[^=]*|APPDIR|ARG0|ARGV0|URUNTIME[^=]*|XDG_[^=]*|TARGET_APPIMAGE|WAYLAND_DISPLAY|DISPLAY|TESSDATA_PREFIX|GTK_PATH|GTK_MODULES|LD_LIBRARY_PATH)='
gdbus introspect --session --dest org.freedesktop.portal.Desktop --object-path /org/freedesktop/portal/desktopSome probes intentionally return nonzero when a device, package, executable
or interface is absent. Retain that output; do not chain probes with &&.
If rg is unavailable, retain env | sort and inspect it directly. Verify
actual installed packages, filesystem paths and launch logs together; absence
of /dev/fuse alone does not prove absence of installed FUSE packages.
In that desktop object's introspection, check both
org.freedesktop.portal.Background and org.freedesktop.host.portal.Registry.
The latter is an interface on the same object, not a separate object path.
Record portal
frontend/backend package versions, interface versions and session type.
Place the executable in a persistent directory containing spaces, for example
~/AppImage acceptance/Addict-0.1.1-x86_64.AppImage, and leave it there for
the entire run. Record its absolute path and checksum on both VMs.
After observing the first ordinary launch and before testing capture, invoke
that outer file with install explicitly. The real host Registry requires
the matching desktop entry even for screenshot requests. Retain the installed
entry; installation must not enable startup by itself. This is the explicit
installation under test in step 6, not automatic desktop integration.
- Ordinary launch and dictionary. Launch the image directly, without
flags or environment workarounds. Observe a visible main window and direct
access to Settings. Record automatic no-FUSE extraction in its log. On the
clean account, accept the in-app HTTPS dictionary download; do not copy an
existing index in as a substitute. Record installed source/edition, filename,
absolute path and SHA-256. With English selected and DeepL unset, translate
catand retain the actual Russian result and screenshot. The index must live outside the bundle and extraction tree. - Runtime and licenses. Identify the resident PID in this account and run
scripts/check-appimage.sh --trace PID NEW_EVIDENCE_DIR. Retain its maps, executable, environment and parent chain. Verify GTK, libc and loader map to the extracted bundle; record literal APPIMAGE/APPDIR/ARG0/ARGV0 where present and/proc/PID/exe. Verify the package audit, embeddedshare/licenses/components.json, addict/Rust/GTK/libc/runtime licenses, Tesseract/tessdata licenses and Leptonica notice. Retain the corresponding sources beside the handoff and verify everySHA256SUMSentry. - Real capture and OCR. Display the three fixture lines below in a text
editor at a readable size. Select the matching language, press the visible
window's Capture button and select only one line using the real region
picker. Record the actual recognized text for all three languages. Repeat
each capture twice more, confirming the picker appears each time and only
the chosen region becomes text. Collect successful engine/model opens and
child mappings, for example with
strace -f -e trace=execve,openatattached to the resident during capture if available. Record the actual bundled Tesseract child, selected eng/spa/cat model, engine, Leptonica and loader paths. The production executable rule resolves siblingbin/tesseractwith../share/tessdata; filesystem layout alone is insufficient evidence. - Cancellation and recovery. Note the current field/result. Start another Capture and press Esc in the picker. Verify no OCR/translation starts and the previous result remains; then capture successfully without restarting Addict. If permission is refused or the backend fails, record the error and verify the visible focused-window recovery route. A prompt that never appears does not establish a denial pass. No path may silently substitute a full-screen image for interactive selection.
- Optional shortcut capability. Only on GNOME 48+ with the actual GlobalShortcuts interface available, assign the screenshot shortcut in Settings, close the window, and repeat capture/cancel/retry from the shortcut. On older GNOME, mark this row outside the applicable target; steps 3–4 still apply. Do not upgrade the target desktop just to enable it.
- Persistent launcher relaunch. Use the explicit installation above. Save the generated
~/.local/share/applications/io.github.doqhu.Addict.desktopand check that its Exec names the persistent image with correct quoting for spaces. Exit the resident; if no tray Exit is available, send SIGTERM to its recorded PID. Confirm its process and exact extraction tree are gone. Launch the installed entry from the application grid and verify a fresh resident and visible window. Trace it again and record the outer image and new runtime. A direct shell launch is not evidence of launcher execution. - Real login startup. With the explicit launcher installed, enable Start
at login in Settings through the real portal. Retain its confirmed state,
portal diagnostics and portal-managed autostart entry/command, which must
name the persistent image plus
--background. Log out completely, then log in. Verify a new bundled resident starts silently without an app window. Launch from the grid and confirm the window becomes visible. Turn Start at login off, retain the confirmed disabled state and entry removal, then log out/in again and verify no resident starts. Do not write an autostart entry manually or replace the portal with the relaunch harness. Missing Background/Registry support blocks this row and final acceptance. - Finish. Preserve all evidence and remaining failures/blockers. On the disposable account, uninstall explicitly if desired and confirm it disables startup and removes the launcher without deleting downloaded dictionaries. Record any cleanup performed. Do not remove a daily-use installation.
Fixtures from the existing bundled OCR verification:
The bank is beside the river.
El niño está cerca del río.
El camí és a prop del riu.
Run 2026-11-11, observer: Claude Code driving disposable QEMU/KVM GNOME
sessions through QMP input, SSH and AT-SPI. Closed with accepted exceptions (decision 2026-11-11): Debian 13 passed
every applicable row except the optional shortcut; Ubuntu 24.04 capture/OCR,
cancellation and login-startup rows are accepted as blocked by that
distribution's portal stack, not as passes. Ubuntu's Background portal
refuses without the host Registry, and its screenshot portal returns no file
even to a client that is not Addict (see the re-run below).
Artifact: CI run 43085196346, attempt 1, source commit
182def524355413b05578991ca5e127b966657de, artifact
Addict-0.1.1-x86_64-handoff; tar SHA-256
fd65ebd077dc01a162da61875c9cf5cf4e9c9a32d459d93ea6458d067aa8c43e; image
SHA-256 7929354f94e83ca84d7000fd9efa265d2567694774eabb024c9f52e52e11d4b7.
Tar, image and every corresponding-source checksum verified; the same image
checksum was confirmed on both targets. Image path on both:
/home/tester/AppImage acceptance/Addict-0.1.1-x86_64.AppImage.
| Evidence | Debian 13 | Ubuntu 24.04 LTS |
|---|---|---|
| CI run/attempt/full commit/image checksum | pass | pass |
| Clean graphical account, OS/GNOME/session/kernel | pass: Debian 13.7, GNOME Shell 48.7, Wayland, 6.12.115 | pass: Ubuntu 24.04.5, GNOME Shell 46.0, Wayland, 6.8.0-147 |
| No FUSE/system engine/models/OCR overrides | pass: no /dev/fuse, no tesseract; fuse3/libfuse3 packages present |
pass: no /dev/fuse, no tesseract; fuse/libfuse2t64 packages present; both log automatic extraction |
| Real Background/Registry capabilities | pass: Background and host.portal.Registry present |
blocked: Background present, host.portal.Registry absent (xdg-desktop-portal 1.18.4) |
| Ordinary visible launch and bundled GTK/libc/loader | pass | pass |
| In-app download, index identity, typed Russian translation | pass: 13 indexes, cat -> кошка |
pass: identical index checksums, cat -> кошка |
| Complete embedded licenses and source checksums | pass (host audit, same checksum) | pass (same image) |
| English real picker/OCR and child/model paths | pass, x3, strace: bundled tesseract/libs/eng.traineddata |
blocked: Capture reports "Screen capture is not available here" |
| Spanish real picker/OCR and child/model paths | pass, x3, spa.traineddata |
blocked |
| Catalan real picker/OCR and child/model paths | pass, x3, cat.traineddata |
blocked |
| Repeated selection, cancellation and successful retry | pass: Esc shows "No snapshot was taken", result kept, retry works in the same resident | blocked |
| Shortcut capture, only where applicable | pending: GNOME 48 dialog opened; assignment attempts did not complete (bind reported "Portal request didn't succeed"); not a pass | not applicable (GNOME 46) |
| Explicit launcher after process/extraction teardown | pass: quoted Exec, SIGTERM, tree gone, grid launch shows window |
pass |
| Enable, new login, silent resident, visible grid launch | pass: portal entry names image + --background; new login started addict --background with no window; grid showed it |
blocked: "Startup was not changed: the Background portal is not available"; no entry written |
| Disable, new login, no resident | pass: entry removed, new login started no resident | blocked (nothing to disable) |
Evidence: target/appimage-acceptance-5.7/{handoff-verified.txt,package-audit.txt}
and per-distro directories (screenshots, trace-*, strace-*,
autostart-*, login-*, dictionary-identity.txt).
Artifact: CI run 43100480735, attempt 1, commit
46405b04fb479f9650ffffa1097628cf3467bd45, image SHA-256
6def4e59fc8799a2c89e0c03b4b929beb884179fb4a4b93a3480d8ce3b2b03f8; tar,
image and all source checksums verified, installed explicitly on the same
Ubuntu 24.04.5 session. The Capture button now reaches the real GNOME region
picker (the earlier "Screen capture is not available here" is gone), and the
shell writes a correct PNG of the selected region to ~/Pictures/Screenshots.
The capture still ends without text: the portal answers Response (2, {}) and
its log says InteractiveScreenshot didn't return a file. A plain Python
client that knows nothing of Addict (target/appimage-acceptance-5.7/portal-shot.py)
gets the identical answer after the same pick (ubuntu/portal-probe-response.txt),
so this is the portal/shell stack of this VM, not the application. Addict
reports it as "No snapshot was taken. Press Capture to try again." and
logs Capture(Ended). A fresh account also lacked
~/.local/share/recently-used.xbel, which GNOME 46 logs as an error on each
screenshot; an empty valid file was created and did not change the result.
The VM has software rendering and no GPU acceleration, which was not ruled out as a cause.
Ubuntu capture, OCR, cancellation/retry and login rows therefore stay
blocked (now by the portal returning no file, plus the Background portal
refusal for login startup), not passed. Debian's results are unchanged and
were obtained with the earlier image (7929354f...); they have not been
repeated on the newer image, which differs only in the capture-connection fix.
Observations needing follow-up:
- After exit,
/tmpkeeps an emptyappimage_extracted_*.lockand two dangling symlinks into the removed tree (created duringinstall). - A first Catalan-model pass over the English line read "The bant is beside the river." (an invalid capture caused by a helper error, not a Catalan result).
- Ubuntu 24.04 ships xdg-desktop-portal 1.18.x without the host Registry, so capture and login startup cannot pass there unless a newer portal is accepted as a prerequisite or the app degrades without the Registry.
Preparation observations, not target passes:
- Source HEAD is
ab42b0d9c896d05c537c8e62c199a9cf5a1b4e87(5.6). Live hosted CI lookup found latest run 42812838854 atf37c831348b0b816e9e53c040e02b9a8fcb57de6, predating AppImage changes. A post-sweep CI handoff is still required. - Final local 5.6 image checksum is
0092a70feb306953a28188d2113b06740de9e930971ba5991dab2c42541c7557. Its metadata identifies a dirty snapshot over the prior baseline. This is local package/mock-smoke evidence, not hosted CI or desktop/login acceptance. - A stopped Ubuntu 24.04.5 GNOME 46 base and an OCR overlay remain locally. Their earlier results apply to earlier artifacts/private mock portals. A new snapshot and real-session capability probe are required. No verified Debian 13 desktop was found in the inspected local inventory.
Store new raw observations under target/appimage-acceptance-5.7/, grouped
by artifact and distro. Add dates, observer and evidence paths to this record
as each real check is completed; keep failed and blocked observations.