Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 6 additions & 0 deletions .github/workflows/v2-tests.yml
Original file line number Diff line number Diff line change
Expand Up @@ -236,6 +236,10 @@ jobs:
working-directory: v2
run: LAUNCHER_CURATION_EVIDENCE=1 npm run test:launcher-rows

- name: Launcher feedback
working-directory: v2
run: LAUNCHER_FEEDBACK_EVIDENCE=1 npm run test:launcher-feedback

# Right-click shows the app menu, not the webview's link menu (#129),
# while text fields keep their native Cut / Copy / Paste.
- name: Context menu
Expand All @@ -259,6 +263,8 @@ jobs:
v2/evidence/launcher-curation-2026-10-23/launcher-states-simulated.webm
v2/evidence/tvrecommendations-safety/*-simulated.png
v2/evidence/tvrecommendations-safety/caution-review-simulated.webm
v2/evidence/launcher-feedback-212/*-simulated.png
v2/evidence/launcher-feedback-212/launcher-feedback-simulated.webm
retention-days: 7
if-no-files-found: ignore

Expand Down
3 changes: 3 additions & 0 deletions v2/evidence/launcher-feedback-212/.gitignore
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
raw/
*-simulated.png
*-simulated.webm
49 changes: 49 additions & 0 deletions v2/evidence/launcher-feedback-212/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,49 @@
# Issue212 launcher feedback evidence

All screenshots and the 15.84-second video are **SIMULATED**, generated locally
with the demo fixture and a test-only invoke wrapper. No real phone/TV operation,
APK, identity migration, release or deployment was performed. The reporter's
screenshot was inspected but is not redistributed here because it contains their
local device address. It shows v2.3.0 and a Google TV Streamer on Android14; the LG
G3 display in the report does not establish the Android host's firmware.

The confirmed defect is missing visible feedback, not established launcher
failure: the old UI placed results below the entire launcher list and Advanced
picker, and a refresh error hid the result and diagnostics entirely. The new
status is beside the clicked row, including when that row becomes Current
default. When refresh fails, the result remains above the error with an explicit
stale-state qualification. Diagnostic copy fallback also remains visible.
Backend success, refusal and unverified outcomes retain their distinct meaning;
a connection exception says the result cannot be confirmed. Initial progress is
visible before backend channel messages. Replies after leaving/changing the page
context do not update the new page or trigger stale refreshes.

`tests/launcher-feedback.mjs` covers 11 simulated cases:

- Verified success, refusal, accepted command with unchanged Home, and missing
verification/error detail.
- Successful command followed by list/current-home/channel-provider refresh
failure, plus refusal followed by refresh failure and clipboard denial.
- Interrupted command, cancelled takeover, and leaving while a command is pending.

Each completed attempt asserts exactly one original set-default command with
`allowStockDisable=false`; no added disable or takeover command is allowed.
Cancelling the existing takeover prompt never retries with opt-in enabled. The
backend and safety engine are unchanged; this does not prove device behavior.

Local validation passed: all 11 feedback cases, existing launcher-row/Advanced
picker/snapshot/ClearTV regressions, Svelte check with 0 errors and 0 warnings,
production frontend build, and regenerated 16 dark + 16 light gallery frames/GIFs.
Exact-head CI and independent review are the merge gates. No claim of
cross-platform or real-device validation is made from local browser checks.

Evidence is attached directly to [PR213’s evidence comment](https://github.com/bryanroscoe/shield_optimizer/pull/213#issuecomment-6355858736), captured at `fccb8da03195218f6f2ca3ed1723426585744214`.
All ten screenshots and the short video were downloaded from those attachments and verified byte-for-byte against the committed originals before duplicate media were removed in a normal follow-up commit. `attachments.json` records each durable attachment URL, SHA256 and byte length; `visual-sha256.json` preserves the original capture hashes. The earlier commit retains the original files without rewriting history.

The attachment migration changes no runtime or test behavior. Regenerated media remain local/CI artifacts and are ignored by Git. Use `LAUNCHER_FEEDBACK_EVIDENCE=1 npm run test:launcher-feedback` to recreate simulated captures; subsequent runs may differ visually from the original capture hashes.

The migration-sensitive `com.shieldoptimizer.app` identifier and data paths remain
unchanged. PR211's experiment merge hold, PR180's approval gate and PR163's
physical/release acceptance gates remain separate. Issue212's actual device
launcher outcome is unverified; no reporter comment was needed to fix the
confirmed presentation defect.
72 changes: 72 additions & 0 deletions v2/evidence/launcher-feedback-212/attachments.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,72 @@
{
"comment": "https://github.com/bryanroscoe/shield_optimizer/pull/213#issuecomment-6355858736",
"captured_revision": "fccb8da03195218f6f2ca3ed1723426585744214",
"assets": [
{
"file": "cancel-takeover-simulated.png",
"url": "https://github.com/user-attachments/assets/7d99d759-80d5-419c-8b9d-413384b25930",
"sha256": "c7d7a57cfd9eda0eab47f83028f61bf40035779c73b04861b2fd0c53b7575528",
"bytes": 155783
},
{
"file": "channel-refresh-simulated.png",
"url": "https://github.com/user-attachments/assets/3eea0cd7-349b-4854-afdd-fbe95954149d",
"sha256": "fbd516f911f0b1e8a8700155fbfe686b234163cac01298bbdd8b092466d5fdea",
"bytes": 83215
},
{
"file": "current-refresh-simulated.png",
"url": "https://github.com/user-attachments/assets/9e867d1d-c25a-4d31-9f43-cff2c703878d",
"sha256": "5fd6eb467eb5674f511387999d995d88accd9f8463bcf233ee30366e64bf4281",
"bytes": 82942
},
{
"file": "failure-refresh-simulated.png",
"url": "https://github.com/user-attachments/assets/614e1021-e793-4821-936c-287149131740",
"sha256": "7c756bed07cd66f0c3a1cde3182a9088372c71695284f77929482e5f9b845b4b",
"bytes": 97889
},
{
"file": "failure-simulated.png",
"url": "https://github.com/user-attachments/assets/edd0c740-0c39-4057-a902-2eaf21d85f28",
"sha256": "e6ba46266eefc8f767788cf419b37b097edb57a781a7c0a1f111aa5948f53f83",
"bytes": 156510
},
{
"file": "interrupted-simulated.png",
"url": "https://github.com/user-attachments/assets/5f65da88-df66-4021-b716-531eaf5f9cff",
"sha256": "978a1dac009390949727f15466e31b9875776ce3f67513ac84c7fe8d24103d8a",
"bytes": 154611
},
{
"file": "list-refresh-simulated.png",
"url": "https://github.com/user-attachments/assets/a718829b-8ae2-4231-836e-06c60fcad98f",
"sha256": "ae36f118aa14cdafce3ceb8de979eb3c42d523a78d8015fc42e80a95a57ace75",
"bytes": 83570
},
{
"file": "noop-simulated.png",
"url": "https://github.com/user-attachments/assets/74320570-63cd-4446-8c21-df73d3fdbc67",
"sha256": "2be452869f30f331d3c02df6275a4ed3a465b4a6627e9c6d978067ec6b8dd4e3",
"bytes": 158606
},
{
"file": "success-simulated.png",
"url": "https://github.com/user-attachments/assets/dff006e8-8331-4726-baec-b8dfc0f68573",
"sha256": "4c625538d3ef2de5b33685b8fef28067fb2ed75bfa9f4387e89f13a6366f44ec",
"bytes": 153985
},
{
"file": "unverified-simulated.png",
"url": "https://github.com/user-attachments/assets/daa8d5e5-edd4-412f-bfb2-1bdb2a6f00c7",
"sha256": "361e8c666fbffe21821d19b99215b81f46f8f0c6ce00f2ed3461be87f0f98c9d",
"bytes": 159395
},
{
"file": "launcher-feedback-simulated.webm",
"url": "https://github.com/user-attachments/assets/24131cf2-561e-4ed4-84ba-c097efc1508f",
"sha256": "29584b91a439dd4d9da268754dd80eef112f1fada04eba8836a57fc42f726137",
"bytes": 1948306
}
]
}
13 changes: 13 additions & 0 deletions v2/evidence/launcher-feedback-212/visual-sha256.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
{
"cancel-takeover-simulated.png": "c7d7a57cfd9eda0eab47f83028f61bf40035779c73b04861b2fd0c53b7575528",
"channel-refresh-simulated.png": "fbd516f911f0b1e8a8700155fbfe686b234163cac01298bbdd8b092466d5fdea",
"current-refresh-simulated.png": "5fd6eb467eb5674f511387999d995d88accd9f8463bcf233ee30366e64bf4281",
"failure-refresh-simulated.png": "7c756bed07cd66f0c3a1cde3182a9088372c71695284f77929482e5f9b845b4b",
"failure-simulated.png": "e6ba46266eefc8f767788cf419b37b097edb57a781a7c0a1f111aa5948f53f83",
"interrupted-simulated.png": "978a1dac009390949727f15466e31b9875776ce3f67513ac84c7fe8d24103d8a",
"launcher-feedback-simulated.webm": "29584b91a439dd4d9da268754dd80eef112f1fada04eba8836a57fc42f726137",
"list-refresh-simulated.png": "ae36f118aa14cdafce3ceb8de979eb3c42d523a78d8015fc42e80a95a57ace75",
"noop-simulated.png": "2be452869f30f331d3c02df6275a4ed3a465b4a6627e9c6d978067ec6b8dd4e3",
"success-simulated.png": "4c625538d3ef2de5b33685b8fef28067fb2ed75bfa9f4387e89f13a6366f44ec",
"unverified-simulated.png": "361e8c666fbffe21821d19b99215b81f46f8f0c6ce00f2ed3461be87f0f98c9d"
}
3 changes: 2 additions & 1 deletion v2/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -38,7 +38,8 @@
"tauri": "tauri",
"subset-icons": "python3 scripts/subset-material-symbols.py",
"test:device-logs": "node tests/log-poller.mjs && node tests/device-logs.mjs",
"test:tvrecommendations-safety": "node tests/tvrecommendations-safety.mjs"
"test:tvrecommendations-safety": "node tests/tvrecommendations-safety.mjs",
"test:launcher-feedback": "node tests/launcher-feedback.mjs"
},
"license": "UNLICENSED",
"dependencies": {
Expand Down
Binary file modified v2/screenshots/gallery-light.gif
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file modified v2/screenshots/gallery.gif
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Loading