docs: align repository names and bilingual entry points; remove obsolete reports
Community checks / verify (push) Skipped
Verify Frame Flow / verify (push) Successful in 4m57s

This commit is contained in:
渡口浪人
2026-10-18 17:53:43 +08:00
parent 51d76a196e
commit f39c7e535b
4 changed files with 1 additions and 173 deletions
-62
View File
@@ -1,62 +0,0 @@
# UI 一致性与图片加载检查
页面使用既有真实元数据创建控件和图片区域,不使用页面骨架或虚构图片卡片。
搜索、排序、卡片操作与写入保护在图片请求前初始化;已知图库数据可先显示,
后台刷新元数据。首页图片独立加载,不阻塞后续页面内容。
图片共用局部加载函数:旋转指示器仅居中显示于所属图片容器,网络请求与解码完成后
立即显示图片,失败后显示中英文提示。没有固定等待或动画最短展示时长。
图库仅请求可见区域及附近图片。浏览器禁缓存不会清除服务端缩略图缓存,
快速图片可能在第一帧绘制前完成,动画不一定肉眼可见。
手动拼版先创建全部真实区域与坐标/拖动交互,再并行请求图片。
每张图片独立完成或失败,持久的区域容器保持加载前后几何位置与坐标索引稳定。
过期布局事件不修改新的规划。
移动端导航单行横向滚动,当前入口自动进入可见区域;低高度横屏侧栏可滚动。
页头在窄屏分行,并为底部安全区域留白。可见控件保留 44 像素触控高度,
当前导航使用 aria-current,扩展表单标签关联相应控件。
表格与手机导航允许容器内滚动,不应导致整页水平溢出。
## 自动检查
使用隔离 Mock 服务、临时数据与测试账号,禁止对生产执行可写的 Mock 脚本。
Photos 授权使用拦截测试响应;不需要真实 NAS 凭据。
```sh
FRAME_FLOW_URL=http://127.0.0.1:6005 \
FRAME_FLOW_ENV_FILE=/path/to/mock.env \
FRAME_FLOW_TEST_USERNAME=test-ui \
FRAME_FLOW_TEST_PASSWORD=test-only-password \
node scripts/ui-layout-audit.cjs
```
需要已安装的 Playwright;可通过 NODE_PATH 指定运行时。
FRAME_FLOW_VIEWPORTS 接受包含 width/height 的 JSON 数组;
FRAME_FLOW_SCREENSHOT_DIR 可选,用于保存仅含测试数据的截图。
| 脚本 | 检查范围 | 本次结果 |
| --- | --- | --- |
| ui-layout-audit.cjs | 11 页面、本地/云端图库、6 类弹窗、展开手动拼版;溢出、控件间距、触控高度、弹窗边界 | 16 组尺寸/语言/主题组合,305 项通过 |
| ui-image-loading.cjs | 三种宽度、明暗主题;局部居中、成功解码、错误提示与无障碍状态 | 45 项通过 |
| ui-progressive-loading.cjs | 阻塞初始化/元数据/图片/任务筛选;首次无缓存时控件先就绪、输入保留、慢请求切换、列表失败、无骨架 | 18 项通过 |
| ui-studio-image-loading.cjs | 桌面/手机、明暗主题;并行请求、独立完成/失败、坐标与拖动、稳定区域 | 31 项通过 |
上述检查无页面脚本异常。生产静态文件与构建文件哈希比对、health/ready 检查通过;
生产浏览器交互验证使用拦截的账号、规划及素材响应,对真实服务仅 GET,
不代表真实账号密码登录、AI 生成、iOS/Android 实机或软键盘测试。
连接中心内容较长,后续可按用户任务分组;模板与排版导航图标仍有重复。
## 首次未缓存图库的初始化
目的地标签、搜索、排序、刷新和上传控件必须先于列表接口完成。
仅已有列表的缓存分支先渲染还不够;无缓存时也应创建真实控件与空的列表容器。
元数据返回前不推测图片数量,不显示真实空图库提示,不生成骨架卡片。
列表失败保留页面控件;慢云端请求期间切换 NAS,迟到响应不得覆盖新页面。
列表返回后保留之前输入的搜索词和排序。任务筛选在同一导航内复用请求,仍不阻塞图库。
启动使用 Settings API 中不调用厂商接口的 device_catalog;完整设备状态作为后台更新,
迟到响应在退出账号后不应用。ui-gallery-bootstrap.cjs 同时阻塞设备状态与图片列表,
验证真实控件仍先显示,列表返回后保留查询和排序,2 项通过。
-83
View File
@@ -1,83 +0,0 @@
# Frame Flow 项目审计 — 2026-10-05
审计基线:794a7e1485cc9046be3e77f6557c75740305ac47。
范围:本地源码、配置、Mock 测试与依赖审计;不包含本次 NAS 状态验证、真实账号登录或真实设备写入。未修改业务代码。
## 发现
### P1:队列扫描上限导致后续高优先级告警饥饿
`display/service.py:222` 只取按创建时间排序的前 50 个 QUEUED 操作,再跳过
被 override 阻挡的低优先级请求。如果这 50 项全被阻挡,第 51 项更高优先级
告警每一轮都无法被扫描到;其他设备请求与本地渲染也可能受影响。
Mock 复现:激活 priority=50 的一小时 override,排入 50 个 priority=10
请求,再排 priority=90 请求,调用 process_one 后后者仍为 QUEUED。
建议先筛选可执行请求,或分页扫描直到找到可执行操作;增加跨设备与优先级回归测试。
### P2:会话失效未更新连接状态,并误清第一方登录
`integrations/kokonna_official/rpc.py:44-51` 在官方返回“请重新登陆”时抛出
UNAUTHORIZED,但没有使官方 session 失效。`connection.py:104-113` 只依据
本地 token 非空,继续显示 authorized=true。`web/app.js:17` 将任意 API 401
都当作 Frame Flow 登录失效并执行 forgetLogin,包括外部官方会话过期。
Mock 复现:RPC 返回 HTTP 500 / error -1 / 请重新登陆后,authorized 仍 true。
建议区分第一方认证与外部账号过期,持久化失效状态,保留 Frame Flow 登录,
在官方区域提供重新连接提示。
### P2:损坏的可选官方会话文件阻止整个服务启动
`connection.py:44-51` 在构造函数中直接解析 JSON 并索引字段,没有异常隔离。
DeviceRegistry 在应用启动时构建该对象。损坏 JSON、缺字段或文件不可读会
使可选功能故障升级为全服务启动失败,影响 API Key、UI 和 Scheduler。
Mock 复现:官方 secret 文件内容为 `{broken`,create_app 抛 JSONDecodeError。
建议隔离并禁用该连接,记录不含文件内容的诊断;其他核心功能继续启动。
### P2:持久化失败导致断开状态与重启状态不同
`connection.py:122-127,146-157` 先修改内存,再保存。磁盘满、权限错误等
导致保存失败时没有回滚。尤其 disconnect 已清内存,而磁盘仍保留旧 token,
重启后又恢复旧连接;虽然原请求返回错误,随后状态查询却会显示未连接。
Mock 复现:让 _save 抛 OSError;当前 authorized=false,重新构造连接后 true。
建议先原子持久化候选状态,再提交内存状态;失败时保持一致并提供明确错误。
### P2:Request ID 脱敏遗漏官方会话
`api/app.py:148-150` 仅检查 API Key、Frame Flow Token、registry.keys,
没有检查用于官方会话的 settings.additional_secrets。符合 Request ID 长度和
字符限制的会话值若被客户端误用为 X-Request-ID,可被响应头和错误模型原样回显。
本问题不表示未授权者能凭空取到 token,而是违反已有 secret 不回显约束。
Mock 复现:完成模拟官方连接后,将 synthetic session `mock-session` 作为
X-Request-ID 发给 /health,响应原样返回该值。建议统一使用完整 secret 集合。
## 验证
- pytest:154 passed,0 failed,0 warning。
- Ruff:通过(应用和 tests)。
- mypy:36 个源码文件通过。
- pip-audit(requirements.lock):No known vulnerabilities found。
- 五项专项 Mock 复现均确认上述行为,不调用真实 KoKonna。
- 没有因发现问题而启用官方写方法;严格 RPC allowlist 仍阻止未启用方法。
## 边界与下一步
测试全绿不代表无缺陷:现有套件没有覆盖以上失败场景。
本轮没有修复或部署;建议先修复队列饥饿,再统一外部账号状态与第一方认证,
然后补齐会话文件容错、持久化事务一致性和 Request ID 脱敏测试。
依赖审计仅表示本次查询未发现已知漏洞,不是全部依赖安全的证明。
## 修复与复验
上述五项已修复:队列使用 keyset 分页查找可执行操作;官方账号失效使用
独立 `OFFICIAL_AUTH_REQUIRED` 错误码并清除会话,前端保留第一方登录且提供
重新连接入口;可选 secret 解析失败不再阻止核心启动;持久化候选状态成功后
才提交内存变更;Request ID 检查涵盖官方会话凭据。
复验:164 passed、0 warning(新增 10 项回归测试);Ruff 通过;mypy 36 文件
通过;113 项布局检查通过;官方过期/第一方登录隔离浏览器检查通过。
已知本地凭据对照历史扫描通过(278 个 blob);该扫描不等同于发现所有未知
secret 的通用审计。本轮不部署 NAS,不执行真实设备写接口。
-27
View File
@@ -1,27 +0,0 @@
# 界面表达审计(2026-10-16)
范围:11 个主页面、主要弹窗、中英文文案、README 和照片数据源说明;对照当前 API、清理与来源记录逻辑。不是厂商接口能力或线上服务状态的全面审计。
| 位置 | 原问题 | 修正 |
| --- | --- | --- |
| 图库 | 排序使用“适配方式” | 独立“排序方式”标签 |
| 轮播 / 播放列表 | 播放顺序使用图片适配标签;间隔重复单位 | 使用“播放顺序”“切换间隔” |
| 总览 | 天气缺译,显示原始 weather | 补齐中英文 |
| 总览 | 图片 ID 标成图片;型号来源标成型号 | 独立标注 ID 与信息来源 |
| 同步状态 | “已同步”容易被视为实物刷新确认 | 标明云端确认 |
| 图片来源 | 无记录却断言非本系统生成 | 只描述未找到可用记录 |
| 模板编辑 | 非模板图片复用不准确的来源错误 | 明确无可编辑的模板来源 |
| 删除 | 本地当前图也提示画框切图 | 按本地、云端、当前云端副本区分确认文案 |
| 星标 / 多选 | 自动清理保护及隐藏勾选项范围不明确 | 加入服务端保留、手动删除、当前页选择范围说明 |
| 上传 | 固定尺寸提示可能与输出不一致 | 提示以生成预览为准 |
| 显示选项 | 不勾选恢复时仍显示时长,容易误解 | 说明时长与优先级的临时显示用途 |
| 数据源 | 未配置与无匹配照片共用空态 | 拆分两种空态 |
| 数据源 | 位置标签、凭据提示仅描述 WebDAV | 补充网盘目录 ID、百度路径、OAuth 凭据 |
| 人物筛选 | 仅描述共享空间,但实际可选个人空间 | 按所选空间说明访问权限 |
| AI / MQTT | AI 密钥称为设备密钥;连接状态缺译 | 独立 API 密钥标签,补齐连接状态 |
| 错误页 | 所有失败都归因设备云端 | 改成通用页面加载失败,保留具体原因 |
| 文档 | 照片数据源旧入口及账号独立性描述过时 | 对齐独立导航与共享 Photos 登录 |
验证:305 项布局检查覆盖 320、390、844 横屏、1440 宽度,中英文与明暗主题,11 页及主要弹窗;8 组星标 / 反选回归;新增文案检查覆盖静态翻译完整性、排序 / 播放 / 型号标签、本地删除和星标作用范围。测试使用隔离 Mock,无真实设备写入、照片删除、AI 调用或部署。
此前未提交的反选、总览图片放大及共享图片查看器改动保留。此报告不代表已提交或已部署。