Skip to content

Commit 399df5b

Browse files
fix(types,docs): the turned-off sentence and the docs stop pointing at retired Setup pages (#29476)
<!-- claude-projects-attribution: {"github_login":"os-warren"} --> _Requested by **Warren** · [project thread](https://claude.ai/code/project/chan_01U5RdnAAmkSQmZbqh6FtqZ8?thread=cmsg_01U5RdnAAmkSQmZbqh6FtqZ8Y91xTWc4Wtxe392BxMEYRn)_ Fixes #29374 Clause-②: no Metadata-protocol: none ## 维护者速读 - 改了什么:动作/流程被关闭时用户看到的那句提示,改为指向现在真实存在的位置(动作 → Setup › Packaged Actions;流程 → Studio 里该包的 Automations);权限文档里指向已退役 Setup 页面的步骤一并改到现在的位置。 - 为什么改:N-28 已退役 Setup › Packaged automation 和 Setup → Access Control 下的 Positions / Permission Sets,文档和报错提示仍把人送去不存在的页面。 - 风险与回滚:只改文字,错误码 `ACTION_DISABLED` / `FLOW_DISABLED` 不变,机器读的是码不是句子;回滚即 revert 本 PR。 - 先看:`packages/types/src/packaged-item-turned-off.ts`(句子本体)、`content/docs/permissions/administrator-guide.mdx`(步骤改写最多)、两份待发布 changeset 的引文改动。 - 两分钟验证:`pnpm --filter @objectstack/types exec vitest run src/packaged-item-turned-off.test.ts`,预期 6/6 通过,动作句含 `Setup › Packaged Actions`,流程句含 `Automations in Studio`。 - 需要你做的:无,席位落地(注意 `Check Changeset` 的 empty-changeset 门禁会因改动两份既有待发布 changeset 保持红,见下方 Acceptance notes,需确认)。 ## What changes **Item 3: the turned-off sentence, by kind** (`packages/types/src/packaged-item-turned-off.ts`). The sentence both refusal engines send (`describeTurnedOffPackagedItem`) named the retired Setup › Packaged automation page. It now names where each switch is: - Action: "This action is turned off for this deployment. An administrator can turn it on again under Setup › Packaged Actions, or you can use another action." The switch is the Setup entry `nav_packaged_actions` (`packages/platform-objects/src/apps/setup-nav.contributions.ts`, label `Packaged Actions`). No action-clone offer, as before. - Flow: "This flow is turned off for this deployment. An administrator can turn it on again in its package's Automations in Studio, or copy it there under a new name." The flow's switch and New similar (the clone door) are on the flow in the package's Automations pillar (`ui/packages/app-shell/src/views/studio-design/FlowItemMoreMenu.tsx`, `setupMetadataRedirect.ts` `packagedAutomationStudioPath`), so the "copy it there" clause stays true. The doc comment no longer calls the page live and explains the two per-kind parts (where, and meanwhile). Plain language, no ADR or tracker number in the runtime string. **Item 2: docs steps, each confirmed in code** (`content/docs/permissions/`): - `administrator-guide.mdx` Step 3 (was `:107`): a position's holders are assigned on **Setup → People & Organization → Position Holders** (`nav_position_holders`, `packages/plugins/plugin-security/src/security-plugin.ts`; page `ui/packages/app-shell/src/views/setup/PositionHoldersPage.tsx`). That page's Add writes `user_id` and `position` only (`PositionHoldersSection.tsx`), so the step now says a business-unit anchored assignment is created as a User Position row directly, with `business_unit_id`. - `administrator-guide.mdx` direct grants (was `:117`): **Setup → People & Organization → Permission Set Assignment** (`nav_permission_set_assignment`; `PermissionSetAssignmentPage.tsx` renders the same `AssignedUsersSection`, titled Assigned Users). Studio's item page shows a link to this Setup page rather than the section (`SetupAssignmentsLink.tsx`), so Setup is where the task is done. - `administrator-guide.mdx` matrix editor (was `:151`) and `access-recipes.mdx:50`: Studio → All metadata → Permission Set, then open the set (`PermissionMatrixEditor.tsx`, which carries the When (edit) column, `perm.field.when`). - `administrator-guide.mdx` "Where is everything": definitions and the on/off switch of positions, permission sets and capabilities are in Studio → All metadata; who holds them is the two Setup people pages. - `authorization.mdx` (was `:251-253`): the catalog list is Studio's All metadata area, `/studio/~all/metadata/permission?scope=environment`, and the old Setup address redirects there (same wording as `permission-sets.mdx:386-387`). **Item 1: the sweep in other words.** Extra hits added here: `authorization.mdx:33` (capabilities "extended by admins in Setup") and `:419-420` (the on/off switch now sits on the item's page in Studio's All metadata area, per the plugin-security comment above its nav contributions), `delegated-administration.mdx:55` (the Delegated Admin Scope block is in the permission set editor, `PermissionAdvancedFacets.tsx`, now in Studio), `capabilities.mdx:124`, `:272` (a capability's label is shown to the administrator who grants it, no longer "in Setup"), and `data-modeling/analytics.mdx:149` (Setup › Datasets: a dataset is metadata, every Setup metadata URL other than a datasource redirects into Studio's All metadata area, `setupMetadataStudioPath`, and no Setup navigation entry names datasets). `skills/**`: zero hits, so this PR touches no governed surface. **Item 5: the six pinned tests** follow the new sentence. `flow-activation-ledger.test.ts`'s status-disabled check now asserts the message carries no turn-on remedy at all (`not.toContain('turn it on again')`), which still holds whatever page the remedy names. The types test gains one case per kind: the sentence never names Packaged automation. **Pending changesets.** `.changeset/27842-disabled-actions-served.md` and `.changeset/27966-flow-disabled-plain-sentence.md` are unreleased and quoted the old sentence verbatim; left as they were, the 18.3.0 CHANGELOG would publish a sentence this PR makes false. Only the quoted sentence (and, in 27966, "switched off under Setup › Packaged automation" → "an administrator switched off") changes. The devx seat accepted this widening on the claim (comment 6580761426). **Platform checklist** (`docs/qa/platform-checklist/areas/`), after #29438 landed and `main` was merged: `api-backend.packaged-action-disabled-dispatch` (acceptance[0] clause and verify, acceptance[6] verify) and `automation.packaged-flow-disable-durable` (acceptance[1] clause and verbatim verify, negative[3]) re-point their remedy phrase to the new sentence, and the two TRANSITIONAL known gaps that promised this re-point are retired. Revisions 13 and 10, history rows added. **Patch changeset** on `@objectstack/types`. ## Why N-28 (#28578) retired Setup's metadata catalog (Positions, Permission Sets, capabilities, every metadata type except datasource) and the Setup › Packaged automation page (ADR-0146 D1, D4, D11; M-1 ruling 6554738464). A person refused a switched-off action or flow was told to send an administrator to a page that no longer exists, and an administrator following the permissions docs looked for menus that are gone. ## Tests - Unit, on the merged head: `@objectstack/types` `packaged-item-turned-off.test.ts` 6/6, `@objectstack/objectql` `action-activation.test.ts` 22/22, `@objectstack/runtime` `domains/action-activation-dispatch.test.ts` 12/12, `@objectstack/service-automation` `flow-activation-ledger.test.ts` 49/49, `@objectstack/types` typecheck clean. `@objectstack/types` rebuilt first (downstream tests read its `dist`). - Dogfood: `api-action-door-forward.dogfood.test.ts` and `packaged-action-disabled-dispatch-live.dogfood.test.ts`, 2 files, 18/18 (head 53a942a, before the main merge, which did not touch the sentence or these files). - Reverse check: restoring the old action remedy in `packaged-item-turned-off.ts` (via `scripts/ablation-replace.mjs`, mutation proven on disk, restored to the HEAD blob) turns two types cases red: the byte-for-byte action sentence and the new "never names Packaged automation" case. ## Acceptance notes - `administrator-guide.mdx:216` (`| Sharing rules, record shares | Setup → Access Control |`) still matches the card's Re-check grep and is left as is: it is correct. `@objectstack/plugin-sharing` still contributes Sharing Rules and Record Shares to Setup's `group_access_control` (`packages/plugins/plugin-sharing/src/sharing-plugin.ts`). - The other remaining Re-check hits are intended: `authorization.mdx:254` and `permission-sets.mdx:387` name the old `/apps/setup/metadata/permission` address only to say it redirects to Studio; `packaged-item-turned-off.ts:24` is the doc comment saying the page is retired; `packages/spec/src/api/protocol.zod.ts:755` is item 4, split to #29446 (domain:spec) and not touched here. - `check-empty-changeset` stays red by design: this PR rewrites two pending release notes that it made false. That is its DELIBERATE CORRECTION case, which asks for confirmation on the PR rather than a restore; restoring them would publish the false sentence. - Not changed, noted: other pending changesets describe the old page as history (`27842-disabled-actions-beside-item.md`, which belongs with #29446's spec line, `28044-…`, `27504-…`, `27378-…`, `27521-…`, `29139-…`); `ui/packages/**` code comments that name the old page (out of scope per the card); `ui/packages/app-shell/src/views/studio-design/datasetCreate.tsx` still says "Setup › Datasets" in a comment. ## Verification Derived gate list: `node scripts/pm/dispatch-gates.mjs --commands --repo objectstack-ai/objectstack` at head ac19230, run locally and reconciled with `--ran`; results and the CI check-runs are in the `os-dev-report` comment on #29374. Docs build and the link check run in CI (`Build Docs`, `check-links.yml`); this PR adds and moves no links. ## Human Minimum - [x] 1. Schemas start as Zod; `packages/spec` holds no runtime logic. (`packages/spec` untouched) - [x] 2. Every name I added uses the casing for its kind. - [x] 3. No formatter ran; `pnpm lint` passes. (lint runs in CI) - [x] 4. One issue, one branch off an up-to-date `main`, one pull request. - [x] 5. A change that publishes carries a changeset, and both declaration lines are filled in here and in the changeset. - [x] 6. `packages/spec` touched: n/a. - [x] 7. No hand edits to `content/docs/references/`, `packages/*/CHANGELOG.md` or `content/docs/releases/`. - [x] 8. Title, body and comments are in English. (the 维护者速读 block is the maintainer summary the dispatch asks for) --- _Generated by [Claude Code](https://claude.ai/code/session_01JQwxbW35xq9yvZvbd174ve)_ --------- Co-authored-by: Claude <noreply@anthropic.com>
1 parent 6a940d1 commit 399df5b

18 files changed

Lines changed: 100 additions & 58 deletions

‎.changeset/27842-disabled-actions-served.md‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,4 +12,4 @@ Metadata-protocol: none
1212

1313
- **Served beside the object** (`@objectstack/metadata-protocol`, `@objectstack/rest`). `GET /api/v1/meta/object/:name` serves `disabledActions` beside `item`: the names in `item.actions` that the deployment's activation ledger switches off. `GET /api/v1/meta/object` serves the same answer keyed by object name. The default cached door carries it too, read live on every call and kept out of the ETag, so a read that carries it is answered in full rather than `304 Not Modified`. The key is absent where no ledger answered (no engine, or an engine with no ledger attached), on a draft read, and on every type other than `object`. `item.actions` is unchanged. The protocol reads the engine's `getDisabledActions` through the kernel's service table by name and imports no engine.
1414
- **The fact it serves** (`@objectstack/objectql`). `ObjectQL.getDisabledActions()` returns the names the engine's activation projection switches off, the same projection both dispatch doors consult before they refuse a call, or `undefined` when no ledger is attached. `listDisabledActions()` is unchanged.
15-
- **The refusal sentence** (`@objectstack/objectql`, `@objectstack/runtime`). A switched-off action is still refused 409 `ACTION_DISABLED` at the REST and MCP doors, and the message now reads: "This action is turned off for this deployment. An administrator can turn it on again under Setup › Packaged automation, or you can use another action." It no longer names the ledger table or the ADR. The engine writes those, with the code and the action's name, to an `info` log line each time it refuses one.
15+
- **The refusal sentence** (`@objectstack/objectql`, `@objectstack/runtime`). A switched-off action is still refused 409 `ACTION_DISABLED` at the REST and MCP doors, and the message now reads: "This action is turned off for this deployment. An administrator can turn it on again under Setup › Packaged Actions, or you can use another action." It no longer names the ledger table or the ADR. The engine writes those, with the code and the action's name, to an `info` log line each time it refuses one.

‎.changeset/27966-flow-disabled-plain-sentence.md‎

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -9,5 +9,5 @@ fix: a flow an administrator switched off is refused with a plain sentence, the
99
Clause-②: no
1010
Metadata-protocol: none
1111

12-
- **The flow refusal** (`@objectstack/service-automation`). A packaged flow switched off under Setup › Packaged automation is still refused `FLOW_DISABLED`, at every door that runs it: its trigger, a direct run, and a parent flow that calls it as a subflow. The message now reads: "This flow is turned off for this deployment. An administrator can turn it on again under Setup › Packaged automation, or copy it there under a new name." It no longer names the ledger table or the ADR. The engine writes those, with the code and the flow's name, to an `info` log line each time it refuses one. A flow disabled by its own status (`obsolete` / `invalid`) still reads "Flow '…' is disabled", so the two reasons stay distinguishable.
13-
- **One sentence for both** (`@objectstack/types`, `@objectstack/objectql`). `describeTurnedOffPackagedItem('action' | 'flow')` builds the sentence. The action refusal (`ACTION_DISABLED`) reads from it too, and its wording is unchanged. Only the last clause differs: a flow can be copied under a new name, and an action cannot, so the action sentence still offers another action instead.
12+
- **The flow refusal** (`@objectstack/service-automation`). A packaged flow an administrator switched off is still refused `FLOW_DISABLED`, at every door that runs it: its trigger, a direct run, and a parent flow that calls it as a subflow. The message now reads: "This flow is turned off for this deployment. An administrator can turn it on again in its package's Automations in Studio, or copy it there under a new name." It no longer names the ledger table or the ADR. The engine writes those, with the code and the flow's name, to an `info` log line each time it refuses one. A flow disabled by its own status (`obsolete` / `invalid`) still reads "Flow '…' is disabled", so the two reasons stay distinguishable.
13+
- **One sentence for both** (`@objectstack/types`, `@objectstack/objectql`). `describeTurnedOffPackagedItem('action' | 'flow')` builds the sentence. The action refusal (`ACTION_DISABLED`) reads from it too, and its wording is unchanged. The two sentences differ in two clauses: where an administrator turns the item back on (an action under Setup › Packaged Actions, a flow in its package's Automations in Studio), and what can be done meanwhile (a flow can be copied under a new name, and an action cannot, so the action sentence offers another action instead).
Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
---
2+
'@objectstack/types': patch
3+
---
4+
5+
fix: the switched-off packaged item sentence names where the switch is now, not the retired Setup › Packaged automation page
6+
7+
Clause-②: no
8+
Metadata-protocol: none
9+
10+
`describeTurnedOffPackagedItem`, the sentence both refusal engines send when an administrator has switched a packaged action or flow off (`ACTION_DISABLED`, `FLOW_DISABLED`), named Setup › Packaged automation as the place to turn it on again. That page is retired: an action's switch is on Setup's Packaged Actions page, and a flow's switch, with New similar beside it, is on the flow in its package's Automations in Studio. The sentence now names each:
11+
12+
- Action: "This action is turned off for this deployment. An administrator can turn it on again under Setup › Packaged Actions, or you can use another action."
13+
- Flow: "This flow is turned off for this deployment. An administrator can turn it on again in its package's Automations in Studio, or copy it there under a new name."
14+
15+
Words only. The envelope codes are unchanged, and a machine reads those, not the sentence.

‎content/docs/data-modeling/analytics.mdx‎

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -145,8 +145,8 @@ It saves an ordinary `dataset` draft in the package, published with the rest of
145145
the package, and the picker selects it. Every dataset written this way counts
146146
its records (a `count` measure), so a report or a chart can bind it at once.
147147
Nothing is derived without the author: there are no implicit datasets. Joins,
148-
filters, date dimensions and derived measures are edited afterwards in
149-
**Setup › Datasets**.
148+
filters, date dimensions and derived measures are edited afterwards on the
149+
dataset's page in Studio's **All metadata** area.
150150

151151
While no dataset reads one of the package's objects, the Studio pickers say so
152152
beside the button, and they list the package's own datasets first.

‎content/docs/permissions/access-recipes.mdx‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -47,7 +47,7 @@ definePermissionSet({
4747
4848
Every business app meets this shape: a contract's legal terms after approval, an order's amount after shipping, an invoice after posting, a purchase order's supplier after approval. The answer is a field permission with a **row condition**, `when`, on the permission set that should lose the edit.
4949

50-
**In the permission-set editor** (Setup → Access Control → Permission Sets, then open the set):
50+
**In the permission-set editor** (Studio → **All metadata** → Permission Set, then open the set):
5151

5252
1. Expand the object (`clm_contract`) to show its field rows.
5353
2. On each field row to lock (`governing_law`, `liability_cap`), set **Read** on and **Edit** off.

‎content/docs/permissions/administrator-guide.mdx‎

Lines changed: 13 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -104,19 +104,22 @@ This is the daily 90%. An assignment is one row: **User Position**
104104
they hold it in. The anchor decides *where* the position's depth grants apply
105105
— "sales manager **of East**" sees East's records, not the whole company's.
106106

107-
From **Setup → Access Control → Positions**, open a position and add
108-
assignments from its related list (or create User Position rows directly).
107+
From **Setup → People & Organization → Position Holders**, pick a position
108+
and add its holders. Holders added there carry no business-unit anchor; to
109+
anchor an assignment to a unit, open the user's record page, go to its
110+
**Positions** tab and choose **New**: the assignment form there takes the
111+
position and the business unit.
109112
These writes are governed: tenant-level admins pass; a
110113
[delegated admin](/docs/permissions/delegated-administration) can only assign
111114
allowlisted sets inside their own subtree — self-escalation is structurally
112115
refused.
113116

114117
Two adjacent surfaces complete the picture:
115118

116-
- **Direct grants** — on a permission set's record page
117-
(**Setup → Access Control → Permission Sets**), the **Assigned Users** panel
118-
adds per-user grants without a position. Rows held *via a position* are
119-
shown but removed on the position, not here.
119+
- **Direct grants** — **Setup → People & Organization → Permission Set
120+
Assignment**: pick a permission set, and its **Assigned Users** panel adds
121+
per-user grants without a position. Rows held *via a position* are shown but removed
122+
on the position (Position Holders), not here.
120123
- **Business-unit membership** — from Step 2; independent of the assignment
121124
anchor.
122125

@@ -148,8 +151,8 @@ One rule of thumb: **capability ships with the apps you install — you rarely
148151
author a permission set by hand.** If you are in this section, you've confirmed
149152
no shipped position covers the need.
150153

151-
The permission-set **matrix editor** (Setup → Access Control → Permission Sets)
152-
is a structured spreadsheet — you never hand-write JSON:
154+
The permission-set **matrix editor** (Studio → **All metadata** → Permission
155+
Set, then open the set) is a structured spreadsheet — you never hand-write JSON:
153156

154157
- **Object grid** — per object: Create / Read / Update / Delete, lifecycle
155158
bits (Transfer / Restore / Purge), and View All / Modify All, with per-row
@@ -209,7 +212,8 @@ sets can't be edited in place either, but they can be cloned and adjusted
209212
| Users, invitations | Setup → People & Organization → Users / Invitations |
210213
| Business-unit tree | Setup → People & Organization → Business Units |
211214
| Teams | Setup → People & Organization → Teams |
212-
| Positions, permission sets, capabilities | Setup → Access Control |
215+
| Positions, permission sets, capabilities: what they grant, and a position's or set's on/off switch | Studio → All metadata |
216+
| Who holds a position, who holds a permission set | Setup → People & Organization → Position Holders / Permission Set Assignment |
213217
| Sharing rules, record shares | Setup → Access Control |
214218
| Password policy, MFA, lockout, SSO | Setup → Configuration → Authentication |
215219
| Company info, localization, branding | Setup → Configuration |

‎content/docs/permissions/authorization.mdx‎

Lines changed: 9 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,7 @@ Authorization splits into three concerns that stay decoupled:
3030
1. **Capability** — *what can be done* (`manage_users`, `export_data`).
3131
Defined by the platform (curated `PLATFORM_CAPABILITIES`) or by a package
3232
via [`defineCapability`](#package-capability-declaration-adr-0066-d1); extended
33-
by admins in Setup. A capability is **not** a contract and has no `inputs` — a
33+
by admins in Studio. A capability is **not** a contract and has no `inputs` — a
3434
resource merely *references* one by name (see Requirement, below).
3535
2. **Assignment** — *who holds it* — permission sets and positions, which are
3636
catalog definitions served by name from the environment registry (a
@@ -248,10 +248,11 @@ only what it owns:
248248
**live** (config); the sets a position distributes are its definition's
249249
`permissionSets`. It owns environment-authored sets and assignments — not
250250
package sets. The set **definition** has one authoritative store, the
251-
metadata layer (ADR-0094 D1, ADR-0131 D3): Setup → Access Control →
252-
Permission Sets opens the catalog list
253-
(`/apps/setup/metadata/permission?scope=environment`), and a create or edit
254-
there is a metadata save (`PUT /api/v1/meta/permission/:name`) into the
251+
metadata layer (ADR-0094 D1, ADR-0131 D3): Studio's **All metadata** area
252+
lists the catalog (`/studio/~all/metadata/permission?scope=environment`;
253+
Setup carries no metadata catalog, and its old
254+
`/apps/setup/metadata/permission` address redirects there), and a create or
255+
edit there is a metadata save (`PUT /api/v1/meta/permission/:name`) into the
255256
environment's definition ledger (`sys_metadata`), served from the registry
256257
beside the packages' sets. No row mirrors it: the `sys_permission_set`
257258
object is no longer registered, so no data route serves one. The save
@@ -416,8 +417,9 @@ discipline: **resolution-time filtering, fail-closed**, in
416417
No definition carries the switch, and no row does: the `active` column of the
417418
retired catalog row objects (`sys_permission_set.active`,
418419
`sys_position.active`) decides nothing, and neither object is registered any
419-
more (ADR-0131 D3). Setup's active switch on the Positions and Permission Sets
420-
catalog lists writes the ledger row, through the door below.
420+
more (ADR-0131 D3). The on/off switch on a position's or a permission set's
421+
page in Studio's **All metadata** area writes the ledger row, through the door
422+
below.
421423

422424
The ledger row is written through
423425
`POST /api/v1/security/_activation/:type/:name`, with `:type` either

‎content/docs/permissions/capabilities.mdx‎

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -121,7 +121,7 @@ export default defineStack({
121121
| Field | Type | Required | Notes |
122122
|:--|:--|:--|:--|
123123
| `name` | `string` | ✅ | The contract. `^[a-z][a-z0-9_.]*$` — lowercase, digits, `_` and `.` |
124-
| `label` | `string` | optional | Shown in Setup. Defaults to a humanized `name` |
124+
| `label` | `string` | optional | Shown to the administrator who grants it. Defaults to a humanized `name` |
125125
| `description` | `string` | optional | What holding the capability permits |
126126
| `scope` | `'platform' \| 'org'` | optional | Defaults to `'platform'`. `org` = scoped to the caller's organization |
127127
| `packageId` | `string` | optional | Author-declared fallback provenance (ADR-0086 D3). Normally the registry stamps this for you |
@@ -269,7 +269,7 @@ to store arbitrary JSON on the authorization surface.
269269
## Checklist
270270

271271
- [ ] Name is namespaced and lowercase, and does not shadow a platform capability
272-
- [ ] `label` and `description` are written for the administrator who will grant it in Setup
272+
- [ ] `label` and `description` are written for the administrator who will grant it
273273
- [ ] `scope` is `org` unless the privilege really is platform-wide
274274
- [ ] The declaration is reachable from the stack (`capabilities: [...]`) or a `*.capability.ts` file
275275
- [ ] No other installed package declares the same name — the registry refuses a second holder at boot

‎content/docs/permissions/delegated-administration.mdx‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -52,7 +52,7 @@ Setup app ("You don't have access to this app"); read on `sys_user`,
5252
`sys_business_unit` and `sys_business_unit_member`, so the lookups can pick
5353
people and units; and CRUD on `sys_user_position`, the assignment rows
5454
themselves. They may sit on the scope's own set or on any other set the
55-
delegate holds. In Setup's permission set editor, the Delegated Admin Scope
55+
delegate holds. In the permission set editor (Studio's **All metadata** area), the Delegated Admin Scope
5656
block lists the five, marks which ones the set already grants, and adds the
5757
missing ones to the set in one click.
5858

0 commit comments

Comments
 (0)