Skip to content

fix(security,hono): /me/apps registry + capability resolution; anchor-bindable member_default (ADR-0090 D5)#2773

Merged
os-zhuang merged 1 commit into
mainfrom
fix/me-apps-member-default
Jul 10, 2026
Merged

fix(security,hono): /me/apps registry + capability resolution; anchor-bindable member_default (ADR-0090 D5)#2773
os-zhuang merged 1 commit into
mainfrom
fix/me-apps-member-default

Conversation

@os-zhuang

Copy link
Copy Markdown
Contributor

Closes #2752, closes #2753 — the two remaining permission-runtime issues from the ADR-0090 dogfood series. Also records the #2754 investigation and two new Access-pillar findings.

#2752/me/apps was dead, twice over

  1. Wrong source: it read metadata.list('app') while stack apps are registered into the engine registry (runtime AppPlugin) → {"apps":[]} for every principal, leaving tabPermissions and AppSchema.requiredPermissions with no enforced consumer. Now sources registry.getAllApps() (nav contributions merged; metadata service as additive fallback).
  2. Empty filter inputs: its capability/tab filters read execCtx.systemPermissions/tabPermissions, which resolveCtx never populates — so even with apps listed, every requiredPermissions app was hidden from the platform admin too. The endpoint now resolves the caller's effective surface the same way /auth/me/permissions does (evaluator + bootstrap + metadata + DB loader), and the DB loader finally carries system_permissions/tab_permissions (a direct grant of setup.access used to vanish here).

Live proof (fresh boot): admin /me/apps['account', 'setup', 'showcase_app'] (setup via the setup.access capability); plain member → ['account', 'showcase_app']; anonymous → []. (Studio's absence is by design — serve.ts deliberately doesn't load @objectstack/studio as an app tile.)

#2753 — the baseline now actually binds to everyone

Every boot logged refusing to bind fallback set to everyone — high-privilege bits {"set":"member_default","offending":"delete/purge/transfer on '*'"} — the platform's own default violated its own D5 tier and flowed through the separate fallback channel D5 explicitly rejected. Two aligned changes:

  • describeHighPrivilegeBits calibrated to the ADR text (D5 lists exactly VAMA, delete/purge/transfer, systemPermissions). The blanket '*'-wildcard rejection was an over-tightening — it moves to the guest tier where D9 specifies it ("explicit objects only"). Spec + lint + runtime gate share the predicate, so all three surfaces stay in lockstep; check:api-surface unchanged.
  • member_default drops allowDelete from its wildcard. ⚠️ Behavior change: deleting records is no longer a baseline right — members keep create/read/edit-own; the owner-scoped delete RLS stays as a narrowing defense for members granted a delete bit elsewhere. Domains that want member deletes grant them per object via ordinary position-distributed sets.

With the baseline anchor-safe, bootstrap's existing binding path succeeds: "what new users get" ≡ "what is bound to everyone" — same table, audit, and explain path. Proven by the new me-apps-and-everyone-baseline dogfood (5 tests: registry-sourced app list, capability gating, anonymous empty, the everyone←member_default binding row, and the delete-refusal).

#2754 — investigated, not currently reproducible

The enterprise organizations package does not exist yet, and cloud's multi-org wiring still imports the retired plugin-org-scoping (dead code — filed objectstack-ai/cloud#796). Design options recorded on #2754 for whoever lands the package.

Access-pillar dogfood (business-admin walkthrough on this branch's build)

Worked: matrix edit → draft → 变更 badge; per-object OWD+Ext badges; suggested-binding lifecycle (/security/suggested-bindings shows the showcase everyone-suggestion confirmed); explain panel end-to-end for self; REST explain-another-user with D12 authorization. Filed:

Verification

126/126 turbo tasks green (incl. all dogfoods with the new baseline posture); live browser + REST checks above on a fresh --ui --seed-admin boot.

🤖 Generated with Claude Code

…tion; member_default becomes anchor-bindable (ADR-0090 D5)

#2752 — GET /me/apps read metadata.list('app') while stack apps live in the
ENGINE REGISTRY, returning [] for every principal; and its capability/tab
filters read execCtx fields that resolveCtx never populates, so even after
sourcing the registry every requiredPermissions app was hidden from
everyone, including the platform admin. It now reads registry.getAllApps()
(nav contributions merged, metadata service as additive fallback) and
resolves the caller's effective systemPermissions/tabPermissions the same
way /auth/me/permissions does. The DB permission-set loader also carries
system_permissions/tab_permissions now (direct grants of e.g. setup.access
used to vanish at this endpoint).

#2753 — the everyone-anchor gate refused the platform's own baseline on
every boot ("refusing to bind fallback set to everyone"). Two aligned
changes: describeHighPrivilegeBits is calibrated to the exact ADR-0090 D5
bit list (the blanket '*' wildcard rejection moves to the GUEST tier where
D9 specifies it), and member_default drops allowDelete from its wildcard.
BEHAVIOR: deleting records is no longer a baseline right — members keep
create/read/edit-own; the owner-scoped delete RLS stays as a narrowing
defense. Bootstrap's existing binding path now succeeds: "what new users
get" is literally "what is bound to everyone" (one channel, D5), proven by
the new me-apps-and-everyone-baseline dogfood (5 tests) and live browser
checks (admin sees setup via setup.access; member does not).

#2754 investigated, not reproducible: the enterprise organizations package
does not exist yet and cloud's multi-org wiring imports the retired
plugin-org-scoping (filed cloud#796); design options recorded on the issue.

Access-pillar dogfood findings filed: objectui#2381 (explain panel cannot
target another user despite full REST/D12 support), objectui#2382
(已分配用户 counts direct grants only — position-held users show as 0).

Closes #2752. Closes #2753.

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 10:43am

Request Review

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

Copy link
Copy Markdown
Contributor

📓 Docs Drift Check

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

98 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/authentication.mdx (via @objectstack/plugin-hono-server)
  • content/docs/permissions/authorization.mdx (via packages/dogfood, packages/plugins/plugin-security, @objectstack/spec)
  • content/docs/permissions/delegated-administration.mdx (via packages/dogfood)
  • content/docs/permissions/explain.mdx (via @objectstack/plugin-security)
  • content/docs/permissions/permission-sets.mdx (via @objectstack/spec)
  • content/docs/permissions/permissions-matrix.mdx (via packages/plugins/plugin-security, @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-hono-server, @objectstack/plugin-security, @objectstack/spec)
  • content/docs/plugins/packages.mdx (via @objectstack/plugin-hono-server, @objectstack/plugin-security, @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/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-hono-server, @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 ac8f029 into main Jul 10, 2026
22 of 23 checks passed
@os-zhuang
os-zhuang deleted the fix/me-apps-member-default branch July 10, 2026 10:47
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/m tests tooling

Projects

None yet

1 participant