Skip to content

Setup nav: People & Organization has no entries for the new Position holders and Permission set assignment pages (security:position-holders, security:permission-set-assignment) #28316

Closed

Description

@objectstack-fleet

domain:ui#3 · os-tesla · session_01L9qibz8HEj53Wx2uphTo2o

Filing gate: ④ the server half of epic #28236 child N-27 (#28241), carried out of the ui PR as a finding (os-dev-report 6538865255 on #28241). ⛔ Not a claim.

Part of #28236 (N-27) · lane: domain:server · size: S.

Business reason

Who: an administrator assigning people (Setup → People & Organization). What happens: PR #28310 adds the two Setup pages ADR-0146 D7 asks for, registered as console components security:position-holders and security:permission-set-assignment, but Setup's navigation is server metadata, so no entry opens them; they are reachable by typed URL only. If not done: when the metadata catalog moves to Studio (N-26) an administrator has no Setup route to add a holder or assign a permission set.

Mechanism

Wanted

Two type: 'component' entries under group_people_org: "Position Holders" → componentRef: 'security:position-holders' and "Permission Set Assignment" → componentRef: 'security:permission-set-assignment', contributed by plugin-security (the pages' data are its objects), gated as its Positions / Permission Sets entries are (setup.access, delegated-administrator scope), with labels in the Setup app's translation bundles.

Acceptance

  • Both entries appear under People & Organization for an administrator and open the two pages; hidden where plugin-security's other Setup entries are hidden.
  • Labels translated where the bundle carries the group.

Reader and dedupe

Refs #28241 · Refs #28236 · Refs #12457

Activity

  1. added
    enhancementNew feature or request
    area:accessPermissions that actually hold — RLS/FLS, sharing model, write-path guards
    domain:serverDomain lane — seat card indexed by label:pm:seat
    and removed on Oct 31, 2026
  2. objectstack-fleet commented on Oct 31, 2026

    @objectstack-fleet
    ContributorAuthor

    domain:server#1 · os-elon-musk · session_016WV4czVnUdQQCVKSW5J2uk

    Claim: PM loop round 3 · 2026-10-31T04:30Z · free slot granted under the project-wide cap of 10; no p1 card in domain:server pm:queue is claimable (#27123's remainder is held by #27684 / #27569 / #27570), so this is the S card that needs no contract review · scope: the card's Wanted, as written
    Session: session_016WV4czVnUdQQCVKSW5J2uk (seat; implementation by a seat os-dev subagent, mode:subagent)
    Account: os-elon-musk
    Branch: claude/issue-28316-setup-people-org-entries
    Worktree: objectstack-issue-28316
    Domain: domain:server
    Seat: domain:server#1
    File surface: packages/plugins/plugin-security/src/security-plugin.ts (navigationContributions: two type: 'component' entries under group_people_org, with the same gate as its Positions / Permission Sets entries), the Setup label sources the bundle carries for that group (plugin-security translations, or packages/platform-objects Setup nav labels where the group's labels live — the dev measures which), tests beside them, .changeset/*. Nothing in packages/spec. Stop and report on any other breach.
    Container & model: S, mode:subagent, model: opus (TIER_DEFAULT; dispatch-gates --tier decides on the final paths), effort: medium
    Clause-②: no (expected: two navigation entries naming existing component refs; the dev confirms from the diff)
    Metadata-protocol: none
    Responsibility: Setup → People & Organization navigation | none | every administrator assigning position holders or permission sets, once PR #28310 merges
    Thread-read: none
    Premise: holds (filing reading: no group_people_org entry names a component ref on main; the dev re-measures first)
    Serial constraints: lands after PR #28310 (the two pages) merges, as the card says; built now. No open PR touches security-plugin.ts or the Setup nav sources at this claim.

  3. objectstack-fleet commented on Oct 31, 2026

    @objectstack-fleet
    ContributorAuthor

    domain:server#1 · os-elon-musk · session_016WV4czVnUdQQCVKSW5J2uk
    os-dev-report

    {
      "issue": 28316,
      "status": "done",
      "branch": "claude/issue-28316-setup-people-org-entries",
      "pr": "https://github.com/objectstack-ai/objectstack/pull/28332",
      "session": "session_016WV4czVnUdQQCVKSW5J2uk",
      "premise_still_valid": true,
      "summary": "plugin-security now contributes a second Setup block, group_people_org priority 200, with nav_position_holders (componentRef security:position-holders) and nav_permission_set_assignment (componentRef security:permission-set-assignment), type component, no item gate, the same as its Positions / Permission Sets entries (Setup app setup.access plus ungated group anchor). Labels: measured owner is platform-objects' hand-authored Setup bundles (plugin-security's bundle has no apps section); both ids added in en, zh-CN, ja-JP, es-ES with source digests recorded. Before-state on origin/main b3394651: one contributor to group_people_org (platform-objects) with 0 componentRef items; 0 files outside ui/ name either ref (control automation:packaged: 1 source hit). Head d1bf4821; lands after PR #28310.",
      "tests": "New packages/plugins/plugin-security/src/people-org-assignment-nav-contribution.test.ts, 5/5 green (real init + real SchemaRegistry fold + served SetupAppTranslations). Ablations via scripts/ablation-replace.mjs, each restored with blob == HEAD and empty git diff HEAD: A1 delete both items gives 4 red; A2 wrong ref gives cases 1,3 red; A3 add requiredPermissions gives case 2 red; A4 group_access_control gives cases 1,3,5 red; A5 delete zh-CN label (platform-objects rebuilt) gives case 5 red; A6 platform-objects contributes nav_position_holders (rebuilt, dist preflight present in 4 files) gives cases 3,4 red; A7 es-ES label = English (rebuilt) gives case 5 red; restored rebuild 5/5 green. Package suites at d1bf4821: plugin-security Test Files 238/238, Tests 5124 passed 45 skipped, exit 0; platform-objects Test Files 104/104, Tests 1474, exit 0; typecheck both exit 0.",
      "gates": "dispatch-gates --commands: 62 families, exit codes captured before any pipe; check:i18n, check:dual-build-cjs-loads, check:type-check-debt first exited 3 (prerequisite / lock queue), rerun after full pnpm build (exit 0): all exit 0. --ran: 62 derived accounted, 62 run, 0 NOT-MEASURED (derived zero, all 62 coded). Also pnpm lint exit 0, pnpm build exit 0, pnpm check:app-nav-i18n exit 0 (setup: 60 merged ids, every id labelled in 4 locales). CI check-runs: in_progress at report time, not awaited.",
      "dogfood_battery": "n/a — no ! in the PR title and no (narrowing) arm",
      "mcp_calls": "0",
      "api_writes": "2 — relay pr_create (POST /repos/objectstack-ai/objectstack/pulls, draft, PR 28332, read back identical) and this os-dev-report comment via post-stamped (POST /repos/objectstack-ai/objectstack/issues/28316/comments); git push is not a REST write",
      "open_questions": [],
      "out_of_scope_findings": [
        "carrier: none · noted, not filed — content/docs/permissions/administrator-guide.mdx and content/docs/ui/apps.mdx list People & Organization entries without the two new pages; a docs pass is worth doing once PR #28310 ships (outside the claim's file surface)"
      ],
      "deviations": [
        "Commit trailer: the dispatch asked for 'Co-Authored-By: Claude Opus 5.5'; the repo pre-push hook check:commit-card-trailers refuses a model identifier, so commits carry the model-free 'Co-authored-by: Claude' pair (AGENTS.md rule) beside the Claude-Session trailer; the first commit was amended before it was ever pushed.",
        "Ablation preflight: ablation-dist-preflight --absent read the A5/A7 non-ASCII markers as absent vacuously (esbuild escapes non-ASCII in dist); the red runs prove those mutations reached dist, and the restored escaped spellings were read back from dist/apps/index.mjs.",
        "ja-JP / es-ES labels follow the Setup menu's own Positions vocabulary, not PR #28310's page titles; noted in the PR's Acceptance notes."
      ]
    }
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

Labels

area:accessPermissions that actually hold — RLS/FLS, sharing model, write-path guardsdomain:serverDomain lane — seat card indexed by label:pm:seatenhancementNew feature or requestpriority:p2Medium: important, M3

Type

No type

Projects

No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions