Skip to content

docs(skills): teach the declared action override and its access-widening refusal - #30704

Merged
os-zhuang merged 2 commits into
mainfrom
claude/project-thread-7vwgvw
Nov 6, 2026
Merged

os-zhuang merged 2 commits into
mainfrom
claude/project-thread-7vwgvw

Conversation

@objectstack-fleet

Copy link
Copy Markdown
Contributor

Requested by Elon · project thread

domain:skills#1 · os-elon-musk · session_016WV4czCxwMepBDxUtozyne

Fixes #30505

Clause-②: no
Metadata-protocol: none

维护者速读

What changes

  • skills/objectstack-platform/SKILL.md (the ADR-0146 customization paragraphs): action joins the list of types a pair's declared override is honoured for, and one sentence teaches what an action override may change. It keeps the base's objectName (the doors match the base's action as OBJECT:NAME; an override on another object is refused declared_package_ships_no_such_item) and replaces the behaviour (type, body, label, visible, …) whole, for whoever could already run the base. Dropping a requiredPermissions entry, turning ai.exposed on, or turning ai.requiresConfirmation off is refused 403 NOT_OVERRIDABLE with rule declared_action_widens_access.
  • content/docs/concepts/metadata-lifecycle.mdx: the sentence saying an action override waits for ADR-0146 D9 and is not served is gone; action is in the type list, and a new bullet states the same rules in full prose.
  • skills/objectstack-platform/evals/config-plugins-ops.json: new case 15 (relabel and re-script a packaged action, and a request to widen who may run it); case 13's type list gains action. The platform evals carry one case per taught override rule (cases 12–14), so the new rule gets one too.
  • .changeset/30505-skills-declared-action-override.md: '@objectstack/skills': patch.

Every fact was read off origin/main b77c160a, not off the card: OVERRIDE_TYPE_CLASSIFICATION.action (disposition: 'overridable') in packages/spec/src/kernel/customization-package.ts; actionOverrideWidening and the declared_action_widens_access / declared_package_ships_no_such_item refusals (403, NOT_OVERRIDABLE) plus the OBJECT:NAME shipper filter in packages/metadata-protocol/src/protocol-packaged-base-refusal.ts. The confirmation key is ai.requiresConfirmation, nested under ai like ai.exposed, so the skill spells both that way.

Why

PR #30497 opened the declared override for action (ADR-0146 D9), and PR #30612 added the objectName rule. The skill still listed the overridable types without action, and the docs page said an action override was not served. An agent reading either would refuse or clone a package's button instead of overriding it.

Token ratchet (skills/**)

Reading Before (b77c160a) After (17e0285f)
objectstack-platform/SKILL.md lines 426 413
objectstack-platform/SKILL.md tokens (ratchet count, ceiling 6011) 6009 6010
All 11 SKILL.md files, lines 4534 4521
All 11 SKILL.md files, tokens 56667 56668

The addition (~100 tokens) is paid in the same file, with no ceiling raise. Each cut removes words, never a re-wrap:

  • The customization paragraph is tightened ("one it does not ship", "a base-shipped locale", "never judging basedOn").
  • The strict: false fence becomes one inline sentence.
  • The four "Moved verbatim to" pointers read "See", and the Part 2 / Part 3 pointers drop "moved verbatim to".
  • The two single-section bootstrap.md pointer stubs (§ Multi-App Composition, § Complete Working Example) merge into the pointer above them, so one line names all four sections.
  • Two observations are dropped: "the example apps carry it" (engines stamp) and "All three example apps use it" (onEnable). The defineStack() warn sentence is shortened; the example warning text it introduces already says the value is dropped.

Acceptance notes

  • content/docs/concepts/metadata-lifecycle.mdx L208 (ADR-0126 table) still names only the switch-off route for a packaged action. That route still exists (packaged-base-regime.ts), so it is not false, but the page does not mention the declared override as the path for changing an action. That line is outside this card's file surface. Noted, not filed.

Verification

Gates were run on the final head 17e0285f (git rev-parse --short HEAD), after a whole-tree turbo run build (lock VERDICT command-exit 0).

  • dispatch-gates --commands: 70 families derived. All 70 exit 0. pnpm lint exits 0.
  • dispatch-gates --ran: 70 derived, 70 run, 0 NOT-MEASURED, 0 UNRUN.
  • The first sweep, on ea0dcdad, was red on check:skill-top-level-keys: one compression had reworded the sentence that gate quotes ("the top level refuses it and the stack fails to load"). 17e0285f restores the sentence and pays the bytes elsewhere.
Gate exit codes on 17e0285
node scripts/check-adr-0087-registration.mjs --base origin/main :: exit 0
node scripts/check-adr-0087-registration.mjs --self-test :: exit 0
node scripts/check-adr-links.mjs :: exit 0
node scripts/check-adr-links.mjs --self-test :: exit 0
node scripts/check-changeset-no-major.mjs --base origin/main :: exit 0
node scripts/check-closing-keyword-parity.mjs :: exit 0
node scripts/check-closing-keyword-parity.mjs --self-test :: exit 0
node scripts/check-comment-mask-corpus.mjs :: exit 0
node scripts/check-doc-route-spelling.mjs --advisory :: exit 0
node scripts/check-doc-route-spelling.mjs --self-test :: exit 0
node scripts/check-docs-section-name.mjs :: exit 0
node scripts/check-docs-section-name.mjs --self-test :: exit 0
node scripts/check-dts-emitted.mjs --self-test :: exit 0
node scripts/check-empty-changeset.mjs --base origin/main :: exit 0
node scripts/check-empty-changeset.mjs --self-test :: exit 0
node scripts/check-section-landing-index.mjs :: exit 0
node scripts/check-section-landing-index.mjs --self-test :: exit 0
node scripts/check-skills-token-ratchet.mjs :: exit 0
node scripts/check-skills-token-ratchet.mjs --self-test :: exit 0
node scripts/ci/assert-turbo-remote-cache.mjs --self-test :: exit 0
node scripts/ci/plan-test-core-shards.mjs --self-test :: exit 0
node scripts/ci/prune-turbo-cache.mjs --self-test :: exit 0
node scripts/pm/release-rehearsal-clone.mjs --self-test :: exit 0
node scripts/release-pending-publish.mjs --self-test :: exit 0
pnpm --filter @objectstack/lint run check:doc-formula-expressions :: exit 0
pnpm --filter @objectstack/lint run check:doc-security-posture :: exit 0
pnpm --filter @objectstack/spec run check:docs :: exit 0
pnpm --filter @objectstack/spec run check:empty-state :: exit 0
pnpm --filter @objectstack/spec run check:liveness :: exit 0
pnpm --filter @objectstack/spec run check:skill-docs :: exit 0
pnpm --filter @objectstack/spec run check:skill-examples :: exit 0
pnpm --filter @objectstack/spec run check:strictness-ledger :: exit 0
pnpm --filter @objectstack/spec run check:variant-docs :: exit 0
pnpm --filter @objectstack/spec run check:yaml-examples :: exit 0
pnpm check:agent-test-spelling :: exit 0
pnpm check:changeset-gate-self-tests :: exit 0
pnpm check:ci-filter-parity :: exit 0
pnpm check:closed-ceremony-text :: exit 0
pnpm check:corpus-claim-drift :: exit 0
pnpm check:cross-package-test-inputs :: exit 0
pnpm check:doc-anchors :: exit 0
pnpm check:doc-authoring :: exit 0
pnpm check:doc-frontmatter :: exit 0
pnpm check:docs-audit-scope :: exit 0
pnpm check:docs-redirects :: exit 0
pnpm check:docs-single-h1 :: exit 0
pnpm check:docs-spec-enumerations :: exit 0
pnpm check:docs-transcript-drift :: exit 0
pnpm check:driver-memory-census :: exit 0
pnpm check:dts-closure :: exit 0
pnpm check:dual-build-cjs-loads :: exit 0
pnpm check:gitlink-declared :: exit 0
pnpm check:lean-entry-closure :: exit 0
pnpm check:merge-driver :: exit 0
pnpm check:nul-bytes :: exit 0
pnpm check:overlay-whitelist-table :: exit 0
pnpm check:pm-governed-merges :: exit 0
pnpm check:pm-skill-id-lint :: exit 0
pnpm check:published-files :: exit 0
pnpm check:published-readme-links :: exit 0
pnpm check:react-page-adapter-contract :: exit 0
pnpm check:refd-timer-probe :: exit 0
pnpm check:role-word :: exit 0
pnpm check:skill-compatibility :: exit 0
pnpm check:skill-frame-sync :: exit 0
pnpm check:skill-identifier-liveness :: exit 0
pnpm check:skill-top-level-keys :: exit 0
pnpm check:sourcemap-no-sources-content :: exit 0
pnpm check:vendor-version-stamps :: exit 0
pnpm check:watch-hint-literal :: exit 0
pnpm lint :: exit 0

Human Minimum

  • 1. Schemas start as Zod; packages/spec holds no runtime logic. (packages/spec not touched.)
  • 2. Every name I added uses the casing for its kind.
  • 3. No formatter ran; pnpm lint passes.
  • 4. One issue, one branch off an up-to-date main, one pull request.
  • 5. A change that publishes carries a changeset, and both declaration lines are filled in here and in the changeset.
  • 6. packages/spec touched: not touched.
  • 7. No hand edits to content/docs/references/, packages/*/CHANGELOG.md or content/docs/releases/.
  • 8. Title, body and comments are in English.
  • The Before Submitting list in CONTRIBUTING.md is done.

Generated by Claude Code

…ing refusal

The platform skill's ADR-0146 customization paragraph now lists `action`
among the declared-override types and says what an action override may
change: it keeps the base's objectName (OBJECT:NAME identity; moving it
is refused declared_package_ships_no_such_item) and replaces behaviour
whole for whoever could already run the base, while dropping a
requiredPermissions entry, turning ai.exposed on or
ai.requiresConfirmation off is refused 403 NOT_OVERRIDABLE with rule
declared_action_widens_access. Paid inside the token ratchet by
same-file compression.

The metadata-lifecycle concept page no longer says an action override
is not served, and the platform evals gain an action-override case.

Claude-Session: https://claude.ai/code/session_016WV4czCxwMepBDxUtozyne
Co-authored-by: Claude <noreply@anthropic.com>
@github-actions github-actions Bot added size/s documentation Improvements or additions to documentation tooling Fix lands in tooling, not a product package — enters pm:queue only with Unblocks: or a named surface labels Nov 5, 2026
@objectstack-fleet

Copy link
Copy Markdown
Contributor Author

domain:skills#1 · os-elon-musk · session_016WV4d1mkgEris4MHHLjtnk

Contract-review-claim: session_016WV4d1mkgEris4MHHLjtnk · head 17e0285 · 2026-11-05T22:49Z

@objectstack-fleet

Copy link
Copy Markdown
Contributor Author

domain:skills#1 · os-elon-musk · session_016WV4d1mkgEris4MHHLjtnk

Contract review

Served-tier: CONTRACT_REVIEW_TIER
Head-sha: 17e0285f3e0d4030ae3f01f97de98f3db748fb29
Local-runs: none
Scope: skills/objectstack-platform/SKILL.md, skills/objectstack-platform/evals/config-plugins-ops.json (hits) + cited (on origin/main, merge-base b77c160a) packages/spec/src/kernel/customization-package.ts, packages/spec/src/kernel/index.ts, packages/metadata-protocol/src/protocol-packaged-base-refusal.ts, packages/metadata-protocol/src/protocol-save.ts, packages/metadata-protocol/src/protocol-history-and-publish.ts, packages/cli/src/utils/override-declarations.ts, packages/cloud-connection/src/marketplace-install-local-plugin.ts, packages/objectql/src/plugin.ts, ADR-0146 D9; on head content/docs/concepts/metadata-lifecycle.mdx, skills/objectstack-platform/references/bootstrap.md, scripts/check-skills-token-ratchet.mjs, scripts/check-skill-top-level-keys.mjs, .changeset/30505-skills-declared-action-override.md

① Derived judgments

  • action is overridable: customization-package.ts:344-348 (disposition: 'overridable'), filtered into OVERRIDABLE_METADATA_TYPES at :370-374, exported kernel/index.ts:48; the gate admits it, CONDITIONS_DELIVERED = new Set(['flow', 'action']) (protocol-packaged-base-refusal.ts:638). SKILL.md L123 and mdx L132-134 list the same 13 types; the "not served yet" sentence is gone. The ADR is not edited, as ordered.
  • Declaration overrides: { package, basedOn } from the .custom pair only (declared_outside_pair, :1025-1029); unchanged teaching.
  • Three widening refusals, exact paths: actionOverrideWidening (:712-733) refuses dropped requiredPermissions (:717-724), ai.exposed false→true (:726), ai.requiresConfirmation true→false (:729, aiOf reads item.ai at :719). The dev's correction of the card (ai.requiresConfirmation) is right. Rule declared_action_widens_access (:1049-1051); NOT_OVERRIDABLE, 403 (:1135-1143).
  • Behaviour replaced whole for the people who could already run it: docblock :697-710; SKILL.md L125 and mdx L136-139 agree.
  • Base objectName kept, OBJECT:NAME at every door: key at :1100-1106, refusal declared_package_ships_no_such_item (:1040, :1186-1190); save protocol-save.ts:510, publish protocol-history-and-publish.ts:788, os validate override-declarations.ts:35-36,127-131, managed install marketplace-install-local-plugin.ts:676-677,3727-3729.
  • Served where drawn or run: objectql/src/plugin.ts:3760-3800.
  • Public surface: none (changeset, mdx, SKILL.md, eval). Metadata-protocol: none correct.

② Semver level

'@objectstack/skills': patch with Clause-②: no / Metadata-protocol: none; not skip-changeset. Matches the PR body and Fixes #30505.

③ Boundary flags

  • PR author objectstack-fleet[bot]. open_questions: none.
  • Deviation "default model; the seat's at-tier review": this record is that review.
  • Deviation "eval outside the ratchet": check-skills-token-ratchet.mjs:584 prices SKILL.md alone (ceiling 6011); confirmed.
  • Ratchet re-measured: SKILL.md 6009 → 6010, ceiling 6011, not raised. check:skill-top-level-keys sentence (check-skill-top-level-keys.mjs:77) still verbatim at SKILL.md L48.
  • Out-of-scope note (mdx L208 names only the switch-off route for a packaged action): L208 is not false; nothing to file.
  • Check-runs at read time (2026-11-05T22:50Z): no red; 7 still in progress.

④ Design judgment

  • skills/objectstack-platform/SKILL.md: L125 holds against the code on every name, field path and status. Compression checked sentence by sentence: "Moved verbatim to" → "See" pointers all land on existing §§ of references/bootstrap.md; the defineStack() warning rule survives in the quoted line; the strict: false fence becomes the same inline call; two dropped sentences are observations about example apps, not rules; the customization-paragraph rewrites keep their meaning. No rule dropped, no meaning changed.
  • should-fix 1 (not blocking): L125 does not say an override may add a capability (protocol-packaged-base-refusal.ts:699-700; mdx L144-145 says it). One clause would close it; headroom is 1 token.
  • evals/config-plugins-ops.json case 15 (L253-269): sibling shape, same HotCRM 3.2.0 fixture as cases 13-14, asserts declared_action_widens_access and requiredPermissions, forbids the two wrong answers; case 13's type list gains action.
  • content/docs/concepts/metadata-lifecycle.mdx L132-145 (prose face): the stale sentence is gone and the new bullet matches ①; no other stale "not served" mention remains in content/docs/** or skills/**.
  • must-fix: none.

Implemented-by: claude/project-thread-7vwgvw
Reviewed-by: session_016WV4d1mkgEris4MHHLjtnk

VERDICT: PASS

@objectstack-fleet

Copy link
Copy Markdown
Contributor Author

domain:skills#1 · os-elon-musk · session_016WV4d1mkgEris4MHHLjtnk

维护者速读

  • 改了什么:objectstack-platform 技能讲清已安装包的 action 也能通过 .custom 对声明式覆盖(改名、隐藏、调整),以及三种放宽权限的覆盖会被 declared_action_widens_access(403 NOT_OVERRIDABLE)拒绝;覆盖保留基础对象的 objectName。同步修正 metadata-lifecycle.mdx 里“action 覆盖尚未提供”的过时句子,并加一条 eval。
  • 为什么改:PR feat(metadata-protocol,objectql): open the declared override for a package's action (ADR-0146 D9) #30497 和 fix(objectql, metadata-protocol, cloud-connection)!: a declared .custom action override is keyed and judged the same way at every door, and only its declared base's handler slots beneath it #30612 已让 action 可覆盖并按 OBJECT:NAME 匹配;旧文本会让 AI 以为 action 不能覆盖,或写出会被拒的放权覆盖。
  • 风险与回滚:只动技能文档、一页文档站说明、一条 eval 和 changeset,不动代码;回滚即 revert 本 PR。
  • 先看:skills/objectstack-platform/SKILL.md 第 123–125 行,和压缩掉的段落(指针都落在 references/bootstrap.md 现有小节)。
  • 两分钟验证:node scripts/check-skills-token-ratchet.mjs | grep objectstack-platform/SKILL,预期 6010 tokens(上限 6011,未抬)。
  • 需要你做的:批准并合并(skills/** 为 Tier H)。契约复核 PASS 评论 6671703593,Head-sha 17e0285f3e0d4030ae3f01f97de98f3db748fb29。
  • 席位意见:可合。复核的可选建议(L125 补一句“覆盖可以增加能力”)没有做:余量只剩 1 token,不值得为它抬上限。

席位核对 — ACCEPT · head 17e0285

@objectstack-fleet objectstack-fleet Bot added the pm:awaiting-merge PR only: landing waits on the maintainer's own review and merge (SKILL.md 复核 ②); never on an issue label Nov 5, 2026
@os-zhuang
os-zhuang marked this pull request as ready for review November 6, 2026 00:55
@os-zhuang
os-zhuang enabled auto-merge November 6, 2026 00:55
@os-zhuang
os-zhuang added this pull request to the merge queue Nov 6, 2026
Merged via the queue into main with commit 6a983a1 Nov 6, 2026
50 checks passed
@os-zhuang
os-zhuang deleted the claude/project-thread-7vwgvw branch November 6, 2026 01:13
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

documentation Improvements or additions to documentation pm:awaiting-merge PR only: landing waits on the maintainer's own review and merge (SKILL.md 复核 ②); never on an issue size/s tooling Fix lands in tooling, not a product package — enters pm:queue only with Unblocks: or a named surface

Projects

None yet

2 participants