I'm not using Canvas, but we are using LTI (with Moodle) and based on the description, if there is a problem on the WW side, then I doubt that the issue is specific to Canvas.
It is interesting why those users grades are now considered to be 0 by WW. Could some change have been made to their WW data to delete the scores that WW had for them at an earlier time (based on which the non-zero scores were sent by LTI farther in the past)?
It would help to know what data the WeBWorK databases contain (score records, source_did set/not set, etc.) for the students whose scores are being changed to zero, and how that differs from the data for the other students.
I am assuming that you have $LTIGradeMode="homework" for per assignment grades. In that case, each "UserSet" has a value set which provide the data needed to pass the grades back to the LMS. Moreover, it seems that $LTIMassUpdateInterval is set, which causes the periodic updates, which is why the scores get changed back to zero again and again.
As far as I can tell, there is no existing WeBWorK feature to disable the mass-update for specific assignments, but one can be added in the future. Such a feature would provide some manner of avoiding such issues via course.conf.
It could be that you can turn off on the Canvas side the "grade receive" feature; but it is not certain that such a change will truly prevent Canvas from accepting additional LTI score updates based on the value of "lis_result_sourcedid" which was already stored on the WeBWorK side. (The fact that changing the type of task did not help seems to indicate that this may not work.)
They only current workaround I can think of off hand would be to manually delete (via direct access to the databases) the value set for the "lis_source_did" in the database records in the table COURSENAME_set_user for each relevant user_set of these assignments, which would prevent further grade updates being sent by WeBWorK, as WW would no longer have the data needed to send the updates for the specific sets.
Something like:
- select set_id,count(*) from _set_user group by set_id;
- # Find the correct values of set_id to change
- update COURSENAME_set_user set lis_source_did=NULL where
- set_id='"First_SetId_to_changed' or set_id='"Second_SetId_to_changed';
should do the trick.
Nathan