How Active/Inactive behaves alongside every existing audience-level and component-level setting on Learning Programs.
Guiding principle: Active/Inactive controls whether a component is assigned. Existing LP settings control when, how, and to whom. Inactive overrides assignment — if a component is Inactive, no new tasks are generated regardless of other settings. Existing tasks for Inactive components remain intact.
LP mode requirement: Active/Inactive state and dynamic LP progress are only available on LPs created in the new recurring mode. Existing "one and done" LPs are unaffected — they retain today's sticky completion behavior and do not expose the Active/Inactive toggle. Without this mode gate, enabling dynamic progress on all existing LPs could generate unexpected new tasks for learners who completed their LP long ago.
V1 scope: Active/Inactive applies to Course components only. Flash Drills and Channels behave as they do in default-mode LPs.
Configured per audience in the "Sharing and task assignment" panel.
| Audience mode | Active component | Inactive component |
|---|---|---|
| Subscribe/enroll | Tasks generated for audience members | No new tasks generated. Existing tasks remain. |
| Share only | No tasks generated (existing behavior) | No tasks generated (same as today) |
"Share only" already prevents task generation; Inactive does the same for individual components within a "Subscribe/enroll" audience. These are independent controls at different levels.
The audience-level start date controls when the LP assignment begins for the audience. Active/Inactive operates after enrollment — a component's state is evaluated when tasks are generated for audience members, not when the audience is created.
The audience start date determines when the LP becomes available; Active/Inactive determines which components within it generate tasks.
| Enrollment option | Active component | Inactive component |
|---|---|---|
| Align to others | Task generated at current timeline position | Skipped — no task generated, even though alignment would normally "catch up" to past components |
| Shift relative | Task generated with shifted offsets | Skipped — no task generated. Gap stays in the shifted timeline. |
The audience-level due date applies to the LP as a whole, not individual components. Active/Inactive operates at the component level. The LP due date is unaffected by component-level Active/Inactive state.
When a component is set to Active and tasks are auto-assigned to existing audience members, those members should receive notifications per the audience's notification settings.
When a component is set to Inactive, no notification is needed — no assignment action is occurring.
Configured per component row on the Manage Collections page.
| Start value | Active | Inactive |
|---|---|---|
| When assigned | Task generated immediately upon enrollment or activation | No task generated |
| Day 1 – Week 51 | Task generated after the specified delay | No task generated. Offset preserved — if set back to Active, original offset resumes. |
| After: [component] | Task generated after gating component is completed | Constraint applies — see below |
Gating constraint: If a component is used as a gating item (another component's Start is set to "After: [this component]"), it cannot be set to Inactive. The toggle is disabled with an explanatory message.
This prevents broken dependency chains. In a chain A → B → C, only C (the tail) can be set to Inactive. To make B inactive, the admin must first change C's Start to something other than "After: B."
The component-level End value is a due date that shows an "overdue" label on learner tasks. It has no system enforcement — does not cancel or revoke access.
| Active | Inactive | |
|---|---|---|
| End value set | Due date applies to generated tasks | No task generated, due date not applicable. Value preserved on component. |
| No end value | No due date on tasks | No task generated |
For existing tasks on a component that becomes Inactive, the due date remains in effect — those tasks are not modified.
The component-level toggle determines whether a task is auto-generated (Enroll) or the learner can self-enroll (Subscribe).
| Active | Inactive | |
|---|---|---|
| Enroll | Task auto-generated | No task generated (Inactive overrides) |
| Subscribe | Learner can self-enroll | Self-enrollment blocked (recommended) |
Decision: should learners self-enroll in an Inactive component?
Recommendation: no. The analogous behavior on individual Courses is the "Do not assign to members of this audience after [date]" setting (not available on LPs, but the same mechanism). When that date passes, the assignment is excluded from the subscription pipeline — self-enrollment is effectively blocked. Following this precedent, Inactive should also prevent self-enrollment. Existing subscriptions remain intact.
| Active | Inactive | |
|---|---|---|
| Notify on | Notification sent when task is generated | No task generated, no notification |
| Notify off | Task generated silently | No task generated |
Notifications are a consequence of task generation. If no task is generated (Inactive), no notification is sent.
New LP mode flag on the LP entity (name TBD). Active/Inactive field on LearningProgramItem. Schema changes and API support.
Dynamic LP progress — LP "Finished" computed from Active components only, reverts to "In Progress" when an Active component is incomplete. Existing audience members — create tasks for Active components (auto-assign on activation, even if LP was previously Finished). New audience members — skip Inactive components (do not assign).
May need to be broken down further during grooming.
Deep copy Course + all content items with new entity IDs. New component added to LP as Inactive by default. Backend API for the action.
Add the new mode option to the LP creation/properties screen.
Active/Inactive indication on component rows in Manage Collections. Toggle affordance for changing status. Gating constraint — disable toggle with explanatory message if component is a gating item.
New option in the three-dot menu on a component row. Creates a placeholder row named "Copy of [Source]" with all options except "Remove" disabled. Admin saves changes → system performs the deep copy. Full editing (rename, content review, toggle Active) available only after copy completes.
Differentiate Active vs. Inactive components for learners on the webapp LP index page.
Differentiate Active vs. Inactive components for learners on the mobile app's equivalent LP view.