Skip to content

docs(skills): the project-setup guide stops mounting app-shell's ObjectView with an objectName prop it never had (objectui#11011) - #11316

Merged
os-zhuang merged 1 commit into
mainfrom
claude/issue-11011-project-setup-objectview-mount
Oct 1, 2026
Merged

os-zhuang merged 1 commit into
mainfrom
claude/issue-11011-project-setup-objectview-mount

Conversation

@objectstack-fleet

Copy link
Copy Markdown
Contributor

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 an ObjectView mounted with a single prop, objectName="contact", and nothing else. The component has no objectName prop: it reads the route's :objectName with useParams from react-router-dom and resolves it against the required objects list, so a verbatim copy threw on first render, and since ConsoleObjectViewProps was declared (PR objectui#11010) the same mount fails to compile. The guide now keeps the provider + AppShell composition, names the four ConsoleObjectViewProps members, says the shell runs under React Router, and points at the README's "ObjectView" block — the one copy pnpm check:doc-snippets compiles — 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, objectui origin/main at cut; dispatch read b28bde8)

  1. The wrong mount was still there: the section's fence imported ObjectView and mounted it with only objectName="contact"; the sentence after the fence called app-shell router-agnostic. Both read at caa0cd3.
  2. ConsoleObjectViewProps (exported from @object-ui/app-shell, declared in packages/app-shell/src/views/ObjectView.tsx) has exactly dataSource (required), objects (required), onEdit (required), externalRefreshKey (optional); no objectName. ObjectView calls useParams() from react-router-dom and does objects.find(...) on the route's objectName; react-router-dom is a peerDependencies entry of packages/app-shell/package.json. The console mounts it as Route path=":objectName" with the four props (packages/app-shell/src/console/AppContent.tsx).
  3. check:doc-snippets roots are content/docs, app docs, every packages/**/README.md and the root README — not skills/**. 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.
  4. The guide's five os:check markers sit on earlier fences; the app-shell tsx fence was and stays unmarked, so check:skill-examples judges nothing I changed (both its legs still ran, below). ⚠️ The dispatch's mechanism assumption that check:skill-eval-tokens "meters the file" with a ceiling is falsified: that gate is an eval must_contain token oracle (bundle-wide), not a size meter; objectui has no skills line/token ratchet at all (no scripts/*.mjs header names one). Readings are reported anyway, below.
  5. node scripts/check-governed-queue-guard.mjs --test on 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:

import { AppShell, ObjectView, AdapterProvider, MetadataProvider } from '@object-ui/app-shell';

‹AdapterProvider adapter={myAdapter}›
  ‹MetadataProvider adapter={myAdapter}›
    ‹AppShell sidebar={‹MySidebar /›}›
      ‹ObjectView objectName="contact" /›
    ‹/AppShell›
  ‹/MetadataProvider›
‹/AdapterProvider›

App-shell is router-agnostic — wire it into React Router / Next.js / TanStack Router yourself.

After:

import { AppShell, AdapterProvider, MetadataProvider } from '@object-ui/app-shell';

‹AdapterProvider adapter={myAdapter}›
  ‹MetadataProvider adapter={myAdapter}›
    ‹AppShell sidebar={‹MySidebar /›}›
      {/* your React Router routes — ObjectView mounts on an object route, see below */}
    ‹/AppShell›
  ‹/MetadataProvider›
‹/AdapterProvider›

App-shell runs under React Router: `react-router-dom` is its peer dependency, and
`ObjectView` resolves the object and view from the route (the console mounts it on
`/apps/:appName/:objectName` and `/apps/:appName/:objectName/view/:viewId`), so it
takes no `objectName` prop. Its props are the exported `ConsoleObjectViewProps` —
`dataSource`, `objects`, `onEdit`, and the optional `externalRefreshKey`. Copy the
mount from the "ObjectView" section of `packages/app-shell/README.md`: that block is
the one `pnpm check:doc-snippets` compiles, and this guide does not restate it.

AdapterProvider adapter, MetadataProvider adapter and AppShell sidebar were checked against their providers' prop interfaces and kept.

File readings before / after (wc; no tokenizer exists in this tree — pnpm-lock.yaml has zero tiktoken / gpt-tokenizer entries — so "tokens" below are whitespace-separated words)

reading before (caa0cd3) after (e98c3c9) delta
lines, project-setup.md 345 351 +6
words, project-setup.md 1234 1301 +67
bytes, project-setup.md 10367 10887 +520
lines, bundle (SKILL.md + guides/*.md + rules/*.md) 4718 4724 +6

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.

workflow (fires on this diff per its pull_request path filter) local command exit
skills-paths.yml node scripts/check-skills-paths.mjs 0 (89/90 resolve, 1 baselined)
skill-examples.yml scoped build from --build-filter (12 packages, 29 turbo tasks, under the shared verify lock: VERDICT command-exit 0, held 223s) · --self-test · run 0 · 0 (60 cases) · 0 ("Every marked skill example holds up")
skill-eval-tokens.yml --self-test · run 0 (29 cases) · 0 (red 0)
line-citation-gate.yml node scripts/check-new-cross-file-line-citations.mjs 0 (0 new citation(s), enforcement report-only)
control-bytes.yml node scripts/check-control-bytes.mjs 0
changeset-presence.yml node scripts/check-changeset-presence.mjs 0 (no changeset owed; one declared anyway)
changeset-guard.yml check-changeset-no-major · check-changeset-overwrite 0 · 0
governed-surface-guard.yml check-governed-queue-guard --test on both paths 3 GOVERNED (expected; the PR leg warns and exits 0)
lint.yml its "needs a full run" step excludes **/*.md and .changeset/**, which is this whole diff, so CI skips the heavy steps and the check still reports. Local, declared narrowing for pnpm lint: ESLint's config has files globs only of the **/*.{ts,tsx} family and no projectService / parserOptions.project (not type-aware), so no untouched file's verdict can move; pnpm exec eslint --format json on 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) 0 · 0 · 0
ci.yml same job-internal exclusion ⇒ heavy steps skip on this diff; nothing of mine is in its input NOT MEASURED locally, by that reason
action-ref-convention.yml · shell-escape-residue.yml · pre-install-import-graph.yml each script 0 · 0 · 0
doc-fence-languages.yml · doc-component-types.yml · doc-example-ids.yml · docs-links.yml · docs-route-eager-closure.yml each script 0 · 0 · 0 · 0 · 0
vi-mock-specifiers.yml check-vi-mock-specifiers · check-vi-mock-inherit 0 · 0
doc-snippet-types.yml node scripts/check-doc-snippet-types.mjs NOT MEASURED: exit 2 (prerequisite: 34-package build); its roots exclude skills/** and this diff touches no covered document; CI owns it
readme-exports.yml node scripts/check-readme-exports.mjs NOT MEASURED: exit 1 "72 self-import(s) could not be judged … run pnpm build first" is the prerequisite class, not a verdict; surface is package READMEs, untouched
spec-main-shape-gate.yml compiles this repo against objectstack main's spec NOT MEASURED locally: no source in this diff
(dispatch-named, no own workflow found by my scan) node scripts/check-comment-mask-corpus.mjs 0 (report: 1 pre-existing disagreement inside the residue objectui#7882 holds open)

Path-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=2 after --filter, so pnpm forwarded it into the package's tsup script (CACError: Unknown option --concurrency, data-objectstack build: Failed). That was my invocation, not the tree; the rerun with --workspace-concurrency=2 before the filter is the measurement above.

Acceptance notes

  • In scope and changed: the mount, and the sentence around it (the "router-agnostic" claim is the sentence after the fence; triage's direction "say that it runs under a router" is exactly its correction).
  • Observation, not filed (advisory, no public door exercised): pnpm check's advisory sweep reports packages/vscode-extension/schemas/objectui-schema.json as "1 did not validate" on this tree; it is a JSON Schema document whose root type: "object" the recogniser admitted structurally. Pre-existing on main; carrier: none.
  • Observation, not filed: the dispatch's gate list named check:skill-eval-tokens as a size meter; it is not (premise 4). No skills size ratchet exists in objectui.
  • No label and no PR assignee written (seat does both). Draft only; ⛔ not readied, not queued, no auto-merge.

Generated by Claude Code

…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
@objectstack-fleet

Copy link
Copy Markdown
Contributor Author

Contract review

Served-tier: CONTRACT_REVIEW_TIER
Head-sha: e98c3c93c95beb28885b944b289c46bfe4021e94
Local-runs: none

Inputs read: card objectui#11011 (body; triage 5874675337; claim 5923408921; os-dev-report 5923854743), PR #11316 (body, 2-file list, the API diff — byte-identical, index lines aside, to git diff from the merge-base caa0cd3 to the head), the head's check-runs (read three times, 03:05Z to 03:14Z), the repository at main (cd5b19a, the PR's base sha) and at the head, PR objectui#11010's merge commit ad0310fb5 through the API. Nothing built, run or re-run. ⛔ Not the dispatch order, not the dispatching seat's conclusions.

① Derived judgments

(a) The new fence — true at the head, and not copyable into a crash. AppShell, AdapterProvider and MetadataProvider are exported from packages/app-shell/src/index.ts (its "Components" and "Providers" export lines). AppShellProps in app-shell's types.ts declares sidebar?: ReactNode and children: ReactNode; the component renders children inside its main element, so AppShell takes children. AdapterProviderProps declares adapter?: ObjectStackAdapter | null; MetadataProviderProps declares adapter: ObjectStackAdapter — the fence's adapter={myAdapter} on both, and sidebar={‹MySidebar /›}, name props that exist. The fence is a fragment (myAdapter and MySidebar are undeclared) carrying no os:check marker, so no gate compiles it and nothing claims it compiles; with the identifiers supplied it renders two providers and an empty main — no objects.find is reachable, so no first-render throw. One observation, not a defect: TypeScript counts a comment-only child as no child, so a copy that leaves the slot holding only the JSX comment is refused at compile time for the missing required children — a refusal, not a crash, on a placeholder whose own text ("your React Router routes — ObjectView mounts on an object route, see below") tells the reader to replace it.

(b) Every added prose sentence, read at the code.

  • "react-router-dom is its peer dependency" — TRUE: packages/app-shell/package.json peerDependencies carries "react-router-dom": "^6.0.0 || ^7.0.0", unchanged across b28bde8, caa0cd3 and cd5b19a.
  • "ObjectView resolves the object and view from the route" — TRUE: in packages/app-shell/src/views/ObjectView.tsx, ObjectView reads const { objectName } = useParams(); and ObjectViewInner reads const { appName, objectName, viewId } = useParams();, both from react-router-dom; the resolution is an objects.find matching o.name === objectName, unguarded, in the outer wrapper — so the removed mount (no objects) still throws on first render on today's code, as the card's class (a) said, and now also fails to compile.
  • "the console mounts it on /apps/:appName/:objectName and /apps/:appName/:objectName/view/:viewId" — TRUE: apps/console/src/App.tsx declares Route path="/apps/:appName/*" rendering the console's AppContent, a "thin wrapper around DefaultAppContent" that renders app-shell's DefaultAppContent with extraRoutes={systemRoutes}; that component's Routes declares Route path=":objectName" and Route path=":objectName/view/:viewId", each rendering ObjectView dataSource={dataSource} objects={allObjects} onEdit={handleEdit} externalRefreshKey={refreshKey}. The README's own "### ObjectView" prose names the same two paths.
  • "so it takes no objectName prop" and "Its props are the exported ConsoleObjectViewProps — dataSource, objects, onEdit, and the optional externalRefreshKey" — TRUE: the interface declares exactly dataSource: DataSource, objects: any[], onEdit (a function taking the record to edit, returning void), externalRefreshKey?: number, no objectName; it is re-exported as a type from views/index.ts and the package entry, both brought by ad0310fb5 (PR objectui#11010, merged 2026-09-28T17:09Z).
  • "Copy the mount from the "ObjectView" section of packages/app-shell/README.md: that block is the one pnpm check:doc-snippets compiles" — TRUE, see (c). "The one" holds: the only other ObjectView mounts in gated documents (root README.md, content/docs/plugins/plugin-view.mdx, packages/plugin-view/README.md) and in examples/byo-backend-console/README.md mount @object-ui/plugin-view's schema-driven ObjectView, a different component, and examples/** is outside the gate's roots anyway.

(c) The pointer lands on a gated copy. packages/app-shell/README.md has the ### ObjectView heading at the head (between ### AppShell and ### DashboardView / PageView); its tsx block imports ObjectView, type ConsoleObjectViewProps and mounts dataSource, objects, onEdit, externalRefreshKey={0} — the hunk ad0310fb5 added. scripts/check-doc-snippet-types.mjs (pnpm check:doc-snippets) collects, in listDocuments, content/docs, every apps/‹app›/docs, every packages/‹pkg›/README.md, nested package READMEs, top-level docs/, docs/adr, docs/audits and the root README.md; its rule is opt-out — "EVERY ts / tsx fenced block in a covered document is compiled, in ISOLATION, as its own module. A block that is not meant to compile must be DECLARED by a marker line immediately above its fence" (the doc-snippet: fragment HTML comment in FRAGMENT_MARKER_EXAMPLES). No such marker sits above the README block, so it is compiled; the head's "Doc Snippet Type Check" is success (4m40s: build, then compile). The same header states "⛔ skills/objectui/** is NOT claimed by any gate here", which is exactly why pointing beats restating. The dev's premise 3 reads right.

(d) No new gate. Two files, neither under scripts/ nor .github/; nothing extends any root. Triage's 「新增门禁默认否」 is honoured.

(e) os:check markers. The guide's five markers sit above json fences and are untouched (identical positions at main and head; the edit starts after them). The edited tsx fence was unmarked at main and stays unmarked — correctly, since it is a fragment check-skill-examples.mjs could not compile ("a self-contained, should-hold-up block is opted in"). "Skill Example Check" success on the head ("Every marked skill example holds up", per the dev; the check-run is the verdict).

(f) AGENTS.md rule #11. A regex scan of the PR body, the changeset and every added line for path:line and #L forms finds none; paths are cited bare (packages/app-shell/README.md, packages/app-shell/src/views/ObjectView.tsx, packages/app-shell/src/console/AppContent.tsx) and symbols by name. "Line Citation Gate" success.

(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 react-router-dom as peer dependency; no objectName prop; the four ConsoleObjectViewProps members; the pointer to the README block. Commentary a reader pays for on every read: the parenthetical naming the console's two route paths (the README the reader is sent to states them), and the tail clause "that block is the one pnpm check:doc-snippets compiles, and this guide does not restate it" (gate provenance a project-setup reader does not act on). The paragraph could be about four lines without losing a true rule. Advisory: no ceiling exists (no skills size ratchet in objectui; check-skill-eval-tokens is a token oracle, see ③), triage asked for precisely "point" plus "say that it runs under a router", and every sentence is true. One more advisory note: the pointer is a repo path; the README ships in the tarball (files lists README.md), so an npm consumer reads it at node_modules/@object-ui/app-shell/README.md, and inline-span repo paths are the guide's convention (check-skills-paths resolves them against the tree; "Skill Guide Path Check" success).

(h) The replaced sentence. At main the guide read "App-shell is router-agnostic — wire it into React Router / Next.js / TanStack Router yourself." False there: the same peer dependency and the same useParams, useSearchParams, useNavigate, useLocation imports in ObjectView.tsx predate ad0310fb5 (unchanged context in that diff), and useNavigate throws outside a React Router context, so a Next.js or TanStack host could not mount ObjectView. Gone at the head: git grep for "router-agnostic" over skills/, app-shell's README and its manifest finds nothing. Nuance, not a defect: the AppShell layout component itself is router-free (its docblock: "Provides basic application structure without routing or console-specific logic"); the new sentence is about the package and ObjectView, which is what the paragraph teaches.

main movement. Merge-base caa0cd3; main at review cd5b19a, five commits past the cut, PR mergeable_state: behind. The guide, app-shell's README, manifest, index.ts, ObjectView.tsx, console AppContent.tsx and both check scripts are byte-identical across b28bde8, caa0cd3 and cd5b19a.

② Semver level

Nothing published changes. No package manifest's files names skills/** (grep over every workspace package.json: none); @object-ui/app-shell's files is dist, src/styles.css, README.md, CHANGELOG.md, LICENSE, none touched. .changeset/11011-project-setup-objectview-mount.md has an empty frontmatter (--- then ---) and a body; check-changeset-presence.mjs's header says "An EMPTY frontmatter counts", subtracts *.md as documentation, and nothing was owed (no guarded src/** in the diff). The empty-frontmatter changeset IS objectui's declared form for "publishes nothing": the repo's own pin in scripts/__tests__/ci-cd-pipeline-doc.test.ts ("never wires the phantom skip-changeset label into a workflow or a gate") says "To declare that a PR publishes nothing, add a changeset with empty frontmatter; that is the mechanism", and 46 such changesets sit in .changeset/ at the head as precedent. Correction to the brief's premise: the labels API lists a skip-changeset label object on objectui at read time — the re-minted phantom that pin predicts ("one API call that applies the name mints the label again"); no workflow or script reads it, so its existence changes nothing. Clause-②: no is right: no accept set, no public surface, no shipped byte moves. "Changeset Declaration", "Changeset Bump Policy", "Changeset Overwrite Report", "Changeset Fixed Group Check": all success.

③ Boundary flags

  • check:skill-eval-tokens is not a size meter — confirmed: scripts/check-skill-eval-tokens.mjs's header reads "Every must_contain token of every skills/‹bundle›/evals/*.json must be something the skill bundle actually TEACHES", a bundle-wide oracle with no ceiling. The dispatch's "line budget" has no instrument in objectui; the dev's wc readings (+6 lines, +67 words, +520 bytes, labelled whitespace words) are the honest substitute. "Skill Eval Token Check" success. Answered.
  • pnpm lint as a proven narrowing — valid: eslint.config.js's files globs are all of the **/*.{ts,tsx} family or specific .ts paths, with no projectService and no parserOptions.project, so linting is per-file and non-type-aware; a .md plus .changeset/*.md diff matches no config and moves no untouched file's verdict. CI's "Lint" success (15s) is lint.yml's own "Only ignored paths changed. Skipping the steps below; this check still reports." path — a skip by design, recorded as such; the same holds for ci.yml's "Type Check".
  • check-doc-snippet-types, check-readme-exports, spec-main-shape-gate NOT MEASURED locally — CI owns them and answered: "Doc Snippet Type Check" success, "README Export Check" success, "Spec Main Shape Gate" success (still in_progress at my 03:05Z read, completed by 03:13Z).
  • origin/main moved b28bde8 to caa0cd3 at cut — judged in ①: nothing in the touched section, nor in any file the prose is about, moved in that interval or since.
  • mcp_calls: 0 / api_writes: 2 — consistent with both threads: the PR by objectstack-fleet[bot], draft, 0 comments, 0 reviews, 0 issue events, no labels, no assignee, no auto-merge, no reviewers; the card carries the dev's one os-dev-report, and its pm:dispatched, pm:queue removal and os-warren assignment at 02:18–02:19Z are the PM's dispatch acts, not the dev's. Labels on the PR: none, and none were due — .github/labeler.yml's documentation rule matches root *.md and packages/**/README.md only, so a skills/** plus .changeset/** diff draws nothing ("label" success). The dev declared "No label and no PR assignee written (seat does both)"; objectstack's claim paragraph expects the PR's assignee to mirror the card's at pr_create, so mirroring os-warren onto the PR is the seat's act on adoption — declared, not hidden.
  • open_questions: []; two out_of_scope_findings noted and not filed (an advisory JSON-schema sweep line on main, and the dispatch's own wording) — both carriers "none", correctly.
  • Tier. skills/** is GOVERNED_SURFACES's skills-catalog row — Tier H: the PR stays draft until a latest-decisive APPROVED review by os-zhuang or hotlong, then the owning seat lands it. "Governed Surface Queue Guard" success on the pull_request leg is the early-warning leg exiting 0 by design, not a clearance.

Check-runs on the head, final read 2026-10-01T03:14:39Z: 41 check-runs — 38 success, 3 skipped (Test (coverage), Test (coverage shard ${{ matrix.shard }}/4), dependabot), 0 in_progress, 0 failure. At my first read (03:05Z) 9 were in_progress (Spec Main Shape Gate and the eight Test (shard N/8)); all reached success, and the ci.yml fan-in Test (needs: [test, test-dist-pins]) completed success at 03:13:32Z. Required contexts per the ruleset API (GET /rules/branches/main, 8 contexts): Lint, Type Check, Build & E2E, Build Docs, Changeset Declaration, Test, Spec Main Shape Gate, Governed Surface Queue Guard — all eight success.

Implemented-by: claude/issue-11011-project-setup-objectview-mount
Reviewed-by: session_01KTZmMfzVzjNvyaLyQ8mHvg

VERDICT: PASS


Generated by Claude Code

@objectstack-fleet

objectstack-fleet Bot commented Oct 1, 2026 •

Copy link
Copy Markdown
Contributor Author

维护者速读

改了什么:发布给用户的 objectui 技能里,「项目起步」指南的 @object-ui/app-shell 一节原来教 <ObjectView objectName="contact" />——这个组件根本没有 objectName 这个 prop,照抄会在首次渲染时崩,PR #11010 之后更是直接编译报错。现在改为:示例只保留 Provider + AppShell 的骨架,正文指向 app-shell README 里被 check:doc-snippets 编译把关的那一份挂载代码,并如实说明它跑在 React Router 之下(react-router-dom 是 peer 依赖、从路由解析 objectName)、四个 prop 是什么。

为什么改:这是 AI 照抄的第一份文档,一句错话等于产品缺陷(北极星第 4 条)。分诊方向「指向而不复述,保持唯一一份在门禁之下」,本 PR 照此做,未新增门禁。

风险与代价(含回滚):只改一节散文 + 一条空 changeset,不发包;不碰代码。复审(契约复审档,记录 5924031392)逐句对照源码核过。回滚 = revert。两处可再精简的修饰语(路由路径括号、门禁出处尾句)留给下次动这一节的 PR。

席位意见:建议批准。

你要做的:在本 PR 上留一条 APPROVED review(os-zhuang 或 hotlong);之后由本席翻 ready、挂 auto-merge 入队。


Generated by Claude Code

@os-zhuang
os-zhuang marked this pull request as ready for review October 1, 2026 05:35
@os-zhuang
os-zhuang added this pull request to the merge queue Oct 1, 2026
@github-merge-queue
github-merge-queue Bot removed this pull request from the merge queue due to failed status checks Oct 1, 2026
@os-zhuang
os-zhuang added this pull request to the merge queue Oct 1, 2026
Merged via the queue into main with commit 2e060ba Oct 1, 2026
43 checks passed
@os-zhuang
os-zhuang deleted the claude/issue-11011-project-setup-objectview-mount branch October 1, 2026 13:53
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

3 participants