Thank you for the excellent breakdown of my example’s peculiarities. As you stated (and as I mentioned in the article), not all screen readers behave identically. What worked extremely well in ChromeVox was, at times, completely broken in JAWS and/or NVDA. For my Robot Shopper example, adding the application role seemed to level the playing field between screen readers. The sole reason for my use of it on the body was to allow arrow navigation directly from page load. However, my intention was not to decree the automatic insertion of this role in the body element for all new web projects. My explanation of this role could have been better.
As for the inclusion (and lack of explanation) for role=“list” and role=“listitem”, this was an unfortunate oversight. Having experienced the same issues you encountered in the first pass, I was experimenting with various fixes. Added these roles to the markup, as it turned out, was the fix I was after—unfortunately, I thought the fix had come from a different change and the new roles were left undocumented.
Thank you for pointing these things out to everyone.