Skip to content

docs(data-modeling): add missing bulk to the objects.mdx apiMethods sample - #10823

Merged
os-zhuang merged 2 commits into
mainfrom
claude/issue-10711-apimethods-bulk
Aug 21, 2026
Merged

docs(data-modeling): add missing bulk to the objects.mdx apiMethods sample#10823
os-zhuang merged 2 commits into
mainfrom
claude/issue-10711-apimethods-bulk

Conversation

@claude

@claudeclaudeBot commented Aug 21, 2026

Copy link
Copy Markdown
Contributor

Fixes#10711

The defect

content/docs/data-modeling/objects.mdx:84 shipped an enable.apiMethods sample that
listed only five of the six authorable primitives:

apiMethods: ['get','list','create','update','delete'],

bulk was missing. An apiMethods whitelist is exactundefined means
unrestricted, a subset means that subset's derived closure — so a reader who copied this
sample verbatim silently denied batch operations on their object.

Both halves re-derived at this PR's base (f4e5d916d6)

The enumpackages/spec/src/data/object.zod.ts:18-22, six members:

exportconstApiMethod=z.enum(['get','list',// Read'create','update','delete',// Write'bulk',// Batch operations]);

The page's own property tablecontent/docs/data-modeling/objects.mdx:97, two rows
below the sample, already named all six:

| apiMethods | all | Whitelist over the six primitives (get/list/create/update/delete/bulk); derived verbs (search/export/upsert/…) follow automatically. undefined = all, [] = none |

So the table was right and the sample was wrong, on the same screen. Only the sample
changed here; the enum is correct and untouched.

The change

- apiMethods: ['get', 'list', 'create', 'update', 'delete'],+ apiMethods: ['get', 'list', 'create', 'update', 'delete', 'bulk'],

One line, one file. This matches the shape the sibling site already carries: #10590 has
already landed on main, and data-modeling/schema-design.mdx:71-77 now enumerates
all six with an explicit 'bulk' // omitting bulk DENIES batch operations comment. That
site is not touched by this PR — it belongs to that card and to the #10616 sweep,
whose gate 3 is "zero changes outside the listed member sites".

Sweep for a third site

The card asked whether any other page under-enumerates apiMethods. Every occurrence
repo-wide was reviewed; objects.mdx:84 was the only remaining defect. The other
sites are correct as written:

SiteShapeVerdict
data-modeling/schema-design.mdx:71-77all six, with bulk commentedalready corrected under #10590 — not touched
references/data/object.mdx:141,178names all sixcorrect; also AUTO-GEN, never hand-edited
references/security/permission.mdx:66apiOperations, 14 effective opsdifferent vocabulary (six primitives + eight derived), correct
ui/setup-app.mdx:70apiMethods: []deliberate deny-all for sys_jwks, correct
protocol/kernel/http-protocol.mdx:856prosecorrect
skills/objectstack-api/SKILL.md:66['get', 'list']deliberate read-only subset example, and the next sentence names all six primitives — correct (and a governed path)
skills/objectstack-data/SKILL.md:95names all sixcorrect (governed path)
packages/objectql/src/registry.test.tsvarious subsetsfixtures deliberately exercising reconciliation — correct
content/docs/releases/v16.mdx, v17.mdxhistoricalrelease-owned, never edited in a code PR

A deliberate subset (['get','list'] to illustrate a read-only API) is not the defect;
the defect is a sample that presents itself as the complete capability surface while
listing five of six.

Verification

Gate set derived from the changed path with node scripts/pm/dispatch-gates.mjs (no path
arguments — the script takes its own change set from the merge base), then re-derived and
re-run after the final commit, at 03c2bb5261, with a clean working tree. All 14
derived families plus check:nul-bytes exit 0. Exit codes were captured before any pipe
(cmd > log 2>&1; ec=$?).

EXIT=0 cross-package-test-inputs EXIT=0 role-word
EXIT=0 doc-anchors EXIT=0 spec-strictness-ledger
EXIT=0 doc-authoring EXIT=0 spec-variant-docs
EXIT=0 doc-formula-expressions EXIT=0 check-cross-package-test-inputs.mjs
EXIT=0 docs-audit-scope EXIT=0 check-doc-frontmatter.mjs
EXIT=0 docs-redirects EXIT=0 nul-bytes
EXIT=0 spec-empty-state EXIT=0 published-readme-links
EXIT=0 spec-liveness

Each gate's own verdict line, not a bare $?:

  • ✓ doc authoring guard: 389 files clean — no bare metadata literals.
  • ✅ check-doc-anchors: 272 internal #fragment link(s) across 408 source file(s) all resolve to a real heading
  • ✓ check-doc-frontmatter: 403 page(s) under content/docs parse with yaml@2.9.0 …
  • ✓ check:doc-formula-expressions: 22 record-scoped formula example(s) across 416 files / 1443 TS blocks judged clean by @objectstack/formula.
  • ✓ docs-accuracy-audit scope is in sync with content/docs/: 189 hand-written doc(s).

check:doc-formula-expressions failed once on the first run with
ERR_MODULE_NOT_FOUND for @objectstack/formula/dist/index.mjs — an unbuilt dependency
closure in a fresh worktree, not a defect in this change. It passes after
pnpm --workspace-concurrency=2 --filter '@objectstack/lint^...' build, and passed in the
post-commit union above.

No ablation applies. A docs correction has no guard under test — there is no gate that
should have caught the missing 'bulk' and no mutation that would prove one red, so that
slot is deliberately empty rather than filled with a ceremony that measures nothing.

Changeset: skip-changeset, and why

This PR touches exactly one file, content/docs/data-modeling/objects.mdx. That file is
the docs site, not a published package: apps/docs is "private": true, and no
package.json in the workspace names content/ in its files[]. Nothing this PR changes
reaches npm, so there is no consumer changelog for a changeset to write — skip-changeset
is correct.

The distinction is about the file's home, not about it being Markdown: a Markdown file
that ships inside a published package (a package README) would need a real changeset,
because it lands in the npm tarball. This one does not.


⚠️main may be red on scripts/pm/git-history.mjs --self-test (#10807, tracked by
PR #10811). That failure reds Lint & Repo Gates for every PR and is not from this change.

Generated by Claude Code


Generated by Claude Code

…s` sample
`content/docs/data-modeling/objects.mdx` shipped an `enable.apiMethods` sample
listing only five of the six authorable primitives, omitting `bulk`.
The whitelist is exact — `undefined` means unrestricted, a subset means that
subset's derived closure — so a reader who copied the sample verbatim silently
denied batch operations on their object.
The page's own property table two rows below already names all six
(`get/list/create/update/delete/bulk`), and `ApiMethod` in
packages/spec/src/data/object.zod.ts declares six. Only the sample was wrong.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DdCnBGcHeufjrq7drTD3wt
@claudeclaudeBot added the skip-changeset PR has no user-facing published change; bypasses the changeset gate label Aug 21, 2026
@github-actionsgithub-actionsBot added size/xs documentation Improvements or additions to documentation labels Aug 21, 2026
@os-zhuang
os-zhuang marked this pull request as ready for review August 21, 2026 13:18
@os-zhuang
os-zhuang added this pull request to the merge queueAug 21, 2026
Merged via the queue into main with commit 2350264Aug 21, 2026
30 checks passed
@os-zhuang
os-zhuang deleted the claude/issue-10711-apimethods-bulk branch August 21, 2026 13:46
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

documentationImprovements or additions to documentationsize/xsskip-changesetPR has no user-facing published change; bypasses the changeset gate

Projects

None yet

Development

Successfully merging this pull request may close these issues.

[finding] objects.mdx's apiMethods sample omits bulk too — same trap as #10590, different page, outside that card's site list

2 participants

@os-zhuang@claude