To add to Ryochet's answer, LMSFinish()
is meant to be a way for the course to tell the LMS that the learner has completed a session, not necessarily the entire course.
The best practice for course development is to set the value for cmi.core.lesson_status
as soon as the course is initialized. This immediately tells the LMS it should not interfere with the value of lesson status when the course invokes LMSFinish()
, and a user who quickly closes the course without leaving page one will be given a status of incomplete
.
However, if the course authors choose not to set lesson_status, the SCORM docs state it is the LMS's responsibility to set the lesson status to completed
. This is what they describe in 3-25, as shown below.
3.3.6.1
It is the responsibility of the SCO to, at a minimum, issue LMSInitialize(“”) and LMSFinish(“”) API calls.
3.4.2
All data elements are optional for use by SCOs. SCOs are required only to use the API functions LMSInitialize("") and LMSFinish(""); they are not required to use LMSSetValue() or LMSGetValue(). SCOs may be very, very small and not be designed to be tracked in detail.
p 3-25
Additional Behavior Requirements: If a SCO sets the cmi.core.lesson_status then there is no problem. However, the SCORM does not force the SCO to set the cmi.core.lesson_status. There is some additional requirements that must be adhered to successfully handle these cases:
- Upon initial launch the LMS should set the cmi.core.lesson_status to “not attempted”.
- Upon receiving the LMSFinish() call or the user navigates away, the LMS should set the cmi.core.lesson_status for the SCO to “completed”.
- After setting the cmi.core.lesson_status to “completed”, the LMS should now check to see if a Mastery Score has been specified in the cmi.student_data.mastery_score, if supported, or the manifest that the SCO is a member of. If a Mastery Score is provided and the SCO did set the cmi.core.score.raw, the LMS shall compare the cmi.core.score.raw to the Mastery Score and set the cmi.core.lesson_status to either “passed” or “failed”. If no Mastery Score is provided, the LMS will cmi.core.lesson_status as “completed”
In other words, if the course sets the values for cmi.core.lesson_status
, just go with the value they provided (assuming it's a valid token). If the course does not provide a value, the SCORM docs are saying to assume it's a "very very small" SCO, and "not be designed to be tracked in detail". As such, set the lesson status to completed
since the SCO is too simple to set the value itself.
If the course authors are uninformed and design a large course that fails to set the lesson status value -- as described in your scenario where "a user could then just view the first page/screen of the SCO and click away" -- the course authors will learn their mistake very quickly (as we all have!) and will edit the course code appropriately.