Improve Android app UI and controller flows

This commit is contained in:
2026-10-09 16:43:58 +08:00
parent c0e26b97fe
commit 608229a497
90 changed files with 8103 additions and 1133 deletions
@@ -0,0 +1,40 @@
# 网页图层UI修正验收(2026-10-09)
本轮修正颜色区布局、背景/帧复选框尺寸、不透明复制与脏目标提示、退出图层移动及模式提示。scene/模板/动图/配置格式、REST、手机公共协议与驱动均不变。VERSION保持1.1.3,FEATURE_UPDATED_AT为2026-10-09T16:12+08:00,未导出OTA/IMG,无App更新、摄像头、实屏视觉和Android真机测试。
## 验收清单
| 用户行为 | 功能与视觉验证 |
| --- | --- |
| 画笔/背景颜色选择、背景开关 | 桌面对齐,390/320上下排列;开关20×20,标签可点,无其他表单回归 |
| 复制弹窗、长帧名称和多选 | 两种弹窗计算背景rgb(23,28,36),原生checkbox20×20;合法长中文及无空格长名称换行,窄屏无横向溢出 |
| 复制当前板、模板和动图多帧 | 扩展浏览器入口通过;独立静态目标4层、两帧各2层,100/300ms间隔不变 |
| 脏目标保存后复制 | 独立目标正常提示、保存、追加及重新载入,不透明提示截图 |
| 画笔/文字移动、退出与继续编辑 | 已提交偏移保留,全屏/扩展/视线保持、面板隐藏、撤销可恢复 |
| 切到视线再退出 | 保留视线平移/滚轮缩放,草稿及撤销状态不变 |
| 未提交拖动预览退出 | 鼠标未松手时用键盘激活退出,候选取消,后续鼠标抬起不提交;一次撤销直接恢复上一已提交移动 |
| 文字退出后直接拖动 | x32→37、y26→30,文字工具恢复,可正常继续编辑 |
复制与脏目标写入只针对隔离mock的独立测试ID;设备既有目标只打开检查后取消,避免修改用户内容。截图已独立目视检查;窄屏颜色截图先将标题滚动到固定顶栏下,避免错误地把遮挡截图作为布局证据。
## 本机与隔离回归
本机全套513通过/9跳过;全部Node87通过。隔离中文/空格目录首次503通过/1失败/11跳过:未改变的显示配置原子替换发生WinError5。单测重测1通过,关闭本轮mock/浏览器后完整重测504通过/11跳过;隔离Node87通过。失败与成功日志均保留,不认定未证实的文件占用根因。
默认环境跳过6项FFmpeg格式、1项HEIC编码器、1项Windows目录symlink及1项仅用于旧OTA子进程的probe;隔离目录另跳过完整Git1项和大型镜像依赖1项。这些媒体功能本轮未改。隔离目录未复制凭据、venv、运行数据,使用已有解释器测试复制源码。
## 经验及剩余边界
稳定需求、TEST-LAYERS-UI测试映射及CSS/布局/截图经验已补到整体开发需求和测试流程。CSS未定义变量使dialog背景失效,使用已有surface;checkbox必须用局部高优先级样式覆盖全局input尺寸;模式出口不应清空撤销。运行mock时应使用准确的源码相对路径定位任务目录,并让环境初始化失败立即停止。本次首次启动环境路径写错,产生源码data下5个默认mock文件后已停止该进程,后续全部测试改用独立数据根。
自动安全审批拒绝了清理上述本轮生成目录(仅返回blocked by policy);未更换手段重试。核桃派软件源代码/data中的5个默认文件在本轮启动16:04:51至停止16:05:23之间生成,确认不是用户内容,已无进程使用,可手动删除该目录。本机一次性目录测试相关资料/如何测试/本机测试环境/.local/work/layers-ui-20261009在本轮结束后同样可手动清理;持续使用的venv、私有凭据和主机密钥保留。
## 设备部署与交付
凭据门禁与远端工具检查通过,离线载荷SHA-256通过;原子更新在持久数据副本上准备后才切换,完整预检508通过/7跳过,首次启动和重启健康检查通过。7项跳过为源载荷没有完整Git1项、本机harness3项、大型镜像构建依赖1项、板端没有Node的跨语言对比1项、旧OTA子进程probe1项;没有新增板端依赖。
已安装8个本轮源码/元数据文件SHA-256与本机一致(installed.log),VERSION1.1.3,功能时间2026-10-09T16:12+08:00。实际网页1280/320两种宽度的完整图层检查均通过、各6次原生确认且无pageerror,退出移动和撤销正常(production-browser.json)。390px检查整行背景标签可点、复选框20×20、弹窗不透明、帧列表405px内滚动(内容1032px)、文档宽度等于视口(production-dialog.json)。设备已有目标仅打开帧列表并取消,未复制或修改用户内容。
部署后与基线逐项比较9模板、6动图共195帧及全部持久文件SHA-256,像素、名称、帧顺序/间隔和配置均不变(verification.log、data-preservation.json)。真实驱动运行正常:deadline_misses=0、oe_pulse_faults=0、last_error=null。既有BlueZ TxPower属性告警仍在,未在UI修正范围处理;服务启动及健康通过。
已清理远端 /run/matrix-screen-controller-layers-ui-20261009 内离线载荷及文件校验清单,并确认本轮10个精确载荷、stage、rollback和迁移/测试路径均不存在(cleanup.log)。本轮mock服务、浏览器及SSH本地转发关闭。本机两处可清理目录因删除被自动审批拒绝而保留,见上面的经验及剩余边界;未改用其他删除手段。
@@ -0,0 +1,248 @@
requirements 未变化,跳过依赖安装。
> <仓库根目录>\测试相关资料\如何测试\本机测试环境\.venv\Scripts\python.exe -m pip check
No broken requirements found.
已清理:<仓库根目录>\测试相关资料\如何测试\本机测试环境\work\pytest
> <仓库根目录>\测试相关资料\如何测试\本机测试环境\.venv\Scripts\python.exe -m pytest -q -p no:cacheprovider --basetemp=<仓库根目录>\测试相关资料\如何测试\本机测试环境\work\pytest
........................................................................ [ 13%]
........................................................................ [ 27%]
........................................................................ [ 41%]
....................................sssssss.......s..................... [ 55%]
........................................................................ [ 68%]
.......s................................................................ [ 82%]
........................................................................ [ 96%]
.................. [100%]
============================== warnings summary ===============================
..\测试相关资料\如何测试\本机测试环境\.venv\Lib\site-packages\dbus_next\service.py:87
..\测试相关资料\如何测试\本机测试环境\.venv\Lib\site-packages\dbus_next\service.py:87
..\测试相关资料\如何测试\本机测试环境\.venv\Lib\site-packages\dbus_next\service.py:87
..\测试相关资料\如何测试\本机测试环境\.venv\Lib\site-packages\dbus_next\service.py:87
..\测试相关资料\如何测试\本机测试环境\.venv\Lib\site-packages\dbus_next\service.py:87
<仓库根目录>\测试相关资料\如何测试\本机测试环境\.venv\Lib\site-packages\dbus_next\service.py:87: DeprecationWarning: 'typing.no_type_check_decorator' is deprecated and slated for removal in Python 3.15
@no_type_check_decorator
..\测试相关资料\如何测试\本机测试环境\.venv\Lib\site-packages\dbus_next\service.py:293: 10 warnings
<仓库根目录>\测试相关资料\如何测试\本机测试环境\.venv\Lib\site-packages\dbus_next\service.py:293: DeprecationWarning: 'typing.no_type_check_decorator' is deprecated and slated for removal in Python 3.15
@no_type_check_decorator
..\测试相关资料\如何测试\本机测试环境\.venv\Lib\site-packages\fastapi\routing.py:234: 83 warnings
tests/test_animations.py: 913 warnings
tests/test_api.py: 2075 warnings
tests/test_fonts.py: 249 warnings
tests/test_frp.py: 332 warnings
tests/test_library_order.py: 332 warnings
tests/test_media_conversion.py: 830 warnings
tests/test_mobile_control.py: 1162 warnings
tests/test_ota.py: 249 warnings
tests/test_performance_mode.py: 83 warnings
tests/test_scene_layers.py: 166 warnings
tests/test_templates.py: 664 warnings
tests/test_ui_copy_editor.py: 599 warnings
tests/test_wifi.py: 249 warnings
<仓库根目录>\测试相关资料\如何测试\本机测试环境\.venv\Lib\site-packages\fastapi\routing.py:234: DeprecationWarning: 'asyncio.iscoroutinefunction' is deprecated and slated for removal in Python 3.16; use inspect.iscoroutinefunction() instead
is_coroutine = asyncio.iscoroutinefunction(dependant.call)
app\main.py:2049: 1 warning
tests/test_animations.py: 11 warnings
tests/test_api.py: 25 warnings
tests/test_fonts.py: 3 warnings
tests/test_frp.py: 4 warnings
tests/test_library_order.py: 4 warnings
tests/test_media_conversion.py: 10 warnings
tests/test_mobile_control.py: 14 warnings
tests/test_ota.py: 3 warnings
tests/test_performance_mode.py: 1 warning
tests/test_scene_layers.py: 2 warnings
tests/test_templates.py: 8 warnings
tests/test_ui_copy_editor.py: 7 warnings
tests/test_wifi.py: 3 warnings
<仓库根目录>\核桃派软件源代码\app\main.py:2049: DeprecationWarning:
on_event is deprecated, use lifespan event handlers instead.
Read more about it in the
[FastAPI docs for Lifespan Events](https://fastapi.tiangolo.com/advanced/events/).
@app.on_event("startup")
..\测试相关资料\如何测试\本机测试环境\.venv\Lib\site-packages\fastapi\applications.py:4495: 2 warnings
tests/test_animations.py: 22 warnings
tests/test_api.py: 50 warnings
tests/test_fonts.py: 6 warnings
tests/test_frp.py: 8 warnings
tests/test_library_order.py: 8 warnings
tests/test_media_conversion.py: 20 warnings
tests/test_mobile_control.py: 28 warnings
tests/test_ota.py: 6 warnings
tests/test_performance_mode.py: 2 warnings
tests/test_scene_layers.py: 4 warnings
tests/test_templates.py: 16 warnings
tests/test_ui_copy_editor.py: 14 warnings
tests/test_wifi.py: 6 warnings
<仓库根目录>\测试相关资料\如何测试\本机测试环境\.venv\Lib\site-packages\fastapi\applications.py:4495: DeprecationWarning:
on_event is deprecated, use lifespan event handlers instead.
Read more about it in the
[FastAPI docs for Lifespan Events](https://fastapi.tiangolo.com/advanced/events/).
return self.router.on_event(event_type)
app\main.py:2079: 1 warning
tests/test_animations.py: 11 warnings
tests/test_api.py: 25 warnings
tests/test_fonts.py: 3 warnings
tests/test_frp.py: 4 warnings
tests/test_library_order.py: 4 warnings
tests/test_media_conversion.py: 10 warnings
tests/test_mobile_control.py: 14 warnings
tests/test_ota.py: 3 warnings
tests/test_performance_mode.py: 1 warning
tests/test_scene_layers.py: 2 warnings
tests/test_templates.py: 8 warnings
tests/test_ui_copy_editor.py: 7 warnings
tests/test_wifi.py: 3 warnings
<仓库根目录>\核桃派软件源代码\app\main.py:2079: DeprecationWarning:
on_event is deprecated, use lifespan event handlers instead.
Read more about it in the
[FastAPI docs for Lifespan Events](https://fastapi.tiangolo.com/advanced/events/).
@app.on_event("shutdown")
tests/test_media_conversion.py::test_free_crop_can_leave_only_one_source_pixel_visible_at_each_corner
tests/test_media_conversion.py::test_free_crop_can_leave_only_one_source_pixel_visible_at_each_corner
tests/test_media_conversion.py::test_free_crop_can_leave_only_one_source_pixel_visible_at_each_corner
tests/test_media_conversion.py::test_free_crop_can_leave_only_one_source_pixel_visible_at_each_corner
<仓库根目录>\核桃派软件源代码\tests\test_media_conversion.py:134: DeprecationWarning: Image.Image.getdata is deprecated and will be removed in Pillow 14 (2027-10-15). Use get_flattened_data instead.
assert sum(pixel[0] > 240 for pixel in output.getdata()) == 1
tests/test_templates.py::test_template_crud_copy_persistence_and_thumbnail_cleanup
<仓库根目录>\核桃派软件源代码\tests\test_templates.py:165: DeprecationWarning: Image.Image.getdata is deprecated and will be removed in Pillow 14 (2027-10-15). Use get_flattened_data instead.
assert len(set(image.getdata())) > 1
-- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html
513 passed, 9 skipped, 8390 warnings in 87.13s (0:01:27)
> "C:\Program Files\nodejs\node.EXE" --test tests/test_animation_ui.mjs tests/test_canvas_tools.mjs tests/test_color_math.mjs tests/test_current_display_playback_ui.mjs tests/test_device_ui.mjs tests/test_font_picker.mjs tests/test_frp_ui.mjs tests/test_interaction_feedback.mjs tests/test_scene_model.mjs tests/test_scene_layers.mjs tests/test_settings_ui.mjs tests/test_template_management_ui.mjs tests/test_ui_copy_editor.mjs tests/test_wifi_ui.mjs tests/test_workspace_order_ui.mjs
✔ derives automatic frame names from current animation name and position (0.6874ms)
✔ keeps custom frame names and restores automatic names when cleared (0.0966ms)
✔ builds non-repeating animation edit context names (0.1028ms)
✔ selects saved animation preview frames by ordered durations (0.5996ms)
✔ loads every preview frame through revision-checked pagination (0.6345ms)
✔ validates configurable animation preview concurrency (0.4131ms)
✔ rejects mixed revisions instead of showing a partial animation (0.4235ms)
✔ validates frame duration only when explicitly called (0.3479ms)
✔ moves selected frames as one ordered group (0.1972ms)
✔ protects an eight pixel ring around interactive drag controls (0.2474ms)
✔ reorders mixed library keys without mutating the source list (0.1172ms)
✔ restores drag eligibility after protected pointer cancellation and drag end (0.3627ms)
✔ animation workspace exposes two previews and the simplified control order (6.0767ms)
✔ normal and pixel modes expose independent ranges and presets (1.0924ms)
✔ pixel stamps are exact squares from 1x1 through 4x4 (0.2203ms)
✔ pixel stamps clip at every canvas edge (0.1736ms)
✔ normal circle geometry remains unchanged (0.1043ms)
✔ line interpolation includes endpoints without coordinate gaps (0.199ms)
✔ older tools migrate while v3 restores the coordinate guide choice (0.205ms)
✔ coordinate guide spacing adapts to the transformed logical pixel size (0.1349ms)
✔ coordinate guide ticks preserve logical values through zoom and pan (0.1674ms)
✔ pixel mode markup and grid stay accessible and non-interactive (7.3324ms)
✔ pixel undo history stores changed snapshots, caps entries, and clears (0.339ms)
✔ canvas view clamps scale and keeps a visible section in the viewport (0.1618ms)
✔ zooming around an anchor preserves its logical position (0.1217ms)
✔ floating editor button stays inside its safe viewport bounds (0.0699ms)
✔ canvas editor markup, guarded input, and checkpoint events stay wired (2.9591ms)
✔ normalizes and converts hexadecimal colors (1.1604ms)
✔ converts RGB and HSV boundaries (0.2164ms)
✔ round trips representative colors within 8-bit rounding (0.243ms)
✔ recent colors deduplicate, normalize, and evict the oldest (0.6482ms)
✔ formats and projects looping playback without moving paused content (1.4035ms)
✔ seek dispatcher keeps one request in flight and flushes the newest position (2.5348ms)
✔ topbar current display dialog exposes static close and animation controls (4.9926ms)
✔ device workspace exposes the compact immediate pure-color test flow (5.5196ms)
✔ font catalog normalization, grouping, and search are stable (1.3207ms)
✔ font picker implements commit-only searchable combobox keyboard behavior (4.6556ms)
✔ settings places unrestricted FRP maintenance at the bottom (6.1934ms)
✔ FRP editor uses raw server storage and official validation errors (1.3256ms)
✔ network diagnostics renders layered evidence (1.803ms)
✔ unavailable controls never masquerade as indefinite loading (7.5008ms)
✔ action controls do not bypass the shared state module (12.1379ms)
✔ HTTP requests time out with a stable user-facing error (17.1637ms)
✔ demo library actions stay black, explain restrictions, and preserve copy (1.7199ms)
✔ sortable cards protect controls and keep demo cards fixed (1.3723ms)
✔ old scene migration rejects unknown fields and duplicate text without filtering (56.87ms)
✔ PNG compression round trips sparse and full brush pixels without DOM (8.0872ms)
✔ blank and black are distinct; independent backgrounds follow layer order (5.9144ms)
✔ disabled background colors stay independent through storage and copy (22.0436ms)
✔ extended pixels survive storage but never enter the central output (6.1956ms)
✔ move preview does not mutate source; confirmed clipping removes only outside ink (13.438ms)
✔ text clipping follows anchor and scale and is retained after edit/reload/copy (8.8565ms)
✔ multiple text groups isolate edits, copies and IDs (0.5382ms)
✔ strict v2 storage protects unknown data and the final brush invariant (5.9174ms)
✔ creates a fixed 64x64 RGB scene (7.6661ms)
✔ serializes pixelRgb as base64 and round trips an independent scene (36.8527ms)
✔ moves a valid v1 draft to the stable key before removing exact legacy keys (47.4139ms)
✔ keeps the v1 draft and all legacy keys when stable-key migration cannot write (21.6215ms)
✔ preserves and blocks a future stable draft instead of falling back or writing blank (8.9167ms)
✔ preserves and blocks a damaged stable draft (0.3938ms)
✔ does not discard a damaged higher-priority legacy key during fallback migration (2.492ms)
✔ rejects damaged scene roots while skipping only damaged elements (11.8415ms)
✔ normalizes text fields and creates a centered lowercase ok element (0.5473ms)
✔ migrates the first valid canvas by v3, v2, legacy priority and merges text v1 (13.6859ms)
✔ supports independent add, update, and delete operations for multiple text elements (0.8036ms)
✔ duplicates with a deep copy, new id, 2px offset, and topmost order (0.4624ms)
✔ alpha-composites full RGBA layers in array order without mutating inputs (1.9702ms)
✔ settings brightness explains an active temporary display-test override (8.6144ms)
✔ settings exposes full OTA upload progress and service recovery polling (4.2243ms)
✔ settings automatically opens and safely copies a detailed OTA failure log (3.456ms)
✔ settings exposes a transactional performance-mode switch with the fixed warning (1.8978ms)
✔ settings exposes persisted animation preview concurrency below performance mode (2.5657ms)
✔ template edit baseline distinguishes clean, dirty, and unbound scenes (1.772ms)
✔ template manager uses a monitor and unified four-row card actions (15.8254ms)
✔ animation editing backs up and restores template edit ownership (2.8231ms)
✔ special editor exposes the agreed modes and guarded editing flow (10.9369ms)
✔ latched WiFi draft state remains dirty until explicitly cleared (2.0158ms)
✔ WiFi settings expose independent network and prompt-delay controls (3.9931ms)
✔ workspace order resolves saved ids and appends new registrations (1.7676ms)
✔ workspace order movement is immutable and respects both boundaries (0.329ms)
✔ drawer exposes one editable list and commits only from the save action (7.9569ms)
ℹ tests 81
ℹ suites 0
ℹ pass 81
ℹ fail 0
ℹ cancelled 0
ℹ skipped 0
ℹ todo 0
ℹ duration_ms 614.8645
> "C:\Program Files\nodejs\node.EXE" --check <仓库根目录>\核桃派软件源代码\app\static\animation-thumbnail-preview.js
> "C:\Program Files\nodejs\node.EXE" --check <仓库根目录>\核桃派软件源代码\app\static\animation-ui-model.js
> "C:\Program Files\nodejs\node.EXE" --check <仓库根目录>\核桃派软件源代码\app\static\app.js
> "C:\Program Files\nodejs\node.EXE" --check <仓库根目录>\核桃派软件源代码\app\static\canvas-tools-model.js
> "C:\Program Files\nodejs\node.EXE" --check <仓库根目录>\核桃派软件源代码\app\static\color-math.js
> "C:\Program Files\nodejs\node.EXE" --check <仓库根目录>\核桃派软件源代码\app\static\color-picker.js
> "C:\Program Files\nodejs\node.EXE" --check <仓库根目录>\核桃派软件源代码\app\static\core.js
> "C:\Program Files\nodejs\node.EXE" --check <仓库根目录>\核桃派软件源代码\app\static\current-display-playback.js
> "C:\Program Files\nodejs\node.EXE" --check <仓库根目录>\核桃派软件源代码\app\static\font-picker.js
> "C:\Program Files\nodejs\node.EXE" --check <仓库根目录>\核桃派软件源代码\app\static\interaction-feedback.js
> "C:\Program Files\nodejs\node.EXE" --check <仓库根目录>\核桃派软件源代码\app\static\media-crop-geometry.js
> "C:\Program Files\nodejs\node.EXE" --check <仓库根目录>\核桃派软件源代码\app\static\media-import-ui-model.js
> "C:\Program Files\nodejs\node.EXE" --check <仓库根目录>\核桃派软件源代码\app\static\pixel-png.js
> "C:\Program Files\nodejs\node.EXE" --check <仓库根目录>\核桃派软件源代码\app\static\scene-board.js
> "C:\Program Files\nodejs\node.EXE" --check <仓库根目录>\核桃派软件源代码\app\static\scene-model-v1.js
> "C:\Program Files\nodejs\node.EXE" --check <仓库根目录>\核桃派软件源代码\app\static\scene-model.js
> "C:\Program Files\nodejs\node.EXE" --check <仓库根目录>\核桃派软件源代码\app\static\sortable-card.js
> "C:\Program Files\nodejs\node.EXE" --check <仓库根目录>\核桃派软件源代码\app\static\template-edit-model.js
> "C:\Program Files\nodejs\node.EXE" --check <仓库根目录>\核桃派软件源代码\app\static\ui-copy-runtime.js
> "C:\Program Files\nodejs\node.EXE" --check <仓库根目录>\核桃派软件源代码\app\static\vendor\fflate\fflate.js
> "C:\Program Files\nodejs\node.EXE" --check <仓库根目录>\核桃派软件源代码\app\static\views\animations.js
> "C:\Program Files\nodejs\node.EXE" --check <仓库根目录>\核桃派软件源代码\app\static\views\canvas.js
> "C:\Program Files\nodejs\node.EXE" --check <仓库根目录>\核桃派软件源代码\app\static\views\device.js
> "C:\Program Files\nodejs\node.EXE" --check <仓库根目录>\核桃派软件源代码\app\static\views\frp-settings.js
> "C:\Program Files\nodejs\node.EXE" --check <仓库根目录>\核桃派软件源代码\app\static\views\layers.js
> "C:\Program Files\nodejs\node.EXE" --check <仓库根目录>\核桃派软件源代码\app\static\views\media-import.js
> "C:\Program Files\nodejs\node.EXE" --check <仓库根目录>\核桃派软件源代码\app\static\views\settings.js
> "C:\Program Files\nodejs\node.EXE" --check <仓库根目录>\核桃派软件源代码\app\static\views\templates.js
> "C:\Program Files\nodejs\node.EXE" --check <仓库根目录>\核桃派软件源代码\app\static\views\text.js
> "C:\Program Files\nodejs\node.EXE" --check <仓库根目录>\核桃派软件源代码\app\static\views\wifi-settings.js
> "C:\Program Files\nodejs\node.EXE" --check <仓库根目录>\核桃派软件源代码\app\static\wifi-draft-state.js
> "C:\Program Files\nodejs\node.EXE" --check <仓库根目录>\核桃派软件源代码\app\static\workspace-order.js
> "C:\Program Files\nodejs\node.EXE" --check app/ui_copy_editor/static/editor.js
> <仓库根目录>\测试相关资料\如何测试\本机测试环境\.venv\Scripts\python.exe scripts/build_ui_copy_catalog.py --check
ui-copy.json is current
本机测试套件通过:all
@@ -0,0 +1,10 @@
{
"candidateCanceled": true,
"undoX": 0,
"continueMode": "draw",
"textDraggedAfterExit": [
37,
30
],
"errors": []
}
@@ -0,0 +1,51 @@
{
"browserResult": {
"passed": true,
"nativeConfirmations": 6,
"layers": 3,
"errors": []
},
"narrowResults": [
{
"width": 390,
"bounds": {
"x": 19,
"y": 198.484375,
"width": 352,
"height": 447.015625
},
"checkbox": {
"x": 36,
"y": 410.640625,
"width": 20,
"height": 20
},
"metrics": {
"width": 390,
"scroll": 390
},
"background": "rgb(23, 28, 36)"
},
{
"width": 320,
"bounds": {
"x": 19,
"y": 169.09375,
"width": 282,
"height": 505.8125
},
"checkbox": {
"x": 36,
"y": 386.96875,
"width": 20,
"height": 20
},
"metrics": {
"width": 320,
"scroll": 320
},
"background": "rgb(23, 28, 36)"
}
],
"errors": []
}
@@ -0,0 +1,3 @@
私有凭据文件可用;未输出任何凭据值。
All 10 exact remote task temporary paths absent.
Binary file not shown.

After

Width:  |  Height:  |  Size: 40 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 41 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 19 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 26 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 28 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 30 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 10 KiB

@@ -0,0 +1,8 @@
{
"templates": 9,
"animations": 6,
"frames": 195,
"persistent_files": 430,
"persistent_baseline_sha256": "cbda03ce858f01ce0d025a4ef0de679dac00d328b7a159be14a05c40fbcb592a",
"unchanged_after_deployment": true
}
@@ -0,0 +1,130 @@
annotated_types-0.8.0-py3-none-any.whl: OK
anyio-4.14.2-py3-none-any.whl: OK
certifi-2026.7.22-py3-none-any.whl: OK
cffi-2.1.1-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.whl: OK
click-8.4.2-py3-none-any.whl: OK
colorama-0.4.6-py2.py3-none-any.whl: OK
cryptography-46.0.5-cp311-abi3-manylinux2014_aarch64.manylinux_2_17_aarch64.whl: OK
dbus_next-0.2.3-py3-none-any.whl: OK
fastapi-0.116.1-py3-none-any.whl: OK
fonttools-4.63.0-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl: OK
h11-0.16.0-py3-none-any.whl: OK
httpcore-1.0.9-py3-none-any.whl: OK
httptools-0.8.0-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl: OK
httpx-0.28.1-py3-none-any.whl: OK
idna-3.18-py3-none-any.whl: OK
iniconfig-2.3.0-py3-none-any.whl: OK
packaging-26.3-py3-none-any.whl: OK
pillow-12.3.0-cp311-cp311-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl: OK
pluggy-1.6.0-py3-none-any.whl: OK
pycparser-3.0-py3-none-any.whl: OK
pydantic-2.13.4-py3-none-any.whl: OK
pydantic_core-2.46.4-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl: OK
pygments-2.20.0-py3-none-any.whl: OK
pytest-8.4.1-py3-none-any.whl: OK
python_dotenv-1.2.2-py3-none-any.whl: OK
pyyaml-6.0.3-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl: OK
starlette-0.47.3-py3-none-any.whl: OK
typing_extensions-4.16.0-py3-none-any.whl: OK
typing_inspection-0.4.2-py3-none-any.whl: OK
uvicorn-0.35.0-py3-none-any.whl: OK
uvloop-0.22.1-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl: OK
watchfiles-1.2.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl: OK
websockets-17.0.1-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl: OK
Looking in links: /run/[private]-screen-controller-layers-ui-20261009/wheels
Processing /run/[private]-screen-controller-layers-ui-20261009/wheels/fastapi-0.116.1-py3-none-any.whl
Processing /run/[private]-screen-controller-layers-ui-20261009/wheels/uvicorn-0.35.0-py3-none-any.whl
Processing /run/[private]-screen-controller-layers-ui-20261009/wheels/pillow-12.3.0-cp311-cp311-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl
Processing /run/[private]-screen-controller-layers-ui-20261009/wheels/fonttools-4.63.0-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl
Processing /run/[private]-screen-controller-layers-ui-20261009/wheels/cryptography-46.0.5-cp311-abi3-manylinux2014_aarch64.manylinux_2_17_aarch64.whl
Processing /run/[private]-screen-controller-layers-ui-20261009/wheels/dbus_next-0.2.3-py3-none-any.whl
Processing /run/[private]-screen-controller-layers-ui-20261009/wheels/pytest-8.4.1-py3-none-any.whl
Processing /run/[private]-screen-controller-layers-ui-20261009/wheels/httpx-0.28.1-py3-none-any.whl
Processing /run/[private]-screen-controller-layers-ui-20261009/wheels/starlette-0.47.3-py3-none-any.whl
Processing /run/[private]-screen-controller-layers-ui-20261009/wheels/pydantic-2.13.4-py3-none-any.whl
Processing /run/[private]-screen-controller-layers-ui-20261009/wheels/typing_extensions-4.16.0-py3-none-any.whl
Processing /run/[private]-screen-controller-layers-ui-20261009/wheels/click-8.4.2-py3-none-any.whl
Processing /run/[private]-screen-controller-layers-ui-20261009/wheels/h11-0.16.0-py3-none-any.whl
Processing /run/[private]-screen-controller-layers-ui-20261009/wheels/httptools-0.8.0-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl
Processing /run/[private]-screen-controller-layers-ui-20261009/wheels/python_dotenv-1.2.2-py3-none-any.whl
Processing /run/[private]-screen-controller-layers-ui-20261009/wheels/pyyaml-6.0.3-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl
Processing /run/[private]-screen-controller-layers-ui-20261009/wheels/uvloop-0.22.1-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl
Processing /run/[private]-screen-controller-layers-ui-20261009/wheels/watchfiles-1.2.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
Processing /run/[private]-screen-controller-layers-ui-20261009/wheels/websockets-17.0.1-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl
Processing /run/[private]-screen-controller-layers-ui-20261009/wheels/cffi-2.1.1-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.whl
Processing /run/[private]-screen-controller-layers-ui-20261009/wheels/iniconfig-2.3.0-py3-none-any.whl
Processing /run/[private]-screen-controller-layers-ui-20261009/wheels/packaging-26.3-py3-none-any.whl
Processing /run/[private]-screen-controller-layers-ui-20261009/wheels/pluggy-1.6.0-py3-none-any.whl
Processing /run/[private]-screen-controller-layers-ui-20261009/wheels/pygments-2.20.0-py3-none-any.whl
Processing /run/[private]-screen-controller-layers-ui-20261009/wheels/anyio-4.14.2-py3-none-any.whl
Processing /run/[private]-screen-controller-layers-ui-20261009/wheels/certifi-2026.7.22-py3-none-any.whl
Processing /run/[private]-screen-controller-layers-ui-20261009/wheels/httpcore-1.0.9-py3-none-any.whl
Processing /run/[private]-screen-controller-layers-ui-20261009/wheels/idna-3.18-py3-none-any.whl
Processing /run/[private]-screen-controller-layers-ui-20261009/wheels/pycparser-3.0-py3-none-any.whl
Processing /run/[private]-screen-controller-layers-ui-20261009/wheels/annotated_types-0.8.0-py3-none-any.whl
Processing /run/[private]-screen-controller-layers-ui-20261009/wheels/pydantic_core-2.46.4-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
Processing /run/[private]-screen-controller-layers-ui-20261009/wheels/typing_inspection-0.4.2-py3-none-any.whl
Installing collected packages: websockets, uvloop, typing-extensions, pyyaml, python-dotenv, pygments, pycparser, pluggy, pillow, packaging, iniconfig, idna, httptools, h11, fonttools, dbus-next, click, certifi, annotated-types, uvicorn, typing-inspection, pytest, pydantic-core, httpcore, cffi, anyio, watchfiles, starlette, pydantic, httpx, cryptography, fastapi
Successfully installed annotated-types-0.8.0 anyio-4.14.2 certifi-2026.7.22 cffi-2.1.1 click-8.4.2 cryptography-46.0.5 dbus-next-0.2.3 fastapi-0.116.1 fonttools-4.63.0 h11-0.16.0 httpcore-1.0.9 httptools-0.8.0 httpx-0.28.1 idna-3.18 iniconfig-2.3.0 packaging-26.3 pillow-12.3.0 pluggy-1.6.0 pycparser-3.0 pydantic-2.13.4 pydantic-core-2.46.4 pygments-2.20.0 pytest-8.4.1 python-dotenv-1.2.2 pyyaml-6.0.3 starlette-0.47.3 typing-extensions-4.16.0 typing-inspection-0.4.2 uvicorn-0.35.0 uvloop-0.22.1 watchfiles-1.2.0 websockets-17.0.1
make: Entering directory '/opt/[private]-screen-controller.stage.1.1.3-layers-ui-20261009/app/display/native'
rm -f -- libh618_hub75.so hub75_benchmark hub75_native_test hub75_safeoff
cc -O3 -std=c11 -Wall -Wextra -Werror -fPIC -pthread -shared h618_hub75.c -o libh618_hub75.so -pthread
cc -O3 -std=c11 -Wall -Wextra -Werror -fPIC -pthread benchmark.c h618_hub75.c -o hub75_benchmark -pthread
cc -O3 -std=c11 -Wall -Wextra -Werror -fPIC -pthread native_test.c h618_hub75.c -o hub75_native_test -pthread
cc -O3 -std=c11 -Wall -Wextra -Werror -fPIC -pthread safeoff.c h618_hub75.c -o hub75_safeoff -pthread
./hub75_native_test
native_bitplane_tests=PASS
./hub75_safeoff --fake
HUB75 safeoff complete
make: Leaving directory '/opt/[private]-screen-controller.stage.1.1.3-layers-ui-20261009/app/display/native'
........................................................................ [ 14%]
........................................................................ [ 28%]
.............................................................s.......... [ 42%]
........................................................................ [ 56%]
........................................................................ [ 70%]
.......s.......................................................s........ [ 84%]
........................................................................ [ 98%]
.......sss [100%]
508 passed, 7 skipped, 389 warnings in 403.15s (0:06:43)
PASS: H618 PI pinctrl: allwinner,sun50i-h616-pinctrl
PASS: /dev/mem accessible: /dev/mem
PASS: /dev/i2c-1 present: /dev/i2c-1
PASS: CPU3 present: /sys/devices/system/cpu/cpu3
PASS: native HUB75 library: /opt/[private]-screen-controller.stage.1.1.3-layers-ui-20261009/app/display/native/libh618_hub75.so
PASS: AArch64 userspace: aarch64
PASS: default network route: default via <设备网络地址> dev wlan0 proto static metric 600
PASS: NetworkManager active: active
PASS: lightdm.service inactive: inactive
PASS: gpioc-server.service inactive: inactive
PASS: map_device.service inactive: inactive
Persistent data prepared successfully: schema=config.json
frpc: OK
LICENSE: OK
frpc binary already verified; skipped
frpc 0.71.0 installed as a system component
● [private]-screen-controller.service - WalnutPi H618 Matrix Screen Controller
Loaded: loaded (/etc/systemd/system/[private]-screen-controller.service; enabled; preset: enabled)
Active: active (running) since Fri 2026-10-09 08:23:44 UTC; 9s ago
Process: 333499 ExecStartPre=/bin/sh -c cat /proc/sys/kernel/sched_rt_runtime_us > /run/[private]-screen-controller/sched_rt_runtime_us.original && printf "%s
" -1 > /proc/sys/kernel/sched_rt_runtime_us (code=exited, status=0/SUCCESS)
Process: 333501 ExecStartPre=/opt/[private]-screen-controller/.venv/bin/python /opt/[private]-screen-controller/scripts/dedicated_host.py check --service (code=exited, status=0/SUCCESS)
Process: 333507 ExecStartPre=/opt/[private]-screen-controller/app/display/native/hub75_safeoff (code=exited, status=0/SUCCESS)
Main PID: 333508 (python)
Tasks: 14 (limit: 1021)
Memory: 137.5M
CPU: 11.733s
CGroup: /system.slice/[private]-screen-controller.service
└─333508 /opt/[private]-screen-controller/.venv/bin/python -m uvicorn app.main:app --host 0.0.0.0 --port 8080
Oct 09 08:23:51 [private] python[333508]: File "/opt/[private]-screen-controller/.venv/lib/python3.11/site-packages/dbus_next/message_bus.py", line 712, in _process_message
Oct 09 08:23:51 [private] python[333508]: handler(msg, send_reply)
Oct 09 08:23:51 [private] python[333508]: File "/opt/[private]-screen-controller/.venv/lib/python3.11/site-packages/dbus_next/message_bus.py", line 898, in _default_properties_handler
Oct 09 08:23:51 [private] python[333508]: raise DBusError(
Oct 09 08:23:51 [private] python[333508]: dbus_next.errors.DBusError: interface "org.bluez.LEAdvertisement1" does not have property "TxPower"
Oct 09 08:23:52 [private] python[333508]: 2026-10-09 08:23:52,019 INFO app.power.voltage: Screen voltage sensor is available
Oct 09 08:23:52 [private] python[333508]: 2026-10-09 08:23:52,049 INFO app.monitoring.resources: System resource monitor is available
Oct 09 08:23:52 [private] python[333508]: INFO: Application startup complete.
Oct 09 08:23:52 [private] python[333508]: INFO: Uvicorn running on http://0.0.0.0:8080 (Press CTRL+C to quit)
Oct 09 08:23:53 [private] python[333508]: INFO: 127.0.0.1:51326 - "GET /api/status HTTP/1.1" 200 OK
WalnutPi Matrix Screen Controller updated successfully: 1.1.3-layers-ui-20261009
WARNING: The directory '/home/[private]/.cache/pip' or its parent directory is not owned or is not writable by the current user. The cache has been disabled. Check the permissions and owner of that directory. If executing pip with sudo, you should use sudo's -H flag.
@@ -0,0 +1 @@
仓库卫生检查通过:已检查 733 个 Git 候选文件,未输出任何秘密值。
@@ -0,0 +1 @@
仓库卫生检查通过:已检查 725 个 Git 候选文件,未输出任何秘密值。
@@ -0,0 +1 @@
{"verified_files": 8, "version": "1.1.3", "feature_updated_at": "2026-10-09T16:12+08:00"}
@@ -0,0 +1,95 @@
✔ derives automatic frame names from current animation name and position (0.808ms)
✔ keeps custom frame names and restores automatic names when cleared (0.1255ms)
✔ builds non-repeating animation edit context names (0.1235ms)
✔ selects saved animation preview frames by ordered durations (0.7779ms)
✔ loads every preview frame through revision-checked pagination (0.6472ms)
✔ validates configurable animation preview concurrency (0.2981ms)
✔ rejects mixed revisions instead of showing a partial animation (0.3864ms)
✔ validates frame duration only when explicitly called (0.4326ms)
✔ moves selected frames as one ordered group (0.235ms)
✔ protects an eight pixel ring around interactive drag controls (0.1911ms)
✔ reorders mixed library keys without mutating the source list (0.12ms)
✔ restores drag eligibility after protected pointer cancellation and drag end (0.497ms)
✔ animation workspace exposes two previews and the simplified control order (6.8882ms)
✔ normal and pixel modes expose independent ranges and presets (1.2686ms)
✔ pixel stamps are exact squares from 1x1 through 4x4 (0.2839ms)
✔ pixel stamps clip at every canvas edge (0.2249ms)
✔ normal circle geometry remains unchanged (0.0917ms)
✔ line interpolation includes endpoints without coordinate gaps (0.2369ms)
✔ older tools migrate while v3 restores the coordinate guide choice (0.2616ms)
✔ coordinate guide spacing adapts to the transformed logical pixel size (0.1598ms)
✔ coordinate guide ticks preserve logical values through zoom and pan (0.2017ms)
✔ pixel mode markup and grid stay accessible and non-interactive (7.2448ms)
✔ pixel undo history stores changed snapshots, caps entries, and clears (0.3945ms)
✔ canvas view clamps scale and keeps a visible section in the viewport (0.1984ms)
✔ zooming around an anchor preserves its logical position (0.1317ms)
✔ floating editor button stays inside its safe viewport bounds (0.0831ms)
✔ canvas editor markup, guarded input, and checkpoint events stay wired (3.1863ms)
✔ normalizes and converts hexadecimal colors (1.5345ms)
✔ converts RGB and HSV boundaries (0.9382ms)
✔ round trips representative colors within 8-bit rounding (0.2933ms)
✔ recent colors deduplicate, normalize, and evict the oldest (0.3496ms)
✔ formats and projects looping playback without moving paused content (1.2628ms)
✔ seek dispatcher keeps one request in flight and flushes the newest position (2.7001ms)
✔ topbar current display dialog exposes static close and animation controls (3.7402ms)
✔ device workspace exposes the compact immediate pure-color test flow (6.3507ms)
✔ font catalog normalization, grouping, and search are stable (2.0276ms)
✔ font picker implements commit-only searchable combobox keyboard behavior (3.427ms)
✔ settings places unrestricted FRP maintenance at the bottom (5.1351ms)
✔ FRP editor uses raw server storage and official validation errors (0.9648ms)
✔ network diagnostics renders layered evidence (1.527ms)
✔ unavailable controls never masquerade as indefinite loading (6.4433ms)
✔ action controls do not bypass the shared state module (6.9201ms)
✔ HTTP requests time out with a stable user-facing error (10.9783ms)
✔ demo library actions stay black, explain restrictions, and preserve copy (1.3072ms)
✔ sortable cards protect controls and keep demo cards fixed (1.2485ms)
✔ media import workspace exposes streaming upload, crop controls, and queue polling (1.6826ms)
✔ free framing starts from the complete source and keeps one pixel visible (0.8104ms)
✔ free framing copy is stable and catalogued (0.1191ms)
✔ upload action has visible ordinary-build copy (0.4106ms)
✔ media naming happens after analysis and conflicts keep the draft (0.2591ms)
✔ awaiting-settings cards survive polling without hiding server transitions (0.1535ms)
✔ old scene migration rejects unknown fields and duplicate text without filtering (47.9235ms)
✔ PNG compression round trips sparse and full brush pixels without DOM (6.3474ms)
✔ blank and black are distinct; independent backgrounds follow layer order (3.1552ms)
✔ disabled background colors stay independent through storage and copy (15.4641ms)
✔ extended pixels survive storage but never enter the central output (5.6959ms)
✔ move preview does not mutate source; confirmed clipping removes only outside ink (9.8782ms)
✔ text clipping follows anchor and scale and is retained after edit/reload/copy (7.7534ms)
✔ multiple text groups isolate edits, copies and IDs (0.7824ms)
✔ strict v2 storage protects unknown data and the final brush invariant (4.1681ms)
✔ creates a fixed 64x64 RGB scene (5.3096ms)
✔ serializes pixelRgb as base64 and round trips an independent scene (25.3775ms)
✔ moves a valid v1 draft to the stable key before removing exact legacy keys (27.5528ms)
✔ keeps the v1 draft and all legacy keys when stable-key migration cannot write (13.5803ms)
✔ preserves and blocks a future stable draft instead of falling back or writing blank (5.8011ms)
✔ preserves and blocks a damaged stable draft (0.4566ms)
✔ does not discard a damaged higher-priority legacy key during fallback migration (1.941ms)
✔ rejects damaged scene roots while skipping only damaged elements (11.0519ms)
✔ normalizes text fields and creates a centered lowercase ok element (0.337ms)
✔ migrates the first valid canvas by v3, v2, legacy priority and merges text v1 (9.0729ms)
✔ supports independent add, update, and delete operations for multiple text elements (0.6678ms)
✔ duplicates with a deep copy, new id, 2px offset, and topmost order (0.3218ms)
✔ alpha-composites full RGBA layers in array order without mutating inputs (1.4592ms)
✔ settings brightness explains an active temporary display-test override (7.2325ms)
✔ settings exposes full OTA upload progress and service recovery polling (2.9749ms)
✔ settings automatically opens and safely copies a detailed OTA failure log (1.7251ms)
✔ settings exposes a transactional performance-mode switch with the fixed warning (2.449ms)
✔ settings exposes persisted animation preview concurrency below performance mode (1.8539ms)
✔ template edit baseline distinguishes clean, dirty, and unbound scenes (1.1902ms)
✔ template manager uses a monitor and unified four-row card actions (7.157ms)
✔ animation editing backs up and restores template edit ownership (1.9429ms)
✔ special editor exposes the agreed modes and guarded editing flow (6.9422ms)
✔ latched WiFi draft state remains dirty until explicitly cleared (2.0016ms)
✔ WiFi settings expose independent network and prompt-delay controls (1.8652ms)
✔ workspace order resolves saved ids and appends new registrations (1.0842ms)
✔ workspace order movement is immutable and respects both boundaries (0.2086ms)
✔ drawer exposes one editable list and commits only from the save action (4.9742ms)
ℹ tests 87
ℹ suites 0
ℹ pass 87
ℹ fail 0
ℹ cancelled 0
ℹ skipped 0
ℹ todo 0
ℹ duration_ms 650.3177
@@ -0,0 +1,125 @@
........................................................................ [ 14%]
........................................................................ [ 28%]
.............................................................s.......... [ 42%]
....................................sssssss.......s..................... [ 56%]
........................................................................ [ 70%]
.......s................................................................ [ 84%]
........................................................................ [ 98%]
.......... [100%]
============================== warnings summary ===============================
测试相关资料\如何测试\本机测试环境\.venv\Lib\site-packages\dbus_next\service.py:87
测试相关资料\如何测试\本机测试环境\.venv\Lib\site-packages\dbus_next\service.py:87
测试相关资料\如何测试\本机测试环境\.venv\Lib\site-packages\dbus_next\service.py:87
测试相关资料\如何测试\本机测试环境\.venv\Lib\site-packages\dbus_next\service.py:87
测试相关资料\如何测试\本机测试环境\.venv\Lib\site-packages\dbus_next\service.py:87
<仓库根目录>\测试相关资料\如何测试\本机测试环境\.venv\Lib\site-packages\dbus_next\service.py:87: DeprecationWarning: 'typing.no_type_check_decorator' is deprecated and slated for removal in Python 3.15
@no_type_check_decorator
测试相关资料\如何测试\本机测试环境\.venv\Lib\site-packages\dbus_next\service.py:293: 10 warnings
<仓库根目录>\测试相关资料\如何测试\本机测试环境\.venv\Lib\site-packages\dbus_next\service.py:293: DeprecationWarning: 'typing.no_type_check_decorator' is deprecated and slated for removal in Python 3.15
@no_type_check_decorator
测试相关资料\如何测试\本机测试环境\.venv\Lib\site-packages\fastapi\routing.py:234: 83 warnings
tests/test_animations.py: 913 warnings
tests/test_api.py: 2075 warnings
tests/test_fonts.py: 249 warnings
tests/test_frp.py: 332 warnings
tests/test_library_order.py: 332 warnings
tests/test_media_conversion.py: 830 warnings
tests/test_mobile_control.py: 1162 warnings
tests/test_ota.py: 249 warnings
tests/test_performance_mode.py: 83 warnings
tests/test_scene_layers.py: 166 warnings
tests/test_templates.py: 664 warnings
tests/test_ui_copy_editor.py: 599 warnings
tests/test_wifi.py: 249 warnings
<仓库根目录>\测试相关资料\如何测试\本机测试环境\.venv\Lib\site-packages\fastapi\routing.py:234: DeprecationWarning: 'asyncio.iscoroutinefunction' is deprecated and slated for removal in Python 3.16; use inspect.iscoroutinefunction() instead
is_coroutine = asyncio.iscoroutinefunction(dependant.call)
测试相关资料\如何测试\本机测试环境\.local\work\layers-ui-20261009\独立 工作区\核桃派软件源代码\app\main.py:2049: 1 warning
tests/test_animations.py: 11 warnings
tests/test_api.py: 25 warnings
tests/test_fonts.py: 3 warnings
tests/test_frp.py: 4 warnings
tests/test_library_order.py: 4 warnings
tests/test_media_conversion.py: 10 warnings
tests/test_mobile_control.py: 14 warnings
tests/test_ota.py: 3 warnings
tests/test_performance_mode.py: 1 warning
tests/test_scene_layers.py: 2 warnings
tests/test_templates.py: 8 warnings
tests/test_ui_copy_editor.py: 7 warnings
tests/test_wifi.py: 3 warnings
<仓库根目录>\测试相关资料\如何测试\本机测试环境\.local\work\layers-ui-20261009\独立 工作区\核桃派软件源代码\app\main.py:2049: DeprecationWarning:
on_event is deprecated, use lifespan event handlers instead.
Read more about it in the
[FastAPI docs for Lifespan Events](https://fastapi.tiangolo.com/advanced/events/).
@app.on_event("startup")
测试相关资料\如何测试\本机测试环境\.venv\Lib\site-packages\fastapi\applications.py:4495: 2 warnings
tests/test_animations.py: 22 warnings
tests/test_api.py: 50 warnings
tests/test_fonts.py: 6 warnings
tests/test_frp.py: 8 warnings
tests/test_library_order.py: 8 warnings
tests/test_media_conversion.py: 20 warnings
tests/test_mobile_control.py: 28 warnings
tests/test_ota.py: 6 warnings
tests/test_performance_mode.py: 2 warnings
tests/test_scene_layers.py: 4 warnings
tests/test_templates.py: 16 warnings
tests/test_ui_copy_editor.py: 14 warnings
tests/test_wifi.py: 6 warnings
<仓库根目录>\测试相关资料\如何测试\本机测试环境\.venv\Lib\site-packages\fastapi\applications.py:4495: DeprecationWarning:
on_event is deprecated, use lifespan event handlers instead.
Read more about it in the
[FastAPI docs for Lifespan Events](https://fastapi.tiangolo.com/advanced/events/).
return self.router.on_event(event_type)
测试相关资料\如何测试\本机测试环境\.local\work\layers-ui-20261009\独立 工作区\核桃派软件源代码\app\main.py:2079: 1 warning
tests/test_animations.py: 11 warnings
tests/test_api.py: 25 warnings
tests/test_fonts.py: 3 warnings
tests/test_frp.py: 4 warnings
tests/test_library_order.py: 4 warnings
tests/test_media_conversion.py: 10 warnings
tests/test_mobile_control.py: 14 warnings
tests/test_ota.py: 3 warnings
tests/test_performance_mode.py: 1 warning
tests/test_scene_layers.py: 2 warnings
tests/test_templates.py: 8 warnings
tests/test_ui_copy_editor.py: 7 warnings
tests/test_wifi.py: 3 warnings
<仓库根目录>\测试相关资料\如何测试\本机测试环境\.local\work\layers-ui-20261009\独立 工作区\核桃派软件源代码\app\main.py:2079: DeprecationWarning:
on_event is deprecated, use lifespan event handlers instead.
Read more about it in the
[FastAPI docs for Lifespan Events](https://fastapi.tiangolo.com/advanced/events/).
@app.on_event("shutdown")
tests/test_media_conversion.py::test_free_crop_can_leave_only_one_source_pixel_visible_at_each_corner
tests/test_media_conversion.py::test_free_crop_can_leave_only_one_source_pixel_visible_at_each_corner
tests/test_media_conversion.py::test_free_crop_can_leave_only_one_source_pixel_visible_at_each_corner
tests/test_media_conversion.py::test_free_crop_can_leave_only_one_source_pixel_visible_at_each_corner
<仓库根目录>\测试相关资料\如何测试\本机测试环境\.local\work\layers-ui-20261009\独立 工作区\核桃派软件源代码\tests\test_media_conversion.py:134: DeprecationWarning: Image.Image.getdata is deprecated and will be removed in Pillow 14 (2027-10-15). Use get_flattened_data instead.
assert sum(pixel[0] > 240 for pixel in output.getdata()) == 1
tests/test_templates.py::test_template_crud_copy_persistence_and_thumbnail_cleanup
<仓库根目录>\测试相关资料\如何测试\本机测试环境\.local\work\layers-ui-20261009\独立 工作区\核桃派软件源代码\tests\test_templates.py:165: DeprecationWarning: Image.Image.getdata is deprecated and will be removed in Pillow 14 (2027-10-15). Use get_flattened_data instead.
assert len(set(image.getdata())) > 1
-- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html
=========================== short test summary info ===========================
SKIPPED [1] 测试相关资料\如何测试\本机测试环境\.local\work\layers-ui-20261009\独立 工作区\核桃派软件源代码\tests\test_repository_hygiene.py:17: repository hygiene tests require a complete Git workspace
SKIPPED [1] 测试相关资料\如何测试\本机测试环境\.local\work\layers-ui-20261009\独立 工作区\核桃派软件源代码\tests\test_kernel_artifact_dependency.py:103: source-only update payload intentionally omits image build dependencies
SKIPPED [5] 测试相关资料\如何测试\本机测试环境\.local\work\layers-ui-20261009\独立 工作区\核桃派软件源代码\tests\test_media_formats.py:19: FFmpeg is not installed
SKIPPED [1] 测试相关资料\如何测试\本机测试环境\.local\work\layers-ui-20261009\独立 工作区\核桃派软件源代码\tests\test_media_formats.py:43: FFmpeg is not installed
SKIPPED [1] 测试相关资料\如何测试\本机测试环境\.local\work\layers-ui-20261009\独立 工作区\核桃派软件源代码\tests\test_media_formats.py:64: libheif examples are not installed
SKIPPED [1] 测试相关资料\如何测试\本机测试环境\.local\work\layers-ui-20261009\独立 工作区\核桃派软件源代码\tests\test_migrate_state_root.py:139: directory symlinks are unavailable on this host
SKIPPED [1] 测试相关资料\如何测试\本机测试环境\.local\work\layers-ui-20261009\独立 工作区\核桃派软件源代码\tests\test_ota_isolation_probe.py:10: only executed by the isolated legacy-worker compatibility test
504 passed, 11 skipped, 8390 warnings in 83.88s (0:01:23)
@@ -0,0 +1,2 @@
. [100%]
1 passed in 0.18s
@@ -0,0 +1,184 @@
........................................................................ [ 14%]
..........................................................F............. [ 28%]
.............................................................s.......... [ 42%]
....................................sssssss.......s..................... [ 56%]
........................................................................ [ 70%]
.......s................................................................ [ 84%]
........................................................................ [ 98%]
.......... [100%]
================================== FAILURES ===================================
_____ test_refresh_rate_config_write_failure_rolls_back_driver_and_frame ______
tmp_path = WindowsPath('<仓库根目录>/测试相关资料/如何测试/本机测试环境/.local/work/layers-ui-20261009/isolation-pytest/test_refresh_rate_config_write0')
monkeypatch = <_pytest.monkeypatch.MonkeyPatch object at 0x00000163445B46D0>
def test_refresh_rate_config_write_failure_rolls_back_driver_and_frame(
tmp_path,
monkeypatch,
):
store = ConfigStore(project_root=tmp_path)
service = DisplayService(store, driver_kind="mock")
image = Image.new("RGB", (64, 64), (9, 8, 7))
> service.show_image(image, mode="composition")
测试相关资料\如何测试\本机测试环境\.local\work\layers-ui-20261009\独立 工作区\核桃派软件源代码\tests\test_display_service.py:566:
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
测试相关资料\如何测试\本机测试环境\.local\work\layers-ui-20261009\独立 工作区\核桃派软件源代码\app\display\service.py:237: in show_image
self.config_store.set_last_mode(mode)
测试相关资料\如何测试\本机测试环境\.local\work\layers-ui-20261009\独立 工作区\核桃派软件源代码\app\config\store.py:189: in set_last_mode
self.update({"last_mode": mode})
测试相关资料\如何测试\本机测试环境\.local\work\layers-ui-20261009\独立 工作区\核桃派软件源代码\app\config\store.py:159: in update
self._write(config)
测试相关资料\如何测试\本机测试环境\.local\work\layers-ui-20261009\独立 工作区\核桃派软件源代码\app\config\store.py:193: in _write
atomic_write_bytes(
测试相关资料\如何测试\本机测试环境\.local\work\layers-ui-20261009\独立 工作区\核桃派软件源代码\app\persistence.py:14: in atomic_write_bytes
atomic_write_many_bytes(((Path(path), content),))
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
writes = ((WindowsPath('<仓库根目录>/测试相关资料/如何测试/本机测试环境/.local/work/layers-ui-20261009...ations",\n "templates"\n ],\n "performance_mode_enabled": false,\n "animation_preview_max_concurrent": 2\n}\n'),)
def atomic_write_many_bytes(writes: Iterable[tuple[Path, bytes]]) -> None:
"""Durably replace one or more files and roll back a failed transaction."""
entries = [(Path(path), bytes(content)) for path, content in writes]
if not entries:
return
targets = [path for path, _content in entries]
if len(set(targets)) != len(targets):
raise ValueError("atomic write transaction contains duplicate paths")
originals: dict[Path, bytes | None] = {}
temporaries: dict[Path, Path] = {}
replaced: list[Path] = []
parents = sorted({target.parent for target in targets}, key=str)
try:
for target, _content in entries:
target.parent.mkdir(parents=True, exist_ok=True)
originals[target] = target.read_bytes() if target.exists() else None
for target, content in entries:
temporary = _write_temporary(target, content)
temporaries[target] = temporary
for parent in parents:
_fsync_directory(parent)
for target, _content in entries:
> os.replace(temporaries[target], target)
E PermissionError: [WinError 5] 拒绝访问。: '<仓库根目录>\\测试相关资料\\如何测试\\本机测试环境\\.local\\work\\layers-ui-20261009\\isolation-pytest\\test_refresh_rate_config_write0\\data\\.config.json.30b22bb7a1fe4136ba5d2ae99b94f117.tmp' -> '<仓库根目录>\\测试相关资料\\如何测试\\本机测试环境\\.local\\work\\layers-ui-20261009\\isolation-pytest\\test_refresh_rate_config_write0\\data\\config.json'
测试相关资料\如何测试\本机测试环境\.local\work\layers-ui-20261009\独立 工作区\核桃派软件源代码\app\persistence.py:41: PermissionError
============================== warnings summary ===============================
测试相关资料\如何测试\本机测试环境\.venv\Lib\site-packages\dbus_next\service.py:87
测试相关资料\如何测试\本机测试环境\.venv\Lib\site-packages\dbus_next\service.py:87
测试相关资料\如何测试\本机测试环境\.venv\Lib\site-packages\dbus_next\service.py:87
测试相关资料\如何测试\本机测试环境\.venv\Lib\site-packages\dbus_next\service.py:87
测试相关资料\如何测试\本机测试环境\.venv\Lib\site-packages\dbus_next\service.py:87
<仓库根目录>\测试相关资料\如何测试\本机测试环境\.venv\Lib\site-packages\dbus_next\service.py:87: DeprecationWarning: 'typing.no_type_check_decorator' is deprecated and slated for removal in Python 3.15
@no_type_check_decorator
测试相关资料\如何测试\本机测试环境\.venv\Lib\site-packages\dbus_next\service.py:293: 10 warnings
<仓库根目录>\测试相关资料\如何测试\本机测试环境\.venv\Lib\site-packages\dbus_next\service.py:293: DeprecationWarning: 'typing.no_type_check_decorator' is deprecated and slated for removal in Python 3.15
@no_type_check_decorator
测试相关资料\如何测试\本机测试环境\.venv\Lib\site-packages\fastapi\routing.py:234: 83 warnings
tests/test_animations.py: 913 warnings
tests/test_api.py: 2075 warnings
tests/test_fonts.py: 249 warnings
tests/test_frp.py: 332 warnings
tests/test_library_order.py: 332 warnings
tests/test_media_conversion.py: 830 warnings
tests/test_mobile_control.py: 1162 warnings
tests/test_ota.py: 249 warnings
tests/test_performance_mode.py: 83 warnings
tests/test_scene_layers.py: 166 warnings
tests/test_templates.py: 664 warnings
tests/test_ui_copy_editor.py: 599 warnings
tests/test_wifi.py: 249 warnings
<仓库根目录>\测试相关资料\如何测试\本机测试环境\.venv\Lib\site-packages\fastapi\routing.py:234: DeprecationWarning: 'asyncio.iscoroutinefunction' is deprecated and slated for removal in Python 3.16; use inspect.iscoroutinefunction() instead
is_coroutine = asyncio.iscoroutinefunction(dependant.call)
测试相关资料\如何测试\本机测试环境\.local\work\layers-ui-20261009\独立 工作区\核桃派软件源代码\app\main.py:2049: 1 warning
tests/test_animations.py: 11 warnings
tests/test_api.py: 25 warnings
tests/test_fonts.py: 3 warnings
tests/test_frp.py: 4 warnings
tests/test_library_order.py: 4 warnings
tests/test_media_conversion.py: 10 warnings
tests/test_mobile_control.py: 14 warnings
tests/test_ota.py: 3 warnings
tests/test_performance_mode.py: 1 warning
tests/test_scene_layers.py: 2 warnings
tests/test_templates.py: 8 warnings
tests/test_ui_copy_editor.py: 7 warnings
tests/test_wifi.py: 3 warnings
<仓库根目录>\测试相关资料\如何测试\本机测试环境\.local\work\layers-ui-20261009\独立 工作区\核桃派软件源代码\app\main.py:2049: DeprecationWarning:
on_event is deprecated, use lifespan event handlers instead.
Read more about it in the
[FastAPI docs for Lifespan Events](https://fastapi.tiangolo.com/advanced/events/).
@app.on_event("startup")
测试相关资料\如何测试\本机测试环境\.venv\Lib\site-packages\fastapi\applications.py:4495: 2 warnings
tests/test_animations.py: 22 warnings
tests/test_api.py: 50 warnings
tests/test_fonts.py: 6 warnings
tests/test_frp.py: 8 warnings
tests/test_library_order.py: 8 warnings
tests/test_media_conversion.py: 20 warnings
tests/test_mobile_control.py: 28 warnings
tests/test_ota.py: 6 warnings
tests/test_performance_mode.py: 2 warnings
tests/test_scene_layers.py: 4 warnings
tests/test_templates.py: 16 warnings
tests/test_ui_copy_editor.py: 14 warnings
tests/test_wifi.py: 6 warnings
<仓库根目录>\测试相关资料\如何测试\本机测试环境\.venv\Lib\site-packages\fastapi\applications.py:4495: DeprecationWarning:
on_event is deprecated, use lifespan event handlers instead.
Read more about it in the
[FastAPI docs for Lifespan Events](https://fastapi.tiangolo.com/advanced/events/).
return self.router.on_event(event_type)
测试相关资料\如何测试\本机测试环境\.local\work\layers-ui-20261009\独立 工作区\核桃派软件源代码\app\main.py:2079: 1 warning
tests/test_animations.py: 11 warnings
tests/test_api.py: 25 warnings
tests/test_fonts.py: 3 warnings
tests/test_frp.py: 4 warnings
tests/test_library_order.py: 4 warnings
tests/test_media_conversion.py: 10 warnings
tests/test_mobile_control.py: 14 warnings
tests/test_ota.py: 3 warnings
tests/test_performance_mode.py: 1 warning
tests/test_scene_layers.py: 2 warnings
tests/test_templates.py: 8 warnings
tests/test_ui_copy_editor.py: 7 warnings
tests/test_wifi.py: 3 warnings
<仓库根目录>\测试相关资料\如何测试\本机测试环境\.local\work\layers-ui-20261009\独立 工作区\核桃派软件源代码\app\main.py:2079: DeprecationWarning:
on_event is deprecated, use lifespan event handlers instead.
Read more about it in the
[FastAPI docs for Lifespan Events](https://fastapi.tiangolo.com/advanced/events/).
@app.on_event("shutdown")
tests/test_media_conversion.py::test_free_crop_can_leave_only_one_source_pixel_visible_at_each_corner
tests/test_media_conversion.py::test_free_crop_can_leave_only_one_source_pixel_visible_at_each_corner
tests/test_media_conversion.py::test_free_crop_can_leave_only_one_source_pixel_visible_at_each_corner
tests/test_media_conversion.py::test_free_crop_can_leave_only_one_source_pixel_visible_at_each_corner
<仓库根目录>\测试相关资料\如何测试\本机测试环境\.local\work\layers-ui-20261009\独立 工作区\核桃派软件源代码\tests\test_media_conversion.py:134: DeprecationWarning: Image.Image.getdata is deprecated and will be removed in Pillow 14 (2027-10-15). Use get_flattened_data instead.
assert sum(pixel[0] > 240 for pixel in output.getdata()) == 1
tests/test_templates.py::test_template_crud_copy_persistence_and_thumbnail_cleanup
<仓库根目录>\测试相关资料\如何测试\本机测试环境\.local\work\layers-ui-20261009\独立 工作区\核桃派软件源代码\tests\test_templates.py:165: DeprecationWarning: Image.Image.getdata is deprecated and will be removed in Pillow 14 (2027-10-15). Use get_flattened_data instead.
assert len(set(image.getdata())) > 1
-- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html
=========================== short test summary info ===========================
SKIPPED [1] 测试相关资料\如何测试\本机测试环境\.local\work\layers-ui-20261009\独立 工作区\核桃派软件源代码\tests\test_repository_hygiene.py:17: repository hygiene tests require a complete Git workspace
SKIPPED [1] 测试相关资料\如何测试\本机测试环境\.local\work\layers-ui-20261009\独立 工作区\核桃派软件源代码\tests\test_kernel_artifact_dependency.py:103: source-only update payload intentionally omits image build dependencies
SKIPPED [5] 测试相关资料\如何测试\本机测试环境\.local\work\layers-ui-20261009\独立 工作区\核桃派软件源代码\tests\test_media_formats.py:19: FFmpeg is not installed
SKIPPED [1] 测试相关资料\如何测试\本机测试环境\.local\work\layers-ui-20261009\独立 工作区\核桃派软件源代码\tests\test_media_formats.py:43: FFmpeg is not installed
SKIPPED [1] 测试相关资料\如何测试\本机测试环境\.local\work\layers-ui-20261009\独立 工作区\核桃派软件源代码\tests\test_media_formats.py:64: libheif examples are not installed
SKIPPED [1] 测试相关资料\如何测试\本机测试环境\.local\work\layers-ui-20261009\独立 工作区\核桃派软件源代码\tests\test_migrate_state_root.py:139: directory symlinks are unavailable on this host
SKIPPED [1] 测试相关资料\如何测试\本机测试环境\.local\work\layers-ui-20261009\独立 工作区\核桃派软件源代码\tests\test_ota_isolation_probe.py:10: only executed by the isolated legacy-worker compatibility test
1 failed, 503 passed, 11 skipped, 8390 warnings in 86.07s (0:01:26)
Binary file not shown.

After

Width:  |  Height:  |  Size: 54 KiB

@@ -0,0 +1,95 @@
✔ derives automatic frame names from current animation name and position (0.8344ms)
✔ keeps custom frame names and restores automatic names when cleared (0.1109ms)
✔ builds non-repeating animation edit context names (0.0981ms)
✔ selects saved animation preview frames by ordered durations (0.609ms)
✔ loads every preview frame through revision-checked pagination (0.555ms)
✔ validates configurable animation preview concurrency (1.0187ms)
✔ rejects mixed revisions instead of showing a partial animation (0.4183ms)
✔ validates frame duration only when explicitly called (0.4254ms)
✔ moves selected frames as one ordered group (0.2261ms)
✔ protects an eight pixel ring around interactive drag controls (0.1889ms)
✔ reorders mixed library keys without mutating the source list (0.1202ms)
✔ restores drag eligibility after protected pointer cancellation and drag end (0.4112ms)
✔ animation workspace exposes two previews and the simplified control order (6.6239ms)
✔ normal and pixel modes expose independent ranges and presets (1.1758ms)
✔ pixel stamps are exact squares from 1x1 through 4x4 (0.2195ms)
✔ pixel stamps clip at every canvas edge (0.1762ms)
✔ normal circle geometry remains unchanged (0.0804ms)
✔ line interpolation includes endpoints without coordinate gaps (0.2975ms)
✔ older tools migrate while v3 restores the coordinate guide choice (0.2289ms)
✔ coordinate guide spacing adapts to the transformed logical pixel size (0.1372ms)
✔ coordinate guide ticks preserve logical values through zoom and pan (0.1836ms)
✔ pixel mode markup and grid stay accessible and non-interactive (6.5794ms)
✔ pixel undo history stores changed snapshots, caps entries, and clears (0.3632ms)
✔ canvas view clamps scale and keeps a visible section in the viewport (0.1771ms)
✔ zooming around an anchor preserves its logical position (0.121ms)
✔ floating editor button stays inside its safe viewport bounds (0.0683ms)
✔ canvas editor markup, guarded input, and checkpoint events stay wired (2.1547ms)
✔ normalizes and converts hexadecimal colors (1.0959ms)
✔ converts RGB and HSV boundaries (0.2125ms)
✔ round trips representative colors within 8-bit rounding (0.2085ms)
✔ recent colors deduplicate, normalize, and evict the oldest (0.2279ms)
✔ formats and projects looping playback without moving paused content (1.0028ms)
✔ seek dispatcher keeps one request in flight and flushes the newest position (2.277ms)
✔ topbar current display dialog exposes static close and animation controls (2.8138ms)
✔ device workspace exposes the compact immediate pure-color test flow (5.2814ms)
✔ font catalog normalization, grouping, and search are stable (1.2077ms)
✔ font picker implements commit-only searchable combobox keyboard behavior (3.0832ms)
✔ settings places unrestricted FRP maintenance at the bottom (4.0794ms)
✔ FRP editor uses raw server storage and official validation errors (0.9054ms)
✔ network diagnostics renders layered evidence (1.276ms)
✔ unavailable controls never masquerade as indefinite loading (5.2608ms)
✔ action controls do not bypass the shared state module (6.9201ms)
✔ HTTP requests time out with a stable user-facing error (22.2398ms)
✔ demo library actions stay black, explain restrictions, and preserve copy (0.9731ms)
✔ sortable cards protect controls and keep demo cards fixed (0.9556ms)
✔ media import workspace exposes streaming upload, crop controls, and queue polling (1.1751ms)
✔ free framing starts from the complete source and keeps one pixel visible (0.6278ms)
✔ free framing copy is stable and catalogued (0.0933ms)
✔ upload action has visible ordinary-build copy (0.2064ms)
✔ media naming happens after analysis and conflicts keep the draft (0.1499ms)
✔ awaiting-settings cards survive polling without hiding server transitions (0.1005ms)
✔ old scene migration rejects unknown fields and duplicate text without filtering (49.3698ms)
✔ PNG compression round trips sparse and full brush pixels without DOM (4.3169ms)
✔ blank and black are distinct; independent backgrounds follow layer order (3.1915ms)
✔ disabled background colors stay independent through storage and copy (12.446ms)
✔ extended pixels survive storage but never enter the central output (5.3709ms)
✔ move preview does not mutate source; confirmed clipping removes only outside ink (9.928ms)
✔ text clipping follows anchor and scale and is retained after edit/reload/copy (7.5961ms)
✔ multiple text groups isolate edits, copies and IDs (0.9609ms)
✔ strict v2 storage protects unknown data and the final brush invariant (3.8003ms)
✔ creates a fixed 64x64 RGB scene (6.227ms)
✔ serializes pixelRgb as base64 and round trips an independent scene (30.277ms)
✔ moves a valid v1 draft to the stable key before removing exact legacy keys (30.4664ms)
✔ keeps the v1 draft and all legacy keys when stable-key migration cannot write (16.3615ms)
✔ preserves and blocks a future stable draft instead of falling back or writing blank (6.9734ms)
✔ preserves and blocks a damaged stable draft (0.2876ms)
✔ does not discard a damaged higher-priority legacy key during fallback migration (1.4569ms)
✔ rejects damaged scene roots while skipping only damaged elements (10.0087ms)
✔ normalizes text fields and creates a centered lowercase ok element (0.4748ms)
✔ migrates the first valid canvas by v3, v2, legacy priority and merges text v1 (8.6045ms)
✔ supports independent add, update, and delete operations for multiple text elements (0.4692ms)
✔ duplicates with a deep copy, new id, 2px offset, and topmost order (0.2556ms)
✔ alpha-composites full RGBA layers in array order without mutating inputs (1.8318ms)
✔ settings brightness explains an active temporary display-test override (5.5205ms)
✔ settings exposes full OTA upload progress and service recovery polling (3.2091ms)
✔ settings automatically opens and safely copies a detailed OTA failure log (1.5628ms)
✔ settings exposes a transactional performance-mode switch with the fixed warning (1.5066ms)
✔ settings exposes persisted animation preview concurrency below performance mode (2.5054ms)
✔ template edit baseline distinguishes clean, dirty, and unbound scenes (1.984ms)
✔ template manager uses a monitor and unified four-row card actions (8.406ms)
✔ animation editing backs up and restores template edit ownership (1.8903ms)
✔ special editor exposes the agreed modes and guarded editing flow (5.876ms)
✔ latched WiFi draft state remains dirty until explicitly cleared (1.131ms)
✔ WiFi settings expose independent network and prompt-delay controls (2.1816ms)
✔ workspace order resolves saved ids and appends new registrations (0.8661ms)
✔ workspace order movement is immutable and respects both boundaries (0.1794ms)
✔ drawer exposes one editable list and commits only from the save action (5.1424ms)
ℹ tests 87
ℹ suites 0
ℹ pass 87
ℹ fail 0
ℹ cancelled 0
ℹ skipped 0
ℹ todo 0
ℹ duration_ms 544.9717
@@ -0,0 +1,14 @@
私有凭据文件可用;未输出任何凭据值。
/usr/bin/python3
/usr/bin/git
/usr/bin/curl
/usr/bin/tar
/usr/bin/sha256sum
/usr/bin/make
/usr/bin/gcc
Python 3.11.2
aarch64
Baseline content: 9 templates, 6 animations, 195 frames
deployment.tar.gz: OK
@@ -0,0 +1,20 @@
[
{
"width": 1280,
"result": {
"passed": true,
"nativeConfirmations": 6,
"layers": 3,
"errors": []
}
},
{
"width": 320,
"result": {
"passed": true,
"nativeConfirmations": 6,
"layers": 3,
"errors": []
}
}
]
@@ -0,0 +1,19 @@
{
"width": 390,
"labelToggle": true,
"background": "rgb(23, 28, 36)",
"checkbox": {
"x": 36,
"y": 300.203125,
"width": 20,
"height": 20
},
"frameList": {
"clientHeight": 405,
"scrollHeight": 1032
},
"pageWidth": {
"viewport": 390,
"scroll": 390
}
}
@@ -0,0 +1,4 @@
私有凭据文件可用;未输出任何凭据值。
All persistent files, pixels, names, frame order and durations match baseline.
{"service": {"app_version": "017ed103e3aef71c", "software_version": "1.1.3", "feature_updated_at": "2026-10-09T16:12+08:00"}, "driver": {"actual_refresh_rate_hz": 97.412, "panel_scan_rate_hz": 97.412, "completed_frames": 25279, "completed_scans": 25279, "scans_per_frame": 1, "deadline_misses": 0, "buffer_swaps": 647, "submitted_frames": 647, "oe_timing_backend": "h618-pwm4", "oe_pulse_faults": 0, "oe_forced_blanks": 0, "max_programmed_oe_ns": 128000, "oe_timing_error": null, "safeoff_error": null, "cpu_affinity": 3, "cpu_affinity_active": true, "cpu_affinity_error": null, "realtime_priority": 50, "realtime_priority_active": true, "realtime_priority_error": null, "memory_locked": true, "memory_lock_error": null, "running": true, "governor": "ondemand", "last_error": null}}