Yes, this is about drill matching. When a student types their answer, each key-fact bubble lights up when checkMatchGroups fires. The bug is that 80% of the content library (288/361 keyFacts) was generated with the wrong group structure — and the bubbles are lighting up on almost any legal-sounding answer. What the groups are supposed to look like (exemplar): "groups": [ ["grab", "seiz", "snatch", "pull"], ← 4 synonyms for the action ["binder", "folder", "document"] ← 3 synonyms for the object ] 2 groups, 3-4 synonyms each. Student must demonstrate BOTH the action AND the object. Runtime: both groups must hit (exactly 2 groups → hitCount === 2). What's actually in the library: "groups": [ ["equal", "equals"], ← stem + inflection, one word ["pai", "pay"], ["act", "acts"], ["claim", "claims"], ["rais", "raised"], ["first", "firsts"], ["action", "actions"] ← 7 single-word groups ] 7-13 groups, 2 entries each (word + stem). Runtime: ceil(7/2)=4 → student needs any 4 of 7 words. A student who writes "the court's first action on the claim" matches {first, action, claim} + {act} = 4 hits → bubble fires. They never mentioned the Equal Pay Act. How widespread: 80% of keyFacts (288/361). It's the entire generated content library — it was built before the current prompt was tightened. The exemplar files are fine; everything else is broken. What the quality gate in PR #2127 catches: It requires ≥2 groups and semantic independence — but it does NOT cap groups at 4. The broken content has disjoint stems across groups so it passes independence. The gate misses this failure mode entirely. --- Three things need to happen: 1. Add a group-count ceiling to the quality gate — max 4-5 groups per keyFact. This would have rejected all 288 broken keyFacts at generation time. 2. Update the prompt to specify "2-4 groups, each with 3-5 synonyms covering one semantic concept" and add an explicit BAD example of word-by-word tokenization. 3. Regenerate the content library — the 63 drill files need new match groups generated from the corrected prompt. The embeddings are fine and don't need to change; only the match.groups fields need to be replaced.