Skip to content

Latest commit

 

History

History
71 lines (53 loc) · 9.95 KB

File metadata and controls

71 lines (53 loc) · 9.95 KB

UX 收敛第一批:实现与验证记录

历史批次记录:状态仅对应文内日期。当前验收边界见 公开审阅说明;本地日志、截图与安装包未纳入公开分支。

日期:2026-09-07(Asia/Hong_Kong)。本记录对应用户“开始修复吧”的授权,以及 公开审阅说明。这是第一批主流程修复的交付记录,不表示 F01—F14 全部完成。

版本与取舍

  • 基线:15c399c8940aeb81d3c45bb0de96759b480d02c2,实施前 fetch 确认的 origin/main。
  • 实施:<workspace>,分支 codex/ux-journey-convergence。改动保存在独立工作树,尚未提交、推送或合并。
  • 原目录 <original-workspace> 的已有 Go 修改、未跟踪文件和像素计划均保留;仅同步本对话工作必读文档。
  • 保留 Go / React / Wails / SQLite,复用原有 steering、lease、handoff、恢复与桌面导入。没有引入新的数据库表、后台执行器或模型协议,也没有增加依赖。
  • 新接口与请求所有权见 ADR 0147。OpenAPI、TypeScript 类型和协议登记同步生成/维护。

本批行为

工作项 已落地行为 验证边界
F01 新对话提供桌面“打开项目”,复用不接收前端路径的原生选择器;取消选择不丢输入。Web 空项目允许先写需求,提供服务端创建项目及刷新说明 原生桥接单测与 Desktop 安全 tag 通过;Web 空目录及 CLI 创建后刷新实测。没有完整演练原生文件选择窗口;Web 尚不能直接导入已有目录,因此 F01 仍是部分完成
F02 默认模型由 Go 解析,前端不再把解析结果误当成用户显式指定;保留身份、作用域、权限与显式模型一致性校验 默认与显式模型均通过真实 Go API / 生产前端;契约拒绝错误身份、错误模型和伪造授权;幂等执行由 Go 回归验证
F03 Thread 创建后立即打开,首轮提交状态由已有 QueryClient 保留;长轮次不再因普通 HTTP 30 秒写超时丢失最终响应 首轮完成前出现停止入口;两轮约 31 秒的真实请求返回成功。全局 HTTP 超时未放宽,已有请求取消及 Go 执行预算仍有效
F04 执行中可以编辑/提交不同内容;后端持久受理补充消息,当前请求所有者在轮次边界消费。停止绑定当前执行 ID,并等待真实收敛;失败清理可重试 实测排队 → 消费;实测停止 → 排队取消 → 再继续;Go 验证重放、旧停止请求隔离、失败清理与 lease 恢复。此处是下一轮队列,不是模型原生即时 steering
F05 按工作区/任务保留页面内草稿及新建选项;晚返回的请求不能清除后来输入;失败内容可放回或添加到草稿 设置往返、项目选择前输入、并发消息逆序完成、不同任务隔离均有验证。没有承诺浏览器刷新、退出或系统重启后恢复未提交草稿
F08 接近底部才跟随;上翻后提示新内容;返回任务恢复阅读位置;关闭浏览器与应用重复的滚动锚点调整 真实长回答令内容高度从 2541 增至 3641 像素,scrollTop 保持 180,设置往返仍为 180;组件覆盖历史分页与任务切换
F09/F10 移除 File/Edit/View/Help 等无行为菜单,改为真实新建/设置动作;移除八个无专属行为的设置入口;权限文案明确当前任务;移除伪装成可配置的固定平台项 相关组件测试、设置往返与菜单实测。未宣称所有设置、权限说明和键盘细节都已审完
F12 输入区工具可换行;侧栏有可达关闭入口;停止与菜单保持同一行,长标题让出操作空间 390×844、390×480、720×480、1440×960 CSS 视口验证;发送/停止进行边界测量及实际点击。720×480 仅作为 1440×960 在 200% 缩放下的等效布局检查,不是原生 DPI 或系统缩放验证
F14 列表、记录、审批加载错误提供重试;运行态来自服务内的真实请求状态;停止后重连可从既有失败记录得知上次中断;取消消息不再伪装成普通已处理消息 运行中切换、停止后重连和错误路径有验证。审批精确预览、所有 provider 错误、跨进程运行状态与全部恢复场景尚未完成

真实流程证据

证据目录:<workspace>/output/playwright/ux-validation/。全部使用隔离的 CYBERAGENT_HOME,真实 Go API 和 web/dist;模型响应来自本机确定性 OpenAI 兼容夹具,没有调用付费模型。

  1. 空实例先写草稿,进入设置再返回,草稿保留;Web 按界面说明在服务端运行 workspace init ux-fixture,刷新后可发送。见 01-empty-web-guidance.png。
  2. 默认路由创建并启动首轮,在夹具完成前就进入任务。见 02-first-turn-before-completion.png。
  3. 补充消息收到明确排队状态;切换设置后保留独立草稿和停止入口;停止后实际连接被取消,排队消息的持久状态为 cancelled。见 03-queue-reopen.png、04-stopped.png、stopped-transcript.json、provider-events.log。
  4. 停止后可以明确发送新消息继续;长回答上翻阅读与返回位置通过。见 05-continue-running.png、06-reader-position-preserved.png、06-scroll.js。
  5. 390×844 的发送按钮边界为 x=341、y=773.5、28×28;停止为 x=266、y=42、72×31,均在视口内并实际点击。最小检查视口 390×480 下发送 y=409.5,未裁切。见 07-narrow-sidebar.png、08-narrow-controls.png、09-narrow-interrupted.png、layout-*.png。
  6. 停止后刷新并重新连接,能看到上次中断提示。见 10-interruption-after-reconnect.png。
  7. 显式模型 openai/ux-scripted-model,先完成首条,再消费下一轮输入。最终两个用户输入、两次模型结果、idle、队列 0。原请求最终 steering=committed,补充请求最初为 pending。见 explicit-queue-result.log、explicit-queue-durable-final.json、11-explicit-queued.png、12-explicit-complete.png。一次本机观测中,发送后 44 ms 出现执行控制;这不是性能预算或竞品基准。
  8. 已受理且仍在运行时刷新页面,再连接同一实例,仍只有一个对应 Thread;执行状态为 idle、last_turn_interrupted=true,没有重复启动首轮。见 disconnect-result.log、disconnect-final-state.json 和 13-disconnect-recovered.png。未提交草稿跨刷新持久化不在本批承诺内。

执行中最初的人工走查用暂停夹具保留现场,触发过模型的 60 秒空闲重试;这不是正常模型时延数据。排队验收也捕捉到一次真实的 ERR_EMPTY_RESPONSE,原因是普通 HTTP 写超时。最终修复后重新演练超过 30 秒的请求成功,不能把失败尝试当成最终通过证据。

浏览器控制台中的主动停止 HTTP 499 与测试服务重启期间断连有明确来源,不能据此宣称控制台始终零错误。具体过程保存在本批日志和脚本中。

自动检查

检查 结果与证据
前端全量测试 最终 96 个文件、558 个测试通过,见 frontend-tests-final.log;不是沿用基线的 550 个测试计数
TypeScript / 生产构建 npm run build 通过,含 tsc -b。仍有既有的大 bundle 提示,没有把打包大小优化混入本批
Go 全量 go test -timeout 30m -count=1 ./... 完整跑完;唯一失败为本次新增 thread_execution.v1 漏登记,已修复并定向复验。其余包通过,包括 application(999.725 s)、httpapi(97.562 s)、store(1615.512 s)。原全量日志保留失败,未伪写为退出码 0
最终 Go 执行回归 ThreadTurn 全量定向通过;application / httpapi 的 ThreadTurn、ThreadInterrupt、OpenAPI race 回归通过。覆盖旧 handoff 完成崩溃恢复,未删除原测试或弱化原断言
HTTP 最终复验 加入真实 HTTP 服务器的长响应测试,普通写超时 20 ms、执行 100 ms 仍能收到响应;race 定向通过。最后一次整个 httpapi 包通过(47.691 s),见 go-http-package-final.log
协议登记 补齐既有协议家族,生成文档;protocolregistry -check -baseline 15c399c… 与协议包测试通过。没有放宽登记检查
Desktop 安全 tag go test -tags "desktop,wv2runtime.error" -count=1 ./cmd/cyberagent-desktop ./internal/desktop ./internal/webui 通过。它不能替代原生安装包人工矩阵

没有重跑整个 Go 全量来覆盖最后的登记/HTTP 小修,而是复验受影响包;也没有把原全量失败归为无关历史问题。没有运行完整跨平台安装包矩阵、全仓 race、真实模型能力对比或完整无障碍审计。

仍需推进

  • F01:原生导入实际窗口验收;Web 导入已有目录的支持边界与产品方案。
  • F06:精确、脱敏的审批动作/目录/授权期限预览,真实审批类型端到端演练。本批仅补齐加载失败反馈。
  • F07:任务级变化汇总、检查结果、带上下文修正、保护用户已有修改的保留/撤销与交付入口。
  • F11:超过 100 条历史可达、稳定项目 ID 分组、搜索范围、任务地址与返回行为。
  • F13:选定并接通一种高价值上下文输入;附件按钮仍明确禁用,不能记成已实现。
  • F09/F10/F12/F14:剩余设置与范围问题、原生平台/键盘/焦点矩阵、跨进程状态和更完整的故障恢复。正常结束的可恢复 Run 仍可能驱动较频繁轮询,后续要按实际活动收敛。

本批停止的目标是当前服务内的执行请求,不能停止另一 CLI/API 进程拥有的执行;停止也不会撤销已完成的文件修改、外部操作或其他任务。服务崩溃不恢复进程内执行身份,继续沿用既有持久化恢复语义。

收尾时已关闭专用浏览器 uxfix、API 与本机响应夹具,确认 18867/18868 不再监听。未遗留后台服务;未提交、推送或发布。