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
I want to install software (Fleet-maintained apps, App Store apps, or custom packages) during new host setup only on hosts that are a member of the specific label
so that I can scope software install more granularly (e.g. by department, role, hardware, etc. OR to scope a stable version to new hosts.
Changes
Software's labels (scope) should be respected in setup experience for all supported platforms.
When a host enrolls, enqueueSetupExperienceItems selects every item flagged install_during_setup for the host's team and platform with no label filtering, so out-of-scope software is installed on and shown to the enrolling host. This story adds per-host label-scope filtering at enrollment, reusing the scope logic that already gates the normal install paths. Multi-platform setup experience, multiple packages per title, and the tabbed Install software UI already shipped, so label scope is the remaining gap.
Database schema migrations: No changes. software_installer_labels, vpp_app_team_labels, and label_membership already exist.
Load testing: Not required. The enqueue query gains an EXISTS scope predicate per software union part, run once per host at enrollment; same order as the existing per-item scope checks on the normal install path.
Pre-QA load test: Not required.
Load testing/osquery-perf improvements: None.
This is a premium only feature: Yes. Scope tables and setup experience are already premium-gated; no new tier gating.
Risk assessment
Requires testing in a hosted environment: No. Local dev with hosts on each platform is sufficient.
Requires load testing: No.
Risk level: Low
Regression watch: no-label software must still install on every host; exclude-any must honor the label_updated_at vs label created_at timing for dynamic labels; the first-added dedup must select the first-added in-scope package per title.
Test plan
Make sure to go through the list and consider all events that might be related to this story, so we catch edge cases earlier.
Core flow
Mark software for setup experience with an include-any label. Enroll an in-scope host and an out-of-scope host. Confirm only the in-scope host installs it and shows it in setup progress.
Repeat with an exclude-any label.
Repeat with an include-all label.
Confirm software with no labels still installs on every host.
Platforms
macOS (Apple MDM / DEP).
Windows and Linux (Orbit enrollment).
iOS or iPadOS (VPP app).
GitOps
Set setup_experience: true on a label-scoped software item, run fleetctl gitops, enroll a host, and confirm scope is respected.
Edge cases
Two in-scope packages for one title: only the first-added installs.
First-added package out of scope, a later one in scope: the later one installs.
Host re-enrollment (failed-step reset) still applies scope and skips already-succeeded items.
Permissions
Setup experience configuration is premium; confirm no per-role behavior change.
Testing notes
Android is out of scope: it does not use the setup experience enqueue flow (software is baked into the Android policy at enroll).
Confirmation
Engineer: Added comment to user story confirming successful completion of test plan.
QA: Added comment to user story confirming successful completion of test plan.
QA: Determined whether this story needs Playwright automation.
Needs automation: Yes / No
If yes, filed a follow-up issue in the :help-qa project with status "Needs automation":
Goal
Changes
Software's labels (scope) should be respected in setup experience for all supported platforms.
When a host enrolls,
enqueueSetupExperienceItemsselects every item flaggedinstall_during_setupfor the host's team and platform with no label filtering, so out-of-scope software is installed on and shown to the enrolling host. This story adds per-host label-scope filtering at enrollment, reusing the scope logic that already gates the normal install paths. Multi-platform setup experience, multiple packages per title, and the tabbed Install software UI already shipped, so label scope is the remaining gap.More details in Figma
Product
setup_experiencenote reverted by Revert docs changes for #24989 (Setup experience: scope software via labels when Macs boot) #27119, updated for all platforms + label scope. Tracked in Setup experience labels: documentation and engineering QA #49407.articles/macos-setup-experience.md. Tracked in Setup experience labels: documentation and engineering QA #49407.Engineering
articles/macos-setup-experience.md— note that setup experience respects label scope. Tracked in Setup experience labels: documentation and engineering QA #49407.software_installer_labels,vpp_app_team_labels, andlabel_membershipalready exist.EXISTSscope predicate per software union part, run once per host at enrollment; same order as the existing per-item scope checks on the normal install path.Risk assessment
label_updated_atvs labelcreated_attiming for dynamic labels; the first-added dedup must select the first-added in-scope package per title.Test plan
Core flow
Platforms
GitOps
setup_experience: trueon a label-scoped software item, runfleetctl gitops, enroll a host, and confirm scope is respected.Edge cases
Permissions
Testing notes
Android is out of scope: it does not use the setup experience enqueue flow (software is baked into the Android policy at enroll).
Confirmation