@@contentlisting is fine, it returns a list of objects that I can iterate over.
Actually retrieving values from the objects, that's the issue!
I tried slide/title, slide/Title, ${python:slide.title}, ${python:slide.Title}, ${python:slide.title()}, then I decided to try to retrieve the object with getObject. That only caused an "insufficient priviliges" error.
Under normal circumstances I would use some kind of interactive tool like pdb settrace to troubleshoot but haven't found how to do that with Themefragments on Plone 6. Working blindly is the major problem here.
This is an example of my latest failure due to insufficient priveleges.
<metal:block tal:repeat="slide_ context/slider/@@contentlisting">
<tal:block tal:define="slide python:slide_.getObject();">
<div class="txbl-slide-padding w-slide" style="transform: translateX(0px); opacity: 1;">
<metal:withoutlink>
<span class="txbl-slider-box w-inline-block">
<h1 class="heading-3">${python:slide.Title()}</h1>
<h4 class="txbl-slider-subheading">${python:slide.Description()}</h4>
</span>
</metal:withoutlink>
</div>
</tal:block>
</metal:block>