QORMQORM v0.9.8 docs Get started

实施进度

主控同步 · 更新:2026-08-21 v0.9.8 准备发版(Error Boundary 收口:async/delay + canvas 渲染级 + CI apt)

v0.9.8(2026-08-21)

Error Boundary 补齐与 CI 硬化。v0.9.7 已发 scene/subtree 首版;本版修 async/delay 绕过、canvas 渲染级 fallback,并修正 Ubuntu apt timeout sudo 杀不掉的问题。

完成定义: go test 相关包绿;CHANGELOG [Unreleased] 可归档;tag v0.9.8 → Release + GHCR;官网打戳。

v0.9.7(2026-08-19)

Error Boundary 首版:app/scene errorBoundary.scene、node errorBoundary.fallbacklastBoundaryError measure、examples/error-boundary。已发版(tag + Release + GHCR + 官网)。

v0.9.5(2026-08-19)

Agent 可验证性收口。规划见 analysis-and-plan.md。G1–G12 已提交;R1(mario jump、CHANGELOG、SKILL layerCache)已落地。

线上:tag v0.9.5、GitHub Release、ghcr.io/qorm/platform:v0.9.5、qorm.com 首页/文档已打戳。首次站点 rsync --delete 误删 /games/ 等 extras,已从备份恢复;后续 deploy 保护 extras,并用 qorm_canvas WASM 与示例源同步 games 页。

下一版: 已发 v0.9.6(list window 虚拟化)→ v0.9.7(Error Boundary 首版)→ v0.9.8(本轮收口)。

第八轮(2026-08-19)

qorm test 能测固定 dt 的 canvas 游戏,并用阈值断言世界坐标。

目标状态证据
G12 state_lt/gt/lte/gte🟢TestStateCompareAsserts
G12 repeat 步骤🟢TestRepeatStep;mario 60×tick
G12 mario 左走阈值🟢examples/mario/tests/walk_left.json(x 低于 28)
G12 http key 取消文档🟢first-action en+zh;SKILL

第七轮(2026-08-19)

qorm test 覆盖到 list as 别名、路由守卫,以及 canvas 游戏的 qscript 动作。

目标状态证据
G11 derived 行内 Wrap(as: line🟢examples/derived/tests/gift_line.jsonTestSimulateEventUsesListAlias
G11 checkout 守卫🟢checkout_guard.json / checkout_ok.json
G11 tetris smoke🟢examples/tetris/tests/move_left.json(onEnter restart 后 moveLeft)
G11 步骤后排空 onEnter / 刷新 computed🟢drainPendingEnter 在每步之后

第六轮(2026-08-19)

qorm test 从「能跑 counter/todo add」推进到「能测 list 行内 handler + computed 断言」。

目标状态证据
G10 todo 行内 Done + computed.openCount🟢examples/todo/tests/toggle.jsonstate_equals 支持 computed.*
G10 counter 纳入示例回归🟢TestRunExampleAppsWithTests

第五轮(2026-08-19)

第四轮故意留下的可验证性缺口:组件物化、list item scope、loader 错误被 test/check 丢掉。

目标状态证据
G7 JSON 组件物化 + item scope🟢TestMaterializeExpandsJSONComponentsTestSimulateEventUsesListItemScopeexamples/uikit/tests
G8 qorm test / qorm check 拒绝 error 诊断🟢TestRunRefusesErrorDiagnosticsTestCmdCheckRefusesErrorDiagnostics
G9 对比表诚实🟢README 小程序=静态 WXML;MCP=25 工具

未做:GTK 接线、Error Boundary、新 widget。

第四轮(2026-08-19)

对照 v0.9.4 的目标/实现缺口,收口 agent 可验证性,不扩 widget。

目标状态证据
G1 canvas hostLimits + MCP contrast 文案🟢TestCollectMeasureHostLimits;mcp-tools en+zh 再生
G2 list 物化 + todo/derived qorm test🟢TestMaterializeExpandsListRenderItemTestRunExampleTodoAndDerived
G3 文档对齐🟢README 架构图、security-model、SKILL 冻结 widget
G4 Linux chromeless 矩阵注释🟢support-matrix en+zh
G5 LAN 观察窗 loopback 门禁🟢TestLANObservationWindowLoopbackOnly
G6 qorm package --revoked🟢TestPackageUpdateFlagPairing + TestOfflineHTMLWithRevokedUpdateConfig

详见 analysis-and-plan.md。未做:GTK 接线、Error Boundary、新 widget。

窗口建设完善轮(2026-08-13)

用户反馈两点:(1) qorm.config.json 在 MCP 与 SKILL 文档里完全没有说明; (2) 窗口部分建设未完善 —— 异形窗口、窗口大小这类配置应统一收进 qorm.config.json。 本轮把窗口配置补齐并落到文档:

变更内容
qorm.config.json 成为窗口配置的家新增 window 块(width/height/title/resizable/chromeless/transparent/hideLog/hideTray),display 块保留为兼容别名;优先级 config > platforms.desktop.window > 顶层 display;坏 JSON / 未知键改为出诊断而非静默吞掉
resizable 真正生效此前只解析不消费。macOS WebView style mask、非 macOS 走 webview HintFixed、canvas 窗口 style mask 均按 resizable:false 锁尺寸;新增 Window.Fixed 区分"显式 false"与"未声明"
title 真正生效窗口标题此前从不消费;现在声明的 window title 优先于 app name 作为窗口标题
异形窗口(chromeless+transparent)macOS WebView 已完整;Windows 补 chromeless(user32 去装饰);Linux/BSD 解析但去装饰未接线(如实记录);canvas 宿主不消费 chrome 标志(如实记录)
MCP 可见qorm_inspect 输出新增 window(解析后的最终窗口配置);mcp-tools.md(en+zh)新增"宿主窗口"引言段 + qorm_inspect 描述更新,生成器测试守护
文档补齐SKILL.md 可运行格式节 + docs/agent/skills.md(en+zh)+ docs/project-structure.md(en+zh)新增 qorm.config.json 专节与优先级表 + AGENTS.md;examples/mario 转用新 window 块;纠正 project-structure 示例中从未存在的 window.icon 键;删除 model.DisplaySpec 死代码

对抗复审 + CI 修复波(同日,4e7a103 的后续)

对抗复审(3 项确认缺陷)+ CI 桌面矩阵(ubuntu/windows 本地无法 cgo 编译的盲区)共同暴露的问题,全部根因修复:

问题修复
Windows:chromeless 无条件剥掉 WS_THICKFRAME → resizable 被静默忽略setUndecorated(hwnd, resizable):只剥 WS_CAPTION,resizable 时保留调整框(它正是 Windows 上用户可调整大小的位)
Windows:chromeless 内容区比声明尺寸大 ~16×39px(SetSize 先按带装饰风格算外框)去装饰挪到 SetSize 之前,框架几何按无装饰风格计算
macOS:陈旧 window.txt 恢复覆盖 fixed 窗口尺寸并锁死(持久化循环反复回写,永不自愈)仅 resizable 窗口恢复记忆框架;fixed 窗口以声明尺寸为准
CI 编译错:hint := webview.HintNone 推断为 int(cgo 无类型常量)不匹配 webview.Hintuintptr(-16) 常量溢出显式 webview.Hint(webview.HintNone);负数 GWL_STYLE 经运行时变量转换
config "width": 0 无法把清单尺寸覆盖回流式(与"WINS + 0=fluid"文档矛盾)applyConfigWindow 按键在场即生效(≥0),新增测试锁定;另加 per-key 合并语义测试
CI build·vet·test 红:TestStdoutSinkSFXDoesNotReplaceMusic 竞态根因不是测试而是 sink:loop 音乐靠"退出即重生"实现,无音频设备的 runner 上 aplay 秒退 → 重生风暴替换 sink.music(生产中即无限失败进程风暴)。加重生护栏:存活 <500ms 判为 sink 损坏不再重生;测试在音乐进程秒退时如实 skip
README 携带过期版本信息按用户要求移除 README.md / README.zh.md 的 "What's new in 0.8.11" 整节 —— README 不再放版本信息
验证手段本机 mingw-w64 交叉编译 -tags desktop Windows 构建通过(本地首次可验证该路径);全门禁绿(34 包 + race + 三构建 + linux/windows 纯构建)

v0.9.1 发布后维护轮(2026-08-13)

CI 变红触发排查,两个失败都是真实缺陷,按根因修复而非移除 job:

提交修复
b6460dbcross-compile 失败根因:darwin 视频解码器是 cgo 文件,CGO_ENABLED=0 交叉编译时被排除,而纯 Go fallback 的 tag 又排除了 darwin → startVideoDecoder 无定义。同一 bug 已导致 release.yml 失败(v0.9.1 GitHub Release 无二进制产物)。重排两个文件的 build tag;另 TestRaidenPerf 在 -race 下仅超性能预算(0 处数据竞争),加 race build tag 跳过预算、保留逻辑断言
ae6e98fgenicons 生成器静默失败:写盘用仓库相对路径但 go:generate 在包目录执行,错误被吞 → 6 个马里奥图标(brick/coin/flag/goomba/ground/mario)从未进入 canvas 位图字体。加 -o flag + 写失败即报错;重新生成 47 → 53 字形,与 widgets.IconSet() 完全一致
39a2995SKILL/MCP/文档/API 完全同步:skills.md 记载了 7 个从未存在的技能文件 → 重写为真实的单一 SKILL.md(含 4 条工作流);图标数 66 → 53、组件数 80+ → 146、样式键 ~90 → 108(SKILL.md / claude-pack.md / AGENTS.md 三处);doc.go 中文版补 qorm_validate 缺失译文、修复 qorm_query 半角病句、补齐 activity/capabilities 漏句;生成的 mcp-tools.md(en+zh)新增「工具分类」+「示例」两节,由 TestMCPDocInSync 永久守护。审计:四个面(mcp-tools en+zh、SKILL.md、integrations/README.md)均为 25/25 工具,零多余零遗漏

遗留已闭环:v0.9.1 tag 的 release workflow 在修复前失败、tag 不可移动 —— 由 v0.9.2 补齐(release 工作流绿,6 平台二进制 + SHA256SUMS 全部产出)。

当前状态

状态证据
v0.9.2 发布🟢tag v0.9.27f938bb · main push 对齐 · release 工作流绿(6 平台二进制 + SHA256SUMS)· 官网 deploy(v0.9.2 戳记 + 首页 200)
G0 基线修复🟢0fd604d 删除 62df1ca 残留 11 文件;go build ./... 恢复
G1 测试基线🟢path widget 全栈落地 · video 测试修正 · 文档生成器手写段保护
G2 安全残留🟢两 token LAN 门禁 · computed 动态 key 拒载 · WASM OTA 吊销 · bundle 版本提示
G3 qorm test MVP🟢Phase 9 spec 落地;examples/counter 4/4;exit 0/1 语义实测
对抗复审🟢三轮闭环:首轮 9 缺陷 → 修复波 → 二轮 2 新 P1 → 主控直修 → 三轮双镜 pass(见 audit-log)
全量回归🟢go test ./... 全绿 · -race 关键包绿 · WASM 构建绿 · gofmt 净

第三轮交付(main,本地未推)

实施波(3 分支 worktree 并行,rebase 后合并)

分支内容
r3-testfixpath widget(canvas 光栅 + HTML <svg><path>,M/L/H/V/Q/T/S/Z 绝对+相对);canvas-advanced qscript 尾随 ;;video measure 期望修正;文档生成器手写段并入生成源
r3-security--lan token 门禁 · computed 动态 key 加载错误 · WASM OTA 吊销快照 · bundle 版本提示
r3-qormtestinternal/testrunner + qorm test CLI + counter 4 份测试文档

修复波(对抗复审驱动,3 分支 worktree 并行)

分支修复
r3-fix-canvas解析器前进保证(弧/Z 后数字/1e309 不再死循环;弧按弦近似);Measure 改原点锚定框(bbox max),偏移路径不再被裁剪
r3-fix-gate门禁密钥与页面 token 解耦:admin token 从不出现在任何响应页面;诊断读面(/dev/state /log /presence GET)纳入门禁;启动提示措辞纠正
r3-fix-testrunneronEnter 运行时错误 → test_runtime_error 失败;- 前缀参数明确拒绝;发现规则/诊断快照/--target/--report 边界在 doc.go 与 spec 对齐

主控直修(二/三轮复审缺陷)

提交修复
db3455d读门禁键于"除 POST 外全部方法"(动词绕过 P1);runtime EnterScriptError 链内首错累积器(enter 链吞错 P1)
5e4e2c0MarkPendingEnter:mount_scene 步骤真正触发目标 onEnter(复审链镜发现的已交付功能洞)

已知债(记录在案,不在 v0.9.6 核心)

级别说明
/logwindow /console 页面在 --lan 无鉴权P2纳入门禁会破坏 AGENTS.md 的人类观察窗约定,待产品决策
POST /dev/state(DevTool 写)仅页面 tokenP2设计如此;持有页面 token 的 LAN 对端可写状态
/poll /events 无 token 帧流P2EventSource 无法带 header;载荷即 GET / 已公开的 UI
/dev/tree /dev/canvas 无鉴权读P2DevTools 面,待 LAN 加固轮统一处理
DevTool 页在 --lan 读面 401 降级P3无 admin token 输入口,待产品决策
弧 → 贝塞尔展平P3当前按弦近似,曲线呈折线
token 比较非常数时间P3== 比较;dev 工具定位可接受,记录在案

v0.9.5 已闭环(移出债表): qorm package --revoked(G6);qorm check 拒 computed 动态 key(TestCmdCheckRefusesErrorDiagnostics);scene onEnter 悬空 action 加载错误(loader 诊断)。

发布

状态
上一版v0.9.7(2026-08-19):Error Boundary 首版 · scene/subtree fallback · measure · 示例
本版v0.9.8(2026-08-21):async/delay boundary · canvas 渲染级 fallback · CI apt sudo timeout
下一版待定

链接

变更日志

时间事件
2026-08-13v0.9.0 CHANGELOG 归档(video widget、canvas-advanced、measure/shot、live capture 等)
2026-08-13第三轮分析:4 路并行(回归/安全/文档/方向)→ 规划 analysis-and-plan.md
2026-08-13G0 基线修复(62df1ca 残留清理)+ 文档同步(README/Roadmap/zh)
2026-08-13实施波:r3-testfix / r3-security / r3-qormtest 并行落地并合并
2026-08-13对抗复审一轮:3 镜验证,9 项确认缺陷(正确性 2 / 安全 3 / 规格 4)
2026-08-13修复波:r3-fix-canvas / r3-fix-gate / r3-fix-testrunner 并行落地并合并
2026-08-13对抗复审二轮:canvas pass(3.2M 模糊);gate/spec 各 1 新 P1(动词绕过 / enter 链吞错)
2026-08-13主控直修两轮 P1 + 链镜发现的 mount_scene 空转洞(MarkPendingEnter
2026-08-13对抗复审三轮:双镜 pass;残留债全部归档 audit-log
2026-08-13全量门禁绿:build · test · race · wasm · coverage gate · qorm test 4/4
2026-08-13v0.9.1 发布:changelog 归档 + version bump + annotated tag + push + 官网部署
2026-08-13窗口建设完善轮:qorm.config.json window 块 + resizable/title 落地 + MCP inspect 可见 + SKILL/文档补齐
2026-08-13对抗复审 + CI 修复波:Windows chromeless×resizable/尺寸几何、macOS fixed 窗口状态恢复、两处编译错、config 0=fluid 覆盖
2026-08-13CI build·vet·test 根因修复(audio sink 重生风暴护栏)+ README 去版本信息(en+zh)
2026-08-13v0.9.2 发布:changelog 归档 + bump + annotated tag + push;release 工作流绿(6 平台二进制补齐 v0.9.1 缺失);官网 deploy 并验证首页 v0.9.2
2026-08-19v0.9.5 发布;官网 rsync --delete 误删 games 后已恢复,并补 canvas WASM 同步
2026-08-19v0.9.6 规划 + P0/P1/P2:文档收口 · sitemap 再生 · canvas list virtualize: "window" · games smoke 包装脚本
2026-08-19v0.9.7 启动:Error Boundary schema/runtime/render 首版 · lastBoundaryError measure 观测面 · examples/error-boundary
2026-08-19v0.9.7 发布:tag + Release + GHCR + 官网
2026-08-21v0.9.8:async/delay 续跑补 HandleSceneError · canvas node/scene 渲染级 boundary · CI sudo timeout apt