docs(devx): the Which scaffolder? callout routes by ARTIFACT — plugin names a metadata plugin and a kernel code plugin (#15817) - #15834
Merged
baozhoutao merged 1 commit intoSep 5, 2026
Conversation
…ames two things `content/docs/deployment/cli.mdx` carried a "Which scaffolder?" callout whose only job is to choose for the reader, and it chose wrong: it sent anyone wanting "a plugin skeleton" to `os init -t plugin`, which emits a METADATA plugin (`objectstack compile`, `private: true`, declarative objects), while every page under /docs/plugins teaches the KERNEL CODE plugin that `os create plugin` emits (`tsc`, publishable, implements the `Plugin` contract with `init` / `destroy`). The callout now routes by ARTIFACT rather than by command word, with a table naming both artifacts, their commands, their build tool, whether they publish, and the page to read next for each. A short paragraph on the same page records WHY the two scaffolders are not merged (#15531: collapsing both under one word would make the collision structural instead of documented), so the reason lives in the docs and not only in the issue. Docs only — no `packages/cli` change; a command-word rename is an interface change that needs its own domain:cli card. Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_012zGPuVVX3deAx9LdjK8jCk
This was referenced Sep 5, 2026
baozhoutao
marked this pull request as ready for review
September 5, 2026 10:37
baozhoutao
enabled auto-merge
September 5, 2026 10:37
Contributor
Author
|
Flipped ready + auto-merge enabled (10:37Z, Generated by Claude Code |
baozhoutao
deleted the
claude/issue-15817-plugin-word-two-artifacts-docs
branch
September 5, 2026 11:00
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Fixes #15817
What was wrong
content/docs/deployment/cli.mdxcarried a "Which scaffolder?" callout whose only job is to choose for the reader — and it chose the wrong artifact. The wordpluginnames two different things across the scaffolders, and the callout routed by the command word instead of by the artifact.Before (
content/docs/deployment/cli.mdx:83-86):A reader wanting "a plugin skeleton" was sent to
os init -t plugin, which emits a metadata plugin — while every page under/docs/pluginsteaches the kernel code plugin thatos create pluginemits.Premise confirmed against the source (read-only, no
packages/clichange)os init NAME -t pluginos create plugin NAMEbuild: 'objectstack compile'—packages/cli/src/commands/init.ts:479build: 'tsc'—packages/cli/src/commands/create.ts:198private: true—renderScaffoldPackageJson,packages/cli/src/commands/init.ts:236@objectstack/plugin-NAME, noprivatekey —packages/cli/src/commands/create.ts:183-184src/objects/__name___item.object.tsrenderingconst … : Data.Object = { … }, manifesttype: 'plugin'—init.ts:492, objects atinit.ts:512-533src/index.tsexportingconst …Plugin: Plugin = { name, version, async init(context) {…}, async destroy() {…} }—create.ts:236-256The card's table is exact.
premise_still_valid: true.After
The callout now routes by artifact, with a table naming both artifacts, their command, what each emits, its build tool, whether it publishes, and the page to read next — plus a
Calloutrecording why the two scaffolders are deliberately separate (the #15531 ruling: collapsing both under one command word would make the collision structural instead of documented), so the reason lives in the docs and not only in the issue.Link targets quoted (all resolved by
check:doc-anchors, and all pre-existing pages — no plugin documentation page was rewritten):[Object Metadata](/docs/data-modeling/objects)→content/docs/data-modeling/objects.mdx[Plugin Anatomy](/docs/plugins/anatomy)→content/docs/plugins/anatomy.mdx[Plugin Development](/docs/plugins/development)→content/docs/plugins/development.mdx[Plugins & Packages](/docs/plugins)→content/docs/plugins/index.mdx#os-init(cli.mdx:79) and#os-create(cli.mdx:1288)Three same-page precision fixes ride along, all the same defect and all inside the card's page:
cli.mdx:29— "scaffolder for plugin skeletons" → "for metadata-plugin skeletons"os initTemplates row — "Reusable plugin package with objects" → names it the metadata plugin and says it is not whatos create pluginemitscli.mdx:1290(#### os create) — the reverse pointer, so a reader landing there is told whichpluginthis isRe-check greps from the card
Before (on
origin/main) and after (on this branch) — identical, both exit 0:The second grep is byte-identical before and after: no
packages/clifile is touched by this PR.Measurement
Derived, not recalled:
node scripts/pm/dispatch-gates.mjs --changed --commands --repo objectstack-ai/objectstack→ 39 commands for the 1-path change set. Exit codes captured before any pipe (cmd > log 2>&1; EXIT=$?). Run atfccd098e4.Green (31 of 39) — including every gate that reads this page:
plus
check-ci-filter-parity,check-closing-keyword-parity(+--self-test),check-comment-mask-corpus,check-doc-frontmatter,check-doc-route-spelling --advisory/--self-test,check-docs-section-name(+--self-test),check-section-landing-index(+--self-test),check:corpus-claim-drift,check:cross-package-test-inputs,check:docs-audit-scope,check:docs-redirects,check:driver-memory-census,check:published-readme-links,check:react-page-adapter-contract,check:refd-timer-probe,check:role-word,check:skill-identifier-liveness,check:vendor-version-stamps,check:watch-hint-literal,@objectstack/speccheck:empty-state/check:liveness/check:strictness-ledger/check:variant-docs/check:yaml-examples, andscripts/docs-audit/check-affected-docs.mjs.⊘ NOT MEASURED (8) — never read as green. Each refused before measuring anything, on a prerequisite this container does not hold (an unbuilt workspace package or a gitignored build artifact), not on a finding:
@objectstack/lint check:doc-formula-expressionsPREREQUISITE NOT MET — the workspace package @objectstack/formula is not built(exit 3)@objectstack/lint check:doc-security-posture@objectstack/formularefusal (exit 3)check:docs-transcript-driftPREREQUISITE NOT MET — … packages/lint/dist/index.js does not exist — @objectstack/lint is not built—⛔ This is NOT a pass and NOT a finding: nothing was measured.(exit 3)@objectstack/spec check:docs❌ packages/spec/json-schema is missing.— gitignored build artifact (exit 1, a prerequisite refusal)@objectstack/spec check:skill-examples❌ packages/spec/dist holds no .d.ts declarations — the package is not built(exit 1, a prerequisite refusal)check-doc-frontmatter.mjs --self-testCannot find module 'fumadocs-core/content/md/frontmatter'—apps/docsdeps absent; the enforcing run (check-doc-frontmatter.mjs, no flag) is greencheck-cross-package-test-inputs --union-into "$RUNNER_TEMP/…"⊘ NOT MEASURED— argv carries a CI-only variablecheck-shard-attestation/check-test-completeness$RUNNER_TEMP/matrix.shardvaluesDeclared narrowing: the repo-wide
pnpm lint/ fullpnpm testfarm is CI's run, not this one. Nothing above was skipped by choice on a gate this container could have measured.Other readings
node scripts/pm/check-governed-merges.mjs --test content/docs/deployment/cli.mdx→ exit 0,✅ NOT governed — ordinary queue landing applies to a PR with exactly this file list.git merge-tree --write-tree origin/main HEADafter a fresh fetch (origin/main=98191d2cb) → exit 0, clean treed4facadef662378931fe54cd594332bd01688649— no conflict.GET /repos/objectstack-ai/objectstack/pulls/N/files): exactly one other open PR touches this file — feat(objectql,cli):backfillSummaryNullsacceptsrecomputeUndefinedOnEmpty— a just-declared min/max/avg roll-up can be filled on request (#15064) #15708, whose onlycli.mdxhunk is at lines 912-946 (os migrate summary-nulls), ~800 lines from every line this PR edits. Disjoint hunks, no conflict.grep -naP '[\x00-\x08\x0b\x0c\x0e-\x1f\x7f]' content/docs/deployment/cli.mdx→ no match.Scope
Docs only, one file. ⛔ No command-word rename:
os init -t plugin→-t metadata-pluginis an interface change on a published CLI and needs its owndomain:clicard, per the triage boundary. ⛔ No plugin documentation page rewritten — link targets were verified, none was wrong. ⛔content/docs/releases/untouched.skip-changeset: nothing is published from any package by this diff.🤖 Generated with Claude Code
https://claude.ai/code/session_012zGPuVVX3deAx9LdjK8jCk
Generated by Claude Code