Skip to content

[finding] ObjectLevelPermission has no consumer left once RoleDefinition.permissions is retired — a published type nothing references #4364

Description

@yinlianghui

Observation-class finding, no user-visible impact today. Surfaced while implementing #4288 inside sweep #4328; recorded rather than fixed, because retiring a second published type is its own judgement call and would have put a row in that PR's diff that its member table does not have.

What

ObjectLevelPermission (packages/types/src/permissions.ts) had exactly one structural referent in this repository: the RoleDefinition.permissions field. #4288 retires that field, so after it lands the type is referenced only by the two barrels that re-export it:

  • packages/types/src/index.ts (the @object-ui/types public surface)
  • packages/permissions/src/index.ts (re-export)

Nothing constructs one, nothing accepts one, nothing reads one. PermissionCondition is one step further out: its only referent is ObjectLevelPermission.conditions, so it inherits the same status transitively. (PermissionEffect is not in this set — FieldLevelPermission.effect still uses it, and that type is live.)

The grants the evaluator actually applies come from ObjectPermissionConfig.roles, whose inner shape is declared inline and does not use ObjectLevelPermission.

Why it is an observation and not a defect

An exported type with no consumers costs nobody a wrong answer. It is worth a card because it is the same declared-but-unread shape #4288 was, one hop out, and because leaving it named in the public surface invites the next author to reach for it as if role-attached grants were a thing the runtime honours — which is exactly what #4288 removed.

Directions (for triage, none advocated here)

  1. Retire both (ObjectLevelPermission, PermissionCondition) as a follow-on dead-surface row. Same criterion as the sweep, and both are @object-ui/types exports so the changeset shape matches sweep: dead-surface deletions batch 3 — 3 zero-consumer items, one claim, one PR (findings-triage 2026-08-11) #4328's.
  2. Keep as vocabulary if role-attached grants are a direction the platform intends to build, and let the types return with the reader. Worth an explicit note in that case, since "declared, no reader" is what got the field retired.

Deliberately not judged here: which of those is right depends on whether role-direct grants have a business pull, and that is a product call rather than a code one.

Dedupe

Searched open issues for ObjectLevelPermission, PermissionCondition, and role-permission type retirement: no existing card. #4288 covers the field only; its member row is closed by #4328's PR.

Metadata

Metadata

Assignees

Type

No type

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions