Installation acceptance checklist (71 items · 2026-10-12)¶
Source: the three ledgers in
docs/mvp-issues.md「装机对照清单」(✅ verified 1 + 🔧 fixed-pending-verify 17 + ⬜ not fixed 53 = 71 items; 2026-10-12 eleventh re-sort corrected the original 51/68 sum drift; 批3-补47 added 2.17 and then line-by-line recount). This version expands each item into a three-part form: preconditions / verification steps / expected results. Every step can be followed as written and every item can be receipted individually. Items with local automation evidence annotate the corresponding unit tests under "Appendix: local automation coverage notes"; the real machine only supplies the UI/interaction half.
0. General preparation (referenced by number by each item, not repeated)¶
| Number | Preparation |
|---|---|
| E0 install | Download the latest green-run nightly assets from daily-build (zip + SHA256SUMS verified consistent), extract to a clean directory and run. Version gate: packages after 2026-10-12 (批3-补42 DSL, 批3-补45 floating widening, 批3-补47 update check landed after that) contain the new items; earlier packages cannot exercise them |
| E1 logs | %APPDATA%\Beacon\logs\beacon-YYYYMMDD.log; failing items attach log-line evidence |
| E2 receipt | Record each item as "passed / failed + phenomenon + screenshot or log line"; on pass, annotate the date on the corresponding line in docs/mvp-issues.md; on failure, record only the phenomenon, do not self-repair |
| C-GH | A GitHub connection (real PAT) + one github.pull_requests and one github.actions.runs widget (pointing at a real repository with PR and Actions activity) |
| C-HTTP | An http connection (any reachable JSON endpoint; a LAN packager or a public echo service both work) |
| C-MACHINE | A machine connection (zero credentials) |
| C-HERALD | A self-hosted herald instance connection (cuihairu/herald) |
| C-MIMO | A Xiaomi MiMo connection + browser login to platform.xiaomimimo.com as backup (get the Cookie via F12) |
| C-JENKINS | A Jenkins connection (the public anonymous instance https://weekly.ci.jenkins.io suffices, or self-hosted) |
| C-MOONSHOT | A Moonshot open platform Key (platform.moonshot.cn; not interchangeable with Kimi For Coding) |
| C-DISCONNECT | A way to cut the network: turn off Wi-Fi / unplug the cable; recovery the same |
| C-DPI | A 200%/250% scaled display (or change scaling in Windows Settings); with multiple monitors, at least two monitors at different scales |
Overall receipt criteria: MVP acceptance (B-803) closes once everything passes; archive recordings/screenshots under docs/.
1. ✅ Verified (1 item, archived, not executed again)¶
| Item | Conclusion |
|---|---|
| Floating transparency floor 0.4→0.2 (批3-补10/补13⑤) | User confirmed fixed on installation 2026-10-10; keep it as is |
2. 🔧 Fixed, pending verification (17 items — focus on these with the latest nightly)¶
2.1 B-301 | Real PAT connection test success/failure paths¶
- Preconditions: E0, E2; one revocable real GitHub PAT.
- Steps: ① Settings → Connections → new GitHub, mistype the PAT by one character → "Test connection"; ② leave the PAT empty → "Test connection"; ③ enter the correct PAT → "Test connection"; ④ swap in a revoked PAT → "Test connection".
- Expected: ①④ clearly report authentication failure (not "connection normal"); ② goes through an anonymous request and honestly shows the anonymous result (does not falsely report authenticated); ③ the connection is healthy and the rate-limit headers are observed.
2.2 B-302 | Real repository PR manual verification (count and yellow highlight)¶
- Preconditions: E0, C-GH.
- Steps: ① add a
github.pull_requestswidget pointing at an active repository; ② compare the Open PR count with the GitHub web page; ③ refresh (tray Refresh All); ④ create a new PR or close a PR and refresh again. - Expected: The count matches the web page; yellow while there are open PRs, green when it hits zero; additions/closures are reflected within ≤1 refresh cycle.
2.3 B-302 | Real repository red CI criterion¶
- Preconditions: Same as 2.2, and the repository needs an open PR with red CI (or run a check red on some PR).
- Steps: ① observe the PR card summary; ② (optional) toggle the
warn_on_red_ciswitch and refresh to compare. - Expected: The red-CI PR summary shows an "N red ci" section; after a 304 re-probe the terminal state is reused without another request; when the switch is off, red CI does not affect it.
2.4 B-303 | Real workflow manual verification (success/failure/running)¶
- Preconditions: E0, C-GH (a
github.actions.runswidget). - Steps: ① trigger one successful run, wait for it to finish and refresh; ② trigger one failing run; ③ trigger a long run (>2 minutes) and refresh while it is running.
- Expected: Success→green, failure→red, running→yellow with increasing duration; a run stuck at the 16-minute level formats the duration correctly (no negatives / garbled text); a malformed JSON response is shown explicitly as Degraded without crashing.
2.5 B-303 | Real workflow mapping review¶
- Preconditions: Same as 2.4.
- Steps: Cross-check each Beacon card against the GitHub web run status one by one (queued/running/success/failure/cancelled).
- Expected: The state mapping corresponds one-to-one with the web page; cancelled is not misjudged as failure.
2.6 批3-补8 | Xiaomi console conventions + GLM 5h primary slot¶
- Preconditions: E0, C-MIMO; a GLM real-Key connection.
- Steps: ① record the MiMo console Cookie (F12 → Application → Cookies → paste the whole
api-platform_phline); ② refresh the MiMo card; ③ observe the GLM card's main value. - Expected: MiMo shows plan used / total / percentage (data from the console API, not a "no quota slot" placeholder); GLM's main slot is the 5h rolling-window percentage.
2.7 批3-补9/17/18/23 | Floating progress bar + quick panel bottom¶
- Preconditions: E0; a numeric widget (e.g. GLM/bigmodel quota) with "numeric floating window" on.
- Steps: ① look at the floating tile progress-bar form; ② push usage to ≥80% (or adjust the threshold); ③ open the Quick Panel and look at the RECENT EVENTS section.
- Expected: The progress bar is a 4 DIP rounded bar + an "NN% " readout (default form); yellow at ≥80%, red when full; the "pool water" effect only appears when selected in settings; RECENT EVENTS scrolls inside the Grid and does not break the panel.
2.8 批3-补11 | Ark quota-exhausted display¶
- Preconditions: E0; an ark connection (Coding Plan). Natural exhaustion is hard to trigger, so you can temporarily drag the widget threshold very low to simulate the judgment.
- Steps: ① wait for some window (5h/weekly/monthly) to exhaust, or simulate it with the threshold; ② observe when a 429 AccountQuotaExceeded-class response arrives.
- Expected: The card shows "额度用尽(窗名,重置时间)" (quota exhausted (window name, reset time)); the 429 exhaustion special case is treated as that window spent with the reset time; an ordinary rate-limit 429 does not flip the state.
2.9 批3-补12 | Notification rule wiring¶
- Preconditions: E0; add one custom rule under Settings → Notifications (e.g. Toast when some widget is Warning+).
- Steps: ① save the rule; ② manufacture a state that satisfies the condition (e.g. cut that connection or inject a failure); ③ change the rule and retest.
- Expected: The custom rule actually fires a Toast (before the wiring it was an empty promise); after modifying the rule the next evaluation takes effect, no restart needed.
2.10 批3-补13 | UI/UX audit 6 groups of discoverability fixes (⑤ transparency verified)¶
- Preconditions: E0.
- Steps: Walk each group: ① the action standalone page is discoverable; ② the detail window scroll region is resident (does not rely on noticing a scrollbar); ③ the settings form is laid out compactly; ④ the refresh tiers have Chinese labels; ⑤ the L2 tile two-column layout; ⑥ screenshot the settings page for the archive.
- Expected: All groups match the designs recorded in 批3-补13; no buttons/regions with "invisible" problems.
2.11 批3-补19 | Edge-collapsed strip cannot be recovered¶
- Preconditions: E0.
- Steps: ① drag the capsule / floating panel to a screen edge so it collapses to a strip; ② hover the strip with the mouse; ③ move away and hover again.
- Expected: Hovering the strip expands it back to the full panel (no more death loop / unrecoverable); the strip and the expanded panel share the same Place math, geometry does not jump.
2.12 批3-补20 | 5K / high scaling clipped text (DPI)¶
- Preconditions: E0, C-DPI (200%/250%).
- Steps: ① open the detail window at 200% scaling; ② look at the capsule and floating tile text; ③ repeat at 250%.
- Expected: The detail window sizes to content and text is complete, not clipped; the capsule / floating panel DIP layout is correct (the earlier 5K clipping root cause was not resizing and falling back to fixed physical pixels).
2.13 批3-补20 | Drag follow-the-cursor + cross-screen flicker¶
- Preconditions: E0, multiple monitors (a high-refresh-rate mouse is better).
- Steps: ① drag the capsule slowly; ② fling it quickly; ③ drag across two monitors with different DPIs.
- Expected: Follows the cursor the whole way without crawling (the start-point absolute positioning fix removes per-event accumulation rounding); no re-layout flicker while dragging across DPIs (re-layout skips WM_DPICHANGED during a drag).
2.14 批3-补21 | Moonshot balance card¶
- Preconditions: E0, C-MOONSHOT.
- Steps: ① create a Moonshot connection (platform.moonshot.cn Key) → test connection; ② add a
moonshot.balancewidget; ③ compare the balance with the web page; ④ raisewarn_belowabove the current balance. - Expected: The connection is healthy and the balance matches the web page; balance ≤ warn_below (default 20) turns yellow, ≤ error_below (default 5) turns red.
2.15 批3-补22 | Drag across three screens follow-the-cursor¶
- Preconditions: E0, three monitors at different scales (if no three-screen setup, approximate with two).
- Steps: Slowly drag the capsule across the three screens in turn, pausing on each to observe the size.
- Expected: The anchor always follows the cursor (physical-pixel convention); no scaling mismatch and no size jumps across different-scale screens.
2.16 批3-补22 | Detail window still clips text at 200%¶
- Preconditions: E0, C-DPI (200%).
- Steps: Open any widget detail window at 200% scaling; check the title, body, and bottom button area.
- Expected: Complete display without clipping (Resize adds back the non-client difference: GetWindowRect−GetClientRect).
2.17 批3-补47 | Update check three lines + failure degradation¶
- Preconditions: E0 (a package after 2026-10-12), C-DISCONNECT (means to cut and restore the network).
- Steps: ① open Settings → About, click "Check for updates" and wait for a conclusion; ② cut the network and click "Check for updates" again; ③ restore the network and click again. When there is a new version, check that the "Open download page" button appears and points at releases/latest.
- Expected: ① the three lines are complete — current version / remote latest version (tag_name) / check result (already latest, or "new version vN" + "Open download page"), with the last check time updated to the minute; ② with the network cut it shows "无法检查更新(HH:mm)" without an exception box; ③ after restoring, it returns to the normal conclusion.
3. ⬜ Not fixed (53 items: code in place, first verification; of these, the app side of B-103/B-104/B-502 was fully CI/unit-test proxied on 2026-10-13 patrol-B and checked off in the todo/mvp-issues ledgers — this chapter keeps the corresponding entries only as installation walkthrough recheck steps)¶
A Installation and process¶
A1 | B-101 | Second launch does not duplicate the process¶
- Preconditions: E0.
- Steps: Double-click the exe for a second launch.
- Expected: No second process appears; the existing instance is woken and shows a tip bubble.
A2 | B-101 | Tray residency¶
- Preconditions: E0.
- Steps: Close all Beacon windows → look in Task Manager; then Exit from the tray menu.
- Expected: After closing windows the process stays in the tray; only Exit truly quits and the process disappears.
A3 | 批3-补27① | Tray Explorer restart recovery¶
- Preconditions: E0, Beacon running.
- Steps: End and restart
explorer.exein Task Manager. - Expected: After Explorer recovers, the tray icon comes back by itself and the severity color is not lost.
A4 | 批3-补27② | Sleep/wake refresh-backfill¶
- Preconditions: E0, at least one widget.
- Steps: Sleep (or simulate with lock screen / network cut) → wake → observe the data update time.
- Expected: Within ≤1 refresh cycle after waking there is new data (does not depend on a manual force-refresh).
A5 | 批3-补28 | Capsule right-click goes straight to settings¶
- Preconditions: E0.
- Steps: Right-click the capsule; then left-click-drag and left-click.
- Expected: Right-click pops the settings window; drag / click-to-open-panel behavior is not disturbed.
A6 | B-104 | Launch on startup¶
- Preconditions: E0.
- Steps: Turn on auto-start in settings → reboot; turn it off → reboot again; finally uninstall and check for leftovers.
- Expected: On → starts automatically after login; off → no longer auto-starts; no auto-start leftovers after uninstall.
A7 | B-105 | Crash fallback¶
- Preconditions: E0, E1.
- Steps: Manufacture an exception (e.g. point a config at an endpoint that throws) → observe the process and logs.
- Expected: The process survives, the logs contain a stack trace, no zombie windows.
A8 | B-804 | Clean VM install¶
- Preconditions: A clean Windows 11 virtual machine.
- Steps: Download the nightly → run → complete the B-803 walkthrough (see
docs/acceptance-B803-e2e-walkthrough.md). - Expected: Installs, starts, the walkthrough passes.
A9 | B-102 | Capsule position memory / no mess across DPIs¶
- Preconditions: E0, C-DPI.
- Steps: ① drag the capsule to a non-default position → restart; ② drag across screens at different scales.
- Expected: After restart the capsule returns to its last position; dragging across DPIs has no size mess (mutual corroboration with 2.13/2.15).
A10 | B-103 | Global hotkey¶
- Preconditions: E0.
- Steps: ① press the hotkey while any foreground app is active (Notepad / browser / fullscreen games excepted); ② change the key in settings → restart → use the new key.
- Expected: The hotkey works in any foreground app and opens the panel; the changed key persists, the old key stops working and the new key works.
B Connections and widget data sources¶
B1 | 批3-补31 | Jenkins build card¶
- Preconditions: E0, C-JENKINS.
- Steps: Create a Jenkins connection (anonymous or user:apiToken) → test → add a
jenkins.buildwidget and fill in job_path. - Expected: The build light / build number follows refreshes; building turns yellow; success green / failure red (color-based judgment).
B2 | 批3-补32 | Local machine network card¶
- Preconditions: E0, C-MACHINE.
- Steps: Create a machine connection (zero credentials) → add a
machine.netwidget → refresh twice or more. - Expected: IP and cumulative traffic are visible in L3; no rate on the first refresh, from the second refresh the ↓↑ rate changes with each refresh.
B3 | 批3-补33 | Local machine Git card¶
- Preconditions: E0, C-MACHINE, the path of any local Git repository.
- Steps: Add a
machine.gitwidget with repo_path set to the local repository → refresh; then make the local branch fall behind the remote (e.g. revert a commit that exists on the remote). - Expected: The ↑↓ / changed / stash counts follow refreshes; falling behind the remote turns yellow.
B4 | 批3-补36 | Local machine resource card¶
- Preconditions: E0, C-MACHINE.
- Steps: Add a
machine.localwidget → refresh continuously; lower the CPU threshold (e.g. to 20). - Expected: CPU shows no value on the first refresh and the percentage follows refreshes from the second; memory / disk show instantaneous percentages; below the threshold, yellow judgment takes effect.
B5 | 批3-补34 | MiMo whole-line Cookie¶
- Preconditions: E0, C-MIMO.
- Steps: Paste the whole Cookie line into the console credential box (not just the single api-platform_ph value) → refresh.
- Expected: Automatically extracts api-platform_ph and produces data (previously whole-line pasting left the card Offline).
B6 | 批3-补38① | MiMo 401 explicit + re-record guidance¶
- Preconditions: E0, C-MIMO.
- Steps: Deliberately enter an expired / scrambled console Cookie → refresh → look at the card's failure-reason line.
- Expected: The Degraded card explicitly states "Cookie 已失效或未录制" and gives the re-record guidance verbatim (including the F12 → api-platform_ph path).
B7 | 批3-补38② | MiMo LiteLLM gateway accounting tier¶
- Preconditions: E0; the local LiteLLM gateway has a DB attached (the current
no_db_connectionis a gateway-side gap — this item is bound to the gateway-side fix; before a DB is attached only the explicit Degraded half is verified). - Steps: Record
litellm_spend_urlin Settings (e.g.http://127.0.0.1:4000/spend/logs) → refresh. - Expected: With a gateway DB the card shows "本月已用 $X.XX(网关记账)" (spent $X.XX this month (gateway accounting)); without a DB it explicitly shows the "LiteLLM 未接数据库" Degraded state, no silent downgrade.
B8 | 批3-补42 | YAML Provider DSL end-to-end¶
- Preconditions: E0, C-HTTP; write a DSL file (see the "Provider DSL" section example in
docs/configuration.md). - Steps: ① set
dsl_pathin the http connection Settings to point at the declaration file → refresh anhttp.statuswidget (without filling data keys in widget.Config); ② fill the same-named keys in widget.Config and refresh again; ③ open that widget's detail page, look at the action area, and click an action with retry (make the target endpoint fail once first); ④ break the YAML (Tab indentation) and refresh again; ⑤ remove the file and refresh; ⑥ deletedsl_pathand refresh. - Expected: ① data comes out per the DSL mapping; ② instance values override the DSL; ③ DSL actions appear only on that connection's widgets, failures auto-retry, and a still-failing message carries "已重试 N 次" (retried N times); ④ the card goes Degraded with the line number explicit, startup is unaffected, other connections are normal; ⑤ likewise Degraded with "文件不存在" (file does not exist); ⑥ behavior is exactly the same as a connection that never used the DSL (zero change).
B9 | B-206 | Offline startup has data¶
- Preconditions: E0, at least one widget that has produced data, C-DISCONNECT.
- Steps: Produce data normally once → exit → cut the network → start.
- Expected: The UI has cached data labeled Last update; after restoring the network it automatically refreshes new data (the cache hydration full-cycle unit test has passed; this item verifies the UI half).
B10 | 批3-补35① | Herald incident ledger card¶
- Preconditions: E0, C-HERALD.
- Steps: Create a herald connection → add a
herald.incidentswidget → manufacture / resolve one open incident on the herald side. - Expected: The open count follows the ledger; open turns yellow, critical turns red; resolved turns green.
B11 | 批3-补35② | Herald subscription card¶
- Preconditions: E0, C-HERALD.
- Steps: Add a
herald.feedwidget (public category or private token) → wait for new entries to be delivered. - Expected: The unread count of new entries increases with refreshes; the token goes to DPAPI and no plaintext lands anywhere.
B12 | 批3-补37 | Herald delivery-failure card¶
- Preconditions: E0, C-HERALD.
- Steps: Add a
herald.deliverieswidget → manufacture one failed delivery (stop the target provider and then notify). - Expected: Shows "无失败" (no failures) when there are none; turns yellow after a failure and shows the failure count.
B13 | B-301 supplement | Anonymous connection degradation (companion item, verified together with 2.1, not counted in the 53)¶
- Preconditions: Same as 2.1.
- Steps: Create a GitHub connection without a PAT and observe the degradation behavior.
- Expected: Shows honestly per the anonymous limit, does not impersonate authenticated. (Overlaps with step ② of 2.1; can be verified together)
C Actions¶
C1 | B-401 | Action failure UI feedback¶
- Preconditions: E0; an action that will fail (e.g. a URL pointing at a dead port).
- Steps: Click that action on the detail page.
- Expected: The UI gives visible failure feedback (result text / color), does not go silent.
C2 | B-402 | Open URL in browser¶
- Preconditions: E0; a widget with a DetailUrl.
- Steps: Click Open on the detail page.
- Expected: The default browser opens the correct URL (the template-rendering unit test has passed; this item verifies the browser half).
C3 | B-403 | Workflow Dispatch full journey¶
- Preconditions: E0, C-GH, a repository with dispatch permission.
- Steps: Dispatch a workflow → observe the whole Run→running→terminal-state journey.
- Expected: The whole state journey is visible in Beacon (no need to open the GitHub web page).
C4 | B-404 | Local command confirm dialog + timeout persistence¶
- Preconditions: E0; configure a local.command action.
- Steps: ① trigger the action and look at the confirm dialog; ② configure a long command to verify timeout termination and log persistence.
- Expected: Confirm dialog by default (can be turned off per action config); the timeout kills the process and the output is still persisted to disk (the executor unit test has passed; this item verifies the dialog UI half).
D Notifications¶
D1 | B-501 | Toast full chain¶
- Preconditions: E0; a notification rule hits.
- Steps: ① trigger a Toast; ② click the Toast; ③ delete the AUMID registration key under HKCU\Software\Classes\AppUserModelId (with CustomActivator) and restart the app to retry.
- Expected: Send / click / activation routing all work; missing AUMID registration self-heals (the toolkit Initialize rebuilds the registration key on next startup).
D2 | B-502 | Toast cooldown¶
- Preconditions: E0; same as above.
- Steps: Inject a Failed state (e.g. point some connection at a bad endpoint to trigger Error).
- Expected: Exactly one Toast is received (no repeated bombardment inside the cooldown window).
D3 | B-503 | Tray coloring¶
- Preconditions: E0; controllable widget states.
- Steps: Manufacture Warning/Error → look at the tray icon.
- Expected: Aggregated state changes are reflected in the tray icon color within ≤1 refresh cycle.
D4 | B-504 | Capsule real aggregation¶
- Preconditions: E0; controllable widget states.
- Steps: Cut the network (C-DISCONNECT) and look at the capsule; after restoring, verify the counts.
- Expected: Offline shows an Offline banner + time when the network is cut; the counts match the actual Widget states.
E L2 / L3¶
E1 | B-601 | Quick Panel open/close¶
- Preconditions: E0.
- Steps: Open the panel with the hotkey → close with Esc → click outside to close on focus loss; traverse fully with keyboard Tab/arrow keys and close; open and close repeatedly.
- Expected: Opens in <100ms with no white screen (cache first); fully operable and closable by keyboard; repeated toggling is stable.
E2 | B-602 | Overview/Pin persistence¶
- Preconditions: E0.
- Steps: Compare the Overview counts with the actual states; right-click Pin one widget → restart.
- Expected: Counts / events are consistent; Pin persists (even without L0 UI effects in this phase it must land in widgets.json/pins.json).
E3 | B-603 | Detail + Retry chain¶
- Preconditions: E0; a run with a failing job.
- Steps: Open the detail page in one click from an L2 event → click [Retry].
- Expected: The detail page goes straight to the corresponding object; the Retry full chain works (including confirmation and result feedback).
F L0 tile behavior¶
F1 | B-701① | Click does not steal focus¶
- Preconditions: E0; an L0 floating tile (settings toggle or Pin).
- Steps: Focus a foreground app (e.g. Notepad) → click the tile.
- Expected: The foreground app's focus is not stolen (you can keep typing).
F2 | B-701①b | Blank click falls through to the desktop (same ledger line as F1)¶
- Preconditions: Same as F1.
- Steps: Click the blank area of the tile window.
- Expected: The click passes through to the desktop (the tile does not eat clicks).
F3 | B-701② | Two tiles update independently¶
- Preconditions: Tiles of two different-source widgets.
- Steps: Change only one source's state.
- Expected: The two tiles update independently of each other; the windows do not enter the taskbar / Alt-Tab.
F4 | B-701②b | Floating-form drag placement restore¶
- Preconditions: Floating form enabled.
- Steps: Drag a tile → restart.
- Expected: One window per widget is draggable; positions are restored after restart; mutually exclusive with the host panel (either/or).
F5 | B-702① | Pin dual-entry consistency¶
- Preconditions: E0.
- Steps: Pin / unpin the same widget via the settings toggle and the context menu respectively.
- Expected: Both entries behave identically and persist.
F6 | B-702② | Non-admitted types cannot be pinned¶
- Preconditions: E0.
- Steps: Try pinning a non-PinSupported type (e.g. a claude.usage-class local card) in both entries.
- Expected: Both entries refuse to pin (the policy unit test has passed; this item verifies the UI gating).
F7 | B-703① | Position / collapsed-state restore + monitor unplug¶
- Preconditions: Two or more L0 tiles.
- Steps: Drag positions, collapse → restart; then unplug the monitor where a tile lives → plug it back.
- Expected: After restart, positions / collapsed states are restored; after unplug/plug the tile is not lost (recycled or returned to a visible area).
F8 | B-703② | Cross-DPI dragging and recycling¶
- Preconditions: C-DPI multiple monitors.
- Steps: Drag a tile across DPI-different monitors; shrink the secondary monitor's resolution.
- Expected: Dragging sizes are correct (DpiLayoutMath as the single source of truth); after shrinking the resolution the tile is recycled into a visible area.
F9 | B-704 | Offline self-healing¶
- Preconditions: L0 tile; C-DISCONNECT.
- Steps: Cut the network and observe the whole flow → restore.
- Expected: No popup windows at any point (Offline state only); after restoring the tile self-heals with new data (the socket-level integration test has passed; this item verifies the UI half).
F10 | B-705① | Critical only pulses¶
- Preconditions: E0; inject Critical (drag the threshold to an extreme or manufacture an Error+ state).
- Steps: Observe L0 after injecting.
- Expected: L0 only changes color and pulses, no interruption (no popup, no focus stealing); the Toast is still emitted by the notification engine as usual.
F11 | B-705② | RFC §6.2.7 four-item checklist¶
- Preconditions: Same as F10.
- Steps: Execute the four-item checklist in
docs/acceptance-B705-L0-behavior.mditem by item and record. - Expected: All four items pass with records kept.
G Appearance and motion¶
G1 | B-706① | Severity colors sync across three surfaces¶
- Preconditions: E0; L0 tile + capsule + tray all visible at once.
- Steps: Change a severity color in settings (e.g. Warning to orange).
- Expected: The L0 tile, capsule, and tray icon all change color in sync.
G2 | B-706② | colorOverride single tile¶
- Preconditions: Two or more tiles.
- Steps: Set colorOverride on one Widget only.
- Expected: Only that tile changes color; priority Widget > severity > default is correct.
G3 | B-706③ | Illegal color fallback¶
- Preconditions: Same as G2.
- Steps: Enter an illegal color value (e.g.
#GGG) → restart. - Expected: Falls back to the default color without crashing; keeps the fallback state after restart.
G4 | B-707① | Color-change transition¶
- Preconditions: Motion tier reduced.
- Steps: Manufacture a Success→Error change.
- Expected: Smooth color-change transition (not an instant jump).
G5 | B-707② | Critical pulse three tiers¶
- Preconditions: Motion settings page.
- Steps: Look at the pulse on the default tier; look at full stillness on the off tier; look at the breathing light on the full tier and adjust intensity.
- Expected: Pulse on by default; off is fully still; full shows a visible breathing light and the intensity is adjustable.
G6 | B-707③ | Motion boundaries¶
- Preconditions: Motion enabled.
- Steps: Listen for sound / try to steal focus during motion; after hiding / collapsing the tile, check power draw (Task Manager CPU/GPU).
- Expected: No focus stealing, no sound; no animation loop while hidden / collapsed (power draw falls back).
H Import/export and settings¶
H1 | B-802 | Import/export end-to-end¶
- Preconditions: E0; an instance with credentials configured.
- Steps: Export → search the whole file for tokens; import in another directory (or VM) → re-enter secrets → compare behavior.
- Expected: The exported file contains no token anywhere (JSON stores only credentialRef, secrets are not packaged); after import + re-entry the behavior matches the original machine (the storage layer's 5 tests have passed; this item verifies the end-to-end half).
H2 | B-805① | Palette / motion live preview persistence¶
- Preconditions: E0.
- Steps: Change color / change tier → look at the live preview → restart.
- Expected: Changes take effect immediately and persist, still there after restart.
H3 | B-805② | Reset defaults + off tier¶
- Preconditions: Same as H2.
- Steps: Click reset defaults; select the off tier and look at the preview.
- Expected: One-click restore of defaults; the off tier preview is fully still.
I Final acceptance¶
I1 | B-803 | MVP full-journey walkthrough¶
- Preconditions: Everything above (or key samples) passed.
- Steps: Record screenshots / a recording per the task-book §success criteria, archive under
docs/(the walkthrough script is indocs/acceptance-B803-e2e-walkthrough.md). - Expected: Full recording archived; all found problems fixed or filed as Issues.
I2 | SHA256 and timestamp cross-check (companion item, not counted in the 53)¶
- Preconditions: E0.
- Steps: Compare the download-page hash with the local zip.
- Expected: Consistent (the release assertion has been verified; this item is the installation-side recheck).
Appendix: local automation coverage notes (2026-10-10 triage commit 4b04205 + 批3-补39/42/45/47/48/49 additions, currently 991/991 green)¶
Windows runtime behavior is governed by the installation walkthrough in this checklist; the following records what has already been proven locally, to avoid repeated troubleshooting when receipting:
- Two items already checked (fully proven by local automation):
- B-801: SerializationRoundTripTests (AppConfig full-field round-trip + defaults invariant) + JsonConfigurationStoreTests.AppConfig_AllFields_SurviveSaveAndReload (startup path field-by-field comparison) + the token-does-not-land-in-JSON unit tests (DpapiSecretStore/ImportExport).
- B-207: OutageRecoveryIntegrationTests — real HttpClient connection refused→Offline+stale state (old cache kept); recovery auto-resets; RefreshWidgetAsync returns false without throwing; first failure with no cache shows "拉取失败" directly.
- Local halves of unchecked items (UI/interaction halves need a real machine, keep them on the ledger without proxy verification):
- B-706×3: PaletteResolverTests (priority Widget>severity>default / illegal value fallback / offline key) — color linkage and persistence UI half pending a real machine.
- B-702 second item: WidgetDisplayPolicyTests.PanelCarries_NonPinSupported_NeverCarried — both entries' interaction pending a real machine.
- B-703 geometry: PinLayoutMathTests (anchor / DPI / out-of-bounds recycling / topology judgment) — dragging and monitor unplug/plug pending a real machine.
- B-207 branch supplement: WidgetHostTests fake Handler (Degraded / backoff / healthy de-duplication).
- B-301/B-302/B-303: GitHubApiClient/GitHubPullRequests/GitHubActions fake Handler full branches (批3-补14/15) — real credentials and real repository halves pending a real machine.
- B-401/B-404: ActionRunnerTests 15 tests (routing/confirm/timeout/cancel/retry six states) + LocalCommandExecutorTests (timeout kills process + persistence) — dialog and feedback UI halves pending a real machine.
- 批3-补42 DSL: ProviderDslTests 46 tests (parse/validate/cache/MappingValue/end-to-end) + ActionRunner retry 6 tests — real-machine dsl_path configuration and action-click halves pending.
- 批3-补47 update check: UpdateCheckTests 48 tests (version parsing shapes and rejection table, SemVer 12 comparison groups including pre-release rules, Evaluate including nightly date conventions, rate-limit degradation) — the GitHub real-endpoint half (three-line display, button semantics, offline degradation) pending a real machine.
- 批3-补48 tile text-width budget + multi-window quota: TileSizingTests 32 tests (text-width model per type / per-type worst-row → total width / label priority aligned to PinTile / machine show linkage) + WidgetValueHintTests multi-window 8 tests (three-window / two-window / out-of-order / remaining convention / single-window not entering / readout collapse judgment) — the visual half that the floating panel's numeric column no longer clips text pending the installation walkthrough.