背景
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.exe 均 NotSigned
Verdict
NO-GO
NO-GO
原始 PR
#131
#138
产品代码修改
无
无
证据纪律
两份 UAT 都采用以下边界,后续复验继续沿用:
code_audit:解释实现或合同,不替代运行时成功。
runtime_screenshot:稳定运行时视觉证据。
interaction_readback:交互后重新读取 UI / 安全本地状态。
UAT:真实安装应用上的端到端用户流程。
pixel_diff:两次 UAT 都未执行,不声明 1:1 像素一致。
功能证据层级:C = control clicked、R = request observed、P = persistence observed、A = 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 Prompt 或 Import;
新建 / 导入条目按 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 复验要求
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 复验要求
A3. P2 — Search / Settings / Account 视觉上可点击但实际 inert
历史 finding:FYG-UAT-003。
#131 在 macOS 0.4.2 上点击三个 shell tool 后没有任何可见状态变化;当时代码绑定为 noop。
期望
A4. P2 — Models 最小窗口滚动内容与 sticky header 重叠
历史 finding:FYG-UAT-004。
在 1152×640 最小窗口,长 Provider form 滚动后字段内容会视觉进入半透明 / sticky heading 区域,降低 section ownership 和可读性。
复验
A5. P2 — MCP config-install 最小高度隐藏最后一个 target
历史 finding:FYG-UAT-005。
在最小高度下,第七个 target(当时为 OpenCode)初始不可见,仅 keyboard focus 能把它带入视野,且缺少明显 scrollbar / fade cue。
复验
A6. P3 — Prompts app rail 在最小窗口隐藏最后一个应用
历史 finding:FYG-UAT-006。
Hermes 等末尾 app 需要 wheel scrolling 才能访问,rail 的 scroll cue 较弱,heading 也可能跟随滚走。
A7. P3 — Search 输入出现重复 clear 控件
历史 finding:FYG-UAT-007。
部分 Skills / MCP / Prompts search 同时暴露浏览器原生清空 affordance 和应用自有 X。
A8. P3 — Models 清除非法值后可能残留错误样式
历史 finding:FYG-UAT-008。
非法输入被清除后,错误视觉状态可能持续到 route refresh。
A9. P3 — Daily Memory 错误信息缺少可操作原因
历史 finding:FYG-UAT-009。
generic load failure 无法帮助用户定位“目录中混入非 Daily Markdown / 非法日期”的实际原因。
当时明确没有把以下内容声称为 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 也无法安全覆盖。
后续要求
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 测试。
后续要求
B5. P2 — 六个非 Codex Agent detail 缺少产品介绍
历史 finding:WIN-UAT-005。
TRAE、QoderWork、WorkBuddy、Grok Build、Claude Code、OpenCode 当时只显示 identity/header,下面存在大块空白,没有当前 contract 期待的页面内产品介绍。
B6. P2 — Codex installer copy 不应突出 FyAgent host
历史 finding:WIN-UAT-006。
当时运行时 copy 包含“在 FyAgent 中安装、更新或启动桌面应用”,与当前 third-party directory/installer copy contract 不一致。
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。
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。
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,installed、current version、launch、update 可能选择 stale registration 或错误 binary。
后续要求
#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 必须优先重新验证
Prompts library persistence 不得隐式清空 live prompt (A1)。
Daily Memory mixed Markdown 不得整页失败 (A2 + B1)。
Windows 正式发布签名 继续由 [G5-02] 发布经过 Authenticode 验证的 Windows x64/arm64 安装包 #68 跟踪(B2)。
建立安全 disposable installed-profile / HIL 路径,补齐 destructive regression(B3)。
补齐 Windows 125/150 DPI、minimize、keyboard acceptance(B4)。
P2 / P3 backlog(最新 main 复验后再决定是否保留)
D. 推荐执行与复验顺序
最新 main 安全复验 :先 Prompts 数据破坏风险,再 Daily Memory。
若仍存在,分别创建窄 P1 fix task / PR;修复后要求 regression fixture + authoritative readback。
Windows signing 继续推进 [G5-02] 发布经过 Authenticode 验证的 Windows x64/arm64 安装包 #68 ,不在本 umbrella Issue 重复实现。
准备新的 macOS / Windows installed candidate。
Windows 使用 exclusive disposable environment 补齐 write/HIL/DPI/focus 证据。
对 P2/P3 按最新 main 逐项 revalidate;已被后续重构修复的直接标注 fixed-by SHA,不重复修。
最后重新执行一轮 macOS + Windows installed-app UAT,分别给出新的独立 verdict。
E. 本 Issue 的关闭条件
本 Issue 是两份历史 UAT 的 umbrella / migration record,不要求所有后续实现都放在同一 PR。满足以下条件后可以关闭:
来源
背景
PR #131 和 PR #138 都是 installed-app UAT / 验收证据 PR,不包含产品修复代码:
NO-GO。NO-GO,原 Trellis UAT task 仍为in_progress,因为后续 remediation / retest 尚未完成。这类长期验收结论更适合由 Issue 跟踪,而不是作为仅文档 PR 等待 merge。本 Issue 统一承接两份 UAT 中的产品问题、发布风险、证据缺口和复验计划。#131 / #138 在本 Issue 建立后将关闭且不合并。
历史验收基线
/Applications/FyAgent.app%ProgramFiles%installfyagent.exe/fyagent-user-helper.exe/uninstall.exe均NotSignedNO-GONO-GO证据纪律
两份 UAT 都采用以下边界,后续复验继续沿用:
code_audit:解释实现或合同,不替代运行时成功。runtime_screenshot:稳定运行时视觉证据。interaction_readback:交互后重新读取 UI / 安全本地状态。UAT:真实安装应用上的端到端用户流程。pixel_diff:两次 UAT 都未执行,不声明 1:1 像素一致。C = control clicked、R = request observed、P = persistence observed、A = authoritative readback。A. #131 — macOS 0.4.2 UAT findings
A1. P1 — Prompts create/import 可能清空真实 live prompt
历史 finding:
FYG-UAT-001,release blocker。危险前置条件
New Prompt或Import;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 复验要求
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,不记录私密文件名或正文。
历史根因
.md;YYYY-MM-DD.md解析;期望
合法 Daily 文件必须继续可浏览;无关
.md应被:不得因为一个无关文件让整个 Daily Memory 功能不可用。
当前 main 复验要求
.md、1 个非法 calendar date 文件。A3. P2 — Search / Settings / Account 视觉上可点击但实际 inert
历史 finding:
FYG-UAT-003。#131 在 macOS 0.4.2 上点击三个 shell tool 后没有任何可见状态变化;当时代码绑定为
noop。期望
A4. P2 — Models 最小窗口滚动内容与 sticky header 重叠
历史 finding:
FYG-UAT-004。在 1152×640 最小窗口,长 Provider form 滚动后字段内容会视觉进入半透明 / sticky heading 区域,降低 section ownership 和可读性。
复验
A5. P2 — MCP config-install 最小高度隐藏最后一个 target
历史 finding:
FYG-UAT-005。在最小高度下,第七个 target(当时为 OpenCode)初始不可见,仅 keyboard focus 能把它带入视野,且缺少明显 scrollbar / fade cue。
复验
A6. P3 — Prompts app rail 在最小窗口隐藏最后一个应用
历史 finding:
FYG-UAT-006。Hermes 等末尾 app 需要 wheel scrolling 才能访问,rail 的 scroll cue 较弱,heading 也可能跟随滚走。
A7. P3 — Search 输入出现重复 clear 控件
历史 finding:
FYG-UAT-007。部分 Skills / MCP / Prompts search 同时暴露浏览器原生清空 affordance 和应用自有 X。
A8. P3 — Models 清除非法值后可能残留错误样式
历史 finding:
FYG-UAT-008。非法输入被清除后,错误视觉状态可能持续到 route refresh。
A9. P3 — Daily Memory 错误信息缺少可操作原因
历史 finding:
FYG-UAT-009。generic load failure 无法帮助用户定位“目录中混入非 Daily Markdown / 非法日期”的实际原因。
#131 的未测边界
当时明确没有把以下内容声称为 PASS:
#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 正确地区分:
处理
与 A2 合并复验;该 finding 不单独再造一套实现逻辑。
B2. P1 — Windows 安装产物未做 Authenticode 签名
历史 finding:
WIN-UAT-002,release blocker。FyAgent 0.4.0 Windows 安装中的:
fyagent.exefyagent-user-helper.exeuninstall.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,两份私有副本均为:
但正式安装的 FyAgent 0.4.0 不支持让 runtime 使用这些副本:正式 Windows home resolution 不启用测试专用 profile redirect;Windows Sandbox 当时不可用,Hyper-V 没有既有 VM,也没有可授权 disposable Windows session。
因此:
后续要求
B4. P1 — Windows 125/150% DPI、稳定最小化和完整键盘焦点证据缺失
历史 finding:
WIN-UAT-004,acceptance evidence gap。#138 实际完成:
没有完成:
原因:Windows Settings 无法被当时的 GUI harness 稳定定位,而且连续检测到真实用户输入,因此执行器按安全规则停止争抢共享桌面。没有用 registry / PowerShell / WebView zoom 冒充真实 Windows DPI 测试。
后续要求
B5. P2 — 六个非 Codex Agent detail 缺少产品介绍
历史 finding:
WIN-UAT-005。TRAE、QoderWork、WorkBuddy、Grok Build、Claude Code、OpenCode 当时只显示 identity/header,下面存在大块空白,没有当前 contract 期待的页面内产品介绍。
B6. P2 — Codex installer copy 不应突出 FyAgent host
历史 finding:
WIN-UAT-006。当时运行时 copy 包含“在 FyAgent 中安装、更新或启动桌面应用”,与当前 third-party directory/installer copy contract 不一致。
B7. P2 — WorkBuddy / Grok Build / OpenCode 空草稿未交互就显示 validation error
历史 finding:
WIN-UAT-007。未输入 secret、未点 Save,就立即出现:
期望
已有配置应先保持可读;新的空 draft 只在字段 touched 或 submit 后显示错误,不制造“页面一打开就是失败”的 UX。
B8. P2 — Skills Discover 切换后丢失 header actions
历史 finding:
WIN-UAT-008。Installed 上存在“检查更新”和“更多”,切到 Discover 后消失;当时 spec 要求 Skills header 保持 mounted。
B9. P2 — Grok Bot registry publisher / executable signer provenance 不一致
历史 finding:
WIN-UAT-009,Needs clarification。当时观察到:
该 finding 不把软件判定为恶意;它要求明确官方 distribution channel / signer / installer provenance。
B10. P2 — Windows 工具 registry / executable / CLI / parallel install 版本漂移
历史 finding:
WIN-UAT-010。历史观察示例:
风险
若 FyAgent 未定义 authoritative detection precedence,
installed、current version、launch、update可能选择 stale registration 或错误 binary。后续要求
#138 的未测 / blocked Windows 路径
以下内容在历史 0.4.0 UAT 中没有被冒充为 PASS:
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 必须优先重新验证
P2 / P3 backlog(最新 main 复验后再决定是否保留)
D. 推荐执行与复验顺序
E. 本 Issue 的关闭条件
本 Issue 是两份历史 UAT 的 umbrella / migration record,不要求所有后续实现都放在同一 PR。满足以下条件后可以关闭:
fixed或独立 bug Issue / fix PR 链接。fixed或独立 bug Issue / fix PR 链接。still applies/fixed/obsolete。来源