Repository navigation
fix(objectql)!: refuse a composed stack's top-level picklist that no package body declares and no object field names - #28231
Conversation
…eld names Co-authored-by: Claude <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_016WV4d1Np3hU7RQnA13YZcL
Co-authored-by: Claude <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_016WV4d1Np3hU7RQnA13YZcL
📓 Docs Drift CheckThis PR changes 1 package(s): 6 hand-written doc(s) NAME something this change touched and may need an implementation-accuracy re-verification:
⛔ 2 release-owned page(s) also name something this change touched. These are read-only:
What this run could not see
Coarse fallback — 20 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 66fb75a77b5ca348e83f7cae783d54e5607bad6a && git checkout 66fb75a77b5ca348e83f7cae783d54e5607bad6a
# afterwards, rebuild it from the two parents, which stay fetchable
git fetch origin 7c3cc889f7c64d465486bb94ded8c8ea558d6945 a2fb76a079fd8e6b022d4f9b86f263b2f3c1cbf1 && git checkout -B drift-repro 7c3cc889f7c64d465486bb94ded8c8ea558d6945 && git merge --no-ff a2fb76a079fd8e6b022d4f9b86f263b2f3c1cbf1
node scripts/docs-audit/affected-docs.mjs --json 7c3cc889f7c64d465486bb94ded8c8ea558d6945
|
|
domain:server#4 · os-elon-musk · session_016WV4d1Np3hU7RQnA13YZcL Contract-review-claim: session_016WV4d1Np3hU7RQnA13YZcL · head b4c7653 · 2026-10-30T18:40Z |
|
domain:server#4 · os-elon-musk · session_016WV4d1Np3hU7RQnA13YZcL Contract reviewServed-tier: Inputs: card #28159 (body; triage 6525964223; claim 6526699957; os-dev report 6530710763), PR #28231 (body, file list, net diff against Check-runs at 2026-10-30T18:54Z: 48 check-runs on the head, every one ① Derived judgmentsEvery accept-set and public-surface change the diff implies, judged in the tree:
② Semver level
③ Boundary flags
④ Design judgmentThe narrowing itself, against the published spec on
Should-fixes:
No must-fix. No fail-open finding at rule level beyond the one the card names and the head closes. Implemented-by: VERDICT: PASS |
…ine registers Co-authored-by: Claude <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_016WV4d1Np3hU7RQnA13YZcL
Co-authored-by: Claude <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_016WV4d1Np3hU7RQnA13YZcL
|
domain:server#4 · os-elon-musk · session_016WV4d1Np3hU7RQnA13YZcL Contract-review-claim: session_016WV4d1Np3hU7RQnA13YZcL · head a2fb76a · 2026-10-30T20:04Z |
|
domain:server#4 · os-elon-musk · session_016WV4d1Np3hU7RQnA13YZcL Contract reviewServed-tier: This record supersedes 6531047218 (head Check-runs at 2026-10-30T20:07Z: 48 check-runs on the head, every one ① Derived judgmentsThe merge, judged by the tree:
The fix, judged by the tree ( ② Semver level
③ Boundary flags
④ Design judgmentThe narrowing itself — the first record's judgment stands and is tighter: every judge the platform runs on a composed stack's picklist vocabulary (
No must-fix. Two should-fixes, both carried on this PR: pin the top-level Implemented-by: VERDICT: PASS |
|
domain:server#4 · os-elon-musk · session_016WV4d1Np3hU7RQnA13YZcL 维护者速读
席位意见:ACCEPT。 席位核对Head-sha:
|
domain:server#4 · os-elon-musk · session_016WV4d1Np3hU7RQnA13YZcL
维护者速读
packages[]的组合栈,若顶层声明了一个 picklist,既没有任何包体声明、也没有任何对象字段引用,启动照常成功,该列表在引擎注册表里静默缺失。manifest服务在注册任何内容之前拒绝这种工件,返回INVALID_METADATA(422),消息点名每个 picklist 和所属栈,并给出处方。packages[]条目里声明;或由对象字段引用它;或从顶层删除。packages[]的栈均不变。packages/objectql/src/plugin.ts的残余注册段、其残余测试文件和一个 changeset。Clause-②: yes (narrowing) — a stack with
packages[]whose top level declares a picklist that no package body declares and no object field names booted, and now refuses the boot withINVALID_METADATA(422)Metadata-protocol: none
What changed
The
manifestservice registers a composed stack's residual (top-level items no package body declares) under the stack's own id, except picklists, which stay metadata only (RESIDUAL_TYPES_WITH_OWN_PATH). A residual picklist that an object field names was loud already. One that no object field names was neither registered nor refused.unreferencedResidualPicklistRefusal(inpackages/objectql/src/plugin.ts) reads the residual rule's own answer (unclaimedTopLevel), takes its picklists, and keeps those that no object field names. "Names" is judged off the artifact alone: its top level and every package body, objects andobjectExtensionsboth, through the existingcollectManifestPicklistReferences. It is never judged off the registry, which is still filling during a boot. If any are left,registerthrows before anything of the artifact registers. The refusal uses the existing picklist envelopepicklistMetadataError(INVALID_METADATA, 422), so no new error code is added. The residual objects rule's line does not move.Measurement (on
mainat35f20551, then on this branch)mainstate=running;resolvePicklistOptions('acme_unused')isundefined; no warning names itINVALID_METADATA, the message namesacme_unusedand stackcom.example.acme.releasepackages: []with only such a picklist on the top level['open']Pins (
manifest-service-residual-objects.test.ts, newdescribe)On
main'splugin.ts: 4 red, 5 green (the 5 controls). On this branch: 9 of 9 green. Both residual test files: 72 of 72 green. Full@objectstack/objectqlsuite: green (counts under Gates).main, green here: the boot refusal (code, status, picklist, stack, all three remedies); several picklists named in one refusal, and not one a field names;packages: []with only such a picklist; afterstart(), the artifact is refused before anything of it registers.packages[]registers its unnamed picklist as before.Ablations, each restored from the committed head:
packages[]controlGates
Run on the head
b4c76532, which mergesmainat7811c3f6, after a full rebuild:dispatch-gates.mjs --commands --repo objectstack-ai/objectstackderived 61 families. All 61 were run and all exited 0.--ranreports 61 run, 0 NOT-MEASURED and 0 UNRUN, and exits 0.pnpm lint: exit 0.pnpm --filter @objectstack/objectql run typecheck: exit 0.@objectstack/objectql9732 of 9732 green,@objectstack/runtime8855 green with 19 skipped,@objectstack/metadata906 of 906 green.Fixes #28159
🤖 Generated with Claude Code
https://claude.ai/code/session_016WV4d1Np3hU7RQnA13YZcL