Repository navigation
docs(ui): generate the component reference for all 106 components from sdui.manifest.json; retire the Setup, Console and Studio pages into the metadata pages and rename the section User Interface - #27179
Conversation
…ith a drift check scripts/gen-sdui-reference.mjs renders content/docs/ui/components/ from the repo-root manifest: one page per namespace (html-tier elements and the plugin-* blocks each share a page), every input as a table row, and an index linking all components. --check fails when the committed pages differ; lint.yml runs it next to the manifest's own check. Co-authored-by: Claude <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01L9qibwMyAnTNeas3ANYhyi
Co-authored-by: Claude <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01L9qibwMyAnTNeas3ANYhyi
… audit scope and the merge driver The docs-accuracy audit's hand-written scope now excludes content/docs/ui/components/** beside references/, and the directory is routed to the os-regen merge driver with gen:sdui-reference as its regeneration. Co-authored-by: Claude <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01L9qibwMyAnTNeas3ANYhyi
…n, beside the other generated trees Co-authored-by: Claude <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01L9qibwMyAnTNeas3ANYhyi
📓 Docs Drift CheckNothing in this diff resolved to a documentable surface (no symbol, route or SDK anchor derived from 0 changed package(s)), so this run has no opinion about the docs. What this run could not see
Coarse fallback — 0 page(s) merely mention a changed package (the pre-#9192 predicate, kept for the deliberately-wide backstop): |
…n os-regen-merge's table Co-authored-by: Claude <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01L9qibwMyAnTNeas3ANYhyi
# Conflicts: # content/docs/ui/index.mdx # content/docs/ui/meta.json
|
triage#1 · os-zhuang · session_01AavokzJ5DndAwitDXvKy4U Contract-review-claim: Triage seat, under the gap rule (#27062), condition (b). This PR touches a governed path ( Generated by Claude Code |
Contract reviewServed-tier: ① Derived judgments
② Semver level
③ Boundary flags
④ Design judgment
Holds. Tried to break it:
Findings: no must-fix. Should-fix (non-blocking): (1) the PR body names the wrong lane for the step; (2) file a carrier for the
Implemented-by: VERDICT: PASS Generated by Claude Code |
…ction User Interface The three pages described products rather than metadata. Their author-facing facts move to the page that owns each behavior: - apps: navigationContributions, the missing-anchor diagnostic and the Setup app's group anchors - views: how a list opens a record (navigation.mode, ?recordId, the drawer stack), per-user list state never writing the view, the 403 for a gated view - deployment/validating-metadata: the load-time _diagnostics envelope, the /api/v1/meta/diagnostics sweep, and what a predicate that cannot be evaluated does at runtime - actions: why a placed action appears nowhere - automation/approvals: the record's Approvals tab The product tour stays in build-without-code. The old URLs answer 308s (/docs/ui/setup-app to /docs/ui/apps, console and studio to build-without-code), and /docs/concepts/setup-app is re-pointed so no chain forms. The audit's hand-written list drops the three pages. Co-authored-by: Claude <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01L9qibwMyAnTNeas3ANYhyi
|
Contract-review-handoff: triage — CONTRACT_REVIEW_TIER unavailable (maintainer rule 「契约复审都要等分诊」, the dispatching seat does not review, 2026-10-28T12:48Z) · head 906bbca Delta review owed on Generated by Claude Code |
…ction variant to danger Co-authored-by: Claude <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01L9qibwMyAnTNeas3ANYhyi
|
Contract-review-handoff: triage — CONTRACT_REVIEW_TIER unavailable (maintainer rule 「契约复审都要等分诊」, the dispatching seat does not review, 2026-10-28T12:54Z) · head 3c36420 This supersedes 6469401570, whose head is now stale. On Generated by Claude Code |
|
triage#1 · os-zhuang · session_01AavokzJ5DndAwitDXvKy4U Contract-review-claim: Triage seat, taking the Generated by Claude Code |
Contract reviewServed-tier: ① Derived judgmentsReview on a moved head. The last record (comment 6467314546) names
② Semver level
③ Boundary flags
④ Design judgment
Findings: no must-fix. No open should-fix: both earlier should-fixes are taken or resolved.
Implemented-by: VERDICT: PASS Generated by Claude Code |
K3 #27179 renamed the content/docs/ui section from "Views & Apps" to "User Interface"; the frontend landing's pointer follows it. Claude-Session: https://claude.ai/code/session_01L9qibzngYyRjmvNxjkfVyd Co-authored-by: Claude <noreply@anthropic.com>
…ons input retired main's #27179 generates content/docs/ui/components/ from sdui.manifest.json; the merged manifest no longer publishes list-view's options input. Co-Authored-By: Claude <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01WGufzevL8Q6rTfGz2XHXGT
Requested by Tesla · project thread
Fixes #27142
Clause-②: no
Metadata-protocol: none
Tier H: the diff edits
.github/workflows/lint.yml(one new gate step), so the maintainer lands it.维护者速读
scripts/gen-sdui-reference.mjs,从根目录sdui.manifest.json生成文档站的「组件参考」(content/docs/ui/components/:7 个分类页加 1 个索引页),一次覆盖全部 106 个组件,每个组件列出输入项的类型、可选值、是否必填和说明。lint 新增一步pnpm check:sdui-reference:manifest 变了而参考页没重新生成,这一步就红。scripts/gen-sdui-reference.mjs的pageFor()(分页规则)和cellText()(MDX 转义);②.github/workflows/lint.yml新增的那一步;③scripts/check-role-word.mjs的SKIP_SUBTREES。node scripts/gen-sdui-reference.mjs --check,应看到✓ … matches sdui.manifest.json (106 components on 7 pages);或在预览站打开/docs/ui/components,索引表有 106 行。ui/下的setup-app、console、studio三页。三页中写给元数据作者的内容并入apps、views、actions、automation/approvals和deployment/validating-metadata;产品导览统一指向build-without-code。栏目名从「Views & Apps」改为「User Interface」。另加 3 条跳转,并改了 1 条旧跳转,避免形成跳转链。Wider scope on head
906bbcaa(maintainer rulings)In the K3 card thread on 2026-10-28 at 12:23Z, Tesla answered 「删掉」 to retiring the three Console-tour pages under
content/docs/ui/and 「板块名用 User Interface」 to the section name. Head906bbcaa(on top of a merge ofmain,f4815b07) carries both:ui/setup-app.mdxui/apps.mdx:navigationContributionsand the Setup group anchorsui/console.mdxui/views.mdx: the record overlay and per-user list state.ui/actions.mdxgains a troubleshooting line,automation/approvals.mdxthe record tab, anddeployment/validating-metadata.mdx_diagnostics, the sweep endpoint and runtime predicate failure. The product tour isbuild-without-code.ui/studio.mdxconsole; the tour isbuild-without-codeOther changes:
content/docs/ui/meta.jsonis titled "User Interface", as is the indexnavTitle.componentstakes the three retired slots.apps/docs/redirects.mjs:/docs/ui/setup-appnow redirects to/docs/ui/apps, and/docs/ui/consoleand/docs/ui/studioto/docs/build-without-code./docs/concepts/setup-appis re-pointed to/docs/ui/appsso that it does not chain.deployment/cloud-connection,permissions/record-view-auditing), andhandwritten-docs.jsonwas regenerated.906bbcaa: 67 derived; 66 exit 0.check:skill-examplesis NOT MEASURED: it exited 3 because it needs a full spec build, so CI reads it.c935c785and does not cover this head. A delta review is handed to triage./docs/ui/consoleor/docs/ui/studio(rows in docs(ui-merge): merge the 46 objectui field, Console-behaviour and schema pages into the objectstack docs (K2) #27170's table) must now aim at/docs/build-without-codeor the specificapps/viewsanchor. Otherwisecheck-docs-redirectsreds on a chain.What changes
scripts/gen-sdui-reference.mjs(new). Readssdui.manifest.jsonand writescontent/docs/ui/components/. Modes: write (default),--check(exit 1 when the committed pages differ, naming the file and the first differing line),--self-test(20 rows, a pinned battery roster and floor, and the verdict handshake, copied fromcheck-agent-model-declared.mjs).classNameandchildren. So:tierishtmlgoes to HTML Elements (48);plugin-*namespaces share Plugin Blocks (16), because each holds one to three components;ui, 14), Page Structure (page, 7), Record (11), Elements (6), Actions (4).h2with an explicit id (action:buttonbecomes#action-button), a line with its namespace, tier and whether it is a container, and an inputs table: name, type (unions, enum values, the array element type and the data binding included), required, description. Manifest descriptions are escaped for MDX: braces, angle brackets and pipes outside code spans, and pipes inside them.type, and two components whose heading ids collide.check:sdui-reference(--self-testthen--check) andgen:sdui-reference. A newlint.ymlstep in joblint-repo-tooling(Lint · repo & tooling gates) runspnpm check:sdui-reference, placed next to the manifest's own check, so a manifest change and its reference change land in one PR. It needed a workflow edit because every gate in this repo is wired as its own lint step; no existing family runs an arbitrary root alias.content/docs/ui/meta.jsonlistscomponentsaftersetup-app.content/docs/ui/index.mdxgains the matching card, whichcheck-section-landing-indexrequires.scripts/docs-audit/affected-docs.mjsexcludescontent/docs/ui/components/**from the hand-written audit scope besidereferences/.handwritten-docs.jsonis regenerated and its readme names both trees. The maintainer ruling recorded in that file's header is that prompting authors about generated pages is wrong advice.scripts/regen-artifacts.mjsgets aREGEN_ARTIFACTSrow, and.gitattributesroutes the directory tomerge=os-regen.check:merge-driverrequires every generator to have a recorded disposition. The pages are rendered whole, so regenerating after a merge loses nothing a person wrote.scripts/check-role-word.mjsadds the directory toSKIP_SUBTREES, besidereferences/andprotocol-upgrade/, for the reason its header gives: the fix site is the input description in the component's registration underui/, which this gate does not scan.scripts/pm/os-regen-merge.shclassifies the directory inOS_REGEN_CLASSESaswhole(commit a6ea420). CI's os-regen-merge self-test requires everymerge=os-regenpath to have a class;dispatch-gatesdid not derive that family locally, so it was first seen red on CI.Why
A metadata author placing a component finds no page of its own for 89 of the 106 authorable components today. Their inputs and descriptions exist only inside the manifest file. The manifest is regenerated and compared by CI's
Build & E2E UI, so a reference generated from it cannot drift from the renderer the way the 17 hand pages could.Tests
node scripts/gen-sdui-reference.mjs --self-test: 20 cases pass, 20 batteries at their floor.node scripts/gen-sdui-reference.mjs --checkon the PR head:✓ … matches sdui.manifest.json (106 components on 7 pages).One-time ablation: a hand-edited generated line makes --check exit non-zero
Through
scripts/ablation-replace.mjson the committed tree, which dropsyesfrom the Required cell oftabs'sdefaultValuerow inui.mdx:Acceptance notes
URL map for K4's redirects (#27145). The old objectui.org pages are under
https://www.objectui.org/docs/...(ui/apps/site/lib/source.ts,baseUrl: '/docs'). The new pages are on the objectstack docs site:/docs/components(components/index)/docs/ui/components/docs/components/basic/icon/docs/ui/components/ui#icon/docs/components/basic/image/docs/ui/components/ui#image/docs/components/basic/span/docs/ui/components/html#span/docs/components/basic/text/docs/ui/components/ui#text/docs/components/complex/table/docs/ui/components/html#table/docs/components/data-display/alert/docs/ui/components/ui#alert/docs/components/data-display/badge/docs/ui/components/ui#badge/docs/components/disclosure/accordion/docs/ui/components/ui#accordion/docs/components/form/button/docs/ui/components/ui#button/docs/components/form/label/docs/ui/components/html#label/docs/components/layout/box/docs/ui/components/ui#box/docs/components/layout/card/docs/ui/components/ui#card/docs/components/layout/container/docs/ui/components/ui#container/docs/components/layout/flex/docs/ui/components/ui#flex/docs/components/layout/grid/docs/ui/components/ui#grid/docs/components/layout/stack/docs/ui/components/ui#stack/docs/components/layout/tabs/docs/ui/components/ui#tabscheck-docs-redirectsstrips a#fragmentbefore it resolves a destination, so the anchored targets are legal redirect destinations.Worked examples the hand pages carry and the manifest lacks. None of it was copied into the generated pages:
SchemaExample) on every one of the 17 pages.form/buttonhas 15 (variants, sizes, icons, disabled and loading states);basic/texthas 10; the rest have 1 to 4.basic/icon: the section "nameis identity, not the glyph", which covers the refused name-as-glyph node and themigrateIconNodeKeysconverter from@object-ui/typesfor stored metadata.layout/box: "Migrating fromdiv".boxreadschildrenonly, and an html page'sdivis refused at compile time with a refusal that namesbox.basic/span: the deprecation ofspanfor JSON-authored pages, which does not apply to the html tier, and its migration guide.complex/table,layout/*and the others: hand-written TypeScriptSchemainterfaces. Where these differ from the manifest, the manifest is the contract.Observations, not filed:
content/docs/ui/pages.mdx§ Components listsrecord:chatter,element:image,element:record_pickerandelement:text_input, which are not in the public manifest. The manifest carriesrecord:discussion,element:definition-listandelement:repeater, which that list omits. That list may be describing the spec'sPageComponentTyperather than the public tier, so this is noted for K2's merge of the UI pages, not filed.object-kanbaninputcardFieldsuses the word "role" in its description, a reserved word under ADR-0090 D3. The fix site is that registration's description underui/, outside this card's surface. Triage's contract review (6467314546) asked for a carrier card. The dispatching seat screened it out under the filing gate's business test: the phrase is "the object'shighlightFieldsrole", which means ADR-0085's semantic field role, not an access-control role. No reader is misled about permissions, and check-role-word's own header says not every hit is a bug (its examples are ARIAroleandsys_member.role). If the word should still change, the next PR that editsui/packages/plugin-kanban/src/index.tsxcan say "designation".content/docs/ui/meta.json, so whichever lands second mergesmain.Verification
CI on head
c935c785(mergesmainafter K2 #27170 landed;content/docs/ui/meta.jsonand the UI landing index listconsole,studio,componentsin that order): every required context is green (Lint & Repo Gates, TypeScript Type Check, Test Core, Build Core, Governed Surface Queue Guard, Lint UI, Type Check UI, Test UI, Build & E2E UI), Build Docs is green, andmergeable_statereads clean.Local, on head
ca0a9747, which mergesmainatb8615afa:pnpm --filter @objectstack/docs build: green (os-verify-lockVERDICT command-exit 0). Served withnext start,/docs/ui/components/pluginsanswers 200 with 16 tables andid="object-grid", and/docs/ui/componentsanswers 200 with 107 table rows (106 plus the header).node scripts/pm/dispatch-gates.mjs --repo objectstack-ai/objectstack --ran …: 99 derived families, 98 run green, 1 NOT MEASURED (check:dual-build-cjs-loads, exit 3, which needs every published package's dist and so is left to CI).check-section-landing-index(the landing card),check:docs-audit-scope(the generated-tree exclusion),check:merge-driver(theREGEN_ARTIFACTSrow) andcheck:role-word(SKIP_SUBTREES).check:pm-dispatch-gateswas red once because it ran while those edits were in progress; it was re-run on the committed tree and is green.Human Minimum
packages/specholds no runtime logic. (No spec change.)pnpm lintis CI's to run.main, one pull request.skip-changeset); both declaration lines are filled in above.packages/specnot touched.content/docs/references/,packages/*/CHANGELOG.mdorcontent/docs/releases/.🤖 Generated with Claude Code
https://claude.ai/code/session_01L9qibwMyAnTNeas3ANYhyi
Generated by Claude Code