Разберем каждое предложение по отдельности, чтобы понять, какую роль играют частицы *не* и *ни*.
Предложение 1: "Он не отходит от мамы ни на шаг."
В этом предложении частица *ни* используется для усиления отрицания, выраженного частицей *не*. То есть, подчеркивается, что он вообще не отходит от мамы, даже на самый маленький шаг.
Ответ: усиление отрицания
Предложение 2: "Я не мог не ответить на это сообщение."
В этом предложении мы видим двойное отрицание: "не мог не". Двойное отрицание в русском языке означает утверждение. То есть, фраза означает, что я обязательно должен был ответить на это сообщение, у меня не было выбора.
Ответ: усиление утверждения