Area: mobieusLearn (audit p8) · Surface: Player activity view; content blocks · Dimension: existing-feature-improvement · Severity: major
Thinkific, LearnWorlds and Teachable can require a learner to watch X% of a video before the lesson is marked complete (and disable skip-ahead). mobieusLearn marks any video lesson complete on a single button click regardless of whether the video was played — defeating compliance/CE training use cases and inflating completion analytics. The 'time_met' criteria kind exists in the schema but isn't wired to actual video playback events. Why it matters: completion certificates and CE credit (the product issues both) become untrustworthy if a learner can complete a 60-minute video instantly.
Evidence
templates/learn/play/activity.php:368-374 — for `completion_criteria_kind === 'viewed'` it renders a manual `<button>Mark as viewed</button>` form. The schema HAS `completion_criteria_kind` ENUM('viewed','time_met','submitted','scored_at_or_above','scorm_complete') and `completion_threshold_seconds` (learn-phase1.sql), but grep for `currentTime|ended|played|watched|video.*progress` in activity.php finds no JS that ties the HTML5 video element's playback to completion. Content block kinds include native 'video' and 'external_video' (new-picker.php:12-13).
Suggested fix. Add a small player JS that listens to the HTML5 video 'timeupdate'/'ended' events, posts watched-seconds to the progress endpoint, and only enables/auto-fires completion when watched >= completion_threshold_seconds (or a % of duration). Optionally disable seek-ahead for required videos.
Filed by the automated tenant-app audit and adversarially evidence-verified. Status: verified. Open — not yet actioned.
Patrick Bass
@mobieus