v0.3: structural query encoding (patterns + slots) for generalization. Expert.from_qa_pairs now accepts patterns=[...]; questions matching a template are encoded as bind(pattern_hv, slot_hv). On a capitals holdout benchmark, char-level returns empty 100% of the time on unseen slots; structural returns a well-formed answer 100% of the time (+100 pts graceful degradation). Honest: format-generalized guesses by analogy, not factual correctness (no embeddings). 91 tests passing.