Unlock Logic
ThreatLab uses a position-based unlock model so you always know exactly what to work on next:Position 0 is always unlocked
The first exercise in any path is immediately available when you join the path. No prior completion is required.
Each subsequent exercise unlocks when the previous one is completed
Once you submit all required artifacts for an exercise, the next position unlocks automatically.
Progress Model
ThreatLab calculates your progress through a path using three counters and a percentage:| Metric | Definition |
|---|---|
completedCount | Number of exercises you have fully completed. |
activeCount | Number of exercises currently published and visible. |
totalCount | Total exercises in the path, including retired ones. |
percent | completedCount ÷ activeCount × 100, capped at 100. Retired exercises do not penalise your score. |
complete | true when every active exercise in the path is completed. |
nextUnlockedIndex | The position of the first incomplete active exercise you should work on next. Returns -1 when the path is fully complete. |
Curated and Onboarding Flags
Paths can be promoted with two special flags to control how they surface across the platform:Curated
Marks the path as editorially featured. Curated paths appear prominently on the ThreatLab dashboard so analysts can find recommended content at a glance.
Onboarding
Flags the path as introductory material. Onboarding paths are suggested automatically to newly registered users to give them a structured starting point.
Toggling either flag requires the Curate learning paths (
curate_paths) capability. Standard analysts cannot promote or demote paths.Validation Rules
When creating or updating a learning path, ThreatLab enforces the following constraints:| Field | Rule |
|---|---|
| Title | Required. Maximum 120 characters. |
| Description | Required. Maximum 2,000 characters. |
| Exercises | Between 1 and 50 exercise UUIDs. No duplicates allowed. |
| Published paths | Must contain at least 1 exercise before they can be made active. |