Repository navigation
fix(metadata-protocol, cli, cloud-connection): a declared action override moved to another object is told which object the base ships the action on - #30697
Conversation
…ride moved to another object is told which object the base ships the action on Co-authored-by: Claude <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_016WV4cx3aafYJDsJo3siYFw
📓 Docs Drift Check7 anchor(s) derived from 3 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 — 45 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 |
|
domain:server#4 · os-elon-musk · session_016WV4czvZykUqhYxYXSSDt4 维护者速读
席位意见:ACCEPT(#30623)。 席位核对Head-sha:
|
Requested by Elon · project thread
Fixes #30623
Clause-②: no
Metadata-protocol: none
维护者速读
.custom动作覆盖把objectName写成了与基包动作不同的对象时,declared_package_ships_no_such_item拒绝信息现在点名两个对象,并告诉作者保留基包动作的objectName;三个入口(保存/发布门、os validate、托管安装)用同一句话。NOT_OVERRIDABLE)、状态码(403)、判定结果全不变;基包根本没有这个名字时,文案与今天一字不差。回滚即 revert。protocol-packaged-base-refusal.ts的shipsNoSuchItemMessage(唯一的句子构造器)和OverrideWriteClosure.baseItemsOf(三个入口各自递进基包的同类条目)。pnpm --filter @objectstack/cloud-connection exec vitest run src/marketplace-install-local-override-gate.test.ts,预期 14/14 绿,其中[#30623]两条(换对象、CONTROL)。What changes
shipsNoSuchItemMessageinpackages/metadata-protocol/src/protocol-packaged-base-refusal.tswrites thedeclared_package_ships_no_such_itemsentence.judgeOverrideWritealready serves all three doors, so the builder lives there, in the lowest package all three already import; no new cross-package export.actionoverride names a base that ships an action of that name on another object, the sentence becomes:'action/NAME' declares an override of 'BASE' on object 'OVERRIDE_OBJECT', but 'BASE' ships its action 'NAME' on object 'BASE_OBJECT'. An override replaces the base's action on that action's own object: keep the base action's objectName: 'BASE_OBJECT' in the override, or remove overrides to keep it as 'PAIR''s own item (ADR-0146 D2).OverrideWriteClosuregains an optionalbaseItemsOf(base): the base's items of this type at any object. Each door hands it the items it already holds:overrideWriteVerdict): the artifact lookup's items under that base's_packageId;os validate(packages/cli/src/utils/override-declarations.ts): the base package's walked items, when the artifact carries it;packages/cloud-connection/src/marketplace-install-local-plugin.ts): the base's listing it already reads (heldBy).protocol-packageless-overlay-migration.ts,cli migrate packageless-overlays) only names the code in a comment and asksoverrideWriteVerdict, so it gets the new sentence with no change.packages/spec/**.Changed lines: 174 (+165 / -9, 7 files).
Tests
packages/objectql/src/protocol-flow-custom-override.test.ts:[#30623]pins the full sentence throughsaveMetaItem(403NOT_OVERRIDABLE) forshowcase_task_closemoved toshowcase_other, plus a CONTROL for an unshipped name (today's sentence, whole verdict).os validate:packages/cli/src/utils/override-declarations.test.ts:log_call(base oncrm_account) declared oncrm_lead, first sentence plus theobjectName: 'crm_account'remedy; CONTROLno_such_call.packages/cloud-connection/src/marketplace-install-local-override-gate.test.ts:crm_close(base oncrm_account) declared oncrm_lead→ 403, nothing saved or ledgered, first sentence plus remedy; separate CONTROLcrm_reopen.Ablation (one, on the builder)
node scripts/ablation-replace.mjsonprotocol-packaged-base-refusal.ts, anchorif (others.length > 0) {→if (others.length > 0 && String('ABLATE30623') === 'on') {;pnpm --filter @objectstack/metadata-protocol build;ablation-dist-preflight.mjs @objectstack/metadata-protocol ABLATE30623exit 0 (marker in dist).Tests 1 failed | 14 passed (15); red:[#30623] the moved override's refusal names both objects…Tests 1 failed | 11 passed (12); red:[#30623] an action override moved to another object…Tests 1 failed | 13 passed (14); red: the moved override; the CONTROL stays green.Restore:
blob == HEAD (153a82430761),git diff HEADempty; rebuild; preflight--absent✓; the three files 15/15, 12/12, 14/14.Acceptance notes
os-dev-reporton declared_package_ships_no_such_item: the refusal names neither the object nor the remedy when an action override moves the action to another object #30623 lists the local gate readings; CI runs the full farm.Verification
Local runs
Head after the gates:
01adff4f(the fix commit);9569f388adds only a merge oforigin/maintouching none of the 7 files.turbo run buildclosure for cli / cloud-connection / objectql + metadata-protocol: 62/62 tasks, lock VERDICT command-exit 0.pnpm --filter metadata-protocol --filter cli --filter cloud-connection --filter objectql typecheck: VERDICT command-exit 0.@objectstack/metadata-protocolvitest: Test Files 317 passed | 4 skipped; Tests 22454 passed | 26 skipped; exit 0.@objectstack/cloud-connectionvitest: Test Files 70 passed; Tests 892 passed; exit 0.@objectstack/cli--project unit(afterpnpm --filter @objectstack/cli build): Test Files 389 passed; Tests 5432 passed; VERDICT command-exit 0. Integration layer declared to CI (no spawn entry touched).@objectstack/objectql:src/protocol-flow-custom-override.test.ts15/15; the full package run is CI's.dispatch-gates --commands: 64 families; 63 exit 0;check:dual-build-cjs-loadsexit 3 then 1 on an unrelated@objectstack/organizationsdist that this targeted build did not emit (needs a whole-tree build): NOT MEASURED, CI runs it.--ran:64 derived famil(ies) accounted for — 63 run, 1 NOT-MEASURED.🤖 Generated with Claude Code
https://claude.ai/code/session_016WV4cx3aafYJDsJo3siYFw