feat(security): ADR-0090 P2 — everyone/guest audience anchors, additive baseline, anchor binding gate#2708
Merged
Merged
Conversation
…ive baseline, anchor binding gate Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_012oLzaP8n7A3YKFmgaHWC8H
|
The latest updates on your projects. Learn more about Vercel for GitHub.
|
Contributor
📓 Docs Drift CheckThis PR changes 4 package(s): 111 hand-written doc(s) reference the affected code and may need an implementation-accuracy re-verification:
|
…or exports (6 additions, 0 breaking) Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_012oLzaP8n7A3YKFmgaHWC8H
…e the #1985 owner policies to org_member The additive `everyone` baseline (P2) surfaced a latent hole: the policy `positions` field was an UNENFORCED property (ADR-0049 class) — a members-only restriction inside the baseline set silently bound everyone who resolved it, which pre-anchor meant "users with no other grants" and post-anchor meant "every authenticated principal" (the two-doors dogfood regression: an admin editing an env-authored set hit the baseline's created_by RLS and got 403). getApplicablePolicies now filters by the caller's held positions when a policy declares a domain, and the two #1985 owner-scoped write/delete policies in member_default declare `positions: ['org_member']` — the rank-and-file identity, matching the pre-anchor behavior where org/platform admins simply never resolved this set. tenant_isolation stays undomained (it is correct for every principal). Dogfood 39 files / 191 tests green; plugin-security 198 green. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_012oLzaP8n7A3YKFmgaHWC8H
os-zhuang
marked this pull request as ready for review
July 9, 2026 04:35
This was referenced Jul 9, 2026
os-zhuang
added a commit
that referenced
this pull request
Jul 9, 2026
…on Model v2 vocabulary (ADR-0090) (#2717) - roles.mdx → positions.mdx: flat positions (岗位), assignment BU anchor, built-in identity positions, everyone/guest audience anchors; the hierarchy narrative moves to business units. - profiles.mdx → migration tombstone: the Profile concept was removed (D2); maps each former use to everyone-anchor bindings, isDefault suggestions, and position-bound sets. - permission-sets.mdx: rewritten as the single capability container — union semantics, access depth (moved here from profiles), capabilities, built-in sets (additive member_default baseline), governed assignment tables, isDefault suggestion, adminScope delegated administration, package provenance. - sharing-rules.mdx: OWD default corrected to fail-closed private (D1 — the page previously documented the pre-v2 fail-open default), canonical four values only, externalSharingModel dial (D11), recipient types position / unit_and_subordinates / team. - authorization.mdx: position vocabulary, D1/D11 in the enforcement chain, delegated-admin gate in anti-escalation, new explain-engine section (D6), D7 linter + access-matrix snapshot added to governance, ADR-0090 in the index. - permissions-matrix.mdx: role-hierarchy section replaced with business-unit hierarchy & positions; isProfile removed from samples; position recipients. - permission-metadata.mdx: isProfile → isDefault/adminScope in the field table; union-semantics section replaces Profile-vs-Set; current_user.positions. - index.mdx: five-concepts overview, v2 implementation-status callout, best practices and example updated. - access-recipes.mdx / field-level-security.mdx: link + heading fixes. Authoritative reference: docs/design/permission-model.md; decision record: ADR-0090 (P1 #2697, P2 #2708, P3 #2711, P4 #2716). Claude-Session: https://claude.ai/code/session_012oLzaP8n7A3YKFmgaHWC8H Co-authored-by: Claude <noreply@anthropic.com>
This was referenced Jul 10, 2026
os-zhuang
added a commit
that referenced
this pull request
Jul 20, 2026
…s (designer parity, #3304) (#3327) assignment, create/update/delete/get_record, and screen now publish configSchemas mirroring objectui's hardcoded field groups — free-form maps as JSON-Schema open objects (additionalProperties: true) rendered by the designer's keyValue editor (objectui #2708), object references as xRef, screen's visibleWhen as an xExpression CEL column. decision/wait/script/subflow stay deliberately schemaless (documented + tested — a partial schema would drop editors). Verified: parity tests, tsc, 335-test suite green. Descriptor metadata only; no runtime behavior change. Closes the #3304 implementation series: loop (#3313), map (#3321), objectui adapter (#2708), this PR.
This was referenced Jul 20, 2026
akarma-synetal
pushed a commit
to akarma-synetal/framework
that referenced
this pull request
Jul 20, 2026
…d + Console) Continues the v16 page from the latest front/back-end code. Since the rc.0 cut, 9 backend changesets landed and the objectui pin advanced 94d4876 -> af1b0db (objectui objectstack-ai#2706-objectstack-ai#2736). Sourced from each repo's own changesets. - Retitles the now-stale 'pending the next console pin' subsection: those 4 frontend items (objectui#2701/objectstack-ai#2706/objectstack-ai#2707/objectstack-ai#2708) are now bundled as the pin advanced; points to the new running section. - Adds a 'Landed since 16.0.0-rc.0' section: - Breaking/behavior: aiStudio/aiSeat alias removal (objectstack-ai#3308); date-arithmetic now a build-time error (objectstack-ai#3306); checkboxes per-option visibleWhen + string option matching (objectstack-ai#3350). - New backend: formula null-guard/floor/ceil (objectstack-ai#3306); engine-owned managedBy bucket (ADR-0103 addendum, objectstack-ai#3343); approvals viewer gating (objectstack-ai#3344) + decision attachments (objectstack-ai#3332); discovery transactionalBatch bit (objectstack-ai#3298); action resultDialog i18n (objectstack-ai#3347); collab-notification/storage localization + wired notifications REST routes (objectstack-ai#3354). - Console (now bundled): option-widget visibleWhen parity, approvals-inbox server-viewer gating + composer retirement, related-list pagination, inline-analytics renderer retirement, authenticated api-fetch threading, result-dialog i18n, engine-owned bucket UI, write-failure surfacing. - Adds aiStudio/aiSeat and date-arithmetic to the upgrade checklist; updates the Console-section intro for the advanced pin. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01AHVoqyH9VAjmbyMN1Ri2jf
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.
Implements ADR-0090 P2 (D5 + D9; follows #2697's P1 wave). Tracks #2696.
What
EVERYONE_POSITION/GUEST_POSITION/AUDIENCE_ANCHOR_POSITIONSexported from@objectstack/spec(identity/position.zod.ts).bootstrap-builtin-positions), idempotently.everyoneis implicit for every authenticated principal (resolve-authz-contextpushes it before position→set resolution), so sets bound to it resolve as ordinary position-bound grants — additive, per-request, no materialized copies.fallbackPermissionSet, defaultmember_default) applies in addition to explicit grants (the old "only when the user had nothing else" conditional meant your first real grant silently cost you the baseline). The baseline is also seeded as aneveryonebinding so it lives in the same table / audit / explain path as admin-authored defaults — validated by the same high-privilege predicate before seeding.principalKind: 'guest'holding exactly['guest'](resolve-execution-context); internal bare contexts are untouched, so the engine's empty-context semantics keep their meaning.sys_position_permission_setwrites binding a set that carries VAMA, delete/purge/transfer, system permissions, or a'*'wildcard toeveryone/guestare rejected (describeHighPrivilegeBitsexported and shared with seed-time validation).Out of scope (per ADR phasing)
Install-time suggestion prompt UI (objectui, ships with the major-13 alignment); guest-position enforcement surfaces for portals; P3 linter family / delegated admin.
Verification
New behavior tests: anchor seeding + idempotency + predicate matrix (5, plugin-security
audience-anchors.test.ts), everyone-additive + anonymous-never-everyone (2, core resolver), guest/human principal at the HTTP entry (2, runtime). Affected suites green locally: plugin-security 198, core 313, runtime exec-ctx 21. Full monorepo build +--continuetest sweep running as the PR's own CI verifies.🤖 Generated with Claude Code
https://claude.ai/code/session_012oLzaP8n7A3YKFmgaHWC8H
Generated by Claude Code