Skip to content

fix(skills,docs): align skills/docs with published spec; guard flat view containers - #3096

Merged
os-zhuang merged 1 commit into
mainfrom
claude/loving-bartik-ae7a83
Jul 17, 2026
Merged

fix(skills,docs): align skills/docs with published spec; guard flat view containers#3096
os-zhuang merged 1 commit into
mainfrom
claude/loving-bartik-ae7a83

Conversation

@os-zhuang

Copy link
Copy Markdown
Contributor

背景

2026-07-17 第三方评估(15.1.0 发布包实测)发现 5 处 skills/docs 与发布 spec 的漂移。这些直接伤害 AI-native 卖点:AI 按官方 skill 写元数据会连续挂。本 PR 全部修复,并把最重的一条(平铺 view 静默不渲染)的根因堵上。

修复清单(评估 5 项)

  1. defineDatasetdefineSeed(skills/objectstack-data 整节 + platform skill 的 os data seed 描述):实际导出是 defineSeed(objectDef, {externalId, mode, env, records})(seed.zod.ts);dataset 名字保留给 ADR-0021 分析语义层。skill 正文新增两者辨析提示。
  2. type: 'unique' 校验类型已不存在(Validation rules: 6 of 9 spec rule types are declared but not enforced at runtime #1475 删除):SKILL.md 类型列表改为完整 6 个 discriminator(script/state_machine/format/cross_field/json_schema/conditional),显式教 indexes: [{ fields, unique: true }];rules/relationships.md 的 junction 组合唯一示例同步改 indexes。
  3. kanban 配置形态(skills/objectstack-ui):顶层 groupBy → 嵌套 kanban: { groupByField, summarizeField, columns },顶层 columns 仍必填;对照 KanbanConfigSchemaexamples/app-showcase/src/ui/views/task.view.ts
  4. docs ui/views 整页重写为 defineView 容器写法:原页面教的平铺 view 对象({ name, label, type, columns } 顶层)os validate 通过但 Console 静默不渲染。新页面以 defineView({ list, listViews, formViews }) + defineStack({ views: [...] }) 注册为主线,并加 Callout 警示平铺写法;属性表订正(columns 实际必填、name/label 实际 optional、span 优先于 legacy colSpanvisibleWhen 为 record 根的 CEL)。
  5. README quickstart curl 路径:/api/v1/todo_task/api/v1/data/todo_task(rest 包路由实证;脚手架模板本已正确)。

顺带修复的同类漂移(修复中实证发现)

  • gantt 示例同病(UI skill):顶层 startField/endField/dependencyField(键名也是错的)→ 嵌套 gantt: { startDateField, endDateField, titleField, progressField, dependenciesField, parentField };timeSegments 示例移入 gantt: 块(objectui 运行时从 ganttConfig.timeSegments 读取)。
  • summary 形态(UI skill):summary: { function: 'min' } → 平枚举 summary: 'min'(ColumnSummarySchema)。
  • rules/validation.md 深度订正:删虚构的 async/custom 类型(外呼/自定义校验 → lifecycle hook);format 的键是 regexpattern、内建无 uuid;conditional 实为 when/then/otherwise(无 validations[] 数组);所有谓词改 record 根 CEL(P 标签),并按运行时 rule-validator.ts 明确 cross_fieldscript 同为反转语义(谓词=失败条件)——原文档的 cross_field 示例全部写反。
  • UI skill 新增 defineView 容器 primer(此前整个 skill 从未出现容器概念)。

根因加固(第 4 条的"为什么 validate 放行")

根因:ViewSchema 四槽全 optional + Zod strip 未知键 → 平铺 view 被剥成合法空容器 {},schema 门通过、loader 零展开、Console 零视图。

验证

  • @objectstack/spec 全量 254 files / 6890 tests 通过(含新增 defineView 空容器/平铺抛错用例);@objectstack/lint216 tests 通过(新规则 7 用例);@objectstack/cli tsc 构建通过。
  • 端到端 dogfood:app-todo 注入平铺 view 探针 → os validateview-container-shape 拦截、exit 1;还原后 app-todo / app-crm / app-showcase(4 容器 21 对象)全部干净通过,无误报。
  • gen:skill-docs 重跑,check:skill-docs 同步 ✓;docs 站点 pnpm docs:build 通过,/docs/ui/views 已在浏览器实测渲染(容器主线、Callout、TOC 正常)。

Follow-ups

🤖 Generated with Claude Code

…iew containers
Fixes the five skill/doc-vs-spec drifts found by the 2026-07-17 third-party
evaluation of the 15.1.0 release (AI following the official skills produced
metadata that failed or silently broke):
1. objectstack-data skill taught `defineDataset()` for seeds — the actual
export is `defineSeed()` (`dataset` is reserved for the ADR-0021 analytics
layer). Renamed the whole section incl. imports, type table, zod path.
2. Same skill taught a `type: 'unique'` validation — removed from the spec in
#1475. Now teaches `indexes: [{ fields, unique: true }]`; also purged the
fictional `async`/`custom` types from rules/validation.md, fixed
`format.pattern`→`regex` (no `uuid` builtin), `conditional` to its real
`when`/`then`/`otherwise` shape, converted all predicates to record-rooted
CEL (`P` tag), and documented that `cross_field` is failure-condition
(inverted) like `script`, per the runtime rule-validator.
3. objectstack-ui skill kanban example used a top-level `groupBy` — the real
shape is nested `kanban: { groupByField, summarizeField, columns }` with
top-level `columns` still required. Gantt examples had the same flat
disease with wrong key names (`startField`/`dependencyField` →
`gantt.startDateField`/`dependenciesField`); `timeSegments` moved inside
the `gantt:` block; column `summary` is a plain enum, not an object. Added
a `defineView` container primer to the skill.
4. docs ui/views taught flat view objects that `os validate` passed but the
Console silently never rendered (ViewSchema strips unknown keys → empty
container). Page rewritten around the `defineView({ list, listViews,
formViews })` container + stack registration; property tables corrected
(`columns` required; `name`/`label` optional; `span` over legacy
`colSpan`; `visibleWhen` is record-rooted CEL).
5. README quickstart curl path `/api/v1/todo_task` → `/api/v1/data/todo_task`.
Root-cause guard for #4: `defineView()` now throws on a container with zero
views, and `os validate` gains a `view-container-shape` check
(`validateViewContainers` in @objectstack/lint, run PRE-parse like the
ADR-0053 check) reporting flat/empty `views: []` entries with a fix hint.
The runtime view type-schema mapping is deliberately untouched (ViewItem +
container + #2555 personalization shapes need their own change).
Regenerated skills/README.md + content/docs/ai/skills-reference.mdx via
gen:skill-docs.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
@vercel

vercelBot commented Jul 17, 2026

Copy link
Copy Markdown

The latest updates on your projects. Learn more about Vercel for GitHub.

ProjectDeploymentActionsUpdated (UTC)
specReadyReadyPreview, CommentJul 17, 2026 7:08am

Request Review

@github-actions

Copy link
Copy Markdown
Contributor

📓 Docs Drift Check

This PR changes 3 package(s): @objectstack/cli, @objectstack/lint, @objectstack/spec.

105 hand-written doc(s) reference the affected code and may need an implementation-accuracy re-verification:

  • content/docs/ai/agents.mdx(via @objectstack/spec)
  • content/docs/ai/skills-reference.mdx(via packages/cli, @objectstack/spec)
  • content/docs/ai/skills.mdx(via @objectstack/spec)
  • content/docs/api/client-sdk.mdx(via @objectstack/cli, @objectstack/spec)
  • content/docs/api/data-flow.mdx(via @objectstack/cli)
  • content/docs/api/environment-routing.mdx(via @objectstack/cli, @objectstack/spec)
  • content/docs/api/error-catalog.mdx(via @objectstack/cli, @objectstack/spec)
  • content/docs/api/error-handling-client.mdx(via @objectstack/spec)
  • content/docs/api/error-handling-server.mdx(via @objectstack/spec)
  • content/docs/api/index.mdx(via @objectstack/spec)
  • content/docs/automation/approvals.mdx(via packages/spec)
  • content/docs/automation/flows.mdx(via @objectstack/spec)
  • content/docs/automation/hook-bodies.mdx(via packages/cli, packages/spec)
  • content/docs/automation/hooks.mdx(via @objectstack/spec)
  • content/docs/automation/index.mdx(via @objectstack/spec)
  • content/docs/automation/webhooks.mdx(via @objectstack/spec)
  • content/docs/automation/workflows.mdx(via @objectstack/spec)
  • content/docs/concepts/architecture.mdx(via @objectstack/spec)
  • content/docs/concepts/design-principles.mdx(via packages/spec)
  • content/docs/concepts/index.mdx(via @objectstack/spec)
  • content/docs/concepts/metadata-driven.mdx(via @objectstack/spec)
  • content/docs/concepts/metadata-lifecycle.mdx(via packages/spec)
  • content/docs/concepts/north-star.mdx(via packages/spec)
  • content/docs/data-modeling/analytics.mdx(via @objectstack/spec)
  • content/docs/data-modeling/drivers.mdx(via @objectstack/spec)
  • content/docs/data-modeling/external-datasources.mdx(via @objectstack/spec)
  • content/docs/data-modeling/field-types.mdx(via @objectstack/spec)
  • content/docs/data-modeling/fields.mdx(via @objectstack/spec)
  • content/docs/data-modeling/formulas.mdx(via @objectstack/spec)
  • content/docs/data-modeling/index.mdx(via @objectstack/spec)
  • content/docs/data-modeling/objects.mdx(via @objectstack/spec)
  • content/docs/data-modeling/queries.mdx(via @objectstack/spec)
  • content/docs/data-modeling/schema-design.mdx(via @objectstack/spec)
  • content/docs/data-modeling/seed-data.mdx(via @objectstack/spec)
  • content/docs/data-modeling/validation-rules.mdx(via @objectstack/spec)
  • content/docs/data-modeling/validation.mdx(via @objectstack/spec)
  • content/docs/deployment/backup-restore.mdx(via @objectstack/cli)
  • content/docs/deployment/self-hosting.mdx(via @objectstack/cli)
  • content/docs/deployment/troubleshooting.mdx(via @objectstack/spec)
  • content/docs/getting-started/build-with-claude-code.mdx(via @objectstack/spec)
  • content/docs/getting-started/cli.mdx(via @objectstack/cli, @objectstack/spec)
  • content/docs/getting-started/common-patterns.mdx(via @objectstack/spec)
  • content/docs/getting-started/examples.mdx(via @objectstack/spec)
  • content/docs/getting-started/quick-reference.mdx(via @objectstack/spec)
  • content/docs/getting-started/quick-start.mdx(via @objectstack/spec)
  • content/docs/getting-started/validating-metadata.mdx(via @objectstack/spec)
  • content/docs/getting-started/your-first-project.mdx(via @objectstack/cli, @objectstack/spec)
  • content/docs/kernel/cluster.mdx(via @objectstack/spec)
  • content/docs/kernel/contracts/auth-service.mdx(via packages/spec)
  • content/docs/kernel/contracts/cache-service.mdx(via packages/spec)
  • content/docs/kernel/contracts/data-engine.mdx(via @objectstack/spec)
  • content/docs/kernel/contracts/index.mdx(via @objectstack/spec)
  • content/docs/kernel/contracts/metadata-service.mdx(via packages/spec)
  • content/docs/kernel/contracts/storage-service.mdx(via packages/spec)
  • content/docs/kernel/index.mdx(via packages/spec)
  • content/docs/kernel/runtime-services/data-service.mdx(via packages/cli)
  • content/docs/kernel/runtime-services/email-service.mdx(via packages/spec)
  • content/docs/kernel/runtime-services/index.mdx(via packages/cli, packages/spec)
  • content/docs/kernel/runtime-services/queue-service.mdx(via packages/spec)
  • content/docs/kernel/runtime-services/sharing-service.mdx(via packages/spec)
  • content/docs/kernel/runtime-services/sms-service.mdx(via packages/spec)
  • content/docs/kernel/runtime-services/storage-service.mdx(via packages/spec)
  • content/docs/kernel/services-checklist.mdx(via @objectstack/spec)
  • content/docs/permissions/authentication.mdx(via @objectstack/cli)
  • content/docs/permissions/authorization.mdx(via @objectstack/lint, @objectstack/spec)
  • content/docs/permissions/permission-sets.mdx(via @objectstack/spec)
  • content/docs/permissions/permissions-matrix.mdx(via @objectstack/spec)
  • content/docs/permissions/positions.mdx(via @objectstack/spec)
  • content/docs/permissions/sharing-rules.mdx(via @objectstack/spec)
  • content/docs/plugins/adding-a-metadata-type.mdx(via @objectstack/spec)
  • content/docs/plugins/development.mdx(via @objectstack/spec)
  • content/docs/plugins/index.mdx(via @objectstack/spec)
  • content/docs/plugins/packages.mdx(via @objectstack/cli, @objectstack/spec)
  • content/docs/protocol/backward-compatibility.mdx(via @objectstack/spec)
  • content/docs/protocol/diagram.mdx(via packages/spec)
  • content/docs/protocol/kernel/config-resolution.mdx(via @objectstack/spec)
  • content/docs/protocol/kernel/i18n-standard.mdx(via @objectstack/spec)
  • content/docs/protocol/kernel/lifecycle.mdx(via @objectstack/spec)
  • content/docs/protocol/kernel/plugin-spec.mdx(via @objectstack/cli, @objectstack/spec)
  • content/docs/protocol/kernel/realtime-protocol.mdx(via @objectstack/cli)
  • content/docs/protocol/kernel/runtime-capabilities.mdx(via @objectstack/spec)
  • content/docs/protocol/knowledge.mdx(via @objectstack/spec)
  • content/docs/protocol/objectql/index.mdx(via packages/spec)
  • content/docs/protocol/objectql/query-syntax.mdx(via @objectstack/spec)
  • content/docs/protocol/objectql/schema.mdx(via @objectstack/spec)
  • content/docs/protocol/objectql/security.mdx(via packages/spec)
  • content/docs/protocol/objectql/state-machine.mdx(via @objectstack/spec)
  • content/docs/protocol/objectui/actions.mdx(via @objectstack/spec)
  • content/docs/protocol/objectui/concept.mdx(via @objectstack/spec)
  • content/docs/protocol/objectui/index.mdx(via @objectstack/spec)
  • content/docs/protocol/objectui/layout-dsl.mdx(via @objectstack/spec)
  • content/docs/protocol/objectui/record-alert.mdx(via @objectstack/spec)
  • content/docs/protocol/objectui/widget-contract.mdx(via @objectstack/spec)
  • content/docs/releases/implementation-status.mdx(via @objectstack/cli, @objectstack/spec)
  • content/docs/releases/index.mdx(via @objectstack/spec)
  • content/docs/releases/v12.mdx(via @objectstack/spec)
  • content/docs/releases/v13.mdx(via @objectstack/spec)
  • content/docs/releases/v9.mdx(via @objectstack/spec)
  • content/docs/ui/create-vs-edit-form.mdx(via @objectstack/spec)
  • content/docs/ui/dashboards.mdx(via @objectstack/spec)
  • content/docs/ui/forms.mdx(via @objectstack/spec)
  • content/docs/ui/index.mdx(via @objectstack/spec)
  • content/docs/ui/public-data-collection.mdx(via @objectstack/spec)
  • content/docs/ui/setup-app.mdx(via @objectstack/spec)
  • content/docs/ui/views.mdx(via @objectstack/spec)

Advisory only. To re-verify, run the docs-accuracy-audit workflow scoped to these files:
node scripts/docs-audit/affected-docs.mjs origin/main → pass the list as args.docs.

@os-zhuang
os-zhuang merged commit 8923843 into mainJul 17, 2026
17 checks passed
@os-zhuang
os-zhuang deleted the claude/loving-bartik-ae7a83 branch July 17, 2026 07:10
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

documentationImprovements or additions to documentationprotocol:uisize/lteststooling

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant

@os-zhuang