The Store catalog and plugin cover show a shirt badge with the course's authored S, M, or L
size. This is learning scope, not a promise of completion time. The badge has a label in the
reader's language; content.learning.sizeRationale is visible beneath it so keyboard and touch
users can read the explanation without hovering.
Course repositories own content.learning.tShirtSize and the rationale. The Store reads those
fields from each Education package root using its shared shape-tolerant NodeElement reader.
Typed plugin content, raw JSON, and JSON object content produce the same result. Missing metadata,
invalid sizes, and non-Education packages render no badge. It does not derive size from course
length, price, or a personalized recommendation.
Store/Core/Source/CourseSize owns the reader and badge shared by Store/Catalog and
Store/Plugin. The Core Tests area covers content shapes, malformed metadata, category boundaries,
normalization without mutation, and translated chrome. The Catalog Tests area verifies
that both installed and package-source course cards include the badge. The Plugin Tests area
renders the actual cover and checks both the authored and omitted cases.