Skip to content
Back to skills

Permission Set Groups And Muting

ASecurity

Use when designing or reviewing permission-set-group architecture, especially profile minimization, group composition, muting strategy, and migration away from profile-heavy security models. Triggers: 'permission set group', 'muting permission. NOT for record-sharing design or CRUD/FLS review in Apex code — use admin/permission-set-architecture.

  • 15 stars
  • 0 votes
  • 0 copies
  • 1 view
  • Added June 1, 2026
ai-agentspythongospringtestingapisecurity

Works with

  • api

Security analysis

A100/100

Pro scans all 7 files and shows the line behind each finding

Scanned October 4, 2026

npx -y skills add PranavNagrecha/AwesomeSalesforceSkills --skill permission-set-groups-and-muting --agent claude-code

Installs into .claude/skills of the current project.

Are you the author of Permission Set Groups And Muting?

Add the live security badge to your README. It updates with every re-scan.

Security grade badge for Permission Set Groups And Muting
[![Security: A — Skills Directory](https://www.skillsdirectory.com/api/skills/pranavnagrecha-permission-set-groups-and-muting/badge)](https://www.skillsdirectory.com/skills/pranavnagrecha-permission-set-groups-and-muting)

More formats (shields.io, HTML) on the badges page. Keep it an A: scan every change in CI with Pro.

Download with Pro
SKILL.md
---
name: permission-set-groups-and-muting
description: "Use when designing or reviewing permission-set-group architecture, especially profile minimization, group composition, muting strategy, and migration away from profile-heavy security models. Triggers: 'permission set group', 'muting permission. NOT for record-sharing design or CRUD/FLS review in Apex code — use admin/permission-set-architecture."
category: security
salesforce-version: "Spring '25+"
well-architected-pillars:
  - Security
  - Operational Excellence
tags:
  - permission-set-groups
  - muting
  - profiles
  - least-privilege
  - access-architecture
triggers:
  - "how should we use permission set groups"
  - "muting permission set strategy"
  - "migrate from profiles to permission sets"
  - "permission bundle architecture in Salesforce"
  - "why use PSG instead of assigning many permission sets"
  - "mute one permission in a permission set group for a persona"
  - "deploy a permission set group and muting permission set as metadata"
inputs:
  - "current profile and permission-set model"
  - "target job functions or feature bundles"
  - "whether subtractive muting is needed"
outputs:
  - "PSG architecture recommendation"
  - "review findings for profile-heavy or unclear access design"
  - "migration pattern for permission bundle design"
dependencies: []
version: 1.0.1
author: Pranav Nagrecha
updated: 2026-10-03
---

# Permission Set Groups And Muting

Use this skill when access design has outgrown direct profile customization and one-off permission-set assignments. Permission Set Groups (PSGs) compose reusable access bundles. A muting permission set subtracts permissions from one group's aggregate when the bundle is almost right but still too broad.

---

## Before Starting

Gather this context before working on anything in this domain:

- How many profiles, permission sets, and direct assignments already exist?
- Are the target bundles feature-based, role-based, or a mix?
- Is the real problem permission composition, or record visibility and sharing instead?
- Do any personas need time-boxed access (assignment expiration) or session-activated access (`hasActivationRequired`)?

---

## Questions to Ask Before Configuring

| Question | Why it matters | What a good answer adds | What proper configuration adds over just doing it |
|---|---|---|---|
| Is the permission you want to remove also granted by the user's profile or by a permission set assigned outside the group? | Permissions from profiles, permission sets, and PSGs are all honored; muting acts only inside the group, so another grant keeps the access. | Finds every grant path before muting. | Muting actually removes the access for the persona. |
| Which persona differs from the shared bundle, and by how many permissions? | Muting is meant for small subtractions; many mutes signal that the base permission sets should be split. | A short, named mute list per group. | The group stays explainable in an access review. |
| Will the PSG, its permission sets, and its muting set ship as metadata? | A PSG holds no permissions itself; the permissions live in the referenced permission sets, and the guide says to retrieve PermissionSet with PermissionSetGroup. Since API 40.0, a deployed permission set's file replaces its contents. | Deploys the whole bundle together with full permission set files. | No partial permission set overwrites a production grant. |
| Who will check group recalculation status after a change? | PSG status moves through Updating to Updated, or to Failed; until then the aggregate is not current. | A post-deploy check of `PermissionSetGroup.Status`. | Users get the new access only when the group says Updated. |
| Does any access need an end date or a session activation step? | `PermissionSetAssignment.ExpirationDate` (API 52.0+) ends an assignment; `hasActivationRequired` (API 53.0+) needs an active session activation. | Time-boxed or step-up access designed in. | Temporary access does not become permanent. |

---

## Core Concepts

### PSGs Are the Composition Layer

A PSG bundles permission sets so access can be assigned as one unit. The Metadata API sample says it plainly: "Individual permissions are included in the permission set referenced, not in the permission set group." Platform recalculation builds the group's aggregate from its `PermissionSetGroupComponent` rows, and `Status` reports `Updated`, `Outdated`, `Updating`, or `Failed`.

### Muting Subtracts From One Group's Aggregate

`MutingPermissionSet` has the same fields as `PermissionSet`. A setting that is **enabled** in the muting set is **turned off** for the PSG it belongs to. For field permissions, `PermissionsRead=true` and `PermissionsEdit=true` in a muting set mute read and edit (Object Reference, FieldPermissions > Muting Permissions). Muting is not a permission source, and it does not reach grants that come from the profile or from permission sets assigned directly.

### Grants Are Additive Across Every Path

The Security Guide states that profiles, permission sets, and PSGs "grant access but not to deny access," and that revoking a permission means removing every instance of it from the user. The same section names muting permission sets in PSGs as one way to remove a permission for the group's users.

### Minimal Profiles Still Matter

Profiles do not disappear. The thinner the base profile, the more a PSG design controls effective access, because a profile grant can't be muted.

### Migration Is an Access-Architecture Project

Moving from profile-centric design to PSGs needs naming, persona testing, and a staged rollout. It is not just a metadata conversion.

---

## Common Patterns

### Feature Bundle PSG

**When to use:** Many users need the same collection of capabilities, such as service console plus case tools.

**How it works:** Create focused permission sets per feature, then group them into one assignable PSG.

**Why not the alternative:** Repeating many direct assignments scales poorly and is harder to audit.

### Base Bundle Plus Muting

**When to use:** Two personas are almost identical except for a few restricted capabilities.

**How it works:** Create a second PSG with the same permission sets plus a muting permission set that enables (and so mutes) only the restricted permissions. The deployable files are in [references/metadata-examples.md](references/metadata-examples.md).

### Profile-Minimization Migration

**When to use:** The org has many feature-heavy profiles and access changes are risky.

**How it works:** Move feature access into permission sets, compose PSGs, assign them in parallel with the old profiles, verify effective access, then strip the profiles.

---

## Decision Guidance

| Situation | Recommended Approach | Reason |
|---|---|---|
| Many recurring permission-set combinations | Permission Set Groups | Better composition and assignment hygiene |
| One bundle is almost right for two personas | Second PSG with a muting permission set | Reuse without cloning permission sets |
| The permission to remove is also on the profile | Remove it from the profile first | Muting can't override a profile grant |
| Profiles still hold most feature access | Migrate toward minimal profiles plus PSGs | Better long-term governance |
| Access issue is record visibility | Use sharing and security-model skills | PSGs do not solve sharing architecture |
| Contractor or project access that must end | Assignment with `ExpirationDate` | The assignment ends on its own |

---

## Recommended Workflow

1. Inventory grants: query `PermissionSetAssignment` and the profile for each persona, and list every path that grants the permissions in scope (see the SOQL in [references/metadata-examples.md](references/metadata-examples.md)).
2. Design focused permission sets and the PSGs per persona; write down each mute and the reason for it.
3. Build the files: `PermissionSet`, `PermissionSetGroup`, and `MutingPermissionSet` in source format, then run `python3 skills/security/permission-set-groups-and-muting/scripts/check_permission_set_groups_and_muting.py --manifest-dir force-app`.
4. Deploy the whole bundle to a sandbox, wait for `PermissionSetGroup.Status = 'Updated'`, and test each persona with a real user login.
5. Roll out in phases: assign PSGs alongside old profiles, verify, then remove profile grants in batches with a rollback list.

---

## Review Checklist

Run through these before marking work in this area complete:

- [ ] Profiles are being minimized instead of expanded.
- [ ] Permission sets have clear, focused purposes.
- [ ] PSGs represent meaningful bundles, not random collections.
- [ ] Each muted permission is not also granted by the profile or a directly assigned permission set.
- [ ] Muting sets enable only the permissions to be removed, with a documented reason.
- [ ] Permission sets deploy as complete files together with their PSG.
- [ ] Group status confirmed `Updated` after each change; personas tested with real logins.
- [ ] Migration and rollback are planned for profile-centric orgs.

---

## Salesforce-Specific Gotchas

Full write-ups with sources are in [references/gotchas.md](references/gotchas.md).

| Gotcha | One-line summary |
|---|---|
| Enabled means muted | In a muting set, `true` turns the permission off for the group. |
| Muting scope | Muting can't remove a grant that comes from the profile or another assignment. |
| Permissions live in sets | A PSG file has no permissions; deploy and retrieve its permission sets with it. |
| Permission set deploy | Since API 40.0 a deployed permission set file replaces the set's contents. |
| Recalculation | Group access is current only when `Status` is `Updated`. |
| Expiring access | `ExpirationDate` ends an assignment; nothing else does. |

---

## Output Artifacts

| Artifact | Description |
|---|---|
| PSG design review | Findings on composition, muting, and profile minimization |
| Access-bundle plan | Recommended permission-set and PSG structure with mute list |
| Migration outline | Phased approach for moving from profile-heavy access to PSGs |
| Bundle metadata | `permissionsets/`, `permissionsetgroups/`, `mutingpermissionsets/` files |

---

## Related Skills

- `security/org-hardening-and-baseline-config`: use when baseline org controls are the concern rather than feature-access composition.
- `admin/permission-sets-vs-profiles`: use for the broader admin-side distinction between permission sets and profiles.
- `apex/apex-security-patterns`: use when code-level sharing and CRUD/FLS enforcement are the real issue.

Files in this skill

  • SKILL.md6.4 KB
  • references/examples.md1.3 KB
  • references/gotchas.md1.1 KB
  • references/llm-anti-patterns.md6.7 KB
  • references/well-architected.md1.2 KB
  • scripts/check_permission_set_groups_and_muting.py2.9 KB
  • templates/permission-set-groups-and-muting-template.md482 B

Attribution

Is this your skill, or is something wrong with this listing? Request removal or report an issue. Author removals are honored within 72 hours.

Comments

Loading comments…