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

feat(showcase,docs): ADR-0090 permission-model zoo + full docs alignment#2739
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.

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 protocol:ai size/xl tests tooling

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant