Why: after the Backend role-authority cutover a non-admin project creator could not load professional role options (RolePolicyAdmin.ListRoles requires system.roles.view → store: account action forbidden), member names fell back to the admin-only EXT-19 ListAccounts ("账号目录暂不可用"), and a removed member's send got an unexplained 404.
Evidence: agent-exec unit rdir-backend-role-options-roster-send (PI, success, transport 612e044). Worker: gofmt/vet clean; go test ./pkg/extension ./internal/app ./internal/server ok; new tests TestRoleOptionsExposeEnabledRolesToNonAdminActor, TestAccountDirectoryProjectRosterEnumeratesResolvedMembers, TestProjectLifecycleRemovedMemberMessageIsForbidden.
Impact:
New optional extension.RoleOptionsProvider (enabled roles, roleId+name only) implemented on the dispatch Host for any enabled actor.
New account directory purpose project.member-roster: rdm plugin only, explicit resolver candidate list (AllCandidates refused), any status, empty query enumerates the scoped roster with normal paging. Other purposes unchanged.
POST /api/conversations/{id}/messages answers 403 conversation: not-project-member when the owner's project work is no longer authorized; other endpoints keep 404.
Why: after the Backend role-authority cutover a non-admin project creator could not load professional role options (`RolePolicyAdmin.ListRoles` requires system.roles.view → `store: account action forbidden`), member names fell back to the admin-only EXT-19 `ListAccounts` ("账号目录暂不可用"), and a removed member's send got an unexplained 404.
Evidence: agent-exec unit rdir-backend-role-options-roster-send (PI, success, transport 612e044). Worker: gofmt/vet clean; `go test ./pkg/extension ./internal/app ./internal/server` ok; new tests TestRoleOptionsExposeEnabledRolesToNonAdminActor, TestAccountDirectoryProjectRosterEnumeratesResolvedMembers, TestProjectLifecycleRemovedMemberMessageIsForbidden.
Impact:
- New optional `extension.RoleOptionsProvider` (enabled roles, roleId+name only) implemented on the dispatch Host for any enabled actor.
- New account directory purpose `project.member-roster`: rdm plugin only, explicit resolver candidate list (AllCandidates refused), any status, empty query enumerates the scoped roster with normal paging. Other purposes unchanged.
- `POST /api/conversations/{id}/messages` answers 403 `conversation: not-project-member` when the owner's project work is no longer authorized; other endpoints keep 404.
- SurfaceVersion 2.28.0-experimental.
Refs: Agent-System-Dev .task/fix-multiuser-collab-followups.md
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.
Why: after the Backend role-authority cutover a non-admin project creator could not load professional role options (
RolePolicyAdmin.ListRolesrequires system.roles.view →store: account action forbidden), member names fell back to the admin-only EXT-19ListAccounts("账号目录暂不可用"), and a removed member's send got an unexplained 404.Evidence: agent-exec unit rdir-backend-role-options-roster-send (PI, success, transport
612e044). Worker: gofmt/vet clean;go test ./pkg/extension ./internal/app ./internal/serverok; new tests TestRoleOptionsExposeEnabledRolesToNonAdminActor, TestAccountDirectoryProjectRosterEnumeratesResolvedMembers, TestProjectLifecycleRemovedMemberMessageIsForbidden.Impact:
extension.RoleOptionsProvider(enabled roles, roleId+name only) implemented on the dispatch Host for any enabled actor.project.member-roster: rdm plugin only, explicit resolver candidate list (AllCandidates refused), any status, empty query enumerates the scoped roster with normal paging. Other purposes unchanged.POST /api/conversations/{id}/messagesanswers 403conversation: not-project-memberwhen the owner's project work is no longer authorized; other endpoints keep 404.Refs: Agent-System-Dev .task/fix-multiuser-collab-followups.md