Add bundled bus fonts and shared font favorites

This commit is contained in:
2026-10-12 15:00:40 +08:00
parent c9dd03c23b
commit 4be74a34f9
181 changed files with 2078575 additions and 76 deletions
@@ -0,0 +1,35 @@
# 公交窄体首版验收
已制作、集成并部署“核桃公交窄体(推荐16px)”。字格 8×16,6763 个 GB2312 汉字、95 个可打印 ASCII、26 个标点/符号,共 6884 个码位。完整字模、42 项逐字修订、离线构建脚本、锁文件、wheel、上游许可和校验信息保存在 `核桃派软件源代码/font_sources/walnut-bus-8x16/`。字体本体为 `核桃派软件源代码/app/fonts/bundled/WalnutBus8x16.ttf`,摘要见 manifest 与 summary。
## 实际验证
- 本机 Python 相关套件 68 项及补充的新字体模板/裁切/回退测试 1 项通过;Node 字体选择器、场景、图层 24 项通过。
- 全部 6884 个字符在 16px 下与字模逐像素一致,alpha 只有 0/255;非空字符无空白、无越格,最后一列保留间隔。32/48/64px 的重点字与整数倍最近邻放大一致。
- 14 页最终字形图册分批查看;重复字形只有空格/全角空格。密度最高 32 字记录在 audit 中;复杂字简化边界保留,不以覆盖检查代替辨识率实验。
- 带中文和空格的隔离副本从新建字体 venv、本地锁定 wheel 重建,TTF 字节一致,完整校样再次通过。
- 网页实际搜索、选择、16px 设置及三行最终合成预览已检查,见 `网页最终预览.jpg`。截图来自本机 mock 页面,“未连接”状态仅指本机 mock 的设备网络信息,不代表部署失败。
- 核桃派隔离候选中累计 68 项 Python 测试通过。1 项 Node 跨语言比较因板端没有 Node 跳过,同项已在本机通过,没有为本次字体任务增加板端 Node 依赖。
- 部署前后 446 个原有持久文件摘要一致,只新增 1 个字体文件。真实 stop/start 的运行目录保留检查通过;后续真实 restart 后 447 个持久文件摘要一致,字体目录仍可用。
- 设备实际 `/api/preview/text-layer` 返回的五组 PNG 在重启前后字节一致,解码后与本机预览逐像素一致。`device-*.png` 是设备原始透明预览;`设备渲染样张.png` 是关闭平滑的放大排版,不是摄像头画面。
- H618 真实驱动仍可用,读取状态时最后错误、OE 错误及 safeoff 错误均为空。驱动参数和扫描实现未改;不据启动时刷新率采样值声称实屏视觉验收或刷新性能验收通过。
正式 VERSION 保持原值,没有导出 OTA/IMG、没有修改或发布 App。功能更新时间为 `2026-10-12T11:09+08:00`。未启动摄像头、未切换实屏测试图案,也没有物理接线或断电操作。
## 已修复的测试准备问题
首次 SFTP 直传任务运行目录失败:父目录仅 root 可访问,子目录 chown 无法绕过父目录权限。改用具名 `/var/tmp/` 暂存后由 sudo 转入任务目录,立即删除上传文件,没有放宽生产目录权限。
隔离候选首次遗漏 VERSION 导致测试无法收集,补齐后有 66 项通过、1 项 Node 比较跳过;另一个测试因遗漏 systemd 文件失败。补齐原生产 systemd 文件后定向重测该项通过。均未在失败状态下切换生产服务。记录中的旧部署路径来自板端历史 `.pyc` 的 traceback,不是对旧工作区的构建依赖。
可重复经验已更新到 `测试相关资料/如何测试/核桃派点阵屏控制服务测试流程.md` 的 TEST-BUS-FONT 条目。接缝合并、bearing、构建锁定和复杂字边界也记录在字体源目录 README。
## 回滚与清理
`rollback.tar.gz` 保存部署前被替换的程序文件,`deployed-files.json` 登记本轮程序文件;回滚时停服务、恢复 backup 中的旧文件,再移除登记的新增程序文件,然后启动并等待健康检查。持久字体、用户配置和用户资源不删除;保留运行目录,不修改 systemd unit。该备份不含设备凭据。
远端本轮候选、测试数据、程序备份和日志在归档拉回后清理,具体路径和结果见 `cleanup.json`。本机持续使用的字体构建环境保留在项目专用 `.local/font-build/`。临时网页与 mock 服务已关闭。本机 10 个具名任务目录及 7 个一次性辅助脚本的批量清理被安全策略拒绝,工具仅返回 blocked by policy,没有提供进一步原因;未换手段重试。本机这些文件仍在,已无用途,可由用户按 `cleanup.json` 的完整仓库相对路径手动删除;不得删除其中未列出的材料、持续环境或用户数据。
## 保留边界
8 列汉字不是标准印刷字形,罕用密集字(如鹤、警、藏、赢、鬻及密度榜中的字符)仍依赖简化和上下文;尚未做真实用户逐字辨识率测试。非 16px 整数倍字号不保证二值边缘。网页最终帧作为本轮视觉依据,不记录为物理实屏观察通过。
@@ -0,0 +1,174 @@
{
"glyph_count": 6884,
"grey": [],
"blank": [],
"right_edge_lit": [],
"duplicates": [
[
"0020",
"3000"
]
],
"densest_32": [
{
"codepoint": "9190",
"lit_pixels": 69,
"density": 0.5390625
},
{
"codepoint": "571C",
"lit_pixels": 69,
"density": 0.5390625
},
{
"codepoint": "9CB4",
"lit_pixels": 68,
"density": 0.53125
},
{
"codepoint": "91B4",
"lit_pixels": 67,
"density": 0.5234375
},
{
"codepoint": "86D0",
"lit_pixels": 67,
"density": 0.5234375
},
{
"codepoint": "7792",
"lit_pixels": 67,
"density": 0.5234375
},
{
"codepoint": "5708",
"lit_pixels": 67,
"density": 0.5234375
},
{
"codepoint": "916E",
"lit_pixels": 66,
"density": 0.515625
},
{
"codepoint": "817C",
"lit_pixels": 66,
"density": 0.515625
},
{
"codepoint": "811A",
"lit_pixels": 66,
"density": 0.515625
},
{
"codepoint": "7784",
"lit_pixels": 66,
"density": 0.515625
},
{
"codepoint": "64D0",
"lit_pixels": 66,
"density": 0.515625
},
{
"codepoint": "5704",
"lit_pixels": 66,
"density": 0.515625
},
{
"codepoint": "9E4F",
"lit_pixels": 65,
"density": 0.5078125
},
{
"codepoint": "9B4D",
"lit_pixels": 65,
"density": 0.5078125
},
{
"codepoint": "8774",
"lit_pixels": 65,
"density": 0.5078125
},
{
"codepoint": "80F4",
"lit_pixels": 65,
"density": 0.5078125
},
{
"codepoint": "7F71",
"lit_pixels": 65,
"density": 0.5078125
},
{
"codepoint": "570A",
"lit_pixels": 65,
"density": 0.5078125
},
{
"codepoint": "5703",
"lit_pixels": 65,
"density": 0.5078125
},
{
"codepoint": "9CD3",
"lit_pixels": 64,
"density": 0.5
},
{
"codepoint": "961A",
"lit_pixels": 64,
"density": 0.5
},
{
"codepoint": "8DDA",
"lit_pixels": 64,
"density": 0.5
},
{
"codepoint": "89D0",
"lit_pixels": 64,
"density": 0.5
},
{
"codepoint": "89CF",
"lit_pixels": 64,
"density": 0.5
},
{
"codepoint": "8334",
"lit_pixels": 64,
"density": 0.5
},
{
"codepoint": "77B0",
"lit_pixels": 64,
"density": 0.5
},
{
"codepoint": "77A9",
"lit_pixels": 64,
"density": 0.5
},
{
"codepoint": "56EB",
"lit_pixels": 64,
"density": 0.5
},
{
"codepoint": "56E4",
"lit_pixels": 64,
"density": 0.5
},
{
"codepoint": "9F83",
"lit_pixels": 63,
"density": 0.4921875
},
{
"codepoint": "9603",
"lit_pixels": 63,
"density": 0.4921875
}
]
}
@@ -0,0 +1,31 @@
{
"removed": [
"/run/matrix-screen-controller/bus-font-20261012",
"/var/tmp/qms-bus-font-upload-20261012.tar"
],
"shared_runtime_preserved": true,
"service_active": true,
"font_available": true,
"local_unused_manual_cleanup": [
"测试相关资料/如何测试/本机测试环境/.local/work/公交 字体隔离",
"测试相关资料/如何测试/本机测试环境/.local/work/bus-deploy",
"测试相关资料/如何测试/本机测试环境/.local/work/bus-extra-pytest",
"测试相关资料/如何测试/本机测试环境/.local/work/bus-font-proof-final",
"测试相关资料/如何测试/本机测试环境/.local/work/bus-font-proof-v1",
"测试相关资料/如何测试/本机测试环境/.local/work/bus-font-proof-v2",
"测试相关资料/如何测试/本机测试环境/.local/work/bus-font-proof-v3",
"测试相关资料/如何测试/本机测试环境/.local/work/bus-parity-data",
"测试相关资料/如何测试/本机测试环境/.local/work/bus-pytest",
"测试相关资料/如何测试/本机测试环境/.local/work/bus-web",
"测试相关资料/如何测试/本机测试环境/.local/work/archive_bus_font.py",
"测试相关资料/如何测试/本机测试环境/.local/work/bus_remote.py",
"测试相关资料/如何测试/本机测试环境/.local/work/cleanup_bus_remote.py",
"测试相关资料/如何测试/本机测试环境/.local/work/deploy_bus_font.py",
"测试相关资料/如何测试/本机测试环境/.local/work/isolate_bus_font.py",
"测试相关资料/如何测试/本机测试环境/.local/work/refine_bus_font.py",
"测试相关资料/如何测试/本机测试环境/.local/work/verify_bus_device.py"
],
"local_cleanup_rejected": "blocked by policy; no further reason provided",
"font_build_environment_retained": true,
"mock_server_stopped": true
}
Binary file not shown.

After

Width:  |  Height:  |  Size: 30 KiB

@@ -0,0 +1,31 @@
{
"restorable_files": [
"FEATURE_UPDATED_AT",
"app/fonts/store.py",
"tests/test_fonts.py"
],
"added_program_files": [
"app/fonts/bundled/LICENSES/boutique-bitmap-7x7/OFL.txt",
"app/fonts/bundled/LICENSES/galmuri/LICENSE.txt",
"app/fonts/bundled/LICENSES/misaki/misaki.txt",
"app/fonts/bundled/LICENSES/miseki-bitmap/LICENSE.txt",
"app/fonts/bundled/OFL.txt",
"app/fonts/bundled/WalnutBus8x16.ttf",
"app/fonts/bundled/manifest.json",
"font_sources/walnut-bus-8x16/README.md",
"font_sources/walnut-bus-8x16/glyphs.json",
"font_sources/walnut-bus-8x16/requirements-build.lock.txt",
"font_sources/walnut-bus-8x16/revisions.json",
"font_sources/walnut-bus-8x16/upstream/LICENSES/boutique-bitmap-7x7/OFL.txt",
"font_sources/walnut-bus-8x16/upstream/LICENSES/galmuri/LICENSE.txt",
"font_sources/walnut-bus-8x16/upstream/LICENSES/misaki/misaki.txt",
"font_sources/walnut-bus-8x16/upstream/LICENSES/miseki-bitmap/LICENSE.txt",
"font_sources/walnut-bus-8x16/upstream/OFL.txt",
"font_sources/walnut-bus-8x16/upstream/fusion-8px-bdf.zip",
"font_sources/walnut-bus-8x16/upstream/fusion-pixel-8px-monospaced-zh_hans.bdf",
"font_sources/walnut-bus-8x16/upstream/source.json",
"scripts/build_bus_font.py",
"scripts/proof_bus_font.py",
"tests/test_bus_font.py"
]
}
@@ -0,0 +1,235 @@
8d99e3cb8c63490e019dd3d567ba874dd75c250dc9b94fb0fb6097717568970d /run/[private]-screen-controller/bus-font-20261012/payload.tar
==================================== ERRORS ====================================
___________________ ERROR collecting tests/test_bus_font.py ____________________
app/ota/versioning.py:36: in read_software_version
return SoftwareVersion.parse(path.read_text(encoding="utf-8"))
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
/usr/lib/python3.11/pathlib.py:1059: in read_text
with self.open(mode='r', encoding=encoding, errors=errors) as f:
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
/usr/lib/python3.11/pathlib.py:1045: in open
return io.open(self, mode, buffering, encoding, errors, newline)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
E FileNotFoundError: [Errno 2] No such file or directory: '/run/[private]-screen-controller/bus-font-20261012/candidate/VERSION'
The above exception was the direct cause of the following exception:
tests/test_bus_font.py:16: in <module>
from app.main import create_app
app/main.py:2106: in <module>
app = create_app(ui_copy_editor_build_enabled=UI_COPY_EDITOR_BUILD_ENABLED)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
app/main.py:449: in create_app
software_version = read_software_version(code_root)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
app/ota/versioning.py:38: in read_software_version
raise RuntimeError(f"software VERSION file is unreadable: {path}") from exc
E RuntimeError: software VERSION file is unreadable: /run/[private]-screen-controller/bus-font-20261012/candidate/VERSION
_____________________ ERROR collecting tests/test_fonts.py _____________________
app/ota/versioning.py:36: in read_software_version
return SoftwareVersion.parse(path.read_text(encoding="utf-8"))
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
/usr/lib/python3.11/pathlib.py:1059: in read_text
with self.open(mode='r', encoding=encoding, errors=errors) as f:
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
/usr/lib/python3.11/pathlib.py:1045: in open
return io.open(self, mode, buffering, encoding, errors, newline)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
E FileNotFoundError: [Errno 2] No such file or directory: '/run/[private]-screen-controller/bus-font-20261012/candidate/VERSION'
The above exception was the direct cause of the following exception:
tests/test_fonts.py:12: in <module>
from app.main import create_app
app/main.py:2106: in <module>
app = create_app(ui_copy_editor_build_enabled=UI_COPY_EDITOR_BUILD_ENABLED)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
app/main.py:449: in create_app
software_version = read_software_version(code_root)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
app/ota/versioning.py:38: in read_software_version
raise RuntimeError(f"software VERSION file is unreadable: {path}") from exc
E RuntimeError: software VERSION file is unreadable: /run/[private]-screen-controller/bus-font-20261012/candidate/VERSION
_________________ ERROR collecting tests/test_scene_layers.py __________________
app/ota/versioning.py:36: in read_software_version
return SoftwareVersion.parse(path.read_text(encoding="utf-8"))
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
/usr/lib/python3.11/pathlib.py:1059: in read_text
with self.open(mode='r', encoding=encoding, errors=errors) as f:
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
/usr/lib/python3.11/pathlib.py:1045: in open
return io.open(self, mode, buffering, encoding, errors, newline)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
E FileNotFoundError: [Errno 2] No such file or directory: '/run/[private]-screen-controller/bus-font-20261012/candidate/VERSION'
The above exception was the direct cause of the following exception:
/usr/lib/python3.11/importlib/__init__.py:126: in import_module
return _bootstrap._gcd_import(name[level:], package, level)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
<frozen importlib._bootstrap>:1206: in _gcd_import
???
<frozen importlib._bootstrap>:1178: in _find_and_load
???
<frozen importlib._bootstrap>:1149: in _find_and_load_unlocked
???
<frozen importlib._bootstrap>:690: in _load_unlocked
???
/opt/[private]-screen-controller/.venv/lib/python3.11/site-packages/_pytest/assertion/rewrite.py:186: in exec_module
exec(co, module.__dict__)
/opt/[private]-screen-controller.stage.animation-20261010-094a526b/tests/test_scene_layers.py:11: in <module>
???
app/main.py:2106: in <module>
app = create_app(ui_copy_editor_build_enabled=UI_COPY_EDITOR_BUILD_ENABLED)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
app/main.py:449: in create_app
software_version = read_software_version(code_root)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
app/ota/versioning.py:38: in read_software_version
raise RuntimeError(f"software VERSION file is unreadable: {path}") from exc
E RuntimeError: software VERSION file is unreadable: /run/[private]-screen-controller/bus-font-20261012/candidate/VERSION
___________________ ERROR collecting tests/test_templates.py ___________________
app/ota/versioning.py:36: in read_software_version
return SoftwareVersion.parse(path.read_text(encoding="utf-8"))
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
/usr/lib/python3.11/pathlib.py:1059: in read_text
with self.open(mode='r', encoding=encoding, errors=errors) as f:
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
/usr/lib/python3.11/pathlib.py:1045: in open
return io.open(self, mode, buffering, encoding, errors, newline)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
E FileNotFoundError: [Errno 2] No such file or directory: '/run/[private]-screen-controller/bus-font-20261012/candidate/VERSION'
The above exception was the direct cause of the following exception:
/usr/lib/python3.11/importlib/__init__.py:126: in import_module
return _bootstrap._gcd_import(name[level:], package, level)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
<frozen importlib._bootstrap>:1206: in _gcd_import
???
<frozen importlib._bootstrap>:1178: in _find_and_load
???
<frozen importlib._bootstrap>:1149: in _find_and_load_unlocked
???
<frozen importlib._bootstrap>:690: in _load_unlocked
???
/opt/[private]-screen-controller/.venv/lib/python3.11/site-packages/_pytest/assertion/rewrite.py:186: in exec_module
exec(co, module.__dict__)
/opt/[private]-screen-controller.stage.animation-20261010-094a526b/tests/test_templates.py:10: in <module>
???
app/main.py:2106: in <module>
app = create_app(ui_copy_editor_build_enabled=UI_COPY_EDITOR_BUILD_ENABLED)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
app/main.py:449: in create_app
software_version = read_software_version(code_root)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
app/ota/versioning.py:38: in read_software_version
raise RuntimeError(f"software VERSION file is unreadable: {path}") from exc
E RuntimeError: software VERSION file is unreadable: /run/[private]-screen-controller/bus-font-20261012/candidate/VERSION
______________________ ERROR collecting tests/test_api.py ______________________
app/ota/versioning.py:36: in read_software_version
return SoftwareVersion.parse(path.read_text(encoding="utf-8"))
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
/usr/lib/python3.11/pathlib.py:1059: in read_text
with self.open(mode='r', encoding=encoding, errors=errors) as f:
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
/usr/lib/python3.11/pathlib.py:1045: in open
return io.open(self, mode, buffering, encoding, errors, newline)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
E FileNotFoundError: [Errno 2] No such file or directory: '/run/[private]-screen-controller/bus-font-20261012/candidate/VERSION'
The above exception was the direct cause of the following exception:
/usr/lib/python3.11/importlib/__init__.py:126: in import_module
return _bootstrap._gcd_import(name[level:], package, level)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
<frozen importlib._bootstrap>:1206: in _gcd_import
???
<frozen importlib._bootstrap>:1178: in _find_and_load
???
<frozen importlib._bootstrap>:1149: in _find_and_load_unlocked
???
<frozen importlib._bootstrap>:690: in _load_unlocked
???
/opt/[private]-screen-controller/.venv/lib/python3.11/site-packages/_pytest/assertion/rewrite.py:186: in exec_module
exec(co, module.__dict__)
/opt/[private]-screen-controller.stage.animation-20261010-094a526b/tests/test_api.py:11: in <module>
???
app/main.py:2106: in <module>
app = create_app(ui_copy_editor_build_enabled=UI_COPY_EDITOR_BUILD_ENABLED)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
app/main.py:449: in create_app
software_version = read_software_version(code_root)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
app/ota/versioning.py:38: in read_software_version
raise RuntimeError(f"software VERSION file is unreadable: {path}") from exc
E RuntimeError: software VERSION file is unreadable: /run/[private]-screen-controller/bus-font-20261012/candidate/VERSION
=========================== short test summary info ============================
ERROR tests/test_bus_font.py - RuntimeError: software VERSION file is unreada...
ERROR tests/test_fonts.py - RuntimeError: software VERSION file is unreadable...
ERROR tests/test_scene_layers.py - RuntimeError: software VERSION file is unr...
ERROR tests/test_templates.py - RuntimeError: software VERSION file is unread...
ERROR tests/test_api.py - RuntimeError: software VERSION file is unreadable: ...
!!!!!!!!!!!!!!!!!!! Interrupted: 5 errors during collection !!!!!!!!!!!!!!!!!!!!
5 errors in 8.77s
8d99e3cb8c63490e019dd3d567ba874dd75c250dc9b94fb0fb6097717568970d /run/[private]-screen-controller/bus-font-20261012/payload.tar
.....................s........................................F..... [100%]
=================================== FAILURES ===================================
____ test_systemd_preserves_runtime_marker_across_service_stop_and_restart _____
/opt/[private]-screen-controller.stage.animation-20261010-094a526b/tests/test_api.py:1144: in test_systemd_preserves_runtime_marker_across_service_stop_and_restart
???
/usr/lib/python3.11/pathlib.py:1059: in read_text
with self.open(mode='r', encoding=encoding, errors=errors) as f:
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
/usr/lib/python3.11/pathlib.py:1045: in open
return io.open(self, mode, buffering, encoding, errors, newline)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
E FileNotFoundError: [Errno 2] No such file or directory: '/run/[private]-screen-controller/bus-font-20261012/candidate/systemd/[private]-screen-controller.service'
=========================== short test summary info ============================
FAILED tests/test_api.py::test_systemd_preserves_runtime_marker_across_service_stop_and_restart
1 failed, 66 passed, 1 skipped, 165 warnings in 239.70s (0:03:59)
8d99e3cb8c63490e019dd3d567ba874dd75c250dc9b94fb0fb6097717568970d /run/[private]-screen-controller/bus-font-20261012/payload.tar
. [100%]
1 passed, 67 deselected, 4 warnings in 7.18s
{"result": "deployed", "preserved_files": 446, "added_fonts": 1, "runtime_survived_stop": true, "manifest": {"id": "builtin:walnut-bus-8x16", "file": "WalnutBus8x16.ttf", "sha256": "d38bf29d6408a6f731865a1ca760a80b5156ebf6ab96d5ad8d649df28163564c", "label": "核桃公交窄体(推荐16px)", "family": "核桃公交窄体", "style": "Regular", "glyph_count": 6884, "recommended_size": 16, "cell": [8, 16]}, "status_keys": ["frp", "mobile", "network", "ok", "power", "resources", "screen", "service", "state", "system", "ui"]}
{
"result": "deployed",
"preserved_files": 446,
"added_fonts": 1,
"runtime_survived_stop": true,
"manifest": {
"id": "builtin:walnut-bus-8x16",
"file": "WalnutBus8x16.ttf",
"sha256": "d38bf29d6408a6f731865a1ca760a80b5156ebf6ab96d5ad8d649df28163564c",
"label": "核桃公交窄体(推荐16px)",
"family": "核桃公交窄体",
"style": "Regular",
"glyph_count": 6884,
"recommended_size": 16,
"cell": [
8,
16
]
},
"status_keys": [
"frp",
"mobile",
"network",
"ok",
"power",
"resources",
"screen",
"service",
"state",
"system",
"ui"
]
}
Binary file not shown.

After

Width:  |  Height:  |  Size: 306 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 277 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 241 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 300 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 343 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 82 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 83 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 85 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 84 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 84 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 86 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 86 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 85 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 85 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 84 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 88 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 85 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 87 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 44 KiB

@@ -0,0 +1,33 @@
{
"result": "deployed",
"preserved_files": 446,
"added_fonts": 1,
"runtime_survived_stop": true,
"manifest": {
"id": "builtin:walnut-bus-8x16",
"file": "WalnutBus8x16.ttf",
"sha256": "d38bf29d6408a6f731865a1ca760a80b5156ebf6ab96d5ad8d649df28163564c",
"label": "核桃公交窄体(推荐16px)",
"family": "核桃公交窄体",
"style": "Regular",
"glyph_count": 6884,
"recommended_size": 16,
"cell": [
8,
16
]
},
"status_keys": [
"frp",
"mobile",
"network",
"ok",
"power",
"resources",
"screen",
"service",
"state",
"system",
"ui"
]
}
@@ -0,0 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:3bee3131dc687230ec0f39eb22b7e8a26ae8a866a6ce2481018b9dbca3d7f67f
size 5744
@@ -0,0 +1,41 @@
{
"font_sha256": "d38bf29d6408a6f731865a1ca760a80b5156ebf6ab96d5ad8d649df28163564c",
"glyph_count": 6884,
"han_count": 6763,
"manual_revisions": 42,
"local_python_passed": 69,
"frontend_node_passed": 24,
"device_python_passed": 68,
"device_skipped": 1,
"device_skip_reason": "Node cross-language parity is local-only; passed locally",
"isolated_rebuild_identical": true,
"pixel_parity": {
"route": true,
"market": true,
"dense": true,
"latin": true,
"large": true
},
"inspected_glyph_sheets": [
1,
2,
3,
4,
5,
6,
7,
8,
9,
10,
11,
12,
13,
14
],
"known_limits": [
"8-column complex glyphs use reduced forms; rare dense characters benefit from context",
"nonmultiples of 16px are not guaranteed binary"
],
"camera_used": false,
"physical_screen_visual_verification": false
}
@@ -0,0 +1,54 @@
{
"restart_preserved_files": 447,
"preview_restart_identical": true,
"screen": {
"width": 64,
"height": 64,
"driver": "walnutpi-h618-hub75",
"driver_available": true,
"driver_error": null,
"hardware_mapping": "walnutpi-pi-bank-pwm-oe-v2",
"driver_options": {
"rows": 64,
"cols": 64,
"scan_rows": 32,
"row_address_bits": 5,
"pwm_bits": 7,
"hardware_mapping": "walnutpi-pi-bank-pwm-oe-v2",
"brightness": 40,
"limit_refresh_rate_hz": 100,
"pio_base": "0x0300B000",
"pi_bank_offset": "0x120",
"data_offset": "0x10",
"cpu_affinity": 3,
"realtime_priority": 50
},
"driver_status": {
"actual_refresh_rate_hz": 0.0,
"panel_scan_rate_hz": 0.0,
"completed_frames": 193,
"completed_scans": 193,
"scans_per_frame": 1,
"deadline_misses": 0,
"buffer_swaps": 4,
"submitted_frames": 4,
"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
}
}
}
Binary file not shown.

After

Width:  |  Height:  |  Size: 50 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 11 KiB