PASS: organizer creates successfully and shows all desktop references
PASS: explicit collapse hides the grid without deleting references
PASS: expand restores saved height and all icons
PASS: narrow layout settles
PASS: short organizer overflows without ScrollViewer
PASS: smooth scrolling clamps and stops at bottom
PASS: resize changes columns and settles tile positions
PASS: resize clamps scroll offset
PASS: Dock reorder persists all references exactly once
PASS: icon loads: Adobe Photoshop 2023.lnk
PASS: icon loads: DeepSeek Harness.lnk
PASS: icon loads: Grok Bot.lnk
PASS: icon loads: IntelliJ IDEA 2022.3.2.lnk
PASS: icon loads: Navicat Premium 16.lnk
PASS: icon loads: QQ.lnk
PASS: icon loads: QQ音乐.lnk
PASS: icon loads: Steam.lnk
PASS: icon loads: Typora.lnk
PASS: icon loads: UU加速器.lnk
PASS: icon loads: Visual Studio 2022.lnk
PASS: icon loads: Visual Studio Code.lnk
PASS: icon loads: WeGame.lnk
PASS: icon loads: WorkBuddy AI.lnk
PASS: icon loads: 哔哩哔哩.lnk
PASS: icon loads: 腾讯会议.lnk
PASS: icon loads: 网易云音乐.lnk
PASS: icon loads: 微信.lnk
PASS: icon loads: 新建文件夹
PASS: launchpad stays above Dock with gap
PASS: launchpad stays in work area
PASS: launchpad dismiss animation closes window
PASS: glass center is translucent, no opaque wallpaper layer
PASS: Dock stays visible for ordinary foreground window
PASS: Dock magnification is active before visibility transition
PASS: Dock hides for work-area maximized window, including side-taskbar layout
PASS: hiding Dock clears magnification immediately
PASS: temporary empty foreground preserves hiding while maximized blocker is still visible
PASS: minimizing maximized blocker restores Dock even with empty foreground and no desktop click
PASS: hidden blocker cannot leave Dock stuck behind transient foreground
PASS: Dock returns after restoring maximized window
PASS: restored Dock does not retain enlarged icons
PASS: minimized maximized window does not hide Dock
PASS: Dock hides for true borderless fullscreen on its monitor
PASS: minimizing borderless fullscreen restores Dock without foreground click
PASS: Dock returns after fullscreen exits
PASS: fullscreen on another monitor does not hide this Dock
PASS: Dock returns during desktop widget interaction
PASS: organizer uses wallpaper frost and Dock enables native live frost
PASS: live Dock frost does not allocate a wallpaper background over other windows
PASS: Dock frost choice and organizer frost both persist
PASS: glass switch disposes frost background subscriptions cycle 0
PASS: only organizer subscribes to wallpaper changes cycle 0
PASS: glass switch disposes frost background subscriptions cycle 1
PASS: only organizer subscribes to wallpaper changes cycle 1
PASS: glass switch disposes frost background subscriptions cycle 2
PASS: only organizer subscribes to wallpaper changes cycle 2
PASS: launchpad frosted persists and blurs live content behind it instead of the wallpaper image
PASS: all temporary frost background layers released
PASS: maximized window on another monitor does not hide this Dock
PASS: clock explicitly selected frosted material survives reopening
PASS: clock backdrop released on close
PASS: shortcut is matched by executable identity
PASS: two windows of one application are grouped as one temporary Dock item
PASS: 12 repeated Dock scans reuse metadata for real test windows without additional COM lookups
PASS: running unpinned applications create the temporary section and separator
PASS: pinning a running app moves it to fixed section without duplicate and keeps running dot
PASS: repeated Dock clicks restore an existing minimized window without launching another instance
PASS: unpinning an open application keeps it in temporary section
PASS: Dock close sends normal close requests to all application windows
PASS: application can cancel Dock close and retain its window and running dot
PASS: Dock close retries the surviving application window without terminating its process
PASS: closing last window retains pinned item and clears running dot
PASS: closed unpinned application is removed from Dock
PASS: embedded application icon includes high-resolution frame
PASS: launchpad background retains alpha transparency with no wallpaper layer
PASS: click inside launchpad does not dismiss it
PASS: click outside launchpad dismisses it without requiring another process to activate
PASS: launchpad does not create a wallpaper backdrop during dismissal
PASS: outside-click observer registers successfully
PASS: outside-click observer releases its hook
PASS: closed temporary item keeps a noninteractive exit visual during transition
PASS: departing icon has an intermediate fade opacity
PASS: Dock background shrinks continuously instead of jumping to final width
PASS: rapid consecutive closes settle without duplicate icons, gaps or separator
PASS: hiding Dock during an exit clears transient visuals immediately
PASS: showing Dock after interrupted exit restores correct items and normal scale
PASS: settled Dock transition leaves no ongoing hover render loop
PASS: NetEase compatibility ignores idle windows and preserves song title separators
PASS: NetEase timeline does not interpret comment counts as playback time
PASS: NetEase playback and lyrics views parse their distinct timeline formats
PASS: minimized NetEase keeps advancing from the last live position while audio plays
PASS: silent audio session pauses the estimate without drifting
PASS: resumed audio continues the estimate
PASS: song change from the window title restarts the estimate with the queue duration
PASS: a live reading after restore replaces the estimate
PASS: NetEase play queue supplies track durations
PASS: music identifies all three requested clients
PASS: explicit music source never redirects to another client or browser
PASS: automatic music selection prefers playing clients
PASS: music timeline clamps stale or invalid positions
PASS: music settings and long-track timestamps normalize safely
PASS: music view displays current song, cover and client controls
PASS: all music controls route to the displayed session key
PASS: music command waits for in-flight metadata instead of racing it
PASS: music click during refresh is delivered once to its original session
PASS: music command rejection is visible instead of claiming success
PASS: source changes reject late metadata and clear old artwork and controls
PASS: disconnected music sessions clear playback state
PASS: closing music view disposes backend and ignores in-flight results
PASS: actual Dock plate leaves most background light visible instead of painting wallpaper
PASS: reopening Dock restores live frost without a static wallpaper layer
PASS: live blur surface is visible behind the shown Dock
PASS: native frost width tracks the magnified Dock plate
PASS: hiding Dock immediately hides its blur surface
PASS: restoring Dock also restores its blur surface
PASS: switching to glass destroys the blur window
PASS: switching back to frost recreates native blur
PASS: open material submenu has the light Windows 11 surface and dark readable text
PASS: material submenu shows current selection with the custom checkmark
PASS: reopened submenu updates selection after material changes
PASS: settings general page contains the eight original desktop and window switches plus GPU rendering, top taskbar auto-hide and (2.2.4) the unverified-TranslucentTB option
PASS: all seven settings categories (incl. 组件管理) render without losing their cards
PASS: weather settings offer a county-level place search with an automatic-location reset
PASS: weather settings expose the Windows location switch and a re-locate button
PASS: search finds settings outside the selected category
PASS: new settings music source updates existing persisted configuration
PASS: light themed source selector generates accessible choices
PASS: Dock switch retains the original configuration behavior
PASS: changing categories preserves the edited Dock slider value
PASS: minimum settings size keeps apply action usable without horizontal scrolling
PASS: empty search shows a readable recovery message
PASS: weather concurrent refreshes share the cached result and avoid duplicate network requests (3 IP services + 1 failed + 1 working weather source)
PASS: weather sends rounded city coordinates with invariant decimal formatting
PASS: weather parses city temperature and observation time, falling back from the failing first source
PASS: explicit weather refresh bypasses the cache
PASS: missing weather fields are rejected instead of displaying fabricated zero values
PASS: cancelled weather refresh makes no network request
PASS: disabled online weather sends no request
PASS: weather component displays the automatic location and fetched temperature
PASS: failed weather refresh keeps the previous reading and says how old it is instead of an error card
PASS: closing the weather component cancels its pending network operation
PASS: organizer new file automatically numbers duplicates without overwriting content
PASS: organizer creates real folders and adds their references
PASS: organizer rejects path traversal and Windows reserved filenames
PASS: preview file creation stays isolated from the real desktop
PASS: sending to organizer deduplicates references and leaves the original file untouched
PASS: new organizer-create-menu submenu uses the light Windows 11 styling with actionable choices
PASS: sending to a disabled organizer reopens and expands it
PASS: sending to organizer does not rebuild or close other widgets
PASS: launchpad can create a new organizer containing the selected reference
PASS: launchpad context menu exposes existing and new organizer destinations
PASS: new launchpad-send-menu submenu uses the light Windows 11 styling with actionable choices
PASS: plain widget background receives pointer input beyond the title area
PASS: collapsed widgets skip periodic refresh work
PASS: hidden widgets skip periodic refresh work
PASS: widget refresh resumes after it becomes visible
PASS: expanded widget drag area excludes text within action buttons
PASS: widget labels and blank backgrounds remain draggable
PASS: widget dragging does not steal slider or text input interactions
PASS: QQ cache maps title with hyphens, multiple artists, duration and album
PASS: QQ cache rejects a different song or artist
PASS: QQ cache rejects a different recording duration or album
PASS: QRC word timings become readable synchronized lines
PASS: QQ cache UTF-8 BOM and literal XML attribute newlines preserve lyric lines
PASS: QRC XML cannot load external entities
PASS: invalid QRC header is rejected before decryption
PASS: NetEase playing list IDs map to the selected song's cached LRC
PASS: NetEase does not use cached lyrics for the wrong artist
PASS: NetEase rejects another recording length
PASS: QQ playback never uses NetEase's cache
PASS: ambiguous matching NetEase song IDs do not guess a lyric file
PASS: a corrupt playlist does not block valid playback-history metadata
PASS: oversized lyric cache files fall back safely
PASS: partially written client caches fall back safely
PASS: client lyric lookups honor cancellation
PASS: late client cache replaces a cached online miss without additional network requests
PASS: provider caches stay separate when switching clients for the same song
PASS: manual retry refreshes a previous direct-client result
PASS: LRC parser handles timestamps offset duplicate timestamps and invalid seconds
PASS: lyric lookup tracks both forward playback and backward seeks
PASS: plain lyrics remain unsynchronized rather than inventing timestamps
PASS: UTF-16 local lyric files decode correctly
PASS: lyrics requests encode metadata and reuse cached song results
PASS: explicit lyric retry invalidates the previous match cache
PASS: mismatched song metadata never displays unrelated lyrics
PASS: disabled or cancelled lyric requests do not hit the network
PASS: lyrics are opt-in and make no request when hidden
PASS: lyric option expands below playback controls and displays the current line
PASS: pause and backward seek use client position without refetching lyrics
PASS: late client-cache retry preserves visible lyrics while loading
PASS: successful client lyrics stop periodic cache retries
PASS: track changes clear previous lyrics before the new request completes
PASS: hiding lyrics cancels work and rejects late responses
PASS: switching music source clears old lyrics immediately
PASS: disconnected playback never leaves the previous lyrics on screen
PASS: closed music component ignores pending lyric responses
PASS: Dock close is the final separated action for temporary applications
PASS: Dock close is the final separated action for pinned applications
PASS: widget menu shows lock action with current state
PASS: locking updates menu wording and shows a toast
PASS: toast removes itself after ~1.5 s
PASS: unlock restores free movement
PASS: widget menu offers 新建组件 with every widget type
PASS: 新建组件 → 便签 opens a new note window
PASS: note text autosaves to settings
PASS: multiple notes are independent instances
PASS: empty note deletes without confirmation
PASS: closing the window keeps the note (persisted for restart)
PASS: note restores text and colour
PASS: 删除便签 removes it from settings
PASS: 新建组件 → 时钟 enables and shows the clock
PASS: creating an existing singleton widget reveals it instead of duplicating
PASS: dragging near the work-area edge snaps and shows a guide line
PASS: holding Alt places freely without guides
PASS: 磁吸对齐 off disables snapping
PASS: top-level menu status distinguishes off / on / moved folder
PASS: top-level menu status text
PASS: known commands get Fluent icons
PASS: widget menu items carry line icons
PASS: lock-state line keeps >=4.5:1 contrast on the light menu
PASS: amber locked-state line keeps >=4.5:1 contrast on the light menu
PASS: Dock 发送至桌面收纳 lists every organizer plus a new one
PASS: Dock send adds a reference to the chosen organizer
PASS: launchpad background menu offers both materials
PASS: launchpad glass has no backdrop window
PASS: launchpad menu keeps only 材质设置 / 添加 / 恢复已移除的项目 (2.2.9) / 打开设置 (no widget items): 材质设置,添加到启动台…,恢复已移除的项目,打开设置
PASS: launchpad material persists in settings
PASS: launchpad frosted uses a live compositor blur placed behind it
PASS: launchpad material submenu shows a checkmark on the current material
PASS: frosted backdrop is prepared, fully transparent, before the launchpad is first painted
PASS: reopened launchpad keeps frosted material
PASS: frosted backdrop fades in together with the content
PASS: closing launchpad releases its backdrop window
PASS: 组件管理 lists every singleton, note and 收纳格
PASS: note entry shows first-line preview and 显示中
PASS: 关闭 hides the note but keeps its text
PASS: a closed note stays hidden after rebuild/restart
PASS: 显示 restores the note with its text
PASS: 定位 flashes the widget with a toast
PASS: note delete confirmation names the lost text and points to 关闭
PASS: cancelling delete keeps the note
PASS: 删除 removes the note permanently
PASS: 收纳格 entry shows its item count
PASS: rename is reflected on the 收纳格 title live
PASS: 收纳格 delete confirmation states only references are removed
PASS: 收纳格 right-click menu offers 删除收纳格
PASS: deleting a 收纳格 never touches the referenced file
PASS: 显示 opens the clock
PASS: 关闭 hides the clock but keeps its position
PASS: 删除 resets the clock's saved data; it can be added again
PASS: 组件管理 page renders its groups
PASS: search reaches 组件管理 rows
PASS: auto-hide ignores ClearDesk's own windows
PASS: overlapped Dock slides below the screen
PASS: pointer at the bottom edge reveals the Dock
PASS: Dock returns when the overlap ends
PASS: setting off never hides the Dock
PASS: 窗口遮挡时自动隐藏 defaults to off
PASS: 新建组件 → 快捷控制 opens the widget
PASS: 快捷控制 is single-instance
PASS: volume shows the default device's real level (28%)
PASS: output device name is shown: 扬声器 (Realtek(R) Audio)  ▾
PASS: radios resolve their state: IMAU-ZY · 4/5 / 已关闭
PASS: 快捷控制 has the usual material / lock menu
PASS: 组件管理 lists 快捷控制 as 显示中
PASS: 关闭 hides 快捷控制 and releases its listeners
PASS: 2.0.5: top taskbar auto-hide off by default; widgets start at 100%
PASS: clock widget supports proportional resizing
PASS: scale 150% enlarges the window while keeping the layout size (370 -> 555)
PASS: scale is clamped to the maximum
PASS: scale is clamped to the minimum
PASS: reset returns to the original size
PASS: widget menu has 恢复默认大小
PASS: 收纳格 / Dock keep their own sizing
PASS: 2.0.6: 动态壁纸实时模糊 is off by default
PASS: notes start without images
PASS: resize: right / bottom edges snap to a neighbour's edges with guides
PASS: resize: width snaps to an equal-size neighbour (dashed dimension guides)
PASS: resize: no snap / guides when nothing is near
PASS: taskbar hot zones: icon spans merge, blank gaps stay cold
PASS: taskbar hot zones: unknown / failed detection falls back to the whole edge
PASS: 便签: inserted image is copied into the app data folder and shown
PASS: 便签: no visible scrollbar (wheel scrolls)
PASS: 便签 menu has 插入图片…
PASS: 便签: deleting an image removes its file
PASS: 2.0.7: widgets start without a custom size
PASS: weather supports free resizing
PASS: width and height are independent (525×250)
PASS: width-only resize re-flows instead of scaling
PASS: height-only resize gives extra room to the layout
PASS: weather shows more forecast days when larger
PASS: tall weather widget renders the forecast row
PASS: text scales by the smaller ratio so content never overflows
PASS: minimum size is clamped
PASS: custom size is stored
PASS: 恢复默认大小 returns to the default size
PASS: old Scale migrates to a custom size
PASS: 组件管理 重置大小 sees the custom size
PASS: 组件管理 重置大小 clears the custom size
PASS: right-click menu has 恢复默认大小
PASS: forecast parsing reads daily data
PASS: 2.0.8: audio peak works next to other Core Audio users (was InvalidCast: )
PASS: audio peak still works after quick controls created its enumerator
PASS: paused NetEase stays paused while minimized
PASS: minimized NetEase keeps advancing from its audio (00:00:38)
PASS: lyrics keep 100% font at the default size
PASS: taller widget enlarges lyric font (capped by width)
PASS: wider widget allows a larger lyric font
PASS: lyric font has a sensible maximum
PASS: locked widget is pinned to the bottom layer
PASS: activating a locked widget does not raise it above other apps (0 app windows below it)
PASS: unlocked widget may come forward
PASS: Dock / 启动台 are never pinned
PASS: 2.0.9: quoted path with spaces and Chinese parses
PASS: unquoted path with spaces parses up to .exe
PASS: environment variables are expanded
PASS: empty command parses to null
PASS: zip / temp extraction locations are recognised
PASS: normal install folders are not temporary
PASS: StartupApproved: 02/06 enabled, odd values disabled, missing = enabled
PASS: autostart starts off
PASS: enable writes a quoted absolute path with --startup ("C:\Users\10980\ClearDeskFix-1021\src\ClearDesk-1.8.2\source\artifacts\Regression-6f3b07c630064e7ea46765ac4115f078\preview-data\startup-test\新建 文件夹\ClearDesk-2.0.9\ClearDesk.exe" --startup)
PASS: settings text says 已启用
PASS: StartupApproved 03 is reported as disabled by Windows
PASS: self-heal never flips the Windows disabled state
PASS: turning autostart on explicitly lifts the Windows-side disable
PASS: entry pointing to a deleted folder is detected
PASS: stale path is repaired to the running copy on launch
PASS: entry left on an older install (e.g. 1.9.1) moves to the newer running copy
PASS: an entry pointing to a newer install is left alone
PASS: missing --startup argument is added (otherwise settings pop up at every login)
PASS: unquoted legacy value is rewritten with quotes
PASS: a correct entry is left untouched
PASS: turned-off autostart is never re-enabled by self-heal
PASS: enable is refused from a temp / zip folder with a clear message
PASS: self-heal does not point the entry at a temp folder
PASS: temp location produces a status text
PASS: blocked Run key falls back to a Startup-folder shortcut
PASS: Startup-folder shortcut honours StartupApproved\StartupFolder
PASS: disable removes the shortcut
PASS: test files carry a downloaded-from-Internet mark
PASS: enabling autostart clears the Internet mark on the install folder
PASS: login gate does not delay when the desktop shell is already up
PASS: settings has a button that opens Windows 启动应用设置
PASS: settings shows the autostart status line
PASS: update: never checked → a background check is due
PASS: update: checked an hour ago → not due again (at most once per ~12 h)
PASS: update: checked 13 hours ago → due
PASS: update: a clock set backwards cannot suppress checks forever
PASS: update: unreadable last-check text counts as never
PASS: update: only a newer version is announced
PASS: update: 跳过此版本 silences that version but not the next one
PASS: update: 稍后提醒 silences the dialog until the reminder time
PASS: update: updateUrl / mirrors from a signed manifest redirect later checks to the new domain without a new build
PASS: update: an unverified manifest can never change the update source
PASS: update settings: 关于 page has 检查更新, 自动检查更新 and 更新源 controls
PASS: update settings: the auto-check switch shows the saved value
PASS: update settings: the auto-check switch is saved
PASS: update settings: an invalid update source is not saved
PASS: update settings: a valid update source is saved
PASS: update settings: 检查更新 reports 'already the latest' when the server has nothing newer
PASS: update settings: no dialog when already up to date
PASS: update settings: a newer signed version opens the update dialog
PASS: update dialog: has 立即更新 / 稍后提醒 / 跳过此版本
PASS: update dialog: shows current and new version, release notes and the signature badge
PASS: update settings: the status line names the new version
PASS: update dialog: 稍后提醒 closes it and delays the next automatic notice
PASS: update dialog: 跳过此版本 remembers the version
PASS: update dialog: an unsigned (GitHub-only) release offers 打开下载页 instead of installing
PASS: update install: notify-only releases are never installed
PASS: update install: a manifest that did not pass signature verification is refused
PASS: update install: the running version is never 'updated' to itself
PASS: weather fallback: 腾讯天气 failed → Open-Meteo answered; later sources were not touched
PASS: weather fallback: the report names each step without URLs
PASS: ip location: three domestic services agree, so the foreign ones are never asked
PASS: ip location: result is marked approximate (网络 IP)
PASS: weather source 腾讯天气: no data for the county → the city-level answer is used and labelled 市级
PASS: weather source 腾讯天气: a county with data needs exactly one request
PASS: weather fallback: a slow source does not block the next one (hedged), and the loser is cancelled
PASS: weather read: Tencent answers first in China, reading carries source and update time
PASS: weather read: when every source fails an error with reasons is raised and the last good reading is kept
PASS: weather cache: last good reading and place are restored from disk as stale data after a restart
PASS: weather cache: stores rounded coordinates only, never the IP address
PASS: weather cache: offline at startup still has the stale reading to show (stale reading is not reported as fresh)
PASS: location: Windows location wins, no IP service is asked, shows 黄浦区
PASS: location: the weather lookup uses the district name from the reverse geocode
PASS: location: if the fix cannot be turned into a name, coordinates still give weather (name shown as 所在位置)
PASS: location: Windows location unavailable (off / denied / no data) → IP vote
PASS: location: a crashing location provider falls back to IP
PASS: location: an IP-grade Windows fix (accuracy worse than 50 km) is not trusted
PASS: ip location behind a proxy/VPN: foreign exit-node answers are ignored in favour of the Chinese service; the user is told
PASS: ip location: when no service returned coordinates they are looked up by city name (or the name alone is used)
PASS: manual place: exactly one request (weather), no IP or system location, shows 赛罕区
PASS: no spam: a second read within 20 minutes is served from the cache without any request
PASS: network change / wake from sleep: location is determined again and weather refetched
PASS: place search: 赛罕区 → 呼和浩特市赛罕区 first (with coordinates), other candidates listed
PASS: place search: one search service down → the other still answers
PASS: place search: both down → empty list, no exception
PASS: place search: a full address is reduced to 'district city' for the name lookup
PASS: dock minimize (real window): SC_MINIMIZE minimizes a window of another thread/app
PASS: dock restore (real window): SC_RESTORE restores it
PASS: input box: the grey hint shows while empty and disappears when typing
PASS: widget window 'todo': is created, shown and registered under its own id
PASS: widget window 'countdown': is created, shown and registered under its own id
PASS: widget window 'schedule': is created, shown and registered under its own id
PASS: widget window 'clipboard': is created, shown and registered under its own id
PASS: widget window 'netspeed': is created, shown and registered under its own id
PASS: widget window 'launcher': is created, shown and registered under its own id
PASS: widget window 'album': is created, shown and registered under its own id
PASS: widget window 'sunair': is created, shown and registered under its own id
PASS: widget window 'folder': is created, shown and registered under its own id
PASS: widget window 'battery': is created, shown and registered under its own id
PASS: widgets: the settings flag is on for every created kind
PASS: widgets: the settings switch turns exactly one kind off
PASS: todo window: the due item reminds exactly once and is saved as announced
PASS: countdown window: the start button starts and pauses the pomodoro
PASS: netspeed window: samples turn into speed and a daily total
PASS: clipboard window: copied text is listed once
PASS: clipboard window: nothing is written to disk by default
PASS: launcher window: adding a file saves it, duplicates are refused
PASS: album window: folder is added and saved, the slideshow moves to the next picture
PASS: sun/air window: falls back to Open-Meteo and caches the result for the next start
PASS: sun/air window: when every source fails the cached value is kept
PASS: schedule window: created with a working data set
PASS: album (real decoder): every picture incl. '#', '%', Chinese names and a 3000 px photo shows [a#b.png|big.jpg|plain.png|中文 图片.jpg|100%.png shown=6]
PASS: album: starts empty, a text file is not added
PASS: album: a picked file is copied into ClearDesk's own folder and shown (photo one-571f134e2cb4b5fe.png)
PASS: album: deleting the original does not break the picture
PASS: album: the picture is still there after the widget is recreated (persisted)
PASS: album: dropping a file with a Chinese name and '#' adds it
PASS: album: the same picture dropped twice is stored once
PASS: album: dropped picture data (not a file) is saved as a PNG
PASS: album: dropping text adds nothing
PASS: album: a dropped folder becomes a source
PASS: album: paste image from the clipboard
PASS: album: paste copied picture files from the clipboard
PASS: album: pasting with nothing useful on the clipboard reports failure
PASS: album: 'show whole picture' is saved
PASS: album: 'fill' is saved
PASS: album: removing a stored picture deletes the copy
PASS: album: removing a picture of a folder source hides it and never deletes the user's file
PASS: album: only existing picture files are copied
PASS: album: 新建组件 → 图片相册 creates a new instance each time (multi-instance since 2.2.2)
PASS: pomodoro window: the chosen lengths are applied and saved
PASS: pomodoro window: the summary shows the settings (50 / 10 / 20 分钟 · 每 3 轮长休息  ⚙)
PASS: pomodoro window: the stepper stops at 180 minutes
PASS: pomodoro window: the stepper stops at 1 minute
PASS: pomodoro window: out-of-range values are clamped
PASS: pomodoro window: the settings survive a restart
PASS: pomodoro window: changing the length while running keeps the current round (the new length starts with the next round)
PASS: mixer page: one row per application, system sounds first (3)
PASS: mixer page: the slider changes only its own application
PASS: mixer page: the mute button toggles
PASS: mixer page: an application that stopped disappears
PASS: mixer page: a new application appears
PASS: mixer page: no applications shows a hint
PASS: mixer page: a failing audio service does not throw
PASS: quick controls: the mixer page is closed at first and does not poll
PASS: quick controls: the 声音 button opens the mixer page inside the widget and reads the sessions
PASS: quick controls: back closes the page, stops polling and releases the sessions
PASS: mixer (live): the audio sessions of this PC can be read (8 sessions)
PASS: system icons: every system icon has a real shell icon
PASS: system icons: the recycle bin icon differs between empty and full
PASS: organizer: the menu offers 添加系统图标 with five entries
PASS: organizer: system icons are added once
PASS: organizer: the grid holds the items
PASS: organizer: the menu shows which system icons are in the box
PASS: organizer: the recycle bin menu offers 打开 and 清空回收站
PASS: organizer: 清空回收站 asks Explorer to empty the bin
PASS: organizer: other system icons have no empty / pin entries
PASS: organizer: a system icon can be removed again
PASS: organizer: 收集桌面 picks up the system icons that are shown on the desktop
PASS: organizer: a collected system icon can be hidden from the box
PASS: organizer: and shown again
PASS: new widget (default): keeps the default position (40,80)
PASS: new widget (right-click): appears at the mouse position (777,355 for 777,355)
PASS: new widget (right-click): the position is saved
PASS: new widget (right-click at the corner): stays inside the work area
PASS: new widget: an old (expired) right-click is ignored
PASS: position: every widget kind keeps its place across save → restart (16 kinds)
PASS: position: a widget placed at the right-click spot is on disk right away (333,221)
PASS: position: an off-screen saved position is only rescued visually; the saved place stays until the user moves the widget
PASS: position: a nudge during a display change is not written to the saved position
PASS: position: the widget is put back where it was saved after the display change settled (200,300)
PASS: position: a normal move is still saved
PASS: live blur (reproduction): without the fix the blur window falls out of place on 3 of 3 z-order changes — the flash on activation
PASS: live blur: the blur window stays directly below its widget through every z-order change (4/4)
PASS: dock: five 'running apps changed' notifications with the same apps cause no rebuild (5 skipped)
PASS: look: the widget menu has 自定义背景 and 无边框 / 透明背景
PASS: look: the same options are on the other widgets (performance, calendar)
PASS: frameless: with the glass frame the outer ring is painted (5935 px)
PASS: frameless: no panel, no border — the outer ring holds no frame (the glass frame paints ~5900 px; only the overhang of a long weekday name such as Wednesday, ~100 px, may touch it) (0 px)
PASS: frameless: the content gets a soft text shadow for readability
PASS: frameless: empty areas still receive the pointer, so the widget can be dragged / right-clicked
PASS: frameless: the text shadow can be switched off
PASS: frameless: lock works the same
PASS: frameless: the option is saved with the widget
PASS: frameless: restored after a restart
PASS: frameless: switching it off brings the frame back
PASS: background: a picture file (Chinese name) becomes the widget background
PASS: background: the picture is copied into ClearDesk's data folder (performance-162470568825.png)
PASS: background + frameless: the picture is shown with rounded corners, without a panel (center alpha 255)
PASS: background: the picture scales with the widget (350x210 for 350x210)
PASS: background: fit mode 适应
PASS: background: fit mode 拉伸
PASS: background: opacity and dimming apply
PASS: background: every widget keeps its own picture
PASS: background: restored after a restart (original file deleted, locked, own size, opacity)
PASS: background: choosing another picture removes the old copy
PASS: background: removing it deletes the copy and nothing else
PASS: background: dropping picture files sets the background (first usable file)
PASS: background: a non-picture is refused and the current background stays
PASS: background: a broken picture file is refused without an error and the current background stays
PASS: background: dropped picture data (not a file) is stored as a PNG
PASS: background: pasting a copied picture sets the background
PASS: background: also works with the glass frame on
PASS: background: stickies take a picture too (no frameless switch for stickies)
PASS: background: the desktop organizer takes a picture and can be frameless
PASS: edges: padding is 20 by default, 40 on a tall widget, 20 when everything scales together, and returns to 20 after reset
PASS: edges: the content keeps growing up to 4× (frame and text together)
PASS: multi-instance: instance ids (album, album~2 …) and which kinds allow several
PASS: multi-instance: an existing single album becomes the first instance, with its settings and pictures intact
PASS: multi-instance: 新建 a second and a third album (album~2, album~3) while the first stays
PASS: multi-instance: the new ones are numbered and do not sit exactly on top of the first
PASS: multi-instance: a new album starts empty with default settings
PASS: multi-instance: pictures are separate per album (1/2/1)
PASS: multi-instance: every album has its own picture folder (the first keeps album-images)
PASS: multi-instance: settings are saved per album
PASS: multi-instance: custom backgrounds are per instance too
PASS: multi-instance: all instances, their lock and size are in the saved settings
PASS: multi-instance: after a restart every album has its own pictures and settings
PASS: multi-instance: position, lock, size and background of each album are restored
PASS: multi-instance: 组件管理 lists every instance
PASS: multi-instance: closing one instance leaves the others
PASS: multi-instance: showing it again brings back the same pictures (no new instance)
PASS: multi-instance: deleting an extra instance removes only its own data
PASS: multi-instance: the freed number is reused with an empty album
PASS: multi-instance: todo can be created twice (todo, todo~2)
PASS: multi-instance: countdown can be created twice (countdown, countdown~2)
PASS: multi-instance: schedule can be created twice (schedule, schedule~2)
PASS: multi-instance: launcher can be created twice (launcher, launcher~2)
PASS: multi-instance: each 待办 list keeps its own items
PASS: multi-instance: each 番茄钟 keeps its own settings and timer
PASS: multi-instance: deleting 待办 2 does not touch 待办 1
PASS: multi-instance: clipboard stays a single widget
PASS: multi-instance: netspeed stays a single widget
PASS: multi-instance: sunair stays a single widget
PASS: 2.2.3 taskbar component: healthy start, known-good copy kept
PASS: 2.2.3 taskbar component: killed process is seen as exited
PASS: 2.2.3 taskbar component: after the process was killed (stale recovery state) a new ClearDesk start still works
PASS: 2.2.3 taskbar component: corrupted file is reported as a mismatch
PASS: 2.2.3 taskbar component: corrupted file restored from the good copy, start succeeds
PASS: 2.2.3 taskbar component: missing exe is reported as missing
PASS: 2.2.3 taskbar component: quarantined/missing exe restored, start succeeds
PASS: 2.2.3 taskbar component: missing manifest is reported
PASS: 2.2.3 taskbar component: missing manifest restored, start succeeds
PASS: 2.2.3 taskbar component: invalid manifest is reported
PASS: 2.2.3 taskbar component: invalid manifest restored, start succeeds
PASS: 2.2.3 taskbar component: exclusively locked file -> no start, no exception, retry later (组件文件暂时被占用：Xaml.dll)
PASS: 2.2.3 taskbar component: once the lock is gone it starts
PASS: 2.2.3 taskbar component: damaged file that is still open elsewhere is replaced
PASS: 2.2.3 taskbar component: damaged and no good copy -> TryStart false with a reason (no exception); Start() still throws for old callers
PASS: 2.2.3 taskbar component: independent TranslucentTB running -> declined with a notice
PASS: 2.2.3 startup: broken optional component does not throw and does not activate the feature
PASS: 2.2.3 startup: the retry brings the feature up once the component is fine again
PASS: 2.2.3 runtime: TranslucentTB killed while ClearDesk runs -> ClearDesk keeps running and notes it
PASS: dock icons: a failed lookup shows a letter tile and is not cached
PASS: dock icons: the retry finds the icon and replaces the tile on the same control
PASS: dock icons: once found, the icon is cached
PASS: dock icons: a failed lookup is retried by the next Dock build and by the retry timer
PASS: dock icons: a lookup that keeps failing is retried 4 times, then left on the letter tile (no endless polling)
PASS: dock icons: the package icon and name of a UWP app come from the shell (设置)
PASS: dock icons: a real exe icon is found and is not mistaken for the generic one
PASS: text sharpness: clock x1.00 = 1.219  (370x170 real=41457083 ref=34021258)
PASS: text sharpness: clock x1.15 = 1.059  (426x196 real=41550571 ref=39224418)
PASS: text sharpness: clock x1.60 = 1.101  (592x272 real=57761953 ref=52468448)
PASS: text sharpness: calendar x1.00 = 2.120  (350x350 real=70531217 ref=33266983)
PASS: text sharpness: calendar x1.15 = 1.322  (403x403 real=86257624 ref=65270757)
PASS: text sharpness: calendar x1.60 = 1.265  (560x560 real=120183184 ref=94983104)
PASS: text sharpness: todo x1.00 = 2.313  (320x380 real=30744922 ref=13294124)
PASS: text sharpness: todo x1.15 = 1.487  (368x437 real=41075408 ref=27626353)
PASS: text sharpness: todo x1.60 = 1.359  (512x608 real=59815771 ref=44028855)
PASS: text sharpness: countdown x1.00 = 2.217  (320x320 real=65429906 ref=29518114)
PASS: text sharpness: countdown x1.15 = 1.406  (368x368 real=80346310 ref=57128579)
PASS: text sharpness: countdown x1.60 = 1.233  (512x512 real=113248568 ref=91854895)
PASS: text sharpness: schedule x1.00 = 2.272  (320x330 real=37959819 ref=16711166)
PASS: text sharpness: schedule x1.15 = 1.539  (368x380 real=46215583 ref=30031364)
PASS: text sharpness: schedule x1.60 = 1.357  (512x528 real=64769086 ref=47729379)
PASS: text shadow (screen): clock x1.00 shadow none: solid-ink share 0.788, dark halo 0.00 px²/ink px
PASS: text shadow (screen): clock x1.00 shadow 2.2.2: solid-ink share 0.788, dark halo 3.52 px²/ink px
PASS: text shadow (screen): clock x1.00 shadow 2.2.3: solid-ink share 0.788, dark halo 1.17 px²/ink px
PASS: text shadow: the 2.2.3 shadow smears less than 2.2.2's (halo 1.17 < 3.52, no shadow = 0.00)
PASS: text shadow: the 2.2.3 shadow is still there (legibility on bright wallpapers)
PASS: text sharpness (screen): clock x1.00 2.2.3 solid-ink share = 0.788
PASS: text sharpness (screen): clock x1.15 2.2.2 solid-ink share = 0.769
PASS: text sharpness (screen): clock x1.15 2.2.3 solid-ink share = 0.832
PASS: text sharpness (screen): clock x1.35 2.2.2 solid-ink share = 0.797
PASS: text sharpness (screen): clock x1.35 2.2.3 solid-ink share = 0.754
PASS: text sharpness (screen): clock x1.60 2.2.2 solid-ink share = 0.781
PASS: text sharpness (screen): clock x1.60 2.2.3 solid-ink share = 0.897
PASS: text sharpness (screen, all text): calendar x1.15  2.2.2 = 0.638  2.2.3 = 0.544
PASS: text sharpness (screen, all text): calendar x1.35  2.2.2 = 0.705  2.2.3 = 0.706
PASS: text sharpness (screen, all text): calendar x1.60  2.2.2 = 0.727  2.2.3 = 0.722
PASS: text sharpness (screen, all text): todo x1.15  2.2.2 = 0.020  2.2.3 = 0.016
PASS: text sharpness (screen, all text): todo x1.35  2.2.2 = 0.028  2.2.3 = 0.012
PASS: text sharpness (screen, all text): todo x1.60  2.2.2 = 0.015  2.2.3 = 0.015
PASS: text sharpness (screen, all text): countdown x1.15  2.2.2 = 0.138  2.2.3 = 0.154
PASS: text sharpness (screen, all text): countdown x1.35  2.2.2 = 0.149  2.2.3 = 0.169
PASS: text sharpness (screen, all text): countdown x1.60  2.2.2 = 0.150  2.2.3 = 0.169
PASS: text sharpness (screen, all text): schedule x1.15  2.2.2 = 0.142  2.2.3 = 0.146
PASS: text sharpness (screen, all text): schedule x1.35  2.2.2 = 0.194  2.2.3 = 0.220
PASS: text sharpness (screen, all text): schedule x1.60  2.2.2 = 0.213  2.2.3 = 0.238
PASS: text sharpness (screen, all text): clock x1.15  2.2.2 = 0.096  2.2.3 = 0.087
PASS: text sharpness (screen, all text): clock x1.35  2.2.2 = 0.099  2.2.3 = 0.083
PASS: text sharpness (screen, all text): clock x1.60  2.2.2 = 0.856  2.2.3 = 0.872
PASS: text sharpness (screen, all text): mean change in solid-ink share = -0.001 over 15 cases, 9 better
PASS: 2.2.4 taskbar: a factory copy built from a folder is self-consistent
PASS: 2.2.4 taskbar: (2.2.3 behaviour) a stale verified.sha256 alone made the folder 'mismatched'
PASS: 2.2.4 taskbar: a stale verified.sha256 in the folder is harmless, the shipped copy is the reference
PASS: 2.2.4 taskbar: starts from the install folder although the folder manifest is stale
PASS: 2.2.4 taskbar: a different TranslucentTB.exe is a mismatch against the shipped copy (TB-03)
PASS: 2.2.4 taskbar: no kept good copy needed: the folder is repaired from the shipped copy and then starts (2.2.3 stopped here with 没有可用的完好备份)
PASS: 2.2.4 taskbar: a runtime-modified component file is repaired and started
PASS: 2.2.4 taskbar: install folder unusable -> the shipped copy is placed in the per-user folder and started from there
PASS: 2.2.4 taskbar: a manifest with BOM and CRLF is read correctly
PASS: 2.2.4 taskbar: a damaged factory copy fails its self-check
PASS: 2.2.4 taskbar: unverified component is refused by default (TB-03)
PASS: 2.2.4 taskbar: with the option on, a valid-signature component of the shipped version is allowed (TB-09)
PASS: 2.2.4 taskbar: with the option on, an invalid signature is still refused
PASS: 2.2.4 taskbar: with the option on, another TranslucentTB version is still refused (版本 10.0.26100.8115 (WinBuild.160101.0800) 与出厂版本 0.0.0-other 不同)
PASS: 2.2.4 taskbar: with the option on, the same version is accepted
PASS: 2.2.4 taskbar: the diagnostic text names the folder and each file with expected and actual SHA-256
PASS: 2.2.4 taskbar: each failure has a short code
PASS: 2.2.4 taskbar: without any shipped copy a mismatch gives TB-03 and a full diagnosis
PASS: 2.2.4 settings: while settings.json cannot be read nothing is written over it
PASS: 2.2.4 position: moving the clock / performance widgets writes the new place to settings.json by itself (a kill right after loses nothing)
PASS: 2.2.4 position: after the restart both widgets are exactly where they were saved
PASS: 2.2.4 position: the exit / logoff flush writes everything still unsaved
PASS: 2.2.4 position: Windows' WM_ENDSESSION (logoff / shutdown) saves the settings
PASS: 2.2.4 position: an unreachable saved place is clamped next to its old place instead of the default corner; the saved value is kept
PASS: 2.2.5 factory copy: a taskbar-factory.zip matching the compiled-in manifest is used
PASS: 2.2.5 factory copy: without the zip the manifest is still the reference (cannot repair)
PASS: 2.2.5 factory copy: a foreign / swapped zip is not used
PASS: 2.2.5 factory copy: verification against the manifest-only pack works
PASS: 2.2.5 TB-04: an exclusively locked exe is 'busy' (TB-04), not a mismatch (code TB-04)
PASS: 2.2.5 TB-04: Restart Manager names the process that holds the file (ClearDesk (PID 12860) C:\Users\10980\ClearDeskFix-1021\src\ClearDesk-1.8.2\source\artifacts\Regression-6f3b07c630064e7ea46765ac4115f078\ClearDesk.exe)
PASS: 2.2.5 TB-04: the signature of an unreadable file is 'unknown', not 'no signature' (未知（文件读不了：文件“C:\Users\10980\AppData\Local\Temp\cd225-tb-912c18af\locked\TranslucentTB.exe”正由另一进程使用，因此该进程无法访问此文件。，所以无法检查签名；不代表没有签名）)
PASS: 2.2.5 TB-04: after the retries the factory copy is extracted to the per-user folder and started from there ()
PASS: 2.2.5 TB-04: the locked file itself was not touched
PASS: 2.2.5 TB-04: real signed TranslucentTB.exe: readable -> 有效; exclusively locked -> 未知（文件读不了：文件“C:\Users\10980\AppData\Local\Temp\cd225-tb-912c18af\signed.exe”正由另一进程使用，因此该进程无法访问此文件。，所以无法检查签名；不代表没有签名）
PASS: 2.2.5 TB-04: a TranslucentTB running from ClearDesk's own folder is taken over as normal (no TB-07 / TB-04)
PASS: 2.2.5 TB-07: a copy running elsewhere is reported with its path
PASS: 2.2.5 TB-04: while the file is busy ClearDesk retries silently (no notice)
PASS: 2.2.5 TB-04: when the retries run out it starts from the per-user copy, still without a notice
PASS: 2.2.5 TB-04: the retry timeline is recorded:
15:24:28.436  +0.0s  开始启动透明任务栏组件：C:\Users\10980\AppData\Local\Temp\cd225-tb-912c18af\locked\TranslucentTB.exe 读不了（被占用或正在被扫描）
15:24:28.774  +0.3s  第 1 次读取失败（占用者：ClearDesk (PID 12860) C:\Users\10980\ClearDeskFix-1021\src\ClearDesk-1.8.2\source\artifacts\Regression-6f3b07c630064e7ea46765ac4115f078\ClearDesk.exe）；0 秒后重试（不提示）
15:24:29.741  +1.3s  第 2 次读取失败（占用者：ClearDesk (PID 12860) C:\Users\10980\ClearDeskFix-1021\src\ClearDesk-1.8.2\source\artifacts\Regression-6f3b07c630064e7ea46765ac4115f078\ClearDesk.exe）；0 秒后重试（不提示）
15:24:30.743  +2.3s  重试 2 次后仍然读不了（占用者：ClearDesk (PID 12860) C:\Users\10980\ClearDeskFix-1021\src\ClearDesk-1.8.2\source\artifacts\Regression-6f3b07c630064e7ea46765ac4115f078\ClearDesk.exe）；改用备用目录 C:\Users\10980\AppData\Local\Temp\cd225-tb-912c18af\run3
15:24:30.880  +2.4s  已改用备用目录启动：C:\Users\10980\AppData\Local\Temp\cd225-tb-912c18af\run3\TranslucentTB.exe
PASS: 2.2.5 TB-04: only when nothing works one notice says 'in use' (透明任务栏暂不可用：组件文件被占用 [TB-04])
PASS: 2.2.5 TB-04: a file held by another ClearDesk instance is normal: no notice and no second TranslucentTB
PASS: 2.2.5 tests: this test run shows no tray notices on the user's desktop
PASS: 2.2.5 tests: the test run uses its own taskbar-manager mutex (Local\ClearDesk.TaskbarManager.331e8e46), never the user's instance's
PASS: 2.2.5 folder widget: several instances with their own ids (folder, folder~2)
PASS: 2.2.5 folder widget: a new one shows the 'choose a folder' prompt
PASS: 2.2.5 folder widget: shows the files and the subfolder (13)
PASS: 2.2.5 folder widget: no visible scroll bar (wheel scrolls)
PASS: 2.2.5 folder widget: the chosen folder is saved for this instance
PASS: 2.2.5 folder widget: a new file appears by itself (FileSystemWatcher)
PASS: 2.2.5 folder widget: a deleted file disappears by itself
PASS: 2.2.5 folder widget: wider -> fewer rows (tiles reflow) 313 -> 94
PASS: 2.2.5 folder widget: height is free
PASS: 2.2.5 folder widget: '打开' opens the item (C:\Users\10980\AppData\Local\Temp\cd225-fw-383dd754\sub)
PASS: 2.2.5 folder widget: widget menu has frameless / background / choose folder (选择文件夹…|在资源管理器中打开|显示 / 不显示隐藏文件|图标大小：大 / 中 / 小|刷新|视图：列表 / 图标|紧凑模式（标题在底部）|材质设置|自定义背景|无边框 / 透明背景|文字阴影（无边框时）|收缩 / 展开|恢复默认大小||新建组件|打开设置|恢复位置|关闭组件)
PASS: 2.2.5 battery widget: registered
PASS: 2.2.5 battery widget: columns follow the width
PASS: 2.2.5 battery widget: low-battery notice is off by default
PASS: 2.2.5 battery widget: readable and unreadable devices are listed; unreadable has no value
PASS: 2.2.5 battery widget: no low-battery notice while the option is off
PASS: 2.2.5 battery widget: unsupported devices can be hidden
PASS: 2.2.5 battery widget: width is free
PASS: 2.2.5 battery widget: menu has frameless / background / low-battery option
PASS: INFO: real devices on this PC: PRO X 2 [罗技接收器] 48% (罗技 HID++ 2.0（0x1004 Unified Battery）) | 2.4G Wireless Device [2.4G 接收器] 不支持读取电量 (HID 25A7:2420；设备没有标准 HID 电量报告，也不是可识别的罗技 HID++ 设备（可能是有线设备，或厂商私有协议）)
PASS: 2.2.5 show desktop: no window is not the desktop
PASS: INFO: show desktop test widgets visible before; z-order normal:  [37:widget0] [38:widget1] [39:Progman] of 39
PASS: INFO: foreground sequence after ToggleDesktop: 0ms Chrome_WidgetWin_1 > 100ms Chrome_WidgetWin_1 > 200ms Chrome_WidgetWin_1 > 300ms Chrome_WidgetWin_1 > 400ms Chrome_WidgetWin_1 > 500ms Chrome_WidgetWin_1 > 600ms Chrome_WidgetWin_1 > 700ms Chrome_WidgetWin_1 > 800ms Chrome_WidgetWin_1 > 900ms Chrome_WidgetWin_1 > 1000ms Chrome_WidgetWin_1 > 1100ms Chrome_WidgetWin_1 > 1200ms Chrome_WidgetWin_1 > 1300ms Chrome_WidgetWin_1 > 1400ms Chrome_WidgetWin_1 > 1500ms Chrome_WidgetWin_1 > 1600ms Chrome_WidgetWin_1 > 1700ms Chrome_WidgetWin_1 > 1800ms Chrome_WidgetWin_1 > 1900ms Chrome_WidgetWin_1 > 2000ms Chrome_WidgetWin_1 > 2100ms Chrome_WidgetWin_1 > 2200ms Chrome_WidgetWin_1 > 2300ms Chrome_WidgetWin_1 > 2400ms Chrome_WidgetWin_1
PASS: INFO: z-order shown:  [37:widget0] [38:widget1] [39:Progman] of 39
PASS: INFO: control: desktop raised over 0 windows (0-2 = show desktop had no effect this time)
PASS: INFO: control without keeper: foreground Chrome_WidgetWin_1, clock on top False, locked on top False, minimized False
PASS: INFO: keeper hook was installed by startup: True, now True
PASS: INFO: after ToggleDesktop foreground Chrome_WidgetWin_1 is desktop: False, raises 0
PASS: INFO: with keeper: z-order  [37:widget0] [38:widget1] [39:Progman] of 39, desktop raised over 0 windows
PASS: 2.2.5 show desktop (Shell.Application.ToggleDesktop): an ordinary widget is not below the desktop
PASS: 2.2.5 show desktop: a widget locked to the bottom is not below the desktop either
PASS: INFO: DockWindow visible after show desktop: True, minimized: False
PASS: 2.2.5 show desktop: restoring the windows does not move the widgets
PASS: INFO: widgets lowered again after restore: raised=False
PASS: 2.2.5 show desktop: while the desktop is in front the locked widget is lifted with the others
PASS: 2.2.5 show desktop: afterwards the locked widget is pinned to the bottom again
PASS: 2.2.6 folder list: a new folder widget uses the list view
PASS: 2.2.6 folder list: one row per item, folders first (Alpha folder, zeta folder, a.txt, 这是一个名字非常非常非常非常非常非常长的文件用来测试省略号的显示效果_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx.txt)
PASS: 2.2.6 folder list: rows are full width and of equal height (366 / 368)
PASS: 2.2.6 folder list: rows stack vertically
PASS: 2.2.6 folder list: small icon per row (41 px)
PASS: 2.2.6 folder list: a long name stays on one line and ends with an ellipsis (289 of 1318)
PASS: 2.2.6 folder list: row is highlighted on hover
PASS: 2.2.6 folder list: double-click opens the item (C:\Users\10980\AppData\Local\Temp\cd226-a5df642e\a.txt)
PASS: 2.2.6 folder list: no visible scroll bar
PASS: 2.2.6 folder list: row height and font grow with the widget, up to the 48 px icon limit (60.0 -> 70.4)
PASS: 2.2.6 folder list: rows follow the new width
PASS: 2.2.6 folder list: a new file appears by itself
PASS: 2.2.6 folder list: 视图 menu switches this instance only and is saved per instance
PASS: 2.2.6 folder list: menu has 视图 plus frameless / background
PASS: 2.2.6 folder list: and back to the list
PASS: 2.2.6 folder list: (setup) a 2.2.5 file has no view
PASS: 2.2.9 固定到启动台 (as from the Explorer menu) adds and saves the items
PASS: 2.2.9 launchpad item menu: 从启动台移除 and reordering next to the existing entries
PASS: 2.2.9 launchpad: no runas for a document
PASS: 2.2.9 launchpad: reorder moves the item and saves the order
PASS: 2.2.9 从启动台移除 hides the entry live and never deletes the file
PASS: 2.2.9 blank-area menu lists the removed item under 恢复已移除的项目
PASS: 2.2.9 restoring brings the item back
PASS: 2.2.9 a desktop item is only hidden from the launchpad
PASS: 2.2.9 全部恢复
PASS: 2.2.9 organizer item menu: 以管理员身份运行, and 固定到启动台 right after 固定到 Dock
PASS: 2.2.9 organizer: runas through ShellExecute (fake)
PASS: 2.2.9 organizer: 固定到启动台 pins the item
PASS: 2.2.9 organizer: no runas for folders, no launchpad pin for system icons
PASS: 2.2.9 Dock: 以管理员身份运行 for a program
PASS: 2.2.9 Dock: runas (fake)
PASS: 2.2.9 Dock: 固定到启动台
PASS: 2.2.9 Dock: no runas for a store app
PASS: 2.2.9 Dock: 关闭应用 stays last
PASS: 2.2.9 folder widget: compact by default, minimum 120x96 (2.2.8: 228x168)
PASS: 2.2.9 can be dragged down to 120 px wide (120x96)
PASS: 2.2.9 compact: widths 120-320 px, the widget keeps the size the user set 
PASS: 2.2.9 compact: title and buttons sit in the bottom bar, inside the widget, not overlapping each other or the list 
PASS: 2.2.9 compact: icons grow with the width (never shrink when widening) 
PASS: 2.2.9 compact at 120 px: content almost touches the edges (left 3.6, right 3.6 px)
PASS: 2.2.9 compact at 120 px: names keep 76 px
PASS: 2.2.9 compact at 120 px: steady, no oscillation
PASS: 2.2.9 compact: scrollbar stays hidden
PASS: 2.2.9 compact 210x470: icons 31 px, text 17 px
PASS: 2.2.9 compact mode can be switched off (title back at the top)
PASS: 2.2.8 list view, 7 items: 1 px steps 420->190, the widget never changes its own size / MinHeight / SizeToContent 
PASS: 2.2.8 list view, 7 items: shrinking never makes the icons bigger (monotonic) 
PASS: 2.2.8 list view, 7 items: no visible scrollbar at any height
PASS: 2.2.8 list view, 7 items: growing never makes the icons smaller (monotonic)
PASS: 2.2.8 list view at 330: no oscillation when left alone (0 recalcs in 600 ms)
PASS: 2.2.8 list view at 230: no oscillation when left alone (0 recalcs in 600 ms)
PASS: 2.2.8 list view at 237: no oscillation when left alone (0 recalcs in 600 ms)
PASS: 2.2.8 list view at 244: no oscillation when left alone (0 recalcs in 600 ms)
PASS: 2.2.8 list view at 251: no oscillation when left alone (0 recalcs in 600 ms)
PASS: 2.2.8 list view at 258: no oscillation when left alone (0 recalcs in 600 ms)
PASS: 2.2.8 list view at 265: no oscillation when left alone (0 recalcs in 600 ms)
PASS: 2.2.8 list view at 272: no oscillation when left alone (0 recalcs in 600 ms)
PASS: 2.2.8 list view at 279: no oscillation when left alone (0 recalcs in 600 ms)
PASS: 2.2.8 list view at 286: no oscillation when left alone (0 recalcs in 600 ms)
PASS: 2.2.8 list view at 293: no oscillation when left alone (0 recalcs in 600 ms)
PASS: 2.2.8 list view at 300: no oscillation when left alone (0 recalcs in 600 ms)
PASS: 2.2.8 list view after a jittery drag: no oscillation when left alone (0 recalcs in 600 ms)
PASS: 2.2.8 drag: recalculation is throttled (55 for 200 moves)
PASS: 2.2.8 drag: the widget ends at the size the user dragged to (262)
PASS: 2.2.8 icon view, 7 items: 1 px steps 420->190, the widget never changes its own size / MinHeight / SizeToContent 
PASS: 2.2.8 icon view, 7 items: shrinking never makes the icons bigger (monotonic) 
PASS: 2.2.8 icon view, 7 items: no visible scrollbar at any height
PASS: 2.2.8 icon view, 7 items: growing never makes the icons smaller (monotonic)
PASS: 2.2.8 icon view at 230: no oscillation when left alone (0 recalcs in 600 ms)
PASS: 2.2.8 icon view at 250: no oscillation when left alone (0 recalcs in 600 ms)
PASS: 2.2.8 icon view at 270: no oscillation when left alone (0 recalcs in 600 ms)
PASS: 2.2.8 icon view at 290: no oscillation when left alone (0 recalcs in 600 ms)
PASS: 2.2.8 icon view at 310: no oscillation when left alone (0 recalcs in 600 ms)
PASS: 2.2.8 icon view at 330: no oscillation when left alone (0 recalcs in 600 ms)
PASS: 2.2.7 widget 275x520, 7 items: icon 44 px, rows use 446 of 462 px
PASS: 2.2.7 widget 275x520: text 21 px (2.2.6: about 9-13)
PASS: 2.2.7 title and header buttons grow too (1.60)
PASS: 2.2.7 sizes follow a resize live (44 -> 22 px)
PASS: 2.2.7 150 items: base size (icon 16 / font 12 / row 26) and scrolling
PASS: 2.2.7 icon view, tall widget with 7 items: bigger icons (58 px)
PASS: 2.2.7 icon view follows the size too (56)
INFO: visibility uses real window handles with deterministic dispatch; foreground hook registration is self-tested, interactive browser switching was not rechecked.
PASS: grid and glass have no idle frame subscriptions
