You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
{{ message }}
Repository navigation
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
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
Setup's People & Organization group is declared in packages/platform-objects/src/apps/setup-nav.contributions.ts (group: 'group_people_org'), and plugin-security contributes its own Setup entries in packages/plugins/plugin-security/src/security-plugin.ts (navigationContributions, ≈L1637; Positions / Permission Sets in Access Control).
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
Who acts:domain:server (plugin-security / platform-objects).
Claim: PM loop round 3 · 2026-10-31T04:30Z · free slot granted under the project-wide cap of 10; no p1 card in domain:serverpm: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.
{
"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."
]
}
Activity
objectstack-fleet commentedon Oct 31, 2026
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:serverpm:queueis 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 writtenSession:
session_016WV4czVnUdQQCVKSW5J2uk(seat; implementation by a seatos-devsubagent, mode:subagent)Account:
os-elon-muskBranch:
claude/issue-28316-setup-people-org-entriesWorktree:
objectstack-issue-28316Domain:
domain:serverSeat:
domain:server#1File surface:
packages/plugins/plugin-security/src/security-plugin.ts(navigationContributions: twotype: 'component'entries undergroup_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, orpackages/platform-objectsSetup nav labels where the group's labels live — the dev measures which), tests beside them,.changeset/*. Nothing inpackages/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: mediumClause-②: 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_orgentry names a component ref onmain; 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.tsor the Setup nav sources at this claim.objectstack-fleet commentedon Oct 31, 2026
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." ] }