Repository navigation
docs(permissions): name where a high-privilege anchor binding is refused; spec patch changeset for the anchor docblock - #24006
Merged
objectstack-fleet[bot] merged 2 commits intoOct 16, 2026
Conversation
…sed; spec patch changeset for the anchor docblock The authorization page said the everyone/guest anchor bindings reject high-privilege sets "at the data layer for every caller". That gate retired with sys_position_permission_set. The sentence now names the measured refusal points: the confirm door (403), every derivation of the everyone definition, and the author-time rule on the CLI and the runtime publish gate (422); no door binds a set to guest yet. Adds the '@objectstack/spec' patch changeset the anchor docblock on EVERYONE_POSITION / GUEST_POSITION owed: the text ships in src/**/*.zod.ts and in dist/*.d.ts. Claude-Session: https://claude.ai/code/session_01LFqdRsuM5nkqoJdHd5ztVk Co-authored-by: Claude <noreply@anthropic.com>
…d the metadata door refuses the publish Claude-Session: https://claude.ai/code/session_01LFqdRsuM5nkqoJdHd5ztVk Co-authored-by: Claude <noreply@anthropic.com>
Contributor
Author
Review: ACCEPT · #23887 + #23935 · PR #24006 @
|
objectstack-fleet
Bot
deleted the
claude/issue-23887-anchor-docblock-changeset
branch
October 16, 2026 18:16
This was referenced Oct 16, 2026
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Fixes #23887
Fixes #23935
Clause-②: no
What
The contract review of the anchor-docblock change (
6f7ad7900f, review6214176883on #23373) left two release-text items. This PR handles both:.changeset/23887-anchor-docblock-guest-no-door.md:'@objectstack/spec': patchfor the docblock that change landed onEVERYONE_POSITION/GUEST_POSITION(packages/spec/src/identity/position.zod.ts:159-167). The docblock now says packages suggest bindings toeveryoneonly and the admin confirms each one, and that no door binds a set toguestuntil ADR-0138 D3 item 5's bind door is built.content/docs/permissions/authorization.mdx:68-78: the page said "Theeveryone/guestaudience-anchor bindings reject high-privilege sets at the data layer for every caller". That stopped being true when the data-layer gate retired withsys_position_permission_set. The new text names each refusal point measured below.This PR changes no code, no other docs page and nothing under
packages/spec/src/**. It touches no governed surface.Why the changeset is owed (measured on this tree's build)
packages/spec/package.jsonfiles[]=["dist","json-schema","liveness","prompts","llms.txt","README.md","src/**/*.zod.ts","CHANGELOG.md","api-surface","spec-changes.json","protocol-upgrade-guide.md"]. Sosrc/identity/position.zod.tsships in the tarball.pnpm --filter @objectstack/spec build, the new sentence (No door binds a set to `guest`) appears indist/membership-role-BpDGLF1o.d.tsanddist/membership-role-a9eypi2I.d.mts. Positive control: the older sibling sentence ("its bindings face the strictest lint tier") appears in the same two files.Where a high-privilege set bound to an anchor is refused (measured)
Tree:
packages/**byte-identical toorigin/main5fb8d158b5. Search:git grep -n describeAnchorForbiddenBitsgives 38 hits. Only 3 are production call sites, and all 3 passeveryone. The other production anchor check is the onedescribeHighPrivilegeBitscaller insecurity-plugin.ts. The anchor seal paths were read separately. The line numbers the card gave (:512,:865) have since moved to:659and:1040.isDefaultsuggestion:POST /api/v1/security/suggested-bindings/:id/confirmcallsconfirmAudienceBindingSuggestionplugin-security/src/suggested-audience-bindings.ts:1040(everyonetier, with the stack's declared capabilities)403 PERMISSION_DENIED; the row stayspendingand nothing is recordedsuggested-audience-bindings.test.ts"refuses a set carrying anchor-forbidden bits — 403, nothing recorded", plus the undeclared-token and platform-capability controls: passedeveryone's definition, acceptance half:readAcceptedEveryoneSets, for record rows and for a walled host'sacceptedDefaultPermissionSetssuggested-audience-bindings.ts:659forbidden;declareEveryonelogs it aterroreveryoneBaseline(describeHighPrivilegeBits, which is the wholeeveryonetier)plugin-security/src/security-plugin.ts:4755-4765, called fromdeclareBuiltinPositions(init()) anddeclareEveryone(kernel:ready, andrederiveEveryoneon accept, revoke, uninstall and package publish)everyone, with awarnbuiltin-positions.declaration-phase.test.tsand thesecurity-plugin.test.tsblock "audience-anchor bindings read the stack's declared capabilities": passedsecurity-anchor-high-privilegeinvalidateSecurityPosture, keyed onisDefault: trueonlylint/src/validate-security-posture.ts:940; registry rowlint/src/authoring-rules.ts:2010-2019(gating, commandsvalidate/build/lint, surfacescli+runtime-publish,runtimeTypesincludepermission)errorfinding on the CLI. At the metadata door's publish it is422 INVALID_METADATA(metadata-protocol/src/runtime-authoring-gate.ts:1194-1195). Draft saves are not gatedvalidate-security-posture.test.ts(166 passed)guestguesttierguestrow with409 SUGGESTION_STATE(suggested-audience-bindings.ts:1009), and the sync never produces oneobjectql/src/security-catalog-namespace.ts:122BUILT_IN_SECURITY_CATALOG_NAMES; metadata door: the sealed-managed-item refusal atmetadata-protocol/src/protocol.ts:18279403 NOT_OVERRIDABLEregistry-security-catalog-namespace.test.ts"the built-in holders" (9 passed,position everyoneamong them). The metadata-door half is pinned forguestbypackages/qa/dogfood/test/guest-grants-channel.dogfood.test.ts:479-491, which I read and did not run (it needs the whole-workspace dogfood boot).everyonegoes through the same predicate, which I also read and did not runNo engine (data-layer) write gate on anchor bindings remains: the plugin-security write gates mention no anchor refusal.
delegated-admin-gate.tsANCHOR_POSITIONSrefusessys_user_positionassignments to an anchor, which is a user assignment and not a set binding. The/security/_activationdoor refuses switching an anchor (400), which is not a binding either.Scratch probe (not committed; run with
tsxagainstpackages/lint/srcover the built closure). CallsrunRuntimeAuthoringRules({ type: 'permission', item })andvalidateSecurityPosture({ permissions: [item] }):Tests run locally (each through
scripts/pm/os-verify-lock.sh, everyVERDICT command-exit 0, after building the plugin-security and lint dependency closures):pnpm --filter @objectstack/plugin-security exec vitest run --maxWorkers=2 src/suggested-audience-bindings.test.ts src/builtin-positions.declaration-phase.test.ts src/audience-anchors.test.ts: 3 files, 65 passedpnpm --filter @objectstack/plugin-security exec vitest run --maxWorkers=2 src/security-plugin.test.ts -t 'audience-anchor bindings read the stack': 3 passed, 217 skippedpnpm --filter @objectstack/lint exec vitest run --maxWorkers=2 src/validate-security-posture.test.ts: 166 passedpnpm --filter @objectstack/objectql exec vitest run --maxWorkers=2 src/registry-security-catalog-namespace.test.ts -t 'built-in holders': 9 passed, 22 skippedGates (head
240caf9b61)node scripts/pm/dispatch-gates.mjs --commands --repo objectstack-ai/objectstackderived 55 commands for this diff. All 55 exited 0. One of them,pnpm --filter @objectstack/spec run check:skill-examples, first exited 3 (PREREQUISITE NOT MET, noclient-reactdeclarations). I built@objectstack/client-reactand its closure, and the rerun exited 0 with 263 examples type-checked.dispatch-gates --rangave: 55 derived, 55 run, 0 NOT-MEASURED, 0 UNRUN.check-empty-changeset: "1 declaring changeset(s) added"check-adr-0087-registration: "no declared-breaking changeset (1 non-breaking changeset(s) seen)"check-changeset-no-major: protocol lockstep holds. Its clause-② level axis prints NOT APPLICABLE locally (nopull_requestpayload), so this PR'sCheck Changesetrun reads that axis from the line above.check:doc-anchors: 531 fragment links resolvecheck:doc-authoring: cleancheck:docs-transcript-drift: cleancheck:docs-audit-scope: cleancheck:nul-bytes: OKnode scripts/docs-audit/check-affected-docs.mjsexits 0, andnode scripts/docs-audit/affected-docs.mjs origin/mainreports "0 docs name something this change touched … 0 changed package(s)". The Docs Drift Check workflow triggers onpackages/**only, so it does not run on this PR.node scripts/check-adr-links.mjs: 765 links resolve. Lychee runs in CI.Acceptance notes
403 NOT_OVERRIDABLEfor the anchors (row 6), pinned by dogfood that only main's full battery runs. Also not run:check:dev-prereqsandcheck:skill-frame-freshness(local-only families; this diff edits nopackages/specsource and no four-axis framework file).skip-changesetdoes not apply.Generated by Claude Code