Skip to content

[UAT] 汇总 macOS 0.4.2 / Windows 0.4.0 NO-GO 验收发现与复验计划 #141

Description

@python-rust

背景

PR #131 和 PR #138 都是 installed-app UAT / 验收证据 PR,不包含产品修复代码:

这类长期验收结论更适合由 Issue 跟踪,而不是作为仅文档 PR 等待 merge。本 Issue 统一承接两份 UAT 中的产品问题、发布风险、证据缺口和复验计划。#131 / #138 在本 Issue 建立后将关闭且不合并。

重要边界: 两份报告验证的是历史已安装版本,并不自动证明当前 main 仍存在相同问题。建立本 Issue 时当前 main 已前进到 67f50b8f#140 已合入)。所有产品 finding 必须在最新 main / 新安装候选上重新验证后,才能继续作为“当前缺陷”关闭或升级。


历史验收基线

维度 #131 macOS UAT #138 Windows UAT
System under test 已安装 FyAgent 0.4.2 已安装 FyAgent 0.4.0
平台 Apple Silicon macOS 26.5.1 Windows 11 Pro 23H2 build 22635.5305 x64
安装范围 /Applications/FyAgent.app machine-wide %ProgramFiles% install
发布来源 Developer ID signed;Gatekeeper accepted as Notarized Developer ID fyagent.exe / fyagent-user-helper.exe / uninstall.exeNotSigned
Verdict NO-GO NO-GO
原始 PR #131 #138
产品代码修改

证据纪律

两份 UAT 都采用以下边界,后续复验继续沿用:

  • code_audit:解释实现或合同,不替代运行时成功。
  • runtime_screenshot:稳定运行时视觉证据。
  • interaction_readback:交互后重新读取 UI / 安全本地状态。
  • UAT:真实安装应用上的端到端用户流程。
  • pixel_diff:两次 UAT 都未执行,不声明 1:1 像素一致。
  • 功能证据层级:C = control clickedR = request observedP = persistence observedA = authoritative readback
  • 点击按钮不能被升级成“已保存”;只有实际持久化 / 权威回读才能声明 P / A。
  • 私密 Prompt/Memory 正文、token、凭据、原始日志、用户路径和 raw screenshot 不进入 Git / Issue。

A. #131 — macOS 0.4.2 UAT findings

A1. P1 — Prompts create/import 可能清空真实 live prompt

历史 finding:FYG-UAT-001,release blocker。

危险前置条件

  • Agent 当前 live prompt 文件非空;
  • FyAgent Prompt DB 中没有 enabled prompt;
  • 用户执行 New PromptImport
  • 新建 / 导入条目按 UI 语义处于 enabled=false

期望

创建或导入一个 disabled library item 只能修改 FyAgent Prompt library。在用户显式 enable / disable 之前,现有 live prompt 文件必须保持字节不变。

#131 审查到的历史行为

后端 upsert 保存 disabled record 后,如果查询到 enabled prompt 数量为 0,会把 live prompt target 写成空字符串;Import 也会构造 disabled record 并走同一 upsert 路径。

由于真实用户 profile 当时满足潜在破坏性前置条件,#131 没有在真实 profile 上执行 destructive UAT;该 finding 的强证据来自 code audit,而不是声称已经真实清空用户文件。

当前 main 复验要求

  • 使用复制 / disposable profile,准备一个非空 live prompt 文件。
  • DB 中确保 0 个 enabled prompt。
  • 新建 disabled prompt,验证 live 文件 fingerprint 完全不变。
  • Import disabled prompt,验证 live 文件 fingerprint 完全不变。
  • 验证 library DB transaction、失败 rollback 和 authoritative readback。
  • 如果最新 main 已修复,记录修复 SHA / regression test,并将该 finding 标记为历史已解决。
  • 如果仍存在,建立独立 P1 bug task / fix PR;不要在本 umbrella Issue 内直接承载实现。

A2. P1 — 一个非日期 Markdown 导致 Daily Memory 整页不可用

历史 finding:FYG-UAT-002,release blocker。

macOS 实际运行现象

真实 Daily Memory 目录同时存在合法日期 .md 和非日期 .md。打开 Daily Memory 后整页进入“无法加载每日记忆”,Retry 后仍失败。

当时只记录了隐私安全的数量:94 个 Markdown,其中 79 个 date-shaped、15 个 non-date-shaped,不记录私密文件名或正文。

历史根因

  • backend 列出所有 .md
  • frontend / Tauri adapter 对整个响应数组执行严格的真实日期 YYYY-MM-DD.md 解析;
  • 任意一个非日期 / 非法日期文件名即可 reject 整个列表。

期望

合法 Daily 文件必须继续可浏览;无关 .md 应被:

  • backend 过滤,或
  • frontend 跳过并给 bounded warning,或
  • 明确分类到非 Daily 区域;

不得因为一个无关文件让整个 Daily Memory 功能不可用。

当前 main 复验要求

  • fixture 中至少包含 1 个合法真实日期文件、1 个非日期 .md、1 个非法 calendar date 文件。
  • valid entries 正常加载。
  • invalid/non-daily entries 不拖死整个数组。
  • Retry 可恢复到相同有效列表。
  • UI 能提供 bounded skipped-entry / actionable diagnostic,而非只显示 generic failure。
  • macOS 和 Windows 都重新验证。

A3. P2 — Search / Settings / Account 视觉上可点击但实际 inert

历史 finding:FYG-UAT-003

#131 在 macOS 0.4.2 上点击三个 shell tool 后没有任何可见状态变化;当时代码绑定为 noop

期望

  • 要么实现真实 surface;
  • 要么明确 disabled / coming-soon,并避免让用户误认为功能损坏。

A4. P2 — Models 最小窗口滚动内容与 sticky header 重叠

历史 finding:FYG-UAT-004

在 1152×640 最小窗口,长 Provider form 滚动后字段内容会视觉进入半透明 / sticky heading 区域,降低 section ownership 和可读性。

复验

  • 最新 main 在最小窗口滚动长 Codex / OpenCode / WorkBuddy form。
  • heading 与内容不重叠,不出现隐藏字段或错误层级。

A5. P2 — MCP config-install 最小高度隐藏最后一个 target

历史 finding:FYG-UAT-005

在最小高度下,第七个 target(当时为 OpenCode)初始不可见,仅 keyboard focus 能把它带入视野,且缺少明显 scrollbar / fade cue。

复验

  • 七个目标全部可通过 pointer + keyboard 明确访问。
  • 有清晰滚动 affordance。

A6. P3 — Prompts app rail 在最小窗口隐藏最后一个应用

历史 finding:FYG-UAT-006

Hermes 等末尾 app 需要 wheel scrolling 才能访问,rail 的 scroll cue 较弱,heading 也可能跟随滚走。

  • 最新 main 在最小窗口重新检查 app rail 可发现性和 keyboard/pointer 可达性。

A7. P3 — Search 输入出现重复 clear 控件

历史 finding:FYG-UAT-007

部分 Skills / MCP / Prompts search 同时暴露浏览器原生清空 affordance 和应用自有 X。

  • 保留唯一清晰的 clear 行为并统一 shared input owner。

A8. P3 — Models 清除非法值后可能残留错误样式

历史 finding:FYG-UAT-008

非法输入被清除后,错误视觉状态可能持续到 route refresh。

  • 验证 touched / dirty / validation lifecycle 在修正值后立即收敛。

A9. P3 — Daily Memory 错误信息缺少可操作原因

历史 finding:FYG-UAT-009

generic load failure 无法帮助用户定位“目录中混入非 Daily Markdown / 非法日期”的实际原因。

  • 在不泄露正文 / 私密文件名的前提下提供 bounded diagnostic,例如“跳过 N 个不符合 Daily 命名规则的文件”。

#131 的未测边界

当时明确没有把以下内容声称为 PASS:

  • Agent Update / reinstall;
  • 真实 Skill install / MCP install / import / assignment;
  • 真实 Provider API key / paid request / 模型网络验证;
  • 真实 Prompt enable/create/import destructive write;
  • 真实 long-term Memory save;
  • 强制 write-denied;
  • native-unavailable;
  • Windows;
  • pixel parity。

#131 focused V2 当时为 8 files / 133 tests PASS,Rust prompt-filtered tests 通过;这些只能支持代码解释和报告一致性,不覆盖 installed-app failure。


B. #138 — Windows 0.4.0 UAT findings

B1. P1 — Daily Memory whole-page failure 在 Windows 也被真实确认

历史 finding:WIN-UAT-001,release blocker。

Windows 真实 profile 的隐私安全只读统计:8 个 Markdown,其中 2 个合法日期、6 个非日期。Daily Memory 初次 load 失败,Retry 后再次失败。

这与 #131 的历史代码根因一致,但 #138 正确地区分:

  • 当前真实 profile 上的 runtime failure:CONFIRMED
  • “只放一个 valid + 一个 invalid synthetic file”的正式 isolated AC7 retest:NOT TESTED

处理

与 A2 合并复验;该 finding 不单独再造一套实现逻辑。


B2. P1 — Windows 安装产物未做 Authenticode 签名

历史 finding:WIN-UAT-002,release blocker。

FyAgent 0.4.0 Windows 安装中的:

  • fyagent.exe
  • fyagent-user-helper.exe
  • uninstall.exe

均被权威 Authenticode readback 判定为 NotSigned

当前跟踪

正式 Windows signing 已有独立 Issue #68;本 Issue 仅保留 UAT 证据和 release blocking 关系,不重复建设 signing 实现。


B3. P1 — 正式安装版本缺少安全 disposable-profile UAT 路径

历史 finding:WIN-UAT-003,testability / safety blocker。

#138 成功创建 rollback copy 和 working copy,两份私有副本均为:

  • 2,994 files;
  • 397,675,522 bytes;
  • zero reparse points;
  • aggregate SHA-256 完全一致。

但正式安装的 FyAgent 0.4.0 不支持让 runtime 使用这些副本:正式 Windows home resolution 不启用测试专用 profile redirect;Windows Sandbox 当时不可用,Hyper-V 没有既有 VM,也没有可授权 disposable Windows session。

因此:

  • Prompt destructive hypothesis 没有执行真实安装版写测试;
  • Daily mixed-name synthetic AC7 没有执行;
  • long path / case collision / CRLF / junction / ACL denial / atomic rollback 等 write-path 也无法安全覆盖。

后续要求

  • 提供 vendor-supported test-hooks / disposable profile redirect,或
  • 使用已经准备好的 Windows Sandbox / VM / HIL isolated account。
  • 任何破坏性测试都必须记录 pre-state、backup、post-state、rollback fingerprint。
  • 测试能力不得默认进入正式生产行为;需要有明确 compile/runtime safety boundary。

B4. P1 — Windows 125/150% DPI、稳定最小化和完整键盘焦点证据缺失

历史 finding:WIN-UAT-004,acceptance evidence gap。

#138 实际完成:

  • 100% normal:PASS;
  • 100% maximized:PASS;
  • restore:PASS;
  • covered scrolling / horizontal clipping:PASS。

没有完成:

  • 125% DPI;
  • 150% DPI;
  • stable minimized state;
  • full Tab/focus order;
  • multi-monitor scale transition(机器只有单显示器)。

原因:Windows Settings 无法被当时的 GUI harness 稳定定位,而且连续检测到真实用户输入,因此执行器按安全规则停止争抢共享桌面。没有用 registry / PowerShell / WebView zoom 冒充真实 Windows DPI 测试。

后续要求

  • 使用独占 Windows desktop session。
  • 通过真实 Windows Settings / supported OS flow 切换 100/125/150%。
  • 每种 scale 都重启应用并检查 clipping、scroll、dialog、focus、long localized strings。
  • 稳定验证 minimize / restore / maximize。
  • 完整验证 keyboard-only focus order。

B5. P2 — 六个非 Codex Agent detail 缺少产品介绍

历史 finding:WIN-UAT-005

TRAE、QoderWork、WorkBuddy、Grok Build、Claude Code、OpenCode 当时只显示 identity/header,下面存在大块空白,没有当前 contract 期待的页面内产品介绍。

  • 最新 main 重新核对 Agent 页面 contract 和当前实现。
  • 如果已由后续 UI 重构修复,标记历史已解决。

B6. P2 — Codex installer copy 不应突出 FyAgent host

历史 finding:WIN-UAT-006

当时运行时 copy 包含“在 FyAgent 中安装、更新或启动桌面应用”,与当前 third-party directory/installer copy contract 不一致。

  • 检查 loading / ready-to-launch / ready-to-update / unavailable / failed 全状态文案。

B7. P2 — WorkBuddy / Grok Build / OpenCode 空草稿未交互就显示 validation error

历史 finding:WIN-UAT-007

未输入 secret、未点 Save,就立即出现:

  • WorkBuddy model ID required;
  • Grok Build base URL / API key / model ID 多个错误;
  • OpenCode blank service URL error。

期望

已有配置应先保持可读;新的空 draft 只在字段 touched 或 submit 后显示错误,不制造“页面一打开就是失败”的 UX。


B8. P2 — Skills Discover 切换后丢失 header actions

历史 finding:WIN-UAT-008

Installed 上存在“检查更新”和“更多”,切到 Discover 后消失;当时 spec 要求 Skills header 保持 mounted。

  • 最新 main 检查 Installed ↔ Discover 切换、pointer / keyboard reachability、最小窗口。

B9. P2 — Grok Bot registry publisher / executable signer provenance 不一致

历史 finding:WIN-UAT-009,Needs clarification。

当时观察到:

  • registry publisher:SpaceXAI;
  • executable Authenticode signer:Anysphere, Inc.;
  • 多个 Grok Bot process 正在运行。

该 finding 不把软件判定为恶意;它要求明确官方 distribution channel / signer / installer provenance。

  • 与工具 owner / 官方发行来源核对 installer 和 executable hash。
  • 如 metadata 不正确,修正 publisher / packaging。

B10. P2 — Windows 工具 registry / executable / CLI / parallel install 版本漂移

历史 finding:WIN-UAT-010

历史观察示例:

  • Qoder CN:uninstall version 与 main executable version 不一致;
  • CodeBuddy:registry 与 executable version 不一致;
  • OpenCode:legacy uninstall、CLI、独立 desktop 同时存在不同版本。

风险

若 FyAgent 未定义 authoritative detection precedence,installedcurrent versionlaunchupdate 可能选择 stale registration 或错误 binary。

后续要求

  • 为 Windows tool detection 定义明确 precedence。
  • 覆盖 single install、parallel install、stale registry、PATH shadow、uninstalled-current 等 fixture / HIL。

#138 的未测 / blocked Windows 路径

以下内容在历史 0.4.0 UAT 中没有被冒充为 PASS:

  • Prompt create/import/toggle/save/delete;
  • long-term Memory write;
  • 125/150% DPI;
  • stable minimize;
  • full keyboard focus;
  • multi-monitor;
  • long path / case collision / CRLF-LF;
  • junction/symlink mutation;
  • product write under file lock;
  • ACL/UAC denial;
  • Defender/quarantine;
  • atomic replace / rollback after failed write;
  • native bridge unavailable;
  • deep link;
  • updater / uninstall / rollback candidate;
  • reliable tray exercise。

Windows AIMASTER 本地 targeted V2 test 当时因为 repo 要求 Node 24.19.0,而机器只有 24.18.0,在 collection 前终止,0 tests run,不声明 PASS;与此同时 PR 的 GitHub Required CI 后续是 green。两者是不同证据,不互相替代。


C. 去重后的当前优先级

P1 / 当前 main 必须优先重新验证

  1. Prompts library persistence 不得隐式清空 live prompt(A1)。
  2. Daily Memory mixed Markdown 不得整页失败(A2 + B1)。
  3. Windows 正式发布签名继续由 [G5-02] 发布经过 Authenticode 验证的 Windows x64/arm64 安装包 #68 跟踪(B2)。
  4. 建立安全 disposable installed-profile / HIL 路径,补齐 destructive regression(B3)。
  5. 补齐 Windows 125/150 DPI、minimize、keyboard acceptance(B4)。

P2 / P3 backlog(最新 main 复验后再决定是否保留)

  • Search / Settings / Account inert UX(A3)。
  • Models minimum-window sticky header overlap(A4)。
  • MCP install-target overflow / scroll affordance(A5)。
  • Prompts app rail scroll affordance(A6)。
  • duplicate search clear control(A7)。
  • Models cleared validation stale style(A8)。
  • Daily Memory actionable diagnostic(A9)。
  • non-Codex Agent 产品介绍(B5)。
  • Codex installer copy contract(B6)。
  • untouched Models validation(B7)。
  • Skills Discover header actions(B8)。
  • Grok Bot publisher/signer provenance(B9)。
  • Windows tool detection precedence / parallel install drift(B10)。

D. 推荐执行与复验顺序

  1. 最新 main 安全复验:先 Prompts 数据破坏风险,再 Daily Memory。
  2. 若仍存在,分别创建窄 P1 fix task / PR;修复后要求 regression fixture + authoritative readback。
  3. Windows signing 继续推进 [G5-02] 发布经过 Authenticode 验证的 Windows x64/arm64 安装包 #68,不在本 umbrella Issue 重复实现。
  4. 准备新的 macOS / Windows installed candidate。
  5. Windows 使用 exclusive disposable environment 补齐 write/HIL/DPI/focus 证据。
  6. 对 P2/P3 按最新 main 逐项 revalidate;已被后续重构修复的直接标注 fixed-by SHA,不重复修。
  7. 最后重新执行一轮 macOS + Windows installed-app UAT,分别给出新的独立 verdict。

E. 本 Issue 的关闭条件

本 Issue 是两份历史 UAT 的 umbrella / migration record,不要求所有后续实现都放在同一 PR。满足以下条件后可以关闭:

来源

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    bugSomething isn't working

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions