Skip to content

feat(showcase,docs): ADR-0090 permission-model zoo + full docs alignment - #2739

Merged
os-zhuang merged 1 commit into
mainfrom
feat/adr-0090-showcase-permission-zoo
Jul 10, 2026
Merged

os-zhuang merged 1 commit into
mainfrom
feat/adr-0090-showcase-permission-zoo

Conversation

@os-zhuang

Copy link
Copy Markdown
Contributor

What

Closes the "showcase + docs" follow-up to the ADR-0090 Permission Model v2 waves (#2697 #2708 #2711 #2716 #2717).

Showcase permission zoo (examples/app-showcase)

src/security/ restructured into positions.ts / permission-sets.ts / sharing-rules.ts (CRM convention), exercising the FULL v2 authoring surface:

Capability Where
Flat positions via definePosition (stale pre-D3 parent removed) 6 positions
CRUD + FLS + RLS (using + write-time check) showcase_contributor
Scope depth, read/write asymmetry (readScope: 'org' / writeScope: 'own') showcase_manager, showcase_executive
View-All (read-only compliance) / Modify-All (public_read repair) showcase_auditor / showcase_ops
systemPermissions (setup.access) showcase_ops
isDefault everyone-suggestion (D5), incl. personal data on a private-OWD object showcase_member_default
Guest-safe capability for the guest anchor (D9) showcase_guest_portal
adminScope delegated administration (D12), BU-subtree + allowlist showcase_field_ops_delegate
externalSharingModel (D11) announcement (private), account (public_read)
Real sys_business_unit org tree seeded with explicit ids src/data/seed/
BU-subtree sharing (unit_and_subordinates, enforced) share_new_inquiries_with_field_ops
D6 access-matrix snapshot gate (31 entries) access-matrix.json

Deliberately NOT demoed (declared ≠ enforced, Prime Directive #10): hierarchy depths (own_and_reports/unit/unit_and_below — enterprise hierarchy-security; the open runtime fails closed and defineStack now errors on them), tabPermissions (an 'app' package carries at most one app, ADR-0019 D3), owner-type sharing rules (seed-skipped [experimental], kept as authoring-shape example with an honest comment).

Runtime guard: packages/dogfood/test/showcase-permission-zoo.dogfood.test.ts (12 tests) proves on the served stack: BU-tree seeding, admin_scope persistence, OWD-private isolation, VAMA bypass (+ auditor write denial), explain-engine attribution of the granting set, delegated-admin positive/negative (subtree, allowlist incl. self, manageBindings: false), and the audience-anchor gate (everyone×high-privilege rejected, guest×guest-safe accepted). The D7 canary in showcase-d7-default-profile moved from private_note to showcase_contact (the baseline now deliberately grants private notes).

Spec

defineStack strict cross-reference validation now treats platform-provided objects (sys_/cloud_/ai_) as legitimate permission-grant and seed targets — required by the D12 delegated-admin shape (CRUD on RBAC link tables) and by seeding the BU tree; mirrors the seed loader's own platform classification; typo net intact for the stack's own objects (tests added).

Docs

  • content/docs/protocol/objectql/security.mdx — full rewrite of the stale sections (profiles removed, positions, canonical OWD four + D1 private default + externalSharingModel, position-scoped RLS, enforced sharing recipients + [experimental] honesty note).
  • isProfile scrubbed from ui/forms.mdx, getting-started/common-patterns.mdx, concepts/architecture.mdx; ui/role-based-interfaces.mdx retitled "Audience-based interfaces"; dead /docs/references/identity/role link fixed to identity/position; releases/implementation-status.mdx no longer claims OWD aliases parse; AI actor snippets use positions (matches ToolExecutionContext); plugin-security README aligned; showcase security tour rewritten.
  • Stale zod docstrings fixed at the source (rls/territory/sharing/tool/agent) and content/docs/references/** regenerated — including the previously never-generated security/explain.mdx (D6 contract reference).

Verified

  • Full suite: 126/126 turbo tasks green (incl. 39 dogfood files / 201 tests).
  • objectstack validate + compile green; D7 posture linter runs (one intentional security-private-no-readscope info); D6 gate proven to fail on grant drift with the semantic diff ("showcase_member_default gains access to showcase_private_note (create, read, edit)") before the snapshot was regenerated.
  • Browser dogfood on a fresh isolated boot: Setup shows the seeded BU org tree, all 12 permission sets, all 12 positions incl. everyone/guest anchors; member sees only their own private note while the auditor sees all (VAMA) — screenshots in session; FLS budget write 400 vs name 200; ops repairs another owner's announcement via Modify-All (member 403); anchor gate rejects everyone×auditor over REST with a self-explanatory 403; anonymous traffic default-denied while the public inquiry form (Option A) accepts 201.

Out-of-scope findings filed

🤖 Generated with Claude Code

Showcase now exercises the complete Permission Model v2 authoring surface
(positions via typed factories, CRUD+FLS+RLS, org-depth read/write asymmetry,
VAMA, systemPermissions, the isDefault everyone-suggestion, guest-safe
capability, adminScope delegated administration anchored on a seeded
sys_business_unit tree, externalSharingModel dials) and opts into the D6
access-matrix snapshot gate; guarded end-to-end by a new dogfood test.

defineStack cross-reference validation learns that platform-provided
(sys_/cloud_/ai_) objects are legitimate permission-grant and seed targets
(ADR-0090 D12 delegated-admin shape; seed-loader parity), with tests.

Docs: protocol/objectql/security.mdx rewritten to the v2 vocabulary; isProfile
scrubbed from all authoring examples; dead identity/role reference link fixed;
stale zod docstrings (rls/territory/sharing/tool/agent) rewritten and the
security/ai references regenerated (adds the missing explain.mdx page).

Deliberately NOT demoed (declared ≠ enforced): hierarchy depth scopes
(enterprise hierarchy-security), tabPermissions (single-app package,
ADR-0019 D3), owner-type sharing rules (seed-skipped [experimental]).

Rename misses and platform bugs found while verifying are tracked in
#2722 #2723 #2724 (vocabulary leftovers) and #2734 #2735 #2737 (fresh-boot
org-RLS visibility, JSON-field seed batch inserts, count-scope leak).

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
@vercel

vercel Bot commented Jul 10, 2026 •

Copy link
Copy Markdown

The latest updates on your projects. Learn more about Vercel for GitHub.

Project Deployment Actions Updated (UTC)
spec Ready Ready Preview, Comment Jul 10, 2026 4:13am

Request Review

@github-actions github-actions Bot added documentation Improvements or additions to documentation tests protocol:ai tooling size/xl labels Jul 10, 2026
@github-actions

Copy link
Copy Markdown
Contributor

📓 Docs Drift Check

This PR changes 4 package(s): @objectstack/dogfood, @objectstack/plugin-security, @objectstack/plugin-sharing, @objectstack/spec.

95 hand-written doc(s) reference the affected code and may need an implementation-accuracy re-verification:

  • content/docs/ai/agents.mdx (via @objectstack/spec)
  • content/docs/ai/skills-reference.mdx (via @objectstack/spec)
  • content/docs/ai/skills.mdx (via @objectstack/spec)
  • content/docs/api/client-sdk.mdx (via @objectstack/spec)
  • content/docs/api/environment-routing.mdx (via @objectstack/spec)
  • content/docs/api/error-catalog.mdx (via @objectstack/spec)
  • content/docs/api/error-handling-client.mdx (via @objectstack/spec)
  • content/docs/api/error-handling-server.mdx (via @objectstack/spec)
  • content/docs/api/index.mdx (via @objectstack/spec)
  • content/docs/automation/approvals.mdx (via packages/spec)
  • content/docs/automation/flows.mdx (via @objectstack/spec)
  • content/docs/automation/hook-bodies.mdx (via packages/spec)
  • content/docs/automation/hooks.mdx (via @objectstack/spec)
  • content/docs/automation/index.mdx (via @objectstack/spec)
  • content/docs/automation/webhooks.mdx (via @objectstack/spec)
  • content/docs/automation/workflows.mdx (via @objectstack/spec)
  • content/docs/concepts/architecture.mdx (via @objectstack/spec)
  • content/docs/concepts/design-principles.mdx (via packages/spec)
  • content/docs/concepts/index.mdx (via @objectstack/spec)
  • content/docs/concepts/metadata-driven.mdx (via @objectstack/spec)
  • content/docs/concepts/metadata-lifecycle.mdx (via packages/spec)
  • content/docs/concepts/north-star.mdx (via packages/spec)
  • content/docs/data-modeling/analytics.mdx (via @objectstack/spec)
  • content/docs/data-modeling/drivers.mdx (via @objectstack/spec)
  • content/docs/data-modeling/external-datasources.mdx (via @objectstack/spec)
  • content/docs/data-modeling/field-types.mdx (via @objectstack/spec)
  • content/docs/data-modeling/fields.mdx (via @objectstack/spec)
  • content/docs/data-modeling/formulas.mdx (via @objectstack/spec)
  • content/docs/data-modeling/index.mdx (via @objectstack/spec)
  • content/docs/data-modeling/objects.mdx (via @objectstack/spec)
  • content/docs/data-modeling/queries.mdx (via @objectstack/spec)
  • content/docs/data-modeling/schema-design.mdx (via @objectstack/spec)
  • content/docs/data-modeling/seed-data.mdx (via @objectstack/spec)
  • content/docs/data-modeling/validation-rules.mdx (via @objectstack/spec)
  • content/docs/data-modeling/validation.mdx (via @objectstack/spec)
  • content/docs/deployment/troubleshooting.mdx (via @objectstack/spec)
  • content/docs/getting-started/build-with-claude-code.mdx (via @objectstack/spec)
  • content/docs/getting-started/cli.mdx (via @objectstack/plugin-security, @objectstack/spec)
  • content/docs/getting-started/common-patterns.mdx (via @objectstack/spec)
  • content/docs/getting-started/examples.mdx (via @objectstack/spec)
  • content/docs/getting-started/quick-reference.mdx (via @objectstack/spec)
  • content/docs/getting-started/quick-start.mdx (via @objectstack/spec)
  • content/docs/getting-started/validating-metadata.mdx (via @objectstack/spec)
  • content/docs/kernel/cluster.mdx (via @objectstack/spec)
  • content/docs/kernel/contracts/auth-service.mdx (via packages/spec)
  • content/docs/kernel/contracts/cache-service.mdx (via packages/spec)
  • content/docs/kernel/contracts/data-engine.mdx (via @objectstack/spec)
  • content/docs/kernel/contracts/index.mdx (via @objectstack/spec)
  • content/docs/kernel/contracts/metadata-service.mdx (via packages/spec)
  • content/docs/kernel/contracts/storage-service.mdx (via packages/spec)
  • content/docs/kernel/index.mdx (via packages/spec)
  • content/docs/kernel/runtime-services/email-service.mdx (via packages/spec)
  • content/docs/kernel/runtime-services/index.mdx (via packages/spec)
  • content/docs/kernel/runtime-services/queue-service.mdx (via packages/spec)
  • content/docs/kernel/runtime-services/sharing-service.mdx (via packages/spec)
  • content/docs/kernel/runtime-services/storage-service.mdx (via packages/spec)
  • content/docs/kernel/services-checklist.mdx (via @objectstack/spec)
  • content/docs/permissions/access-recipes.mdx (via packages/plugins/plugin-security)
  • content/docs/permissions/authorization.mdx (via packages/dogfood, packages/plugins/plugin-security, packages/plugins/plugin-sharing, @objectstack/spec)
  • content/docs/permissions/permission-sets.mdx (via @objectstack/spec)
  • content/docs/permissions/permissions-matrix.mdx (via packages/plugins/plugin-security, packages/plugins/plugin-sharing, @objectstack/spec)
  • content/docs/permissions/positions.mdx (via @objectstack/spec)
  • content/docs/permissions/sharing-rules.mdx (via @objectstack/plugin-security, @objectstack/spec)
  • content/docs/plugins/adding-a-metadata-type.mdx (via @objectstack/spec)
  • content/docs/plugins/development.mdx (via @objectstack/spec)
  • content/docs/plugins/index.mdx (via @objectstack/plugin-security, @objectstack/spec)
  • content/docs/plugins/packages.mdx (via @objectstack/plugin-security, @objectstack/plugin-sharing, @objectstack/spec)
  • content/docs/protocol/backward-compatibility.mdx (via @objectstack/spec)
  • content/docs/protocol/diagram.mdx (via packages/spec)
  • content/docs/protocol/knowledge.mdx (via @objectstack/spec)
  • content/docs/protocol/objectos/config-resolution.mdx (via @objectstack/spec)
  • content/docs/protocol/objectos/i18n-standard.mdx (via @objectstack/spec)
  • content/docs/protocol/objectos/lifecycle.mdx (via @objectstack/spec)
  • content/docs/protocol/objectos/plugin-spec.mdx (via @objectstack/spec)
  • content/docs/protocol/objectos/runtime-capabilities.mdx (via @objectstack/spec)
  • content/docs/protocol/objectql/index.mdx (via packages/spec)
  • content/docs/protocol/objectql/query-syntax.mdx (via @objectstack/spec)
  • content/docs/protocol/objectql/schema.mdx (via @objectstack/spec)
  • content/docs/protocol/objectql/security.mdx (via packages/plugins/plugin-sharing, packages/spec)
  • content/docs/protocol/objectql/state-machine.mdx (via @objectstack/spec)
  • content/docs/protocol/objectui/actions.mdx (via @objectstack/spec)
  • content/docs/protocol/objectui/concept.mdx (via @objectstack/spec)
  • content/docs/protocol/objectui/index.mdx (via @objectstack/spec)
  • content/docs/protocol/objectui/layout-dsl.mdx (via packages/spec)
  • content/docs/protocol/objectui/record-alert.mdx (via @objectstack/spec)
  • content/docs/protocol/objectui/widget-contract.mdx (via @objectstack/spec)
  • content/docs/releases/implementation-status.mdx (via @objectstack/plugin-security, @objectstack/spec)
  • content/docs/releases/index.mdx (via @objectstack/spec)
  • content/docs/releases/v9.mdx (via @objectstack/spec)
  • content/docs/ui/create-vs-edit-form.mdx (via @objectstack/spec)
  • content/docs/ui/dashboards.mdx (via @objectstack/plugin-security, @objectstack/spec)
  • content/docs/ui/forms.mdx (via @objectstack/spec)
  • content/docs/ui/index.mdx (via @objectstack/spec)
  • content/docs/ui/role-based-interfaces.mdx (via packages/plugins/plugin-security)
  • content/docs/ui/setup-app.mdx (via @objectstack/spec)

Advisory only. To re-verify, run the docs-accuracy-audit workflow scoped to these files:
node scripts/docs-audit/affected-docs.mjs origin/main → pass the list as args.docs.

@os-zhuang
os-zhuang merged commit 0a8e685 into main Jul 10, 2026
17 checks passed
@os-zhuang
os-zhuang deleted the feat/adr-0090-showcase-permission-zoo branch July 10, 2026 04:13
akarma-synetal pushed a commit to akarma-synetal/framework that referenced this pull request Aug 17, 2026
…a5d1 (objectstack-ai#9081)

v16.mdx named `af1b0db` as the objectui pin the 16.0.0-rc.1 cut landed on, in
four places. Re-deriving the chain from packages/console/CHANGELOG.md's rc.1
section shows af1b0db is an intermediate pin, not the endpoint: the four
rc.1 entries chain 94d4876 -> 0318118 (a276969) -> 3b2e4d9
(bfa3c3f) -> af1b0db (1965549) -> 69fa5d1 (a791200). The chain closes
on both boundaries — rc.0's last entry (39b56d0) ends at 94d4876, and the
GA-cut entry (db34d54) states its range as 69fa5d1...9a5f016.

Also re-derives the objectui PR span on the "Landed since 16.0.0-rc.0" line.
The page said objectstack-ai#2706-objectstack-ai#2736; the min/max of trailing PR numbers across the rc.1
windows is objectstack-ai#2701-objectstack-ai#2743 (it was wrong at both ends even for the af1b0db window,
whose span is objectstack-ai#2701-objectstack-ai#2739).

Docs-only, no content added: this is the releases-page factual-correction lane
from CLAUDE.md, deliberately kept separate from the completeness lane.


Claude-Session: https://claude.ai/code/session_011RB4waLuNbdruCo6X9oobm

Co-authored-by: Claude <noreply@anthropic.com>

This branch was successfully deployed

1 active deployment
Preview — 2e7b96c3 Deployed Jul 10, 2026 by vercel[bot]
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 size/xl tests tooling

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant