- Tile removal runs as webui_tile_remove_with(ops), host-tested with a
scripted console: after a restage, only a successful unregister lets
anything be hidden or deleted; WEBUI_TILE_DIR is never deleted while a
nullfs is bound on it; the marker goes last.
- Every successful ensure forgets the icon keeper's entry and sets the
tile visible, so a registered tile is never left hidden.
- The outside-removal check runs before webui_start.
- register_appdb_has_title uses content_db_has_title: one bound WHERE
titleId = ? lookup per title table instead of reading 2048 rows.
- backHistory: Escape/Backspace/gamepad ○ on a fresh first screen (no
guard) call onRoot once, as ○ does.
- removed_outside tests list each scenario explicitly.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01JoFXdUvVCDAG8xRjtp52qt
Tile removal (payload):
- Judge removal by app.db, which the home screen draws, not by the PC
installed list. 7.1.9 deleted the tile's files even when Sony's uninstall
failed, leaving a greyed-out row; 7.1.10 could still delete them while a
row stayed (one uninstall removes one of two install records).
- While a row remains: ask Sony again; a row whose staged files are gone is
restaged and registered so the uninstall has an app to remove; a row Sony
keeps is hidden (tbl_iconinfo visible = 0, kept hidden by the icon keeper).
Files are deleted only when the icon is gone or hidden; otherwise the tile
stays working instead of greyed out.
- Turning the tile on again shows a hidden icon again.
- A marker records that the helper registered the tile; at helper start a
tile app.db no longer has (deleted on the PS5 itself) is not registered
again and the setting turns off.
Console page: WebKit closes a page it did not open by script only while its
back/forward list has one entry; the PS5 guard pushed at load made both ○ and
window.close() unable to leave from Home. No guard on the first screen while
history is a single entry; after a level, the old close attempt remains.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01JoFXdUvVCDAG8xRjtp52qt
- /api/jobs releases the page's finished jobs after replying
(ava1_jobs_release_seen), so batches cannot fill the shared table.
- list_registered_titles_json leaves out WEBUI_TILE_TITLE_ID; a PC's
APP_UNREGISTER of the tile is Settings -> tile off (saved tile:false,
tile thread removes it) so the next start does not re-register it.
- Now running: the focused app is never the tile; the fallback names
only a game title id (PPSA/CUSA/... prefixes), never the browser, the
tile or homebrew. Codec selftest covers it.
- /api/settings carries tile_busy/tile_failed (webui_tile_state); the
tile request is made before the reply.
- put_str/r_status clamp `at` after every escape/printf; send_error and
r_fs_delete clamp too.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01RxCGb8Asp1A1AQYiv1kbgS