A Policy Can Stay on the List and Stop Doing Anything

Published 2026-10-09 · LuckyMDM Blog

The short answer: a policy can sit in your console, show as delivered, and govern nothing at all. That is what happens to command-based software update policies once a device reaches the 27.0 operating systems, because the commands stop working while no error is raised. The unit keeps checking in and keeps reporting healthy, and the policy quietly becomes decoration. The test is a pair of conditions rather than a single symptom: the declarative side of your configuration is empty while the command side still carries the policy. When both hold, the policy is a no-op.

Why a policy can be present and absent at the same time

Two execution models

The command model is a question-and-answer loop. The service sends a command, the device acknowledges it, and the service polls later to confirm the setting actually landed. Every setting costs a round trip, and a device that stays offline drifts until it checks in again. The declarative model works on a different mechanism: the service declares a target state, the device evaluates locally how far it is from that state, closes the gap itself, and reports back when the state changes. One is an event the server performs; the other is a condition the device maintains. The root difference is where the decision is made, and from the 27.0 releases onward update control exists only in the second model, which requires the service to be able to express a target state rather than a sequence of instructions.

The device moved itself, the configuration did not

This is the layer most teams miss, and the underlying reason is that the two halves move on separate clocks. A device that updates to 27.0 arrives on the declarative model on its own. The policies you built under the old model stay exactly where they are, and the declarative tab starts out empty. So the device lands in a new model and finds nothing governing it, while the console looks at the old policy and assumes it is still in force. Neither side raises an error, and whether a unit is affected depends on two independent events: the user accepting an upgrade, and an operator rebuilding the configuration. Which is why this belongs to configuration lifecycle rather than device troubleshooting.

What stopped working, precisely

Apple's wording for enterprise in the 27 cycle is short: legacy software update management no longer functions in all 27.0 operating systems. Four mechanisms are named as no longer functioning: software update commands, software update queries, recommended cadence settings, and software update restrictions including deferrals and Background Security Improvements. On the developer documentation side, ScheduleOSUpdate, AvailableOSUpdates and OSUpdateStatus were marked deprecated from iOS 26.0, with pointers to the declarative configuration and status items instead. This was a two-year retirement path closing, not a sudden removal.

Four differences between the two models

DimensionCommand modelDeclarative model
ExecutionServer sends commands, device acknowledgesServer declares target state, device evaluates and acts locally
StatusServer polls to confirmDevice reports when state changes
Update enforcementUpdate commands plus deferral restrictionsTarget version plus a deadline the device honours itself
Failure modeAcknowledgement errorsSilent; nothing executes and nothing is reported

Three moments a policy becomes a no-op

The upgrade that crosses 27.0

The most direct case. A unit running an earlier version crosses the line the moment its user accepts a major upgrade, and the update policy it used to obey loses effect at that same moment. No prompt on the device, no alert on the server.

New stock that ships on the new release

The second case is intake. Units that ship with 27.0 or later installed only ever look at declarative configurations, from first activation onward. If your service holds nothing but command-based policies, those units are ungoverned from day one, and they still appear as enrolled in the ledger. This is the group worth watching most closely.

The profile nobody has touched in three years

The third case is the quiet one. Several capabilities that used to live in restrictions payloads moved to declarative configurations during the 27 cycle. The profile still installs and still reports success, but some of its entries no longer map to anything that takes effect. A configuration file that has not been reviewed since long before the transition can, on current devices, be managing zero units.

Four checks, each with a pass condition

The arithmetic

Three parameters: units already across the line, detection lag, and the cost of closing the gap.

Take a fleet of 2,000 units with 60 percent on 27.0, which is 1,200 units. With a quarterly review cadence the longest detection lag is 90 days, so the worst-case no-op exposure is 1,200 units x 90 days = 108,000 unit-days, or roughly 296 unit-years, meaning the equivalent of 296 units sitting without update control for a full year.

Closing it costs two things. Rebuilding declarations: four declarations at two hours each is 8 hours, and at USD 60 per hour that is USD 480. Sampling verification: 100 units at 3 minutes each at USD 0.72 per minute is USD 216. Together, USD 696.

Compressing detection lag costs a reconciliation pass: 2,000 units at 0.5 minutes each is 1,000 minutes, which at USD 0.72 per minute is USD 720 per pass, and four passes a year is USD 2,880. So roughly USD 3,576 in one-off and annual effort removes 108,000 unit-days of uncertainty. The value of the sum is not its precision but its direction: for silent failures, the work belongs on the configuration side, because you cannot rely on the device to tell you.

Three misconceptions about this failure mode

Using online status as proof a policy works. A unit being reachable says the management channel is open, nothing more. A command-based update policy on a 27.0 unit fails while the unit stays online, acknowledges normally and reports healthy. The substitute evidence is the policy type and the two-sided comparison.

Assuming that no error means the migration finished. Silence is the defining property of this failure. Device migration to the declarative model is automatic; configuration migration is not. Their progress is mismatched by design, so the empty declarative pane has to be checked explicitly.

Reading it as the management stack failing. What was retired is the command path inside one domain, not the management relationship. Units remain enrolled, remain reachable, and configurations in other domains remain in force. Treating it as a total failure triggers a needless full rebuild.

Two boundaries where this does not apply

Boundary one: outside the update domain. This retirement covers software update commands, queries, cadence settings and update restrictions. Network, content filtering and other domains move on their own schedules with their own preconditions. Identify which domain a configuration belongs to before deciding whether it still governs anything.

Boundary two: this is not the same change as credential decoupling. Moving credentials into standalone assets so a certificate rotation no longer forces a full configuration push is a change to the structure of credentials and configuration. This is a change to configuration lifecycle after a command channel retires. Both appear in the same release cycle; the mechanisms and the remediations differ.

One check you can run today

Pick any unit that has already reached 27.0 and look up which type of update policy it is currently subject to. If the answer is command-based, that unit's updates are ungoverned. One query settles it, and no additional tooling is needed.

Platforms built for subscription fleets, such as LuckyMDM (Sichuan Starlight Network LLC), tend to make this a scheduled reconciliation for the same reason: the upgrade is a user-side action the service cannot prevent, so the only lever is detecting it quickly. On the ledger, LuckyMDM stores the policy type alongside the reported operating system version and flags a unit for review when the two do not line up.

FAQ

Do deferrals still work?

Yes, in a different place. They are no longer an MDM restriction but a setting inside declarative software update configuration, with a window of 1 to 90 days, plus a recommended cadence option controlling whether users see all updates, only updates for the oldest version, or only the upgrade to the newest.

What does enforcing a specific version require?

Per Apple's reference, version-specific enforcement has been available since iOS 17 and does not require supervision; the deadline is interpreted in the device's local time zone, so one declaration covers multiple regions. Deferral, automatic download and install settings, and related items do require a supervised device. Which of these your platform exposes is a question for your vendor.

Should we hold devices back to avoid this?

Holding units on older versions trades a known gap for a growing one. The declarative model enforces more consistently than the commands it replaces, so the safer sequence is to pilot, then migrate configuration, then let the fleet move.

Do no-op units need re-enrolment?

No. The management relationship was never interrupted; only the command path within the update domain stopped functioning. Adding the declarative configuration is sufficient, with no re-enrolment or wipe.

How far ahead can the deadline be announced?

Notifications can begin up to 14 days before the enforcement deadline, and deferral windows run from 1 to 90 days, which gives room to schedule around working hours.

Criteria checklist

All Articles