Repository navigation
docs(skills): the project-setup guide stops mounting app-shell's ObjectView with an objectName prop it never had (objectui#11011) - #11316
Conversation
…ctView with an objectName prop it never had (objectui#11011) The `@object-ui/app-shell` section of `skills/objectui/guides/project-setup.md` taught an `ObjectView` mounted with only `objectName="contact"`. The component has no such prop: it reads the route's `:objectName` with `useParams` and resolves it against the required `objects` list, so a verbatim copy threw on first render and, since `ConsoleObjectViewProps` was declared, fails to compile. The guide now keeps the provider + AppShell composition, names the four `ConsoleObjectViewProps` members, says the shell runs under React Router (`react-router-dom` is the package's peer dependency) and points at the README's "ObjectView" block, the one copy `pnpm check:doc-snippets` compiles, instead of restating it. Empty-frontmatter changeset: no package source changes. Co-authored-by: Claude <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01KTZmMfzVzjNvyaLyQ8mHvg
Contract reviewServed-tier: Inputs read: card objectui#11011 (body; triage 5874675337; claim 5923408921; ① Derived judgments(a) The new fence — true at the head, and not copyable into a crash. (b) Every added prose sentence, read at the code.
(c) The pointer lands on a gated copy. (d) No new gate. Two files, neither under (e) (f) AGENTS.md rule #11. A regex scan of the PR body, the changeset and every added line for (g) The +6 net lines, judged by their reader. The guide goes 345 to 351 lines, 1234 to 1301 words. Rule lines an agent setting up a project needs: runs under React Router with (h) The replaced sentence. At
② Semver levelNothing published changes. No package manifest's ③ Boundary flags
Check-runs on the head, final read 2026-10-01T03:14:39Z: 41 check-runs — 38 Implemented-by: VERDICT: PASS Generated by Claude Code |
维护者速读改了什么:发布给用户的 objectui 技能里,「项目起步」指南的 为什么改:这是 AI 照抄的第一份文档,一句错话等于产品缺陷(北极星第 4 条)。分诊方向「指向而不复述,保持唯一一份在门禁之下」,本 PR 照此做,未新增门禁。 风险与代价(含回滚):只改一节散文 + 一条空 changeset,不发包;不碰代码。复审(契约复审档,记录 5924031392)逐句对照源码核过。回滚 = revert。两处可再精简的修饰语(路由路径括号、门禁出处尾句)留给下次动这一节的 PR。 席位意见:建议批准。 你要做的:在本 PR 上留一条 APPROVED review(os-zhuang 或 hotlong);之后由本席翻 ready、挂 auto-merge 入队。 Generated by Claude Code |
Fixes #11011
Clause-②: no
The published objectui skill's project-setup guide (
skills/objectui/guides/project-setup.md, section "@object-ui/app-shell— minimal shell + renderers") taught anObjectViewmounted with a single prop,objectName="contact", and nothing else. The component has noobjectNameprop: it reads the route's:objectNamewithuseParamsfromreact-router-domand resolves it against the requiredobjectslist, so a verbatim copy threw on first render, and sinceConsoleObjectViewPropswas declared (PR objectui#11010) the same mount fails to compile. The guide now keeps the provider +AppShellcomposition, names the fourConsoleObjectViewPropsmembers, says the shell runs under React Router, and points at the README's "ObjectView" block — the one copypnpm check:doc-snippetscompiles — instead of restating it. Per triage's direction: pointing, not restating, keeps one copy under a gate; no new gate.Session:
https://claude.ai/code/session_01KTZmMfzVzjNvyaLyQ8mHvg(domain:skills seat 1, round 11, dispatched dev).维护者速读(草稿)
改了什么。
skills/objectui/guides/project-setup.md的@object-ui/app-shell一节:删掉示例里那行把ObjectView当成接受objectName属性的挂载(该组件从没有这个属性),示例保留 provider 与AppShell的组合、把子节点位置改成一条 JSX 注释指向路由;把紧随其后的「App-shell 与路由无关」一句改成真话:react-router-dom是 app-shell 的 peerDependency,ObjectView从路由解析对象与视图,它的属性是导出的ConsoleObjectViewProps(dataSource、objects、onEdit、可选externalRefreshKey),正确挂载去读 app-shell README 的「ObjectView」小节。另加一个空 frontmatter changeset(不发版)。为什么改。 这份 skill 是 AI 搭 objectui 项目时读的第一份材料,照抄那个挂载在
main上首渲染即抛错、在 PR objectui#11010 之后直接编译失败;「与路由无关」那句也是假的(peerDependency 与useParams两处实测)。triage 的方向是「指向 README 里被check:doc-snippets编译的那一份,不要再抄一份」,本 PR 照做,且不新增门禁(新增门禁默认否)。风险与代价(含回滚)。 只动一份 markdown 与一个空 changeset,不发版、不动代码。风险是文字仍有不准处——每个属性名、peerDependency、路由形状都在本树实测(见下方「前提核验」)。回滚:revert 这一个 squash commit 即可,无状态残留。
席位意见。 (留空,席位定稿)
你要做的。
skills/**是受管面:本 PR 停在 draft。若认可,留下一条 APPROVED review(os-zhuang/hotlong),之后由派发席翻 ready 并入合并队列;不认可则在评论里说要改什么。Premise check at my tree (
caa0cd3, objectuiorigin/mainat cut; dispatch readb28bde8)ObjectViewand mounted it with onlyobjectName="contact"; the sentence after the fence called app-shell router-agnostic. Both read atcaa0cd3.ConsoleObjectViewProps(exported from@object-ui/app-shell, declared inpackages/app-shell/src/views/ObjectView.tsx) has exactlydataSource(required),objects(required),onEdit(required),externalRefreshKey(optional); noobjectName.ObjectViewcallsuseParams()fromreact-router-domand doesobjects.find(...)on the route'sobjectName;react-router-domis apeerDependenciesentry ofpackages/app-shell/package.json. The console mounts it asRoute path=":objectName"with the four props (packages/app-shell/src/console/AppContent.tsx).check:doc-snippetsroots arecontent/docs, app docs, everypackages/**/README.mdand the root README — notskills/**. The README's "ObjectView" block carries no fragment marker between its heading and the next, so the opt-out gate compiles it; the pointer lands on a gated copy.os:checkmarkers sit on earlier fences; the app-shelltsxfence was and stays unmarked, socheck:skill-examplesjudges nothing I changed (both its legs still ran, below).check:skill-eval-tokens"meters the file" with a ceiling is falsified: that gate is an evalmust_containtoken oracle (bundle-wide), not a size meter; objectui has no skills line/token ratchet at all (noscripts/*.mjsheader names one). Readings are reported anyway, below.node scripts/check-governed-queue-guard.mjs --teston both changed paths: exit 3, GOVERNED (skills/**); this PR is draft-only until an authorized APPROVED review.Before / after of the section
Angle brackets are written as ‹ › below because GitHub strips tag-shaped text from a PR body; the committed file has ordinary JSX.
Before:
After:
AdapterProvider adapter,MetadataProvider adapterandAppShell sidebarwere checked against their providers' prop interfaces and kept.File readings before / after (
wc; no tokenizer exists in this tree —pnpm-lock.yamlhas zerotiktoken/gpt-tokenizerentries — so "tokens" below are whitespace-separated words)caa0cd3)e98c3c9)project-setup.mdproject-setup.mdproject-setup.mdSKILL.md+guides/*.md+rules/*.md)Net lines are positive because the one false sentence became six true ones; objectui has no ceiling to pay (see premise 4), and the PM's "≤ 0 if the ceiling is tight" clause did not bind.
Gates run locally (head
e98c3c9; exit codes captured before any pipe)Install:
bash scripts/ci-setup-pnpm.sh && pnpm install --frozen-lockfile— exit 0.pull_requestpath filter)skills-paths.ymlnode scripts/check-skills-paths.mjsskill-examples.yml--build-filter(12 packages, 29 turbo tasks, under the shared verify lock:VERDICT command-exit 0, held 223s) ·--self-test· runskill-eval-tokens.yml--self-test· runline-citation-gate.ymlnode scripts/check-new-cross-file-line-citations.mjs0 new citation(s), enforcement report-only)control-bytes.ymlnode scripts/check-control-bytes.mjschangeset-presence.ymlnode scripts/check-changeset-presence.mjschangeset-guard.ymlcheck-changeset-no-major·check-changeset-overwritegoverned-surface-guard.ymlcheck-governed-queue-guard --teston both pathslint.yml**/*.mdand.changeset/**, which is this whole diff, so CI skips the heavy steps and the check still reports. Local, declared narrowing forpnpm lint: ESLint's config hasfilesglobs only of the**/*.{ts,tsx}family and noprojectService/parserOptions.project(not type-aware), so no untouched file's verdict can move;pnpm exec eslint --format jsonon the two changed files: exit 0, 2 files listed, each "File ignored because no matching configuration was supplied", 0 rule messages. Roster also run:check-vi-mock-override-shape·check-test-path-roots·pnpm --workspace-concurrency=2 --filter '@object-ui/cli...' build && pnpm check(under the lock,VERDICT command-exit 0, held 49s, waited 90s)ci.ymlaction-ref-convention.yml·shell-escape-residue.yml·pre-install-import-graph.ymldoc-fence-languages.yml·doc-component-types.yml·doc-example-ids.yml·docs-links.yml·docs-route-eager-closure.ymlvi-mock-specifiers.ymlcheck-vi-mock-specifiers·check-vi-mock-inheritdoc-snippet-types.ymlnode scripts/check-doc-snippet-types.mjsskills/**and this diff touches no covered document; CI owns itreadme-exports.ymlnode scripts/check-readme-exports.mjspnpm buildfirst" is the prerequisite class, not a verdict; surface is package READMEs, untouchedspec-main-shape-gate.ymlmain's specnode scripts/check-comment-mask-corpus.mjsPath-filtered out of this diff:
board-snapshot,half-state-patrol,hook-selftests,lockfile-dedupe,lockfile-integrity,performance-budget,live-e2e. Automation, not gates:labeler,cross-repo-issue-closer,dependabot-auto-merge.One null run to disclose: my first CLI build attempt put
--concurrency=2after--filter, so pnpm forwarded it into the package'stsupscript (CACError: Unknown option --concurrency,data-objectstack build: Failed). That was my invocation, not the tree; the rerun with--workspace-concurrency=2before the filter is the measurement above.Acceptance notes
pnpm check's advisory sweep reportspackages/vscode-extension/schemas/objectui-schema.jsonas "1 did not validate" on this tree; it is a JSON Schema document whose roottype: "object"the recogniser admitted structurally. Pre-existing onmain; carrier: none.check:skill-eval-tokensas a size meter; it is not (premise 4). No skills size ratchet exists in objectui.Generated by Claude Code