Skip to content

docs(skills): the page-builder guide authors object-grid and object-gantt in the properties bag (objectui#10859; objectui#11276 rider) - #11404

Merged
os-zhuang merged 2 commits into
mainfrom
claude/issue-10859-page-builder-bag-examples
Oct 2, 2026
Merged

os-zhuang merged 2 commits into
mainfrom
claude/issue-10859-page-builder-bag-examples

Conversation

@objectstack-fleet

Copy link
Copy Markdown
Contributor

Part of #10859
Clause-②: no
Part of #11276 — the declared rider: objectui#11276's release comment 5940114124 names this seat as carrier of the "Grid plugin example", so the two examples move in ONE governed PR and one approval covers both.

⛔ Governed surface (skills/**): this PR stays a DRAFT until an authorized approver (os-zhuang / hotlong) leaves an APPROVED review; the claiming seat lands it after that. node scripts/check-governed-queue-guard.mjs --test skills/objectui/guides/page-builder.md answers GOVERNED (exit 3).

What changes

One file, skills/objectui/guides/page-builder.md, its "Plugin integration in page schemas" section:

  • "Grid plugin example": the object-grid node now writes objectName and columns inside properties; bind stays on the node, where objectui's BaseSchema declares it (the bag refuses it, measured below). PR objectui#11399 moved the arm and listed this governed producer without editing it.
  • "Gantt plugin example": the object-gantt node now writes objectName and the gantt block inside properties. PR objectui#11337 moved the arm; this is the governed item objectui#10859's release comment 5926748567 names.
  • The section lead no longer says plugin widgets "read their configuration off the node exactly like the built-in renderers do". It names the three arms that take the bag (object-grid, object-form, object-gantt) in the wording the "Form plugin example" header used, says objectui validate refuses the flat spelling by name, says object-kanban declares its keys on the node, and keeps the true half: the props envelope is not read.
  • The prose after the gantt fence that taught the flat startDateField / endDateField keys "on the node" (the ObjectView / ListView flatten product) is retired. One sentence replaces it: the flat keys are refused by name and the refusal points at properties.gantt.KEY. The sentence on the required trio and the README pointer stay.
  • The "Form plugin example" header drops the sentence the lead now carries, so the three bag examples read alike.

No other file. No changeset: node scripts/check-changeset-presence.mjs answers "No source or published contract of a released package changed in this range, so no changeset is owed" — the PR objectui#11397 precedent: skills/** sits outside every changesets-versioned package, so the repo rule asks for neither a bump nor an empty-frontmatter declaration; skip-changeset has no reader in this repo, so no label either.

Line readings (skills/**, governed; budget net 0, no growth)

reading before (6aa029b63f) after net
skills/objectui/guides/page-builder.md, whole file 353 352 −1
whole bundle, every file under skills/ (27 files) 5408 5407 −1
every SKILL.md under skills/, summed 142 142 0

git diff --numstat for the one file: 23 added, 24 deleted. The two bag wrappers cost 4 lines; the retired gantt prose (6 lines out, 2 in) and the shortened form header paid for them. No token ratchet is defined for skills/** in this repo, so lines are the only reading.

Measured (worktree at base 6aa029b63f, then at the head; Node v22.22.2 from /opt/nvm, since the container's v22.22.0 is refused by objectui's engine-strict install)

Every os:check JSON fence in this file, through both authoring faces, read from the BUILT @object-ui/types dist: safeValidateSchema (the function objectui validate calls) and StrictAnyComponentSchema. The file has 8 such fences plus one typescript and one tsx fence the faces do not judge.

fence (by type) at base, tolerant / strict at head, tolerant / strict
card (section 3) ACCEPT / ACCEPT ACCEPT / ACCEPT
action:button ACCEPT / ACCEPT ACCEPT / ACCEPT
statistic ACCEPT / ACCEPT ACCEPT / ACCEPT
card (expression boundaries) ACCEPT / ACCEPT ACCEPT / ACCEPT
object-grid REFUSE / REFUSE: invalid_type at objectName and at columns ("Did you mean objectName → properties.objectName?"), plus the record-source rule at properties.objectName ACCEPT / ACCEPT
object-form ACCEPT / ACCEPT ACCEPT / ACCEPT
object-kanban ACCEPT / ACCEPT ACCEPT / ACCEPT (fence unchanged)
object-gantt REFUSE / REFUSE: invalid_type at objectName and at gantt ("Did you mean gantt → properties.gantt?"), plus the record-source rule at the root ACCEPT / ACCEPT

Count: 2 of 8 refused at base, 0 of 8 at head.

Public door, end to end. The built packages/cli/dist/cli.js validate on each fence as a standalone document: the base grid and gantt fences exit 1, "Schema validation failed", printing the Did you mean … → properties.… lines above; the head grid and gantt fences exit 0, "Schema is valid", Type: object-grid / Type: object-gantt.

The rewrites' edges, each a probe document on the same two faces:

  • bind inside the grid's bag: REFUSE on both faces, unrecognized_keys at properties naming bind ⇒ bind stays on the node, as PR objectui#11399's producers keep it.
  • The gantt trio: a bag gantt block missing endDateField, startDateField or titleField is refused at properties.gantt.KEY on both faces; the block with only the three is accepted ⇒ "Those three gantt keys are the required ones; every other option … is optional" stays true.
  • The flat gantt keys on the node (startDateField / endDateField / titleField): REFUSE on both faces, each "Did you mean KEY → properties.gantt.KEY?" ⇒ the replacement sentence says what the validator prints.
  • object-kanban in a bag (properties.objectName / properties.groupBy): the tolerant face accepts it (passthrough), the strict face refuses unrecognized_keys naming properties; the flat kanban node is accepted by both ⇒ the lead's "object-kanban declares its keys on the node" is the measured reading, and that example is untouched.
  • Control: { "type": "timeline" } is accepted by both faces.

The same sweep over every other .md under skills/ (report only, nothing edited): 16 files, 70 os:check JSON fences. The marker's contract for a JSON fence is "parses" (check-skill-examples.mjs), not "is a component document", and most refusals are fences whose root is not a node at all (no type: project-setup.md 5, schema-expressions.md 6, plugin-development.md 1, rules/protocol.md 1). Three fences with a registered type are refused: guides/data-integration.md and guides/schema-expressions.md each carry a list node written with bind only, refused at items (invalid_type) by both faces, and guides/plugin-development.md carries a type: "module" fence (invalid_union at type, a custom plugin type the guide registers in prose). rules/protocol.md's card fence with a props envelope is refused by the strict face only, which is the trap that passage documents. Listed in the dev report for the seat; not this PR's.

Gates (every exit code captured to a file before any pipe)

At ccb4e7fb, the guide commit (skills/** is byte-identical at the head d83d2748, which only merges origin/main 7728c67c):

gate exit verdict line
pnpm exec turbo run build of check-skill-examples.mjs --build-filter's closure, --concurrency=2, under the shared verify lock 0 Tasks: 29 successful, 29 total
pnpm check:skill-examples 0 Every marked skill example holds up against the built types. (JSON phase: 70 fence(s) parsed, 0 failed.)
pnpm exec vitest run of the 12 ledgered test files that read skills/objectui/** (per scripts/markdown-test-inputs.mjs: skill-guide-provider-envelope, skill-guide-data-table-binding, skill-guide-permission-config, check-installed-spec-pin-claims, check-shell-escape-residue, check-skill-eval-tokens, check-skill-examples, check-skills-paths, doc-version-claims, dollar-dialect-alias-census, layered-read-declared-path-4016, markdown-test-inputs), under the lock 0 Test Files 12 passed (12) · Tests 389 passed (389), VERDICT command-exit 0

At the head d83d2748:

gate exit verdict line
pnpm check:skills-paths 0 OK (89/90 stated path(s) resolve across 20 guide file(s); 1 baselined)
pnpm check:skill-eval-tokens 0 Every must_contain token is taught by its own skill bundle.
pnpm check:control-bytes 0 OK (scanned 9926 tracked text file(s); skipped 85 binary); a self-scan of the file for control bytes: 0 hits
pnpm check:shell-escape-residue 0 OK (5/5 root(s) resolved …)
node scripts/check-changeset-presence.mjs 0 No source or published contract of a released package changed in this range, so no changeset is owed.
pnpm changeset:check 0 No changeset declares a major bump.
pnpm check:new-line-citations 0 0 new citation(s), enforcement report-only
pnpm check:changeset-claims (report-only) 0 names .changeset/6475-gantt-block-face-declared.md, whose census sentence says this guide's gantt block carries the trio: still true (the block moved into the bag with all three keys), so no dated note is owed
node scripts/check-governed-queue-guard.mjs --test skills/objectui/guides/page-builder.md 3 GOVERNED — 1 of 1 path(s), the expected answer: draft until approval

Not run, with the reason: check:doc-snippets, check:doc-examples, check:doc-example-ids and check:doc-fences scan content/docs and the package READMEs (check-doc-snippet-types.mjs's header says skills/objectui/** is not claimed by any gate there), so they cannot read this diff. Repo-wide pnpm lint and pnpm test are CI's runs.

维护者速读(草稿)

改了什么。 只改一份对外发布的技能指南 skills/objectui/guides/page-builder.md 的「Plugin integration in page schemas」一节,净 −1 行。两个示例(object-grid 的 Grid 示例、object-gantt 的 Gantt 示例)从「属性平铺在节点上」改成写进 spec 规定的 properties 包;bind 留在节点上。该节的导语不再说「插件组件像内建渲染器一样直接从节点上读配置」,改为点名三个走 properties 包的类型(object-grid / object-form / object-gantt)、说明 objectui validate 会按键名拒收平铺写法、object-kanban 仍在节点上声明键,并保留「props 信封不会被读」这句真话。Gantt 示例下面那段教「也可以把 startDateField 等键平铺在节点上」的文字删掉,换成一句:平铺键会被按名拒收,拒收信息会指向 properties.gantt.KEY。

为什么改。 这两个示例是 AI 写页面时的直接范本,而它们教的写法现在会被 objectui validate 拒收(实测:基线上的两段 JSON 用构建后的 CLI 校验都是 exit 1、「Schema validation failed」;改后两段都是 exit 0、「Schema is valid」)。拒收来自已合并的 PR objectui#11337(object-gantt,objectui#10859 第 6 批)和 PR objectui#11399(object-grid,objectui#11276):按平台 spec 的 PageComponentSchema,组件自己的属性只能住在 properties 包里,objectui 的校验面与 os validate 对齐。指南是受管面,所以那两张卡都把它列出而没有改,由本 PR 一次性承接,一次批准覆盖两个示例。文件里其余 6 个 os:check JSON 示例在基线上就通过校验,本次全部复测通过。

风险与代价(含回滚)。 零代码、零发布包改动、无 changeset(门禁判定本次不欠)。风险只有措辞是否准确,每句都有上面的实测支撑(包括 bind 放进包里会被拒、gantt 三个必填键、kanban 平铺仍被接受)。回滚 = revert 这一个 commit,指南回到旧写法——但旧写法会被校验器拒收,所以不建议回滚。本 PR 是受管面(skills/**),须人工批准后才能落地。

席位意见。 (留空)

你要做的。 若认可措辞,在本 PR 留一条 APPROVED review;认领席随后转 ready 并走合并队列落地。

Acceptance notes

  • Observed, not filed, for the seat: three os:check JSON fences in other governed guides are refused with a registered type (two list nodes refused at items, one module custom type), listed under "Measured" above. Not this PR's file; the dev report carries them with dedupe words.
  • Observed, not filed: the "Kanban plugin example" writes bind on the node, which objectui's BaseSchema declares and both objectui faces accept; the spec's PageComponentSchema refuses bind (recorded on objectui#10859 at the batch-6 ACCEPT as a BaseSchema-wide question). Unchanged here.
  • The branch head is a merge of origin/main 7728c67c (objectui#11395, packages/layout) into the guide commit; the merge commit carries git's default message, and objectui forbids force-push, so it is not rewritten. The squash landing drops it.

Session session_01JG2jy8a9su7ia4Hx7zxv42, seat domain:ui#2, account os-sales.


Generated by Claude Code

claude added 2 commits October 1, 2026 21:01
… in the properties bag (objectui#10859)

The "Grid plugin example" and "Gantt plugin example" os:check fences wrote
their props flat on the node, a spelling `objectui validate` refuses by name
since the object-gantt (objectui#10859 batch 6) and object-grid
(objectui#11276) arms moved to the spec's `properties` bag. Both fences now
write the bag; `bind` stays on the grid node, where BaseSchema declares it.

The section lead no longer says plugin widgets read their configuration off
the node: it names the three arms that take the bag and the one that still
declares its keys on the node, and keeps the sentence that the `props`
envelope is not read. The prose that taught the flat gantt keys "on the
node" is retired for one sentence naming the refusal and its prescription.

Measured on the built @object-ui/types dist at 6aa029b: the two fences
were refused by both authoring faces; the rewritten fences and the other six
os:check JSON fences in the file are accepted by both. Net -1 line under the
skills/** zero-growth budget.

Co-authored-by: Claude <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01JG2jy8a9su7ia4Hx7zxv42
@github-actions

github-actions Bot commented Oct 1, 2026

Copy link
Copy Markdown
Contributor

changeset-claim-re-read

⚠️ 1 pending changeset(s) describe a file this change touches

Their bodies publish verbatim into the CHANGELOG at the next release, so this is a request to re-read them against your diff — addressed here because you are the one seat that can answer it without re-deriving anything.

⛔ Nothing here blocks, and nothing here is a verdict on your change. This gate exits 0, is not a required context, and judges name resolution, never meaning: it asked whether a pending body names a file you touched. "Is this sentence still true?" is the one question it will not answer, and the one you are being asked to answer.

.changeset/6475-gantt-block-face-declared.md

  • names skills/objectui/guides/page-builder.md → skills/objectui/guides/page-builder.md — edited by this change

    Maintainer ruling, objectui#6475 (2026-08-27), Option A — enforce as-is, immediately, no warning window (the startup-stage no-gradualism rule, objectstack#12668: transitions do not get phased windows without named external-user evidence, and none exists here). A census of every gantt block reachable through ObjectGanttSchema in this repository — the examples/schema-catalog fixtures, content/docs/plugins/plugin-gantt.mdx, and the published skills/objectui/guides/page-builder.md guide — found zero blocks missing the trio.

Read the paragraph, not the line: both false halves of the objectui#8617 claim sat in one paragraph, and correcting either alone would have left it asserting the same wrong thing.

If a claim did go false, correct the body. That is precedented and prose-only, frontmatter untouched; check-changeset-overwrite.mjs will report the correction as its own case 2 ("correcting a declaration on purpose … legitimate"), which is the intended shape — one gate asks for the read, the other records the write.

Not covered, stated so nobody reads this as more: a born-false claim that spells no line address at all (objectui#9495 coordinated one by ORDINAL — "a grep finds that member first" — and deciding that means reading what the sentence means), a claim spelled as a symbol or a package rather than a backticked file name, and a file named ambiguously.

Compared the checked-out tree with 7728c67c8 (merge-base with origin/main): 1 file(s) changed outside .changeset/, read against 1953 pending declaration(s) that publish a body (2574 pending in total). · run

@objectstack-fleet

Copy link
Copy Markdown
Contributor Author

维护者速读(终稿)

domain:ui seat 2 · session_01JG2jy8a9su7ia4Hx7zxv42 · 2026-10-01T21:30Z。席位已对照 diff 校正草稿。卡上复核:ACCEPT 见 objectui#10859,契约复审档复核 5940930445 PASS。

改了什么。 只改对外发布的技能指南 skills/objectui/guides/page-builder.md 的「Plugin integration in page schemas」一节(+23 / −24,净 −1 行)。两个示例从「属性平铺在节点上」改成写进 spec 规定的 properties 包:object-grid(bind 仍留在节点上)和 object-gantt。导语改为点名走 properties 包的三种类型(object-grid / object-form / object-gantt),说明 objectui validate 会按键名拒收平铺写法,object-kanban 仍在节点上声明键。Gantt 示例下那段教「平铺键也能写在节点上」的文字,换成一句:平铺键会被按名拒收,拒收信息指向 properties.gantt.KEY。

为什么改。 这两个示例是 AI 写页面时直接照抄的范本,而它们教的写法现在会被 objectui validate 拒收(实测:改前两段 JSON 交给构建后的 CLI 校验都 exit 1,改后都 exit 0)。拒收来自已合并的 PR objectui#11337(object-gantt)和 PR objectui#11399(object-grid)。指南是受管面,那两张卡都只列出它、没有改它,所以由本 PR 一次承接,一次批准覆盖两个示例。文件里其余 6 个 os:check 示例改前改后都通过校验。

风险与代价(含回滚)。

  • 零代码、零发布包改动,无 changeset(门禁判定不欠)。CI 全绿。
  • 风险只在措辞。复核指出一处可以更精确:「bind is a node key」对 objectui 自己的校验成立,但平台 spec 的 PageComponentSchema 并不收 bind。这是卡上早已记录的全局问题(objectui 的 BaseSchema 声明了 bind),旧指南本来就把 bind 写在这个节点上,本 PR 没有新增它。
  • 回滚 = revert 这一个 commit。但旧写法会被校验器拒收,不建议回滚。

席位意见。 建议批准。每句都有实测支撑,范围恰为一节,净行数在预算内(−1),契约复审档复核 PASS。上述 bind 措辞点不阻塞:它不会把 AI 引向写错,objectui 的校验确实接受节点上的 bind。若您希望现在就收紧措辞,可按复核建议把 Grid 示例的标题改为 "Grid plugin example — bind is a key objectui's BaseSchema declares on the node, so it stays beside the bag:"。改后 head 会变,需重跑一次复核。另:复核在其他两份受管指南里发现 4 处 { "type": "list", "bind": … } 示例被校验拒收(list 要求 items,渲染器却从 bind 取数),已立卡 objectui#11405,修复面多半在 packages/types,不在本 PR。

你要做的。 在本 PR 留一条 APPROVED review(os-zhuang 或 hotlong 任一)。批准后由认领席转 ready、挂 auto-merge,走合并队列落地。

domain:ui seat 2 · 维护者速读(终稿) · 2026-10-01T21:30Z


Generated by Claude Code

@os-zhuang
os-zhuang marked this pull request as ready for review October 1, 2026 23:51
@os-zhuang
os-zhuang enabled auto-merge October 1, 2026 23:51
@os-zhuang
os-zhuang added this pull request to the merge queue Oct 1, 2026
Merged via the queue into main with commit 64c173d Oct 2, 2026
41 checks passed
@os-zhuang
os-zhuang deleted the claude/issue-10859-page-builder-bag-examples branch October 2, 2026 00:07
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants