Repository navigation
release: 15.1 QA test checklist — framework 15.1.0 + console (objectui 14.1) #3072
Copy link
Copy link
Closed
Description
背景
准备发布 15.1:framework 15.0.0 → 15.1.0(87 commits / 65 changesets,60 minor + 62 patch,无 major)+ 配套 Console objectui 14.0.0 → 14.1.0(94 commits,framework 已钉 b8967495be73,console dist 校验一致)。
本 issue 是发布前的完整测试清单,逐项验证后勾选。配套产物:
- release docs 增补:
content/docs/releases/v15.mdx新增 "What's new in 15.1.0" 章节(分支release/15.1-docs,待 PR) - 测试计划长文:
docs/plans/release-15.1-test-plan.md(同分支)
测试环境:examples/app-showcase + objectstack dev --ui --seed-admin -p 3901 -d file:/tmp/showcase-rel151-3901/data.db,workspace 全量构建 71/71 绿,console dist == .objectui-sha。
图例:🖥 浏览器验证 · 🔌 API/CLI 验证 · 🤖 已有自动化钉死(CI)
A. 安全加固
- A1 🔌🤖 静态
readonlyUPDATE 强制:REST PATCH readonly 字段被 strip(security: 服务端 readonly 字段在 UPDATE 时未强制(可被用户上下文覆盖) #2948/fix(security): enforce static readonly fields on the UPDATE write path (#2948) #2957/安全:静态字段 readonly: true 仅 UI 层生效、服务端不强制 → 审批/状态/金额字段可被直接 PATCH 绕过写入(FLS 缺口) #3003,dogfood 已钉) - A2 🔌🤖
readonlyWhen多行 UPDATE 强制,任一锁定行 → 整批丢弃该字段(安全:readonlyWhen 服务端剥离仅覆盖单条 update 路径,多行 updateMany 不强制(条件只读可被批量绕过) #3042) - A3 🔌🤖
owner_id锚点:insert 伪造/update 转移需 transfer grant;bulk insert 自动 stamp(安全:owner_id(属主锚点)客户端可写、服务端无守卫 → 非属主可伪造/转移记录属主 #3004/fix(security): 守卫 owner_id 属主锚点 + bulk 写按属主收敛 (#3004, #2982) #3018) - A4 🔌🤖 bulk write 按 owner/RLS write filter 收窄,fail-closed(Security: bulk (multi) update/delete skips OWD owner scoping on private objects — members can modify others' rows #2982)
- A5 🔌🤖 删用户
set_null级联豁免 owner guard,级联不中断(属主守卫与级联 set_null 冲突:非特权删除 sys_user 时 owner_id 级联置空被 #3004 守卫拦截(级联中途失败) #3023/fix(security): 级联 set_null 豁免属主转移守卫 (#3023) #3048) - A6 🔌🤖
$expand强制被引对象 RLS/FLS(Security: $expand bypasses RLS/FLS on the referenced object (data leak on lookups) #2850/fix(security): enforce referenced-object RLS/FLS on $expand (#2850) #2961) - A7 🖥🔌 public form 剥离 server-managed 锚点(owner_id/organization_id/audit 列)(安全:公开表单(publicFormGrant)提交绕过 owner_id 属主守卫 → 匿名可伪造属主 #3022/fix(security): 公开表单不可再伪造服务端托管锚点(owner_id 等)(#3022) #3036)
- A8 🔌🤖 匿名 deny 统一:未登录
POST /graphql、raw/data→ 401([security] Anonymous posture inconsistent across surfaces: dispatcher /graphql and raw hono /data bypass requireAuth (/meta now gated) #2567 系列) - A9 🔌 MCP
run_action需ai.exposed,fail-closed + audit log(fix(security): gate the MCP action surface onai.exposed, fail-closed (#2849) #2964) - A10 🔌🤖 reports IDOR / 定时报表 RLS / RAG fall-open 三洞(Security: Reports surface ignores caller identity — cross-user/cross-tenant IDOR (read/delete any report) + scheduled reports bypass owner RLS #2980/Security: Knowledge/RAG retrieval fall-opens to unfiltered corpus when ExecutionContext is missing or system — agent data ceiling escape #2981/ADR-0096 (execution-surface identity admission) + fixes for the 3 confirmed-exploitable holes it surfaced (#2980, #2981, #2982) #2975)
- A11 🖥 OWD 保存门:packaged 对象只能收紧 sharingModel;
external ≤ internal保存时拒绝(OWD posture is lint-only at runtime: env can widen a packaged object's sharingModel via OS_METADATA_WRITABLE, and external≤internal (ADR-0090 D11) is never enforced on the write path #3050 + objectui#2508) - A12 🖥🔌🤖 附件访问链:读继承 parent、下载 401/403 + 短时效签名 URL、attach 需 parent EDIT([attachments] v1 follow-ups: sys_file orphan lifecycle + non-admin permission matrix dogfood #2755/[attachments] v2 tracking: parent-visibility inheritance, authed downloads, remaining enforce-or-remove #2970)
- A13 🔌 sharing rule seed-not-clobber + capability scope seed-once(Audit sibling declared-metadata↔record two-store types (sys_position, sys_sharing_rule, sys_capability) per ADR-0094 addendum #2909)
- A14 🖥 better-auth 1.7.0-rc.1 登录链路正常(登录成功、后续请求 200)✅ 已验:admin 登录 + 全程会话正常
B. 声明式 Connector(ADR-0096/0097)
- B1 🔌🤖 provider-bound 实例 boot materialization:
GET /api/v1/automation/connectors见origin:'declarative'(feat(connectors): ADR-0096 — provider-bound declarative connector instances (#2977) #2994/feat(showcase): live provider:'mcp' declarative connector demo + CI-pinned dogfood proof (#3056) #3062) - B2 🖥 flow designer connector picker 列出可调度 connector 并标注声明式实例(objectui#2563)
- B3 🔌 上游不可达 → degraded husk + 指数退避重试,恢复原子换入(feat(connectors): degrade + retry declarative instances on unreachable upstream (#3017) #3049)
- B4 🔌 declarative stdio 默认拒绝,host allowlist opt-in(feat(connector-mcp): policy-gate declarative stdio transports — default-deny + host allowlist (#3055) #3059)
- B5 🔌 openapi spec 文件路径解析 + 逃逸拒绝(feat(connector-openapi): resolve providerConfig.spec from a package-relative file path (#3016) #3024)
- B6 🔌 descriptor-only boot 审计 warning;
enabled:false静音(feat(automation,spec): descriptor-only contract + boot audit for declarative connectors (#2612) #2985)
C. 附件 v1
- C1 🖥 RecordAttachmentsPanel 认证上传/下载 + 无权限友好拒绝文案(objectui#2532)
- C2 🖥 发票行 per-line Receipt(inline grid 上传单元格)✅ 已验:INV-1001 编辑态 Line Items 出现 Receipt 列 FileCell(Upload 按钮),上传 png → chip+缩略图 → 保存落库(receipt 字段含 file 元数据 + storage URL),相关列表自动刷新(连带验证 chore: version packages #2607 MutationEvents)
- C3 🔌🤖 附件读继承 parent 可见性(受限用户不见、计数不泄漏)([attachments] v2 tracking: parent-visibility inheritance, authed downloads, remaining enforce-or-remove #2970)
- C4 🔌🤖 sys_file 孤儿 tombstone/reap + upload_session abort multipart([attachments] v1 follow-ups: sys_file orphan lifecycle + non-admin permission matrix dogfood #2755)
D. Dashboard 全局筛选
- D1 🖥 Revenue Pulse:filter bar 驱动多图表 ✅ 已验:Region 全部→AMER:Invoices 7→4、Accounts Signed 3→2;→EMEA:Subtotal 1920→0(证明绑定生效);opt-out 的 "Accounts (all time)" 恒为 14;dirty 时出现"重置"且重置正确;optionsFrom 服务端 distinct(全部/AMER/EMEA/APAC);filter bar zh 本地化(近90天/重置)
- D2 🖥 Studio widget inspector 可视化 filterBindings 编辑器(objectui#2586)
- D3 🖥 spec-form
{value,label}options 不再崩 dashboard,select 显示 label(objectui#2597)
E. Console 核心体验(objectui 14.1)
- E1 🖥 Record 级 inline edit:共享 draft + 单次原子 Save ✅ 已验:双击进入 record 级编辑,highlight strip(负责人)+ 正文(税率)同时可编;两处改动 → 底部同一 Save 条 → 恰好一次 PATCH,响应含两处新值,
updated_by服务端 stamp;编辑中 header Edit 置灰 - E2 🖥 多按钮 record header:≥3 动作并排,Delete/Share 进 ⋯(objectui#2574)
- E3 🖥 related list 权限门控:无子对象 read 权限 → section 不渲染(objectui#2565,需非管理员用户)
- E4 🖥 kanban:stageField 默认 lane + highlightFields 默认卡片字段(objectui#2596/chore: version packages #2541)
- E5 🖥 拼音搜索 ✅ 已验:⌘K
zhangwei→ 张伟(联系人);APIsearch=zw→ 张伟、lin→ Faye Lin、王→ 王芳;记录__search:"zhangwei zw"伴随列已回填 - E6 🖥 conditional tabs:page:tabs item
visibleWhen,FALSE 时整 tab 消失(feat(spec): conditional tabs — page:tabs items accept a visibleWhen CEL predicate (#2606) #2967 + objectui#2516) - E7 🖥🤖 B3 级联选项:country→province 门控/过滤 + role-gated tier + server 拒绝越权提交(test(app-showcase): B3 cascading-select fixture — server-enforced dynamic options (#2559) #3006;进行中:表单 dependsOn 门控已见,「Select country first」;选 China 后 province 选项集待确认)
- E8 🖥 GB18030 CSV 导入:GBK 中文表头正常映射(objectui#2557)
- E9 🖥 toast 不再因 error envelope 崩页(React Add i18n support for homepage (国际化官网首页) #31)(objectui#2580)
- E10 🖥 Studio/metadata-admin 跟随应用 locale,无混语言(objectui#2602)
- E11 🖥 活动 feed/audit 摘要 workspace locale 本地化(fix(plugin-audit): localize activity summaries to the workspace locale (#3039) #3045/feat(showcase+lint+audit): ADR-0085 #2548 follow-ups — console bump past PR4, detail-shapes e2e, shadowed-group lint, labeled feed summaries #3029)
- E12 🖥 Create User:param 可翻译 + 显式密码胜出不报 400(i18n: console action-dialog param labels are untranslatable —
os i18n extractskipsactions[].params#3030/auth: create-user 400s when a password is typed whilegeneratePasswordkeeps its default (true) #3031) - E13 🖥🤖 action visible 三陷阱:
record_more进 ⋯ 菜单、os.user.* 别名、报错谓词 warn(objectui#2611)
F. Studio(设计期)
- F1 🖥 CEL formula 编辑器:推断结果类型(Number/Text/…)、summary 结构化 roll-up(objectui#2609)
- F2 🖥 字段条件规则 CEL:
previous.补全 + did-you-mean(objectui#2571) - F3 🖥 list-view 条件格式化编辑器 + 运行时行着色(objectui#2558/perf(lint): load the TypeScript compiler lazily in validateReactPageProps #2544)
- F4 🖥 RLS 编辑器 lint/补全/per-policy test-run(objectui#2533)
- F5 🖥 Access:OWD 总览批量编辑 +
?surface=owd:overview深链(objectui#2508) - F6 🖥 Access unsaved 三连守卫(矩阵/pillar SPA 导航/OWD 行)(objectui#2588/条件 tab:给 page:tabs 的 item 加 visibility(CEL)—— #2579 follow-up #2606/Showcase: AI-domain examples (agent/tool/skill) deferred — cloud/MCP-only per ADR-0063 #2610)
- F7 🖥 只读包权限矩阵锁定(objectui#2570)
- F8 🖥 AccessExplainPanel record 粒度 + 三态溯源徽标(objectui#2502/Dashboard-level filters (date / region) driving multiple charts #2501)
- F9 🖥 flow palette 搜索/键盘导航/recents(objectui#2543/fix(objectql): enforce array shape for multi-value fields in the write pipeline #2553)
- F10 🖥 Decision Branches 行内 Target 选择 → 画布连边(objectui#2568)
- F11 🖥 Page/View inspector 不崩(lazySchema × z.toJSONSchema)(fix(spec): keep lazySchema proxies identity-compatible with z.toJSONSchema (objectui#2561) #3021)
- F12 🖥 package spec-form modal + namespace 前缀编辑期强制(objectui#2535/ci: bump downstream hotcrm smoke ref to v1.2.1 (ADR-0085 digestion) #2524)
- F13 🖥 feature-gated action UI 门控:关插件按钮消失(feat(spec,auth): guard that every feature-gated capability is UI-gated (#2874) #2965 + objectui#2536)
G. 平台 / 协议 / 部署(API·CLI)
- G1 🔌
aggregate_recordsMCP 工具(RLS 一致 + FLS 输入门)(feat(mcp): aggregate_records 工具 — GROUP BY 聚合走 engine 读路径(RLS/D10/FLS 全继承) #2976) - G2 🔌 standalone authored action 上 MCP 桥(Standalone authored
actionrows execute but are invisible to MCP list_actions/run_action (declaration-surfacing gap) #3010/fix(runtime): surface standalone authored action rows on the MCP action bridge (#3010) #3020) - G3 🔌 packages REST:PATCH 路由 / POST 重复 409 / install overwrite(fix(packages): register PATCH /packages/:id so edit-manifest reaches the handler #2995/fix(packages): reject duplicate package id on POST /packages with 409 #2971/feat(client): pass
overwritethrough packages.install for upgrade flows #3007) - G4 🔌 ADR-0087 rehydration 握手 +
migrate meta --from 10(feat(protocol): complete ADR-0087 — load-seam handshake, chain backfill 12–15, release artifacts #2972) - G5 🔌 discovery honest capabilities(无虚假 realtime 路由)(ADR-0076)
- G6 🔌
kernel:bootstrapped+app:seededmembership backfill(feat(kernel): kernel:bootstrapped anchor + fix everyone auto-bind ordering (#2926 follow-ups) #2989/fix(plugin-auth): re-run membership backfill when app seeding settles (#2996) #3000) - G7 🔌 Docker 镜像 + create-objectstack 脚手架 container-ready(feat(docker): publish official runtime image ghcr.io/objectstack-ai/objectstack #2952/feat(create-objectstack): scaffolded projects ship container-ready #2979)
- G8 🔌 tenancy strict block:
strategy:残留 → 响亮 parse error + tombstone(feat(spec)!: 删除 tenancy.strategy + tenancy.crossTenantAccess — tenancy 块 strict 化 + tombstone(#2763) #2962) - G9 🔌 拼音
__search伴随列 boot backfill ✅ 已验:seed 存量行带__search,见 E5 - G10 🔌 REST 403 透传 / 未知
$参数 400(app-showcase 权限模型复测清单(07-15 对照 main 重评):1 项回归级重大缺陷(#2930 锚点写护栏被 A4 词表打穿)+ 2 项部分修复 + 3 项未修 + 1 项建议降级 + 2 项观察 #2926 ⑦⑩)
回归门(发布前必须全绿)
-
pnpm build全绿(71/71,console dist ==.objectui-sha✅) -
pnpm test全绿(含全部 dogfood 套件) - objectui
e2e/live/showcase-smoke.spec.ts -
pnpm check:release-notes -
os validateexamples 三道门
已发现的观察项(非阻塞,待分诊)
- 发票列表 Owner id 列显示裸 FK id(
he9M1IJv…)而非用户名——view 配置或 lookup display 解析,观感问题。 - 登录页/顶栏品牌仍为 "ObjectOS"——15.1 已把 'ObjectOS' 从 spec 公开面退役(refactor(spec): retire 'ObjectOS' from the spec's public surface — Kernel naming #2963,ObjectOS 专指商业发行),OSS console 品牌是否要跟随改名需拍板。
- E7 级联表单选 China 后 Province 仍显示 "Select country first" 占位——待确认是选项集未刷新还是占位文案未更新(功能本身有 live e2e 钉着)。
Reactions are currently unavailable
Metadata
Metadata
Assignees
Labels
No labels
Activity
os-zhuang commentedon Jul 16, 2026
✅ E7 级联选项 — 已验证 + 修复了一个 bug
发现 bug:在真实创建/编辑表单里,B3 级联 select(#2284 / #1583)失效——选了 Country 后 Province 永远停在 "Select country first" 不解锁。
根因:form 渲染器只对
DATA_SOURCE_FIELD_TYPES(lookup 等)注入实时表单记录dependentValues;注册的 option widget(field:select/radio/multiselect)被排除,stripRegisteredFieldProps在到达 SelectField 前就把它 strip 了。加上SchemaRendererContext从无formValues兜底,SelectField 的dependsOn门永远看不到父字段。builtincase 'select'回退路径正常,但 ObjectForm 实际走的注册field:select路径坏了——所以此前的form-cascading-select测试(用 builtin 路径)没抓到。修复:objectui#2620 — 把
dependentValues也转发给 option 字段(镜像 lookup 修复 #2215/#2216)。验证(objectui console dev 连真后端,真实 SelectField widget):
顺带验证 F6 unsaved 守卫(Esc 关表单时弹"放弃更改?")✅
影响面说明:该 bug 早于 15.1(#2284 引入,约 7 月初),非本次回归,但 15.1 主打 B3 级联,应带上此修复。opt-in live e2e
cascading-options.spec.ts不在默认 CI,所以此前无人发现。回归门批量结果
pnpm build71/71,console dist == .objectui-shapnpm check:release-notesOKos validateshowcase 三道门通过(21 objects / 4 views / 23 flows …)os-zhuang commentedon Jul 16, 2026
第二轮验证结果(浏览器 + API)
✅ Console / Studio 浏览器验证
os i18n extractskipsactions[].params#3030);同时勾"生成临时密码"且填显式密码 → 成功建用户、无 400(auth: create-user 400s when a password is typed whilegeneratePasswordkeeps its default (true) #3031 显式密码胜出),结果弹窗"User Created"干净渲染(无 React Add i18n support for homepage (国际化官网首页) #31 崩页)1 + 2 * 3→ 实时显示"✓ CEL 有效"+"∑ 返回类型:数字";输入非法 CEL → 红框报错含位置+修复提示。此 CelPredicateField 基础设施 F2/F3/F4 共用(docs(audits): Studio package-create UX dogfood — browser walkthrough findings #2609/feat(messaging): digest batching for notifications (ADR-0030 P3b-2) #1582)✅ API / CLI 验证(curl + cookie)
enabled:false, status:unavailable;无 phantom /realtime 路由、无 websockets 虚报(ADR-0076)?$bogus=1→400📋 观察项(非阻塞)
发票 Owner id 列显示裸 FK— 已排除:App 视图"负责人"列正确显示 email(ada.chen@example.com);Studio 原始数据网格显示存储 id 属预期(不同 surface)。覆盖小结
剩余未逐一点的项(B3-B6 connector 降级/stdio、E2/E3/E4/E6/E8/E10/E11/E13、D2/D3、F9-F13、A7/A11)多为同类组件变体或需特定 CLI/多用户场景,核心机制已由上述代表项或 dogfood 覆盖。
os-zhuang commentedon Jul 16, 2026
第三轮 — 非浏览器项改为「实跑单测」权威覆盖 + 诚实完成度矩阵
坦白:并非所有 50 项都逐一浏览器点过。以下是精确状态。非浏览器项(安全/MCP/connector/boot)本轮实际跑了相关包单测(不再是推断),全绿:
(本轮合计 2856 测试绿;ERROR 日志均为测试故意触发的 fail-closed 断言。)
本轮新增浏览器验证
GET /api/v1/automation/connectors返回showcase_status_api {origin:declarative, state:ready}诚实完成度矩阵(50 项)
结论:安全/后端/MCP/connector 面 = 单测+dogfood 权威全绿;marquee UI = 直接浏览器验证;剩 ~10 项纯 UI 变体未逐一点,机制已由同族或自动化覆盖。若需要我把这 ~10 项也逐一浏览器点完,说一声即可。
os-zhuang commentedon Jul 16, 2026
第四轮 — 补齐剩余浏览器 UI 项
page.selectedProjectId != ''门控的面板瞬间出现;这是 conditional tabs(feat(spec): conditional tabs — page:tabs items accept a visibleWhen CEL predicate (#2606) #2967)所用同一引擎(tab item 级同谓词)最终完成度
发布结论:安全/后端/MCP/connector = 单测+dogfood 全绿;全部 marquee + 绝大多数 UI 项 = 直接浏览器验证;发现并修复 1 真 bug(objectui#2620)。15.1 可发布,前置条件:①.objectui-sha 重钉含 #2620;②两 PR(objectui#2620、framework#3079)CI 绿后合并。
os-zhuang commentedon Jul 16, 2026
第五轮 — 剩余 8 项全部补齐 ✅
本轮浏览器直接验证
本轮单测权威覆盖(实跑,全绿)
✅ 最终结论:issue 全部 50 项均已覆盖
发布前置:①.objectui-sha 重钉含 #2620 ②两 PR(objectui#2620、framework#3079)CI 绿后合并。15.1 可发布。