HTML5 app that reports SCORM 1.2 "completed" isn't marked complete until 5 minutes have passed, even with "Completion" Option set to "Determined by resource"

Operating System (e.g. Windows, MacOS, Linux): Windows 11

Browser (e.g. Chrome, Firefox, Safari): Firefox

Channel (Name of the channel you were working on): “Typing Test” (Token: huhop-vutup)

Description of problem: I am trying to develop an HTML5 Touch Typing tutor. Full Disclosure: I am using Claude to help me develop the program. In testing, I have been having issues with the lessons not being marked as “Complete” within Kolibri as I would expect. My intention is for Learners to have to type six “sentences” of words, after which they are given an accuracy and word per minute score. If they pass a certain threshold for both, it is marked complete, and the HTML5 app sends a “complete” message to Kolibri using SCORM 1.2. I have made sure during every test that in the Details for the resource that “Completion” is set to “Determined by the resource”, rather than a time requirement (Allow learners to mark complete is also always disabled). I have been having issues in testing that if you complete the typing test quickly, that it is not marked as “complete” by Kolibri until the page has been open for some amount of time - it seems like exactly 5 minutes. Is this the intended behavior?

Some scenarios I have tried in testing:

  • Completing the typing goal before 5 minutes requires waiting 5 minutes total page load time before being marked complete. If you exit the app and open it again, it will “Complete” after 5 minutes total time, even if you don’t attempt the typing goal in the second session. As long as you have met it once, it will complete after 5 minutes total page loaded time.
  • Staying on the page for 5 minutes without attempting the typing or having failed the accuracy/wpm threshold does NOT mark complete. You have to ALSO pass the accuracy/wpm check, which triggers sending the SCORM message.
  • In the Resource Details, I tried first changing the completion time using “When time spent is equal to duration” option, and then changing back to “Determined by resource”, but the required completion time always seemed to be 5 minutes.
  • If I left “When time spent is equal to duration” active (instead of “Determined by resource”) and set it to 1 minute, it would still NOT automatically complete after 1 minute. I still had to meet the accuracy/wpm check for the HTML5 app to send the “Complete” SCORM message before Kolibri would mark as completed.

For now, the last option seems like the best work around since 1 minute should be the bare minimum to complete the typing goal, anyway. However, I wanted to check in here because to me, this seems like unintended behavior. I would think there should be some non-time-gated option for completion. If it is intended to always have some minimum time duration requirement, the way it is currently implemented is extremely unintuitive. If there is something else I am missing, I would very much appreciate some clarification.

Thank you very much for your time and all the work you all do in developing this offline learning tool!

Hi @Lakster, thank you for the detailed report.

It looks like you’ve found a bug in Kolibri that wasn’t on our radar. When a SCORM 1.2 resource sets its status to “completed”, Kolibri saves the status but doesn’t recognize it as finished. We are working on a fix that will land in a future Kolibri release.

In the meantime, you can work around it by setting completionStatus to “passed” instead of “completed” in your app’s config.js once the learner meets the accuracy and WPM thresholds. “passed” is a status that Kolibri currently does recognize as finished, so you can switch Completion back to “Determined by the resource”.

Could you try this change in your app and confirm if it solves the problem?

Thanks again for reporting this!

Alex.

Hi Alex,

Thanks for your very quick response. I read up some more about the different states that can be sent for completionStatus and I think “passed” is more in-line with what I wanted in this case anyway. I got it working with one additional caveat: I had wanted to try sending the accuracy% of the typing test to Kolibri over SCORM for coaches to be able to see and used “cmi.core.score.raw” (also with setting min and max to 0 and 100), however, this seemed to be read by Kolibri as a sort of “percentage completed” rather than a score, so it would not mark as complete unless the user got a typing accuracy of 100%. Is there no way for a coach to see a score/grade for each typing lesson? I know there are Kolibri “quiz” modules, but this really doesn’t work for this sort of typing test. Ideally, I’d like coaches to see two “score” values (for accuracy and wpm), but even just one would be nice. Currently, users can see their own past scores by saving in the “cmi.suspend_data” field, so they can even see it across devices, but I couldn’t find a way for coaches to be able to see any of these scores in Kolibri.

Since I’m still new to implementing new Kolibri modules, I had two more quick questions about the process itself. First, is there an easier way to test modules besides uploading a new version to Kolibri Studio and then downloading this new version on my local Kolibri instance? Is there no way to more easily test it locally? Second, is there a way for myself (or someone else who uses the module in future) to edit the actual zipped HTML5 files once it has been uploaded to the channel? For instance, I am working on making multiple languages, but if someone wanted to add one themselves, they would just need to edit and include one “language” file in their own local Kolibri instance of the channel. Is this possible for them to do? Otherwise it seems like they would have to create their own custom channel and reupload the entire HTML5 zip file as their own custom channel for them to be able to make a new language or otherwise edit configuration options in the channel? I’ve already included some user-configurable settings (like light/dark mode) that can be changed within the loaded HTML page on a user-by-user basis, but if coaches/admins wanted to implement some configuration option that applied to all users, I’m not aware of a way to do this without editing the HTML/js files themselves? Even just for making changes myself, if I want to update any features in an activity in the channel, I need to completely delete it and upload a new activity in its place. AFAIK, any user data associated with the old activity is also deleted, so even if I wanted to make a minor change in future, anyone who had already been using it would lose all of their previous completion status and user scores for that activity in the channel.

Thanks again for your time!

Hi @Lakster,

Glad to hear the “passed” status is working for you, and thanks for testing the workaround. I’ve talked with the team, and here you can find the responses to your questions:

Scores for coaches: There is no way for coaches to see additional saved learner progress from HTML5 apps at the moment. We’re discussing whether to expand this in a future release.

Testing locally: Unfortunately, we don’t have a quicker way to do this right now. You can try most of your app by opening the index.html file in a browser, but testing it within Kolibri (completion, saved progress) still means uploading to Studio, publishing, and importing the channel into Kolibri.

Editing the app after uploading: Files can’t be edited once a channel is imported into Kolibri, and there’s currently no way for admins or coaches to set app options that apply to all users. You need to make changes to the zip file in Studio. This means that if someone else wants to deliver a custom version of your resource, yes, they need to create a new channel and upload the edited zip file there. However, you don’t need to delete the entire resource to update the app. In the resource’s edit panel in Studio, you can use “Replace file” to upload the new zip. Learner progress is tied to the resource, not to the file. This way, after you import a new version to Kolibri, learners’ progress and saved data are kept.

Thanks again for the detailed feedback. It’s really helpful!

Alex.