Repository navigation
docs(spec): say a disabled package's fields are not among a base's contributions - #30642
Conversation
…ntributions The contributions array describe of GetPackageCustomizationsResponseSchema excluded a disabled package's flows and navigation items, but its field clause had no such exclusion, although the served object's fold withholds those fields and readBaseContributions skips their contributors. The field clause now carries the same parenthetical exclusion; the reference page is regenerated. Claude-Session: https://claude.ai/code/session_01L6bhgTqqeHSwZYJmApbDCa Co-authored-by: Claude <[email protected]>
📓 Docs Drift Check1 anchor(s) derived from 1 changed package(s); no hand-written page names any of them, so this run has nothing to list — not a clean bill of health. This check sees only pages that NAME a derived anchor: one that documents this change in prose, or enumerates it in an authoring dialect, names none and stays invisible to it on every run. What this run could not see
Coarse fallback — 170 page(s) merely mention a changed package (the pre-#9192 predicate, kept for the deliberately-wide backstop): Which tree this was computed onThis run read A worktree cut from an older # while this PR is open — GitHub drops the merge commit once it closes
git fetch origin 76317ccd4f605cc1a30988bad216007f7ce0633d && git checkout 76317ccd4f605cc1a30988bad216007f7ce0633d
# afterwards, rebuild it from the two parents, which stay fetchable
git fetch origin f3a52d38ffbace266347267bbb0dd0130bb35b9d 88a5f34377d6f5613018469de79dceb4e16d9794 && git checkout -B drift-repro f3a52d38ffbace266347267bbb0dd0130bb35b9d && git merge --no-ff 88a5f34377d6f5613018469de79dceb4e16d9794
node scripts/docs-audit/affected-docs.mjs --json f3a52d38ffbace266347267bbb0dd0130bb35b9d |
|
domain:spec#3 · os-sales · session_01L6bhgTqqeHSwZYJmApbDCa Contract-review-claim: session_01L6bhgTqqeHSwZYJmApbDCa · head b5aa7aa · 2026-11-05T20:00Z Full review at Generated by Claude Code |
|
domain:spec#3 · os-sales · session_01L6bhgTqqeHSwZYJmApbDCa Contract reviewServed-tier: Inputs read: card #30086 (body; comments 6631512692, 6666645427, 6667879149), PR #30642 (body, file list, net diff ① Derived judgmentsThe diff is three files: the
Nothing else is implied: ② Semver levelThe changeset grades ③ Boundary flagsEvery dev flag answered;
④ Design judgmentThe The new clause. "the fields of every object extension of an object the base owns, from any package but the base and its pair (a disabled package's are not listed, as the served object withholds them)".
Sentences left in place.
Completeness. With this clause the array describe names an exclusion for each of its three kinds, and the docblock's general rule, the arm describes, the runtime docblock and the route pins all say the same thing. No must-fix. Must-fix: none. Should-fix:
Gate verdicts on this head, as read at 2026-11-05T20:28Z: 65 check-runs, every one completed: 57 Implemented-by: VERDICT: PASS Generated by Claude Code |
Claude-Session: https://claude.ai/code/session_01L6bhgTqqeHSwZYJmApbDCa Co-authored-by: Claude <[email protected]>
… listed The served object's fold withholds a disabled package's extension, but a field another declaration also carries stays on the served object, so "withholds them" was wider than the mechanism. The clause and the changeset now name the extension as what is withheld. Claude-Session: https://claude.ai/code/session_01L6bhgTqqeHSwZYJmApbDCa Co-authored-by: Claude <[email protected]>
|
domain:spec#3 · os-sales · session_01L6bhgTqqeHSwZYJmApbDCa Contract reviewServed-tier: Delta record. The full review of this PR at ① Derived judgments
② Semver levelUnchanged: ③ Boundary flags
④ Design judgmentOnly the edited sentence is re-judged; every other sentence of Must-fix: none. Should-fix: none new. Gate verdicts on the new head, as read at 2026-11-05T21:12Z: 69 check-runs, every one completed: 59 Implemented-by: VERDICT: PASS Generated by Claude Code |
|
domain:spec#3 · os-sales · session_01L6bhgTqqeHSwZYJmApbDCa 维护者速读
席位意见:契约复审两轮都 PASS。第一轮的 should-fix 1 指出原因写宽了:停用包的扩展整体不参与合成,但同名字段若由所有者或另一个启用的包声明,仍会留在对象上。第 1 轮已把描述和变更集的同一句都改成"停用包的扩展被扣下",增量复审逐句核对为真。should-fix 2、3 是复审提的另立卡建议,席位不另立(理由见下)。 席位核对 — ACCEPT · domain:spec#3 · head
|
domain:spec#3 · os-sales · session_01L6bhgTqqeHSwZYJmApbDCa
Requested by Sales · project thread
Fixes #30086
Clause-②: no
Metadata-protocol: none
维护者速读
GET /api/v1/packages/:id/customizations)里"其他包贡献的条目"那一段的说明文字,补上一句:被停用的包加到对象上的字段不会列出。packages/spec/src/api/package-lifecycle.zod.ts的contributions数组 describe(字段分句新增的括号说明,原因写的是"停用包的扩展整体不参与对象合成"),其次是重新生成的content/docs/references/api/package-lifecycle.mdx同一行。pnpm --filter @objectstack/spec build && pnpm --filter @objectstack/spec check:generated,预期输出 "All 14 generated artifacts are up to date"。What changes
packages/spec/src/api/package-lifecycle.zod.ts: the.describe()ofGetPackageCustomizationsResponseSchema.contributions. Its field clause, "the fields of every object extension of an object the base owns, from any package but the base and its pair", now ends with "(a disabled package's are not listed, as the served object withholds its extension)", in the same parenthetical form the flow and navigation clauses already carry.content/docs/references/api/package-lifecycle.mdx: regenerated bygen:docs. Not hand-edited..changeset/30086-customizations-disabled-package-fields.md: a@objectstack/specpatch.No key, shape, export, default or test assertion changes, and nothing in
packages/runtimeorpackages/objectqlchanges.Tests
88a5f3437(merge baseaf8aab1b1, after mergingorigin/main).pnpm --filter @objectstack/spec exec vitest run --maxWorkers=2 src/api/package-lifecycle.test.ts src/api/package-api.test.ts: Test Files 2 passed (2), Tests 155 passed (155).pnpm --filter @objectstack/spec typecheck: exit 0.pnpm --filter @objectstack/spec check:generated: exit 1 beforegen:docs(onlycontent/docs/references/**stale), then exit 0, "All 14 generated artifacts are up to date".eslint --no-inline-config packages/spec/src/api/package-lifecycle.zod.ts: exit 0.Acceptance notes
origin/maindc518112, PR fix(objectql)!: withhold a disabled package's objectExtensions fields from the object they extend, and keep their columns #30362 (8cc709d5, an ancestor of this branch's base,merge-base --is-ancestorexit 0) already makes the served object's fold withhold a disabled package'sobjectExtensionsfields (packages/objectql/src/registry.ts, theisPackageDisabledfilters at :4883 and :4912).readBaseContributionsskips that package'sfieldcontributors (packages/runtime/src/domains/packages.ts:3386, docblock :3320-3326). So reading (b) of the card governs, no server work is owed, and the schema docblock "a disabled package's contributions MUST NOT be listed" (:511-514) is now true for every kind and stays as written.packages/runtime/src/domains/packages-disable-module-extension-fields.test.ts:326, "no longer lists the module's fields among the app's contributions", drives the realGET /packages/:app/customizationsroute afterPATCH /packages/:module/disable, and :336 restores them on enable. The nav half is pinned inpackages/runtime/src/domains/packages-customizations.test.ts:693.field/flowarm describes are unchanged. They define what afieldorflowentry IS, not which items are listed, so neither reads as including a disabled package's fields; the listing rule lives in the array describe.withholdDisabledExtensions(packages/objectql/src/registry.ts) leaves a disabled package's wholeextendlayer out of the fold, but withholds a field only when neither the owner nor a kept extension also declares it. So when an enabled package adds a field of the same name, or the disabled extension patches an owner-declared field, the field stays on the served object while the list still drops the disabled package's entry. The clause now reads "as the served object withholds its extension", which is exact in both cases. The changeset's matching sentence ("began withholding them") is corrected the same way.origin/mainwas merged in (merge, not rebase) before the edit.patch,Clause-②: no,Metadata-protocol: none: the text now matches what the server already answers, and no metadata author's accepted set moves.check-changeset-no-majormeasured below.Verification
All readings at head
88a5f3437(merge baseaf8aab1b1,objectstack-ai/objectstack), after mergingorigin/main.pnpm --filter @objectstack/spec check:generated: exit 1 before regeneration (onlycontent/docs/references/**stale),gen:docsexit 0, then exit 0, "All 14 generated artifacts are up to date".eslint --no-inline-config packages/spec/src/api/package-lifecycle.zod.ts: exit 0.node scripts/pm/dispatch-gates.mjs --commands --repo objectstack-ai/objectstack: 96 derived commands (the same list as round 0), each run after a fullturbo run build --concurrency=2(119/119 tasks) with its exit code captured before any pipe; all 96 exit 0.--ranreconciliation: "96 derived, 96 run, 0 NOT-MEASURED, 0 UNRUN" (a DERIVED zero: all 96 recorded an exit code).node scripts/check-changeset-no-major.mjs --base origin/main --event(this body as the declaration): exit 0, LEVEL AXIS "clause-②noand metadata-protocolnone... a non-protocol change atpatch".pnpm check:dev-prereqsexit 0;pnpm check:skill-frame-freshnessexit 0.Generated by Claude Code
🤖 Generated with Claude Code
https://claude.ai/code/session_01L6bhgTqqeHSwZYJmApbDCa