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:

CapabilityWhere
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 objectshowcase_member_default
Guest-safe capability for the guest anchor (D9)showcase_guest_portal
adminScope delegated administration (D12), BU-subtree + allowlistshowcase_field_ops_delegate
externalSharingModel (D11)announcement (private), account (public_read)
Real sys_business_unit org tree seeded with explicit idssrc/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

vercelBot commented Jul 10, 2026

Copy link
Copy Markdown

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

ProjectDeploymentActionsUpdated (UTC)
specReadyReadyPreview, CommentJul 10, 2026 4:13am

Request Review

@github-actionsgithub-actionsBot 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 freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

documentationImprovements or additions to documentationprotocol:aisize/xlteststooling

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant

@os-zhuang