All Artifacts Reassignment Feature Overview

LP Reassignment & Recertification

Artifact A — PM leadership + dev handoff

Overview

We have a gap in reassignment and recertification. Customers need to reassign training on recurring schedules — annual compliance renewals, certification expirations, regulatory recertification on fixed clocks. Today, admins handle these manually because the system doesn't support them natively.

To close this gap, the solution that makes sense is to extend our Learning Programs. Currently, LPs are missing:

With these additions, LPs can be extended to cover the reassignment/recertification use cases:


UC1: Annual Compliance

Fixed calendar schedule, all learners on the same cycle

Scenario All learners complete the same training on a fixed calendar schedule, year over year. Example: Security Compliance training, due annually.

Admin Setup

1
Enable Course-level scheduling on LP
Turns on the new LP mode flag
2
Create Course "Security Compliance 2026"
Start = Jan 1 2026  ·  End = Dec 31 2026
3
"Use for next cycle"
Copies Course + content items → creates "Security Compliance 2027"
4
Set dates on new Course
Start = Jan 1 2027  ·  End = Dec 31 2027

Learner Timeline

Jan 2026 Jul 2026 Jan 2027 Jul 2027 2026 Course 2027 Course Sam Normal Completed Jun 10 Joe Late enrollee Skipped (end date passed) Alex Non-completer Cancelled Restart
In Progress
Completed
Completion point
Cancelled
Skipped
Detailed timeline table
Name Scenario Date Event LP Status Notes
Sam Normal enrollee Mar 15 2026 Enrolls in LP In Progress 2026 Course is active (start passed, end not reached)
Jun 10 2026 Completes 2026 Finished Completion record retained
Jan 1 2027 2027 Course becomes active In Progress New active Course to complete
Feb 20 2027 Completes 2027 Finished Both completion records retained
Joe Late enrollee Feb 10 2027 Enrolls in LP In Progress 2026 end date passed → Skipped. Starts with 2027.
Mar 5 2027 Completes 2027 Finished
Alex Non-completer Mar 15 2026 Enrolls in LP In Progress 2026 Course is active
Dec 31 2026 End date reached, not completed Cancelled Access revoked. Partial progress retained in record.
Jan 1 2027 2027 Course becomes active In Progress Fresh start on 2027
End-date cancellation: unfinished learners on Dec 31 → CANCELLED. Completion record retained, access revoked.
Components used: LP mode flag Absolute start Absolute end Course end date Active Course state Skip logic Cancellation Dynamic LP progress Use for next cycle

UC2: Partner/Product Certification with Renewal

Learner-initiated, completion-triggered chain, no fixed clock

Scenario Learner enrolls at their own pace. After completing the original certification, they must renew periodically (e.g., every 12 months after completion). The chain waits for the learner — no fixed clock.

Admin Setup

1
Enable Course-level scheduling on LP
Turns on the new LP mode flag
2
Create Course "Original Certification"
Start = enrollment date  ·  End = none
3
"Use for next cycle" → create "Renewal 1"
Start = 365 days after completing Original  ·  End = none
4
"Use for next cycle" → create "Renewal 2"
Start = 365 days after completing Renewal 1  ·  End = none

Learner Timeline

Jan 2026 Jul 2026 Jan 2027 Jul 2027 Jan 2028 Lisa Fast completer 365-day wait R2 Dan Slow completer 365-day wait Amy Late enrollee 365-day wait R1
In Progress
Completion
Wait period (completion-triggered)
Detailed timeline table
Name Scenario Date Event LP Status Notes
Lisa Fast completer Jan 1 2026 Enrolls in LP In Progress Original Cert immediately active
Jan 15 2026 Completes Original Finished Completion record retained. 365-day wait begins.
Jan 15 2027 Renewal 1 unlocks In Progress 365 days after completion. New active Course.
Jan 25 2027 Completes Renewal 1 Finished Record retained. Next 365-day wait begins.
Jan 25 2028 Renewal 2 unlocks In Progress Cycle continues indefinitely
Dan Slow completer Jan 1 2026 Enrolls in LP In Progress Original Cert immediately active
Jul 15 2026 Completes Original Finished Takes 6 months. 365-day wait starts from here.
Jul 15 2027 Renewal 1 unlocks In Progress Dan's renewal is 6 months later than Lisa's
Aug 1 2027 Completes Renewal 1 Finished Chain continues from Dan's own pace
Amy Late enrollee Jun 15 2026 Enrolls in LP In Progress Enrolls 6 months after Lisa. Original Cert active.
Jun 30 2026 Completes Original Finished 365-day wait starts from Jun 30.
Jun 30 2027 Renewal 1 unlocks In Progress Amy's entire chain is shifted to her enrollment/completion dates
Components used: LP mode flag Enrollment-relative start Completion-triggered delay Active Course state Completion-chain Dynamic LP progress Use for next cycle

UC2 Variant: Access Window

Completion-triggered renewal with a limited window to complete each Course

Scenario Same as UC2 — learner enrolls and completes certification, then must renew periodically. But each Course has a time-limited access window (e.g., 30 days). If not completed within the window, the Course is cancelled and the chain stops.

Admin Setup

1
Enable Course-level scheduling on LP
Turns on the new LP mode flag
2
Create Course "Original Certification"
Start = enrollment date  ·  End = 30 days after Course starts
3
"Use for next cycle" → create "Renewal 1"
Start = 365 days after completing Original  ·  End = 30 days after Course starts
4
"Use for next cycle" → create "Renewal 2"
Start = 365 days after completing Renewal 1  ·  End = 30 days after Course starts

Learner Timeline

Jan 2026 Jul 2026 Jan 2027 Jul 2027 Jan 2028 Lisa Within window Mark Misses window Lapsed — chain never starts Kim Misses renewal Lapsed — chain stops Amy Late enrollee
Access window (30d)
In Progress
Completion
Lapsed (window expired)
Wait period
Detailed timeline table
Name Scenario Date Event LP Status Notes
Lisa Completes within windows Jan 1 2026 Enrolls in LP In Progress Original Cert active. Window: Jan 1–Jan 31.
Jan 15 2026 Completes Original Finished Within 30d window. 365-day wait begins.
Jan 15 2027 Renewal 1 unlocks In Progress Window: Jan 15–Feb 14 2027.
Jan 25 2027 Completes Renewal 1 Finished Within 30d window. Chain continues.
Jan 25 2028 Renewal 2 unlocks In Progress Window: Jan 25–Feb 24 2028.
Mark Misses original window Jan 1 2026 Enrolls in LP In Progress Original Cert active. Window: Jan 1–Jan 31.
Jan 31 2026 Window expires, not completed Lapsed Original cancelled. Access revoked. Chain never starts.
Kim Misses renewal window Jan 1 2026 Enrolls in LP In Progress Original Cert active. Window: Jan 1–Jan 31.
Jan 20 2026 Completes Original Finished Within window. 365-day wait begins.
Jan 20 2027 Renewal 1 unlocks In Progress Window: Jan 20–Feb 19 2027.
Feb 19 2027 Window expires, not completed Lapsed Renewal 1 cancelled. Chain stops. Original completion retained.
Amy Late enrollee Jun 15 2026 Enrolls in LP In Progress Enrolls 6 months late. Window: Jun 15–Jul 15.
Jun 27 2026 Completes Original Finished Within window. 365-day wait starts from Jun 27.
Jun 27 2027 Renewal 1 unlocks In Progress Amy's entire chain shifted. Window: Jun 27–Jul 27 2027.
Access window expiry: Course not completed within 30-day window → CANCELLED. Access revoked, record retained. Chain does not advance.
Open question: Admin recovery for lapsed learners — what happens if the user is re-added via a different audience? Does it create a fresh assignment? Known v1 limitation — no "grant extension" mechanism.
Components used: LP mode flag Enrollment-relative start Completion-triggered delay Relative end date Course end date Active Course state Cancellation Completion-chain Dynamic LP progress Use for next cycle

UC3: Regulatory Clock Renewal

Fixed clock anchored to enrollment date — doesn't wait for learner

Scenario Renewal is anchored to a fixed clock (enrollment date), not to when the learner completes. The regulatory body doesn't care when you finished — your cert expires on a set schedule regardless. Example: Healthcare compliance, must recertify every 12 months from enrollment.

Admin Setup

1
Enable Course-level scheduling on LP
Turns on the new LP mode flag
2
Create Course "Original"
Start = enrollment date  ·  End = 365 days after Course starts
3
"Use for next cycle" → create "Renewal 1"
Start = 365 days after enrollment  ·  End = 365 days after Course starts
4
"Use for next cycle" → create "Renewal 2"
Start = 730 days after enrollment  ·  End = 365 days after Course starts
Key difference from UC2: In UC2, the chain waits for the learner (completion-triggered). In UC3, the clock keeps ticking regardless — Courses activate and expire on a fixed schedule anchored to enrollment date.

Learner Timeline

Jan 2026 Jul 2026 Jan 2027 Jul 2027 '28 Year 1 (365d fixed) Year 2 (365d fixed) Sara On time Tom Non-completer Clock doesn't wait — cycles regardless Nia Late enrollee ← Nia's clock starts from her enrollment
Fixed course window
In Progress
Completed (waiting)
Completion
Cancelled (expired)
Detailed timeline table
Name Scenario Date Event LP Status Notes
Sara Completes on time Jan 1 2026 Enrolls in LP In Progress Original active. Window: Jan 1 2026–Dec 31 2026.
Mar 1 2026 Completes Original Finished Done early. LP stays Finished until next cycle.
Jan 1 2027 Renewal 1 becomes active In Progress 365 days after enrollment. Window: Jan 1–Dec 31 2027.
Feb 15 2027 Completes Renewal 1 Finished Done early again. Waits for next cycle.
Jan 1 2028 Renewal 2 becomes active In Progress 730 days after enrollment. Cycle continues.
Tom Non-completer Jan 1 2026 Enrolls in LP In Progress Original active. Window: Jan 1 2026–Dec 31 2026.
Dec 31 2026 Original end date reached, not completed Cancelled Access revoked. Record retained.
Jan 1 2027 Renewal 1 becomes active In Progress Clock doesn't wait. Renewal starts regardless.
Dec 31 2027 Renewal 1 end date reached, not completed Cancelled Consecutive cancellations accumulate. No special treatment in v1.
Nia Late enrollee Jun 15 2026 Enrolls in LP In Progress Original active. Window: Jun 15 2026–Jun 14 2027.
Aug 1 2026 Completes Original Finished Done. Waits for next cycle based on her enrollment.
Jun 15 2027 Renewal 1 becomes active In Progress 365 days after Nia's enrollment. Window: Jun 15 2027–Jun 14 2028.
Jul 20 2027 Completes Renewal 1 Finished Nia's entire clock is shifted to her enrollment date.
Fixed clock: Courses activate and expire on schedule regardless of learner progress. Non-completion → cancelled, next cycle starts anyway.
Open question: Admin recovery for lapsed learners — same as UC2 variant. Known v1 limitation.
Components used: LP mode flag Enrollment-relative start Relative end date Course end date Active Course state Cancellation Dynamic LP progress Use for next cycle

System Components

Building blocks required to support reassignment/recertification

Foundational (new concepts)

#ComponentDefinition
1 Course end date A Course can have an expiration date. Scoped to LP Courses in v1; could apply to Courses in general in the future.
2 Active Course state A Course is "active" when: start date is in the past AND end date is in the future (or none). This is the window during which the learner has access.

LP Mode

#ComponentDefinition
3 LP mode flag A flag on the LP that enables Course-level scheduling. When on, each Course gets its own start/end dates and lifecycle.

Behaviors

#ComponentStatusDefinition
4 Cancellation New When end date is reached and Course is incomplete: set status to "Cancelled", revoke access to the Course. Completion record retained if previously earned.
5 Skip logic New Automatic. If learner's enrollment date > Course end date, the Course is skipped. No admin toggle.
6 Completion-chain enforcement Exists Next Course waits for previous to complete before unlocking.
7 Dynamic LP progress New LP status = Finished when all active Courses are complete. Reverts to In Progress when new active Courses appear. Completion records retained permanently.

Scheduling

#ComponentStatusDefinition
8 Absolute start date New Course becomes available on a fixed calendar date.
9 Enrollment-relative start New Course becomes available X days after LP enrollment.
10 Completion-triggered delay Extend existing Adds "N days after" delay to existing immediate completion trigger.
11 Absolute end date New Course expires on a fixed calendar date.
12 Relative end date New Course expires X days after it starts.

Admin Tools

#ComponentDefinition
13 Use for next cycle Copies a Course (+ underlying content items) as a shortcut for creating the next cycle. Admin then adjusts dates.

UC → Component Mapping

Which components are required for each use case

Component Status UC1 UC2 UC2+Window UC3
Foundational
1. Course end dateNew
2. Active Course stateNew
LP Mode
3. LP mode flagNew
Behaviors
4. CancellationNew
5. Skip logicNew
6. Completion-chainExists
7. Dynamic LP progressNew
Scheduling
8. Absolute startNew
9. Enrollment-relative startNew
10. Completion-triggered delayExtend
11. Absolute endNew
12. Relative endNew
Admin Tools
13. Use for next cycleNew

Story Breakdown & Build Sequence

Proposed stories and sequencing rationale

Proposed Stories

Story Components What it delivers
S1 LP mode flag, Absolute start, Absolute end Basic scheduled Courses with fixed calendar dates
S2 Course end date, Active Course state, Skip logic Late enrollees handled correctly; system understands "active" vs "expired"
S3 Cancellation End date reached → cancel assignment, revoke access, retain completion record
S4 Dynamic LP progress LP status reacts to active Courses (Finished ↔ In Progress)
S5 Use for next cycle Admin can copy Course + content for next cycle

Build Sequence

S1 → S2 → S3 → S4 → S5

Step Rationale
S1 first Establishes the foundation (mode flag + date fields)
S2 after S1 Requires end dates from S1 to define "active" and "expired"
S3 after S2 Requires active state from S2 to know when to cancel
S4 after S3 Requires cancellation from S3 to correctly recalculate LP progress
S5 last Independent but most useful after the others exist

What This Unlocks


Scope Boundaries

What's covered in v1 and what's explicitly out of scope

What's Covered (v1)

Cadence-driven reassignment — recurring training triggered by time (calendar dates, enrollment-relative dates, completion-triggered delays).

What's Explicitly NOT Covered

Category Example Why out of scope
Event/incident-triggered Safety incident → reassign training to team Requires external trigger integration, not time-based
Content version change Policy v2 published → auto-reassign everyone on v1 Requires content-change detection + auto-assignment
Performance/assessment-triggered Fails phishing test → reassign awareness training Requires conditional branching (pass/fail logic)
Role/transfer-triggered Role change → redo compliance for new role Blurs new assignment vs. reassignment
Grant extension Admin extends window for individual learner Known v1 limitation — no mechanism exists
Admin recovery (re-audience) Lapsed learner re-added via different audience Behavior unknown — needs investigation
Key insight: The v1 model is cadence-driven (time triggers reassignment). Significant real-world reassignment is event-driven (something happened that triggers it). This is the explicit design boundary.