diff --git a/README.md b/README.md index e925e87..cd40e01 100644 --- a/README.md +++ b/README.md @@ -6,10 +6,11 @@ desktops may use the same independent VM manager and viewers. ## Status -The first installable UEFI preview passed a complete disposable QEMU/KVM run: +The terminal UX UEFI preview passed all 13 disposable QEMU/KVM acceptance checks: installation, boot without the ISO, password login, persistent data, networking, -nested KVM and VM survival across user logout. See the -[build and acceptance record](docs/releases/2026-10-13/acceptance.json). +nested KVM, VM survival across logout, and the packaged download/run/open/menu +workflow with Fastfetch. See the +[release and acceptance record](docs/releases/2026-10-13-terminal-ux/README.md). The first physical target is ASUS TUF Dash F15 FX517ZC; laptop hardware checks remain pending. Existing NixOS and VM disks were not installation or test targets. diff --git a/docs/install.md b/docs/install.md index c16dcc1..e1d545b 100644 --- a/docs/install.md +++ b/docs/install.md @@ -1,7 +1,7 @@ # Install Hydra OS Hydra OS targets x86_64 UEFI systems. Disable Secure Boot for this first image. -Boot the ISO and open the recovery terminal. The live session uses a locked +Boot the ISO and enter `:shell` in the terminal VM menu. The live session uses a locked `hydra-live` account with local sudo access; changes in the live filesystem are volatile. The image provides no default SSH login or universal installed password. @@ -73,7 +73,13 @@ synthetic VM endpoint. Network namespaces and veth interfaces exist only inside the disposable Hydra OS guest. When guest KVM is available, it launches a further fresh-disk QEMU as the installed account to exercise KVM, the bridge helper, and private QMP; this checks VM launch, not a nested operating system boot. -It also logs the installed account out and back in, checking that the same VM, +The installed normal account also exercises the packaged terminal menu, +downloads a complete nonboot ISO fixture from a private loopback HTTP server, +starts a scratch VM with `hydra run`, checks cache reuse and stable process/QMP +identity through `hydra open`, and verifies the default Fastfetch logo/name. +This fixture checks the command flow, not a nested guest OS boot. + +The harness also logs the installed account out and back in, checking that the same VM, private sockets and user audio services survive a measured interval without an open login session. This establishes process/socket continuity, not audio playback. diff --git a/docs/releases/2026-10-13-terminal-ux/README.md b/docs/releases/2026-10-13-terminal-ux/README.md new file mode 100644 index 0000000..2a15937 --- /dev/null +++ b/docs/releases/2026-10-13-terminal-ux/README.md @@ -0,0 +1,45 @@ +# Hydra OS terminal UX preview + +Source revision: `1bc7965ccaddb76abc78aafa82bb59358cf4dc0e`. + +## Changes + +- Terminal VM menu accepts a number, name, or the remembered selection. Opening a stopped guest starts it explicitly; opening a live guest reconnects its screen. The selected VM receives the initial workspace after refresh, while other QEMU processes continue independently. +- `hydra run URL --name NAME` downloads an ISO, creates a new guest and opens it. `hydra open NAME` reopens it; `hydra download URL` only downloads. Guided creation honors the same `--defaults` as direct CLI creation. +- Downloads show progress, support cancellation and optional publisher SHA-256, validate ISO9660 declared extents, and preserve existing files/profiles. Pure UDF images are explicitly unsupported by this initial downloader; ISO9660/UDF hybrids are accepted through ISO9660 validation. A format check does not establish publisher authenticity or arbitrary guest OS bootability. +- Visible system, boot, installer and viewer labels use **Hydra OS**. Fastfetch includes an original three-headed text logo and a concise host summary. +- A separate self-contained developer update bundle supports dry-run, exact checksums, backups and best-effort exception rollback. It does not replace guest disks, profiles, kernel or networking. + +## Verification + +- Complete source suite: **293 tests passed**, 44.788 seconds. +- Private two-guest focus probe: selecting Beta opens workspace 2; fresh keyboard focus, unchanged PID/UUID and continuing hidden counters survive refresh and compositor exit. +- Private general graphics/input smoke: reserved switching while keybindings are inhibited, manual USB selector without automatic attachment, view reconnection and media lifecycle passed. Requested display mode is 1920×1080 at 144000 mHz; physical refresh/input behavior is not inferred from that request. +- Independent task and final branch reviews completed; ISO extent validation, partial rollback reporting, shortcut help and custom menu defaults findings were resolved. No open review findings remain. +- The final full update zipapp was exercised against a disposable installed-root fixture: dry-run, apply, all installed hashes, retained original metadata and relocated CLI passed. The existing user installation has not been updated. + +Rebuilt ISO boot/install acceptance: **all 13 checks passed**. The [complete report](acceptance.json) identifies the exact ISO and firmware. It includes real installation, ISO-free boot, password login, persistent data, the packaged terminal UX and Fastfetch, routed LAN-to-VM TCP, nested KVM, VM/socket survival through actual logout and normal shutdown. No check was skipped. The [Fastfetch capture](fastfetch.txt) comes from the installed test guest's default configuration. + +The previous preview record at `../2026-10-13/` describes only the earlier ISO and is unchanged. + +## Delivery and decisions + +ISO: `hydra-os.iso`, 2,345,932,800 bytes. SHA-256: + +```text +1ed2cc79482ac5b14794ed6d4c4caf46ecc54af6457c5d38bc662cd3c104fbad +``` + +Runtime update: `hydra-os-update-1bc7965.pyz`, 56,425 bytes. SHA-256: + +```text +3ed9288451894277797aa34f105f1969af0a892b1ec14dc27b1fadeed2a7e7f3 +``` + +See [terminal usage](../../terminal-usage.md) for applying it inside an installed Hydra guest, logging out and in again, installing Fastfetch on older images, and manually reversing an update. The bundle includes Fastfetch configuration/artwork, not its executable package. + +The derivative OS identity is `ID=hydra-os`, `ID_LIKE=gentoo`; vendor `/usr/lib/os-release` remains intact. Consumers matching only `ID=gentoo` need to consider `ID_LIKE`. Technical hostname, bridge, storage paths and EFI bootloader identifier remain compatible. + +The downloader deliberately rejects pure UDF because it cannot verify its declared extent with the implemented validator. Such media needs a supported alternative or a separate manual download/lower-level workflow. Publisher hashes remain advisable for whole-image integrity. + +Physical ASUS graphics, touchpad, brightness keys, Wi-Fi, suspend, audio playback and actual USB-device redirection remain hardware checks. The updater is a trusted-source developer tool with backups, not a signed package manager or a guarantee of multi-file atomicity across power loss. No command channel into the existing manual test VM was available; staged delivery evidence does not mean that VM was updated. diff --git a/docs/releases/2026-10-13-terminal-ux/acceptance.json b/docs/releases/2026-10-13-terminal-ux/acceptance.json new file mode 100644 index 0000000..ad62e2e --- /dev/null +++ b/docs/releases/2026-10-13-terminal-ux/acceptance.json @@ -0,0 +1,66 @@ +{ + "schema": 1, + "status": "passed", + "scratch": "/home/workspaces/ubuntu-dev/home/.cache/hydra-tests/hydra-iso-smoke-rjtq89i8", + "iso": "/home/workspaces/ubuntu-dev/home/Projects/hydra-os/build/artifacts/hydra-os.iso", + "iso_sha256": "1ed2cc79482ac5b14794ed6d4c4caf46ecc54af6457c5d38bc662cd3c104fbad", + "checks": { + "live_qmp_kvm": { + "status": "passed", + "output": "{\"enabled\": true, \"present\": true}" + }, + "live_boot": { + "status": "passed", + "output": "/usr/bin/hydra\n/usr/bin/hydra-install\n/usr/bin/qemu-system-x86_64\n/usr/bin/qemu-img\n/usr/bin/remote-viewer\n/usr/bin/foot\n/usr/bin/labwc\nactive\nactive\nactive\n" + }, + "real_installer": { + "status": "passed", + "output": "Installer completed via guest controlling TTY" + }, + "live_poweroff": { + "status": "passed", + "output": "QEMU exited before ISO-free reboot" + }, + "installed_qmp_kvm": { + "status": "passed", + "output": "{\"enabled\": true, \"present\": true}" + }, + "installed_password_login": { + "status": "passed", + "output": "hydratest\n" + }, + "installed_terminal_ux": { + "status": "passed", + "output": "{\"status\": \"passed\", \"uid\": 1000, \"normal_user\": \"hydratest\", \"launcher\": \"/usr/bin/hydra\", \"fixture_bytes\": 43008, \"iso_sha256\": \"aa66329c263f560f514c00a71551490dd6593ee7632404e072584e2803e0a1c7\", \"cache_reused\": true, \"http_requests\": [\"/fixture.iso\"], \"before\": {\"name\": \"ux-407c8d94\", \"uuid\": \"708c7761-5d45-540b-9e50-ecbccab235dd\", \"pid\": 664, \"process_start\": \"1365\", \"kvm\": true}, \"after_open\": {\"name\": \"ux-407c8d94\", \"uuid\": \"708c7761-5d45-540b-9e50-ecbccab235dd\", \"pid\": 664, \"process_start\": \"1365\", \"kvm\": true}, \"after_menu\": {\"name\": \"ux-407c8d94\", \"uuid\": \"708c7761-5d45-540b-9e50-ecbccab235dd\", \"pid\": 664, \"process_start\": \"1365\", \"kvm\": true}, \"memory_mib\": 512, \"cpus\": 1, \"disk_size\": \"64M\", \"network\": \"bridge\", \"empty_menu\": \"\\nHydra OS \\u2014 virtual machines\\n\\nNo VM profiles. Use :run to create one from an ISO path or direct URL.\\n\\nNumber/name opens one VM; Enter opens the last (*) or only VM.\\n:run / :new :download :network :shell :help :refresh :quit\\n:shutdown NAME requests guest shutdown; :detach NAME removes ISO while stopped.\\nhydra> \", \"running_menu\": \"\\nHydra OS \\u2014 virtual machines\\n\\n # Name State RAM\\n 1 ux-407c8d94 running 512 MiB\\n\\nNumber/name opens one VM; Enter opens the last (*) or only VM.\\n:run / :new :download :network :shell :help :refresh :quit\\n:shutdown NAME requests guest shutdown; :detach NAME removes ISO while stopped.\\nhydra> \", \"run_output\": \"\", \"download_output\": \"/tmp/hux-cov4pymn/cache/hydra/iso/4341afe870c3591f6581e2c0c00554e8876cfe2f669a6208636261a2f6b069ee-fixture.iso\\n\", \"fastfetch_command\": [\"fastfetch\", \"--pipe\", \"false\", \"--show-errors\"], \"fastfetch_default_config_sha256\": \"2af12ce007705f039870867c89b0fc6f90bcf6c6b29c04b63ab75f345419b1a1\", \"fastfetch_logo_sha256\": \"ddd6d11f785aac99591fbcc5959e9f553287514459832131c70e48525ad76868\", \"fastfetch_output\": \" /\\\\ /\\\\ /\\\\ hydratest@hydra-os\\n .-(o > .-(o > .-(o > OS: Hydra OS x86_64\\n/ / / / / / Kernel: Linux 6.18.54-gentoo-dist-bin\\n\\\\ \\\\______\\\\ \\\\______\\\\ \\\\ Uptime: 12 seconds\\n \\\\ \\\\ / CPU: 12th Gen Intel(R) Core(TM) i7-12650H (2) @ 2.69 GHz\\n '---. .---' Memory: 426.05 MiB / 3.80 GiB (11%)\\n \\\\ /\\\\/\\\\ / Disk (/): 6.98 GiB / 30.34 GiB (23%) - ext4\\n ___\\\\/ \\\\/___ Local IP (enp0s2): 10.0.2.15/24\\n /______________\\\\\\n H Y D R A O S\\n\\n\", \"scope\": \"Packaged installed CLI, cache, branding and live nested QMP/KVM; nonboot ISO fixture, no nested OS boot or performance claim\", \"cleanup\": \"Only the verified private fixture VM stopped through hydra stop --force\"}\n" + }, + "disk_persistence": { + "status": "passed", + "output": "Sentinel content verified from command output frame" + }, + "installed_contract": { + "status": "passed", + "output": "active\nactive\nactive\nactive\n3: hydrabr0 inet 10.203.0.1/24 brd 10.203.0.255 scope global noprefixroute hydrabr0\\ valid_lft forever preferred_lft forever\ndefault via 10.0.2.2 dev enp0s2 proto dhcp src 10.0.2.15 metric 100 \ntable ip hydra_nat {\n\tchain postrouting {\n\t\ttype nat hook postrouting priority srcnat; policy accept;\n\t\tip saddr 10.203.0.0/24 oifname != \"hydrabr0\" masquerade\n\t}\n}\nconnected\n198.18.0.41 STREAM gentoo.org\n198.18.0.41 DGRAM \n198.18.0.41 RAW \n/usr/bin/hydra\n/usr/bin/hydra-install\n/usr/bin/qemu-system-x86_64\n/usr/bin/qemu-img\n/usr/bin/remote-viewer\n/usr/bin/foot\n/usr/bin/labwc\n\u001b[1;34musage: \u001b[0m\u001b[1;35mhydra\u001b[0m [\u001b[32m-h\u001b[0m] [\u001b[36m--config \u001b[33mCONFIG\u001b[0m] [\u001b[36m--state \u001b[33mSTATE\u001b[0m] [\u001b[36m--runtime \u001b[33mRUNTIME\u001b[0m]\n [\u001b[36m--defaults \u001b[33mDEFAULTS\u001b[0m]\n \u001b[32m{menu,download,run,open,add,media,list,status,start,shutdown,stop,view,session,_session-helper} ...\u001b[0m\n\nHydra OS independent VM manager\n\n\u001b[1;34mpositional arguments:\u001b[0m\n \u001b[1;32m{menu,download,run,open,add,media,list,status,start,shutdown,stop,view,session,_session-helper}\u001b[0m\n \u001b[1;32mmenu\u001b[0m Open the terminal VM menu\n \u001b[1;32mdownload\u001b[0m Download and validate a direct ISO URL\n \u001b[1;32mrun\u001b[0m Create, start and display a VM from a local ISO or\n HTTP(S) URL\n \u001b[1;32mopen\u001b[0m Start a stopped VM or reconnect a running VM\n \u001b[1;32madd\u001b[0m Create a VM profile without starting it\n \u001b[1;32mmedia\u001b[0m Attach or detach installation media while stopped\n \u001b[1;32mlist\u001b[0m List configured VMs\n \u001b[1;32mstatus\u001b[0m Query VM state through private QMP\n \u001b[1;32mview\u001b[0m Connect a viewer without changing VM power\n \u001b[1;32msession\u001b[0m Start the minimal Hydra OS labwc session\n \u001b[1;32m_session-helper\u001b[0m ==SUPPRESS==\n\n\u001b[1;34moptions:\u001b[0m\n \u001b[1;32m-h\u001b[0m, \u001b[1;36m--help\u001b[0m show this help message and exit\n \u001b[1;36m--config\u001b[0m \u001b[1;33mCONFIG\u001b[0m\n \u001b[1;36m--state\u001b[0m \u001b[1;33mSTATE\u001b[0m\n \u001b[1;36m--runtime\u001b[0m \u001b[1;33mRUNTIME\u001b[0m\n \u001b[1;36m--defaults\u001b[0m \u001b[1;33mDEFAULTS\u001b[0m Distribution preferences for newly created profiles\nQEMU emulator version 10.2.3\nCopyright (c) 2003-2025 Fabrice Bellard and the QEMU Project developers\nqemu-img version 10.2.3\nCopyright (c) 2003-2025 Fabrice Bellard and the QEMU Project developers\n/usr/share/edk2/OvmfX64/OVMF_CODE.fd\n" + }, + "lan_to_vm_tcp": { + "status": "passed", + "output": "PASS: routed new LAN-to-VM TCP connection on arbitrary port 43117\n" + }, + "nested_kvm": { + "status": "passed", + "output": "Formatting '/tmp/hydra-nested-pmtnvwzh/fresh.qcow2', fmt=qcow2 cluster_size=65536 extended_l2=off compression_type=zlib size=67108864 lazy_refcounts=off refcount_bits=16\nPASS: normal-user nested KVM VM and bridge helper; fresh qcow2; private QMP\n" + }, + "installed_user_logout": { + "status": "passed", + "output": "{\"status\": \"passed\", \"real_logout\": true, \"no_open_logins\": true, \"survival_seconds\": 15, \"same_vm\": {\"name\": \"logout-bc617dc9\", \"uuid\": \"0c031012-0f16-55bb-98c5-ed7352000c2c\", \"pid\": 943, \"process_start\": \"2192\", \"directories\": {\"/run/user/1000/hydra-logout-bc617dc9\": [46, 52, 16832], \"/run/user/1000/hydra-logout-bc617dc9/logout-bc617dc9\": [46, 53, 16832]}, \"sockets\": {\"qmp\": [46, 57, 1000, 49640], \"spice\": [46, 56, 1000, 49640], \"pipewire\": [46, 28, 1000, 49590], \"pulse\": [46, 27, 1000, 49590]}, \"audio_services\": {\"pipewire.service\": \"InvocationID=aac07ae95f15474894fc94690edfa62c\\nExecMainPID=916\\n\", \"pipewire-pulse.service\": \"InvocationID=55735e4672f2412398cfd82086b21030\\nExecMainPID=918\\n\", \"wireplumber.service\": \"InvocationID=1dc399b7b35c42c7bb43f44923805472\\nExecMainPID=917\\n\"}}, \"audio_scope\": \"Socket and service continuity only; signal/playback untested\"}\n" + }, + "installed_poweroff": { + "status": "passed", + "output": "Normal installed guest shutdown" + } + }, + "physical_hardware": "pending", + "nested_scope": "Normal-user KVM VM launch, bridge helper and QMP; no nested guest OS boot", + "ovmf_code_sha256": "f3ff7e73448ed2845ee15356f394882f5618eb5dab92c9a30ec6ee0e1468553a", + "ovmf_vars_input_sha256": "6ed987af3a3c155be71665f510eae3e007eda9b8b94afd59d45e91c4a11565cc", + "completed_utc": "2026-10-13T15:08:23Z" +} diff --git a/docs/releases/2026-10-13-terminal-ux/artifacts.json b/docs/releases/2026-10-13-terminal-ux/artifacts.json new file mode 100644 index 0000000..5a838af --- /dev/null +++ b/docs/releases/2026-10-13-terminal-ux/artifacts.json @@ -0,0 +1,33 @@ +{ + "source_commit": "1bc7965ccaddb76abc78aafa82bb59358cf4dc0e", + "iso": { + "file": "hydra-os.iso", + "size": 2345932800, + "sha256": "1ed2cc79482ac5b14794ed6d4c4caf46ecc54af6457c5d38bc662cd3c104fbad" + }, + "runtime_update": { + "status": "passed", + "bundle": "hydra-os-update-1bc7965.pyz", + "source_commit": "1bc7965ccaddb76abc78aafa82bb59358cf4dc0e", + "sha256": "3ed9288451894277797aa34f105f1969af0a892b1ec14dc27b1fadeed2a7e7f3", + "payload_files": 16, + "checks": [ + "dry_run_no_changes", + "zipapp_apply", + "all_payload_hashes", + "original_image_manifest", + "vendor_release_preserved", + "branded_release", + "relocated_cli" + ], + "existing_user_guest_modified": false + }, + "kernel": "6.18.54-gentoo-dist-bin", + "packages": 561, + "tests": { + "unit": 293, + "iso_acceptance": 13, + "iso_skipped": 0 + }, + "physical_hardware": "pending" +} diff --git a/docs/releases/2026-10-13-terminal-ux/fastfetch.txt b/docs/releases/2026-10-13-terminal-ux/fastfetch.txt new file mode 100644 index 0000000..88fd495 --- /dev/null +++ b/docs/releases/2026-10-13-terminal-ux/fastfetch.txt @@ -0,0 +1,11 @@ + /\ /\ /\ hydratest@hydra-os + .-(o > .-(o > .-(o > OS: Hydra OS x86_64 +/ / / / / / Kernel: Linux 6.18.54-gentoo-dist-bin +\ \______\ \______\ \ Uptime: 12 seconds + \ \ / CPU: 12th Gen Intel(R) Core(TM) i7-12650H (2) @ 2.69 GHz + '---. .---' Memory: 426.05 MiB / 3.80 GiB (11%) + \ /\/\ / Disk (/): 6.98 GiB / 30.34 GiB (23%) - ext4 + ___\/ \/___ Local IP (enp0s2): 10.0.2.15/24 + /______________\ + H Y D R A O S + diff --git a/docs/releases/2026-10-13-terminal-ux/runtime-update.json b/docs/releases/2026-10-13-terminal-ux/runtime-update.json new file mode 100644 index 0000000..fd0f065 --- /dev/null +++ b/docs/releases/2026-10-13-terminal-ux/runtime-update.json @@ -0,0 +1,17 @@ +{ + "status": "passed", + "bundle": "hydra-os-update-1bc7965.pyz", + "source_commit": "1bc7965ccaddb76abc78aafa82bb59358cf4dc0e", + "sha256": "3ed9288451894277797aa34f105f1969af0a892b1ec14dc27b1fadeed2a7e7f3", + "payload_files": 16, + "checks": [ + "dry_run_no_changes", + "zipapp_apply", + "all_payload_hashes", + "original_image_manifest", + "vendor_release_preserved", + "branded_release", + "relocated_cli" + ], + "existing_user_guest_modified": false +} diff --git a/docs/superpowers/plans/2026-10-13-terminal-ux.md b/docs/superpowers/plans/2026-10-13-terminal-ux.md index aa46c6d..cb1b9cc 100644 --- a/docs/superpowers/plans/2026-10-13-terminal-ux.md +++ b/docs/superpowers/plans/2026-10-13-terminal-ux.md @@ -51,10 +51,10 @@ Interfaces: - Manifest defaults from `HYDRA_SESSION_MANIFEST` when valid; launch errors remain actionable and never silently restart an unknown/foreign VM. -- [ ] Write and observe failing tests using a local HTTP fixture (ISO, HTML, +- [x] Write and observe failing tests using a local HTTP fixture (ISO, HTML, truncation, checksum, cancellation, cache reuse, collision). -- [ ] Implement downloader and explicit open/run commands, preserve existing CLI. -- [ ] Test no accidental overwrite/start, headless operation, RAM preflight and +- [x] Implement downloader and explicit open/run commands, preserve existing CLI. +- [x] Test no accidental overwrite/start, headless operation, RAM preflight and view-only reconnection. Run scoped tests and commit only owned files. ## Task 2: Terminal menu and focused session handoff @@ -72,10 +72,10 @@ Interfaces: requested configured VM. Recovery delegates to menu; automatic clients remain view-only. Errors stay in menu, and operations use fresh runtime profiles. -- [ ] Write failing menu/refresh tests for stopped/running selection, unknown +- [x] Write failing menu/refresh tests for stopped/running selection, unknown identity, names such as s/q, empty/invalid profiles and second-workspace focus. -- [ ] Implement terminal flow, visible command previews and recovery fallback. -- [ ] Run scoped tests plus an isolated session probe where feasible; commit +- [x] Implement terminal flow, visible command previews and recovery fallback. +- [x] Run scoped tests plus an isolated session probe where feasible; commit owned files. Existing reserved chords and VM independence remain intact. ## Task 3: Hydra OS branding and Fastfetch @@ -84,20 +84,20 @@ Owned: `image/packages`, `image/rootfs` (Fastfetch config/logo/motd only), `hydra/image.py`, `image/grub.cfg`, `session` metadata, new branding tests. Coordinate session/CLI visible names with their owners; do not edit their files. -- [ ] Confirm Fastfetch's Gentoo atom, supported logo/config format and search path. -- [ ] Add original terminal logo and restrained summary configuration; retain +- [x] Confirm Fastfetch's Gentoo atom, supported logo/config format and search path. +- [x] Add original terminal logo and restrained summary configuration; retain technical IDs while updating visible OS/boot/session labels. -- [ ] Verify config with actual Fastfetch in a temporary/container environment, +- [x] Verify config with actual Fastfetch in a temporary/container environment, preview logo, and test resulting image metadata. Commit owned files. ## Task 4: Integration and delivery Owner: controller. README/install docs, update bundle, isolated validation. -- [ ] Review each task diff with concrete test reports; resolve findings. -- [ ] Integrate task interfaces; document terminal usage and branded name. -- [ ] Run complete suite and isolated smoke covering run/open/menu with new code. -- [ ] Prepare a reversible guest update with exact file inventory and checksums; +- [x] Review each task diff with concrete test reports; resolve findings. +- [x] Integrate task interfaces; document terminal usage and branded name. +- [x] Run complete suite and isolated smoke covering run/open/menu with new code. +- [x] Prepare a reversible guest update with exact file inventory and checksums; preserve old ISO and test disk. Assess cached image rebuild and test new output. -- [ ] Review whole branch, commit/publish authorized repository changes and report +- [x] Review whole branch, commit/publish authorized repository changes and report exactly which artifacts and guest states have actually been updated. diff --git a/docs/verification.md b/docs/verification.md index bb9ce55..862869b 100644 --- a/docs/verification.md +++ b/docs/verification.md @@ -1,13 +1,17 @@ # Graphics and recovery verification -The [2026-10-13 preview record](releases/2026-10-13/acceptance.json) identifies -the exact ISO, firmware and harness used for the passing twelve-check acceptance -run. The unmodified ISO installed onto a fresh 32 GiB qcow2 disk and booted from +The [terminal UX preview record](releases/2026-10-13-terminal-ux/acceptance.json) +identifies the exact ISO and firmware used for the passing thirteen-check +acceptance run. The unmodified ISO installed onto a fresh 32 GiB qcow2 disk and booted from that disk with no ISO attached. Password login, persistent data, removed live overrides, installed services, DNS lookup, routed LAN-to-VM TCP, normal-user nested KVM/bridge access and normal shutdown passed. An actual logout followed by 15 seconds without an open login and a new login preserved the same VM, QMP/SPICE sockets and user audio services. Audio playback was not measured. +The installed normal account also exercised download/cache/run/open/menu using +the packaged commands and verified the default Fastfetch rendering. Its ISO +fixture is intentionally nonbootable; nested guest OS boot is not inferred. +The [first preview record](releases/2026-10-13/acceptance.json) remains unchanged. Live graphical recovery was also observed through a private QEMU screenshot; the earlier two-guest compositor and profile-refresh probes cover fullscreen