Model persisted library state in the external-binding fixture instead of returning pre-creation data to background refreshes. Keep all selected and excluded library assertions, without assuming the last snapshot request belongs to the new library. Windows App: 300 passed; complete frozen Linux suite: 5371 passed, 51 skipped. Typecheck, lint and bilingual notes validation passed.
14 KiB
Desktop 与 Agent 0.15.0 发布准备
日期:2026-09-27。候选验证通过,不代表已发布。
范围与批准
- 用户要求 Desktop 与 GoodBuddy Agent 同步升级至
0.15.0,明确不构建 LoongArch。 - 源码基线:
0f8bf405db7ca21a85cc70009ad083eb837e1e03。 - Desktop 差异基线为已发布的
v0.13.16,Agent 为agent-v0.13.4。 - 准备两个独立标签
v0.15.0与agent-v0.15.0;尚未创建或推送。 - 用户已批准两份完整双语说明,正式正文仅维护在
Desktop 发布资源 的
0.15.0条目与 Agent 发布资源。 已逐条核对写入文本与批准草案一致,本记录不再复制正文。 FEATURES.md与FEATURES.zh-CN.md已核对本轮能力、限制和候选版本。- 用户要求两张未跟踪宣传截图保留原位、不提交,打标签前另行处理; 不移动、删除、暂存或更改忽略规则。
- 2026-09-28 用户更新授权:当前工作区的宣传文档与素材可以一起提交、推送,
后续候选由代理自行审核确认,不再逐次等待用户批准,继续完成双产品正式发布。
三张新增候选图已读取检查,保留原始草稿属性,不冒充正式发布截图或对外媒体发文。
发布说明正文保持不变,
releasedAt更新为实际准备发布日期 2026-09-28。
本地验证
npm run typecheck:通过。npm run lint:通过。npm run release:notes:verify:通过。- 发布说明相关三个文件定向测试:16 项通过。
- 首轮
npm test:5,313 通过、79 跳过、4 失败,耗时 697.61 秒。 三项失败来自当时尚未批准写入的 0.15.0 Desktop/Agent 发布说明; 另一项为magic-notes-layout.electron.test.ts的布尔断言。 该布局用例单独复验 1 项通过,未修改源码或放宽断言。 单独通过不替代全量结果。 - 正式说明写入后的最终
npm test:5,317 通过、79 跳过、0 失败, 453 个测试文件通过、11 个跳过,耗时 645.49 秒。随后再次执行完整npm run typecheck与npm run lint,均通过。 - 最终验证期间出现并行宣传文档编辑及新增
storygraph.png,均不属于本次 发布准备改动,不暂存或覆盖。打标签前仍须处理工作区洁净条件。 - 修改文档的相对文件链接、版本一致性和
git diff --check通过。 - 不运行本地生产构建、打包或安装包启动。准确候选提交须经用户批准, 然后双远端推送、主分支 CI、生产构建、原生发布与公开核验分别进行。
Agent 当前源码实机验证
共享 Linux x64 Host 的 LAN/VPN SSH 端口均可达,实际通过 LAN 与既有固定
Host Key、加密凭据连接。重新捆绑当前源码的 Agent CLI、daemon、model bridge
与 Desktop 适配器,仅上传独立 /root/tmp/gb-lifecycle-* 测试目录,复用已安装且
版本锁未变的 Node/OpenCode/Continue,不替换原安装,不构建正式包。
最终 OpenCode、Continue 各通过一次 Ask 和一次 Execute,无工具请求,
验证回答、后续历史、空闲 Runtime 回收及测试停止后所属进程为 0。
模型请求时读取所属进程的固定遥测字段,确认 DO_NOT_TRACK=1、
OTEL_SDK_DISABLED=true 及三个 exporter 均为 none,不输出整个环境。
这些结果补齐 eb53c82 的 Agent/model bridge 真实链路验证,
但不证明后台没有其他网络流量,也不替代三目标正式包验收。
首轮 Continue 探针沿用了 OpenCode 原生历史持久化假设,未像 Desktop 一样传入
request.history,第二轮历史断言失败;当前 Continue 冷启动源码明确要求传入
保存历史。修正测试输入及会话 ID 断言后通过,未修改产品实现。
有完整计数的实机运行共 8 次真实模型 HTTP 请求:首次 OpenCode 2 次、
首次 Continue 2 次、最终 Continue 2 次、最终 OpenCode 2 次。
此前一次直接启动 Electron 的探针未捕获子进程输出,不能确认是否实际发出请求,
该次上限 2 次,不纳入通过证据;因此不能把 8 次写成本轮精确总数,总量为 8–10 次。
后续均使用等待退出并记录脱敏输出的启动器;本轮探针 Electron 进程已退出。
本地诊断证据在临时 opencode/release-015-host/,不提交脚本、日志或凭据。
首次候选 CI 与测试修正
用户批准的首次候选 5a6ba6c14f5c58f3da5e9afe281b18e0cbdb1ae8
已推送至 origin/main 和 github/main,未创建两个发布标签。
- Agent CI 36329271991 源码验证及 Linux x64、Linux arm64、Darwin arm64 原生构建全部通过。
- Desktop CI 36329271967 为 5,342 通过、51 跳过、3 失败。两个 App 长历史场景超过默认 5 秒单用例时限; 会话采集 Electron 场景等待 Escape 返回笔记列表超时。生产构建未运行。
- 测试修正仅让原生键盘辅助函数显示窗口、获取焦点并等待
document.hasFocus(), 然后发送真实输入;两个长历史场景采用仓库既有的 15 秒单用例时限。 不修改产品实现、不跳过 Linux、不关闭沙箱、不删除或放宽数据和键盘断言。 - Windows 聚焦复验三个失败场景通过,其中真实 Electron 覆盖完整 502 条历史、 214px 窄栏键盘操作、浅深主题确认按钮、真实 IPC/SQLite 和重开保留。 修正后首次全量复验被中断,不计为通过;随后完整重跑为 5,317 通过、 79 跳过、0 失败,453 个文件通过、11 个跳过,耗时 646.48 秒。 类型检查、lint 和发布说明校验均通过,新候选 Linux CI 仍需独立通过。
- 本次只改测试和验证文档,不改变 Agent、远程 Runtime 或模型桥; 沿用上方当前源码 Host 验证,不新增真实模型请求。
- 新提交必须重新取得准确 SHA 批准,原发布说明正文保持不变。
Linux 实机复现与最终同步修正
2026-09-28:第二次批准候选 12594961fe1e814e89f55de1fbfe245310505115
的 Desktop CI 36331853137
为 5,343 通过、51 跳过、2 失败。两个 App 长历史场景已通过;
Escape 返回列表仍失败,活动历史迁移这次超过默认 5 秒时限,生产构建仍未执行。
按用户要求直接在共享 Linux x64 Host 测试准确候选源码。使用独立磁盘测试目录、
锁定 Node 24.19.0 和 npm ci,补齐 Xvfb 与匹配的 X server 系统依赖;
没有创建新账号,使用既有非 root 账号运行测试,保留 Electron 沙箱及其标准 helper 权限。
不替换既有 Agent,不修改其安装或工作区,不执行生产构建或打包。
原测试在 Host 上稳定复现:缩窄窗口会按产品既有行为收起工作栏,隐藏面板仍有非零宽度。
诊断显示 Escape 实际发给 aria-expanded=false 的工作栏开关,而不是笔记输入框。
因此仅获取窗口焦点不够;测试改为等待窄视口及响应式渲染完成,按真实按钮打开工作栏,
确认展开状态和目标输入框焦点后再发送键盘输入。临时诊断代码已移除。
迁移测试在 Host 上以原默认时限通过,保留 10,000 条记录、完整迁移、WAL 字节比、 扫描次数与无变化写入断言;仅为这一个大数据场景采用已有的 15 秒单用例时限, 不改数据库实现或全局时限。
- 最终 Linux Host 完整
npm test:5,345 通过、51 跳过、0 失败, 449 个文件通过、15 个跳过,耗时 751.09 秒。 - Windows 聚焦回归:3 项通过,包含真实 Electron 和迁移。
- Windows 完整类型检查、lint、发布说明校验:全部通过。
- Linux Electron 实测覆盖 502 条历史、218px 窄栏、Escape/Tab/Enter、 浅深主题确认按钮、真实 IPC/SQLite 与重开保留;Windows 对应窄栏为约 214px。
- 本阶段不新增真实模型请求,不改变产品代码或双语说明。 新候选仍须重新批准 SHA 并通过自己的主分支 CI/生产构建,两个标签仍未创建。
后续 CI 焦点前提与确定性取消验证
b8b6007 的 CI 36335076841
两次执行均为 5,344 通过、51 跳过、1 失败,失败点改为 new title focus,
生产构建没有运行。该次失败未在 Host 的 10 次带诊断复验中重现,其中 5 次限制单 CPU;
移除临时诊断后再测也通过。这些独立结果不替代 CI。
测试原先直到键盘阶段才显示窗口,前面的自动聚焦检查仍在隐藏窗口执行。 现让测试窗口从开始即显示并确认焦点,保留标题自动聚焦原断言; 超时增加实际焦点、标题禁用/可见/隔离状态和保存状态,避免只报告阶段名称。 可见窗口版本在 Host 连续五次聚焦复验通过。
随后 Host 全量出现一个独立的 Continue 取消测试竞争:
setTimeout(0) 没有保证取消发生在子进程启动前,空 mock 已被调用。
用例改在既有启动环境回调处精确取消,仍验证回调执行、子进程未启动和临时配置删除,
不更改 Continue 产品实现或取消机制。
- 最终 Host 完整测试:5,345 通过、51 跳过、0 失败,449 个文件通过、 15 个跳过,耗时 743.34 秒。
- Windows 可见窗口 Electron 回归及确定性取消回归通过。
- 完整类型检查、lint 通过;双语说明正文不变,日期调整后另行验证发布资源。
- 上述均为测试或验证文档调整,不新增真实模型调用,不改变 Agent 发布输入。 正式发布仍要求当前候选自己的 CI/生产构建通过。
完整分支快照重新核对
d9e1e42 的 Desktop CI 36340682594
已通过原生会话采集焦点测试,但为 5,367 通过、51 跳过、4 失败。
核对祖先后确认准备期间另有四个并行提交进入分支:
ee1bf8a 输入区控件样式、8e60736 流式会话稳定排序、
f35198d 桌面通知开关、d47f967 监督结果继续讨论。
它们已随用户授权的当前分支推送;前述 Host 的 5,345 项通过使用较早源码快照,
不能作为包含这四项的新候选验证结果。
本轮已重新核对四个提交的实现和文档,补充两份功能矩阵与双语发布说明: 通知开关默认开启且不影响应用内提示;流式更新不改变排序; 监督结果可直接编辑问题并继续讨论,界面不再提供知识实体写回控件。 Agent 产品源码及 Runtime 锁未因这四项改变,Agent CI 36340682607 源码校验和三个原生构建全部通过。
补齐通知默认值的契约 fixture;Obsidian 多次真实子进程调用使用单用例 15 秒时限,
避免前项超时后的在途调用污染下一项取消断言;笔记来源用例按面板查询控件,
并等前次来源操作释放禁用状态后再发起下一次。
这些修正不改变产品实现。Windows 聚焦回归 19 项通过,类型、lint 和说明校验通过。
从 Git tree 1758ff58a6ff33fcf7ddaa3d35dd2fcc57cd1265 导出完整快照,
覆盖 Host 测试源码,而非只同步早期快照中的少数文件。
该完整快照 npm test 为 5,371 通过、51 跳过、0 失败,
451 个文件通过、15 个跳过,耗时 751.42 秒,包含全部四个并行提交。
最终提交前再次核对源码、测试、依赖和发布资源与该已验证 tree 一致,
仅追加本段验证结果;完整候选仍需自己的主分支 CI 与生产构建通过。
完整候选后的焦点同步修正
5cdffee 的 Agent CI 36343184917
三个原生构建和源码校验通过;桌面
CI 36343184916
为 5,369 通过、51 跳过、2 失败,生产构建未执行。
会话采集的焦点等待可被 body 后代文字误满足,菜单随后被真正的消息聚焦关闭;
另一个原生 Runtime 控件用例在启动完成前打开失焦关闭的菜单。
本轮收紧消息焦点的元素断言,并等待项目能力请求及启动渲染后再打开 Runtime 选项。
不重试菜单、不跳过场景、不改产品实现。
完整冻结 tree 2ddc0da69b6bcb42d8272c44dd11e3e6904d0438 在 Host 全量
5,371 通过、51 跳过、0 失败,耗时 748.21 秒。
Windows 原生 Runtime 聚焦用例、类型检查和 lint 通过。
提交仅追加本段记录;仍须等待修正候选的主分支 CI 和生产构建。
706726b 的桌面 CI 36345672365
已通过上述采集与 Runtime 用例,但另一个外部知识库测试失败:
5,370 通过、51 跳过、1 失败,生产构建未执行。
该 fixture 只在查询新库 ID 时返回包含已创建库的快照,普通轮询会返回创建前数据;
同时错误地要求最后一次请求必须属于新库,忽略后台轮询。
改为模拟已持久化的库列表,等待新库请求发生,保留原库与新增库选中、被排除库未选中的
全部界面断言,不修改产品代码。Windows 完整 App 300 项通过,类型、lint 和说明校验通过。
冻结 tree 42a92450ad7d9ebc50167c7946bff53cff2889e6 的 Linux 全量为
5,371 通过、51 跳过、0 失败,耗时 748.67 秒。
数据、兼容与验收边界
Desktop schema 48 新增魔法笔记会话来源元数据。升级前应备份完整用户数据,
包括数据库及相邻 notes/ 目录;旧客户端不能打开升级后的数据库。
本次发布准备不修改数据库迁移实现,也不直接改写用户数据库。
Agent 发布工作流以候选 package.json 设置最低 Desktop 版本,因此
Agent 0.15.0 包要求 Desktop 0.15.0;Node、OpenCode、Continue 锁不变。
Agent 与 Desktop 独立发布,Agent 不替代 Desktop Latest。
原生客户端的远程 coordinator、托管标准 Node 交付整合、Continue/OpenCode Ask 内置 MCP 映射及完整跨平台安装包验收仍有缺口,见 原生客户端进度。 本次说明明确标为本地预览,不将这些未完成部分宣称为已提供能力。