docs(skills): objectstack-ui puts the create/edit form under form, not a named formViews entry - #21651
Conversation
…`, not a named `formViews` entry `ViewSchema.form` is the container's default form view and `formViews` holds additional named forms; the expansion serves `form` as the one default and promotes no named form in its place. Three positions in the objectstack-ui skill authored the create/edit form as `formViews.default` / `formViews.edit`: the subforms example in SKILL.md, the `os:check` container and its callout in rules/list-views.md, and the first eval's expected output. Each now puts that form in `form`; the wizard eval keeps its legitimately named form. Co-authored-by: Claude <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01CB6W87z22K2yjUCDyVrJRk
…ainer's defaults The sentence introducing the `defineView` container listed `list`, `listViews` and `formViews` and left out `form`, the same omission the callout below it carried. It now reads "the default `list` and `form`, named `listViews`, and `formViews`", re-wrapped at the same width. Co-authored-by: Claude <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01CB6W87z22K2yjUCDyVrJRk
Contract reviewServed-tier: Read-only shape: the diff against the merge base 15fe567 (two commits, a864ccc and the patch-round commit d66ec02), card #21537 with every comment, and this head's check-runs; nothing built or run locally. Reviewed by the dispatch seat in seat (served tier equals the constant's value, read from ① Derived judgments
② Semver level
③ Boundary flags
Implemented-by: VERDICT: PASS |
Contract reviewServed-tier: Supersedes record 5975004740, whose ① Derived judgments
② Semver level
③ Boundary flags
Implemented-by: VERDICT: PASS |
维护者速读(终稿)— PR #21651(#21537)· skills seat 1 · 2026-10-04T00:43Z改了什么: 发布的 为什么改: PR #21535 落地后,运行时只把 风险与代价(含回滚): 纯技能文本,无 changeset( 席位意见: 建议批准。示例顺序按 你要做的(一个动作): 在 PR #21651 上给一次 APPROVED review;批准后由席位清标、ready、挂 auto-merge 入队。 |
Fixes #21537
Clause-②: no
What this changes
ViewSchema.formis a container's "Default form view" andformViewsare "Additional named form views" (packages/spec/src/ui/view.zod.tslines 4782 and 4784 atorigin/main15fe567). Since PR #21535 landed,expandViewContainerWithDiagnosticsservesformas the one default form and promotes no named form in its place, so a container whose only form is a namedformViewsentry declares no default form. Three positions in the publishedobjectstack-uiskill taught exactly that shape. Each now authors the create/edit form underform:skills/objectstack-ui/SKILL.md— the subforms example (option 2 under entering a record together with its child line items):formViewswith adefaultkey becomesform, one nesting level fewer; the inline comments are kept.skills/objectstack-ui/rules/list-views.md— the os:check markeddefineViewcontainer: theformViewsblock with aneditkey becomesform, placed afterlistin the schema's own declaration order (list,form,listViews,formViews); the callout now reads "Every view lives underlist/form/listViews/formViews".skills/objectstack-ui/evals/views-apps-actions-pages.json— eval 1'sexpected_outputnow expectsdefineView({ list, form, listViews })and "formwithtype: 'simple'". Itsmust_contain/must_not_containreference no changed spelling and are untouched.Every
formViewsoccurrence inskills/objectstack-ui/**at the base, and its disposition:SKILL.md:14formViewstype: 'wizard'"SKILL.md:77formViewswithdefaultformSKILL.md:207list+form, then namedlistViews/formViews"rules/list-views.md:14list, namedlistViews, andformViews"rules/list-views.md:29formViewswitheditformrules/list-views.md:38formnowevals/views-apps-actions-pages.json:7formevals/views-apps-actions-pages.json:57and:60must_containParse proof (built spec at a864ccc)
expandViewContainerWithDiagnostics('support_case', container)imported frompackages/spec/dist, on thelist-views.mdcontainer before and after:formViewswithedit, noform): forms served =support_case.edit,isDefaultabsent; collisions noneform): forms served =support_case.form,isDefault: true; collisions noneReadings
Whole-file lines and ratchet tokens, before → after (base 15fe567 → a864ccc):
skills/objectstack-ui/SKILL.mdskills/objectstack-ui/rules/list-views.mdskills/objectstack-ui/evals/views-apps-actions-pages.jsonWhole package (sum of every
skills/**/SKILL.md): 4397 → 4395 lines. No ceiling moved. No changeset: the diff publishes nothing from a released package (skill text only), soskip-changesetapplies.Verification (all at a864ccc; every exit code captured before any pipe)
pnpm --filter @objectstack/spec build— exit 0 (underscripts/pm/os-verify-lock.sh, "VERDICT command-exit 0").pnpm --filter @objectstack/spec run check:skill-examples— exit 0: "260 prose examples type-check across 3 surface(s) — every marked block parsed, so tsc ran the SEMANTIC pass on all of them"; the edited os:check container is among them. A first run exited 3 (PREREQUISITE NOT MET:packages/client-react/distunbuilt, nothing measured);@objectstack/types,core,clientandclient-reactwere then built directly and the gate rerun.pnpm --filter @objectstack/spec run check:skill-docs— exit 0 (skills/README.md,content/docs/ai/skills-reference.mdxin sync);check:skill-refs— exit 0 ("9 generated files in sync").node scripts/check-skills-token-ratchet.mjs— exit 0: "54 authored bundle file(s) within their ceilings";--self-testexit 0 (65 cases).node scripts/pm/dispatch-gates.mjs --commandswith no paths derived 24 families from the diff at a864ccc; all 24 run, every exit 0;--ranreconciliation: "24 derived famil(ies) accounted for — 24 run, 0 NOT-MEASURED". The derived set equals the dispatch's list minuscheck:skill-examples, which was run anyway.pnpm --filter @objectstack/lint run check:doc-formula-expressionsexited 3 (PREREQUISITE NOT MET) on the first run and 0 after@objectstack/formulaand@objectstack/lintwere built.pnpm check:nul-bytesexit 0.pnpm lintis CI's run, not run locally (declared narrowing: the diff is Markdown and JSON only, no ESLint-governed file).维护者速读(草稿)
改了什么。 发布的
objectstack-ui技能有三处把「新建/编辑表单」写在formViews的具名条目下(default、edit)。本 PR 把这三处改为容器的form键:SKILL.md 的子表单示例、list-views.md 的defineView示例及其提示框、评测文件第一条的预期输出。向导(wizard)表单是真正的附加具名表单,保持不动。为什么改。 spec 把
form定义为容器的默认表单、formViews定义为附加的具名表单。PR #21535 落地后,运行时只把form当默认表单,不再把第一个具名表单提升为默认。技能照旧教的话,AI 作者按示例写出的应用在规范层面没有默认表单,只靠前端的兜底才显得正常。按 NORTH-STAR 优先级规则 4,写给 AI 的技能说错一句等于产品缺陷;两者应随同一个版本发布。风险与代价(含回滚)。 纯技能文本,不涉及代码与发布包,无 changeset。三个文件的 token 读数均净减(见上表),没有抬任何上限;
check:skill-examples证明改后的示例仍能编译,并用构建后的 spec 解析验证了改后容器的support_case.form被标为默认。回滚即 revert 本 PR 的单个 commit。残余:list-views.md 第 14 行的引言仍只列出list/listViews/formViews(在认领的区域之外),见 Acceptance notes。席位意见。
你要做的。
skills/**是 Tier H 受管面:需要你的一次 APPROVED review;之后由席位落地。PR 保持 draft,不翻 ready、不挂 auto-merge。Acceptance notes
rules/list-views.md:14("aggregating the defaultlist, namedlistViews, andformViews") omitsformthe same way the callout did. It sits outside the claimed region (the container and the callout), so it is untouched here; folding it in costs about four tokens against a headroom of 76 and is reported to the seat.must_containdoes not assert theformkey (it never asserted the form key before either); adding"form:"would fit the remaining headroom of 3 tokens but is beyond the card's stated fix and is left to the seat.formafterlistViews; this PR follows the schema's declaration order (list,form,listViews,formViews) in the container, the callout and the eval, which is also the order of SKILL.md's "Define defaultlist+form, then namedlistViews/formViews" row.origin/mainwas still at the base when this PR opened (no merge needed), and a second merge follows once that sibling lands.Generated by Claude Code