Skip to content

finding: permission.rowLevelSecurity.priority is a retiredKey tombstone, but objectui's PermissionAdvancedFacets still types it and seeds priority: 0 on every newly added RLS policy #7130

Description

@os-project-manager

Observation-class finding from the axis-③ liveness audit (ledger claims vs measured objectui readers). Filed unassigned for triage; ledger/tombstone verdict vs measured objectui producer disagree — this card does not prescribe which side is right (acknowledging the producer in the ledger row vs dropping the seed/type in the facets is triage's fork).

Audited revisions (E24)

  • objectstack origin/main @ 4ac12ef4cfe4a1925fb7e950c56d7aff0bbc5381
  • objectui origin/main @ 5bfaabde05c3876c9604a2aa47f4822f9e6de8b5

Both read via git fetch + git archive of origin/main, not working trees.

The ledger claim

packages/spec/liveness/permission.jsonprops.rowLevelSecurity.children.priority (status: "dead", verifiedAt: "2026-07-30"):

evidence: "packages/spec/src/security/rls.zod.ts (retiredKey tombstone — authored values REJECT with the prescription; z.input types the key never)"
note: "REMOVED 2026-07-30 … Not merely unimplemented: under OR-combination the promised 'conflict resolution' semantics cannot exist, so it went straight to the #3715/#3950 remove disposition inside the v17 breaking window."

Measured reality at objectui @5bfaabd

packages/app-shell/src/views/metadata-admin/PermissionAdvancedFacets.tsx:

  • :49 — the local policy shape still carries the key:
interface RlsPolicy {
  name?: string;
  object?: string;
  operation?: string;
  using?: string;
  check?: string;
  enabled?: boolean;
  priority?: number;
}
  • :368 — the "Add policy" button seeds it on every new policy:
setPolicies([
  ...policies,
  { name: '', object: '*', operation: 'all', using: '', enabled: true, priority: 0 },
])
  • :30-39 docblock says the facets are "persisted by the editor's existing whole-record Save" and that "Shapes mirror the framework spec (sampled from live data): RLS policies {name,object,operation,using,check,enabled,priority}" — a mirror sampled before the 2026-07-30 removal. No priority strip was found on the facets' save path (grep for priority in the file yields only the three sites above; a scrub elsewhere on the save pipeline was not measured).

Why it matters

The tombstone's contract is "authored values REJECT". The Studio facets author the key on every policy added through the UI, so a permission saved after using the structured RLS editor carries a parse-rejected key. This is the same producer/tombstone shape as the axis-③ specimen objectui#3901, but on the write path rather than a dormant read.

Dedup

  • Org-wide open-issue searches for rowLevelSecurity priority and PermissionAdvancedFacets return nothing.
  • The ledger's own 2026-07-30 correction pass looked at these facets (the sibling rls.label row cites "PermissionAdvancedFacets edits policies") but recorded no verdict on the priority: 0 seed.
  • objectui#3901 is a different key/file; not a dup.

Suggested lane

Cross-lane: spec/security ledger row + objectui metadata-admin (Studio) editor.

Provenance: cross-repo read-only audit, session https://claude.ai/code/session_018ffcE95NaMJcL9XJ9VDYgk

Metadata

Metadata

Assignees

Type

No type

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions