Easy: Re-run recall_at_k(vector_search, k=3) and k=10; recall@k is monotone non-decreasing in k, so explain why it rewards larger k even when precision falls.
Standard: Add two (question, [doc_ids]) tuples to QUERIES; make one question answerable only by combining POL-001 and POL-002. Re-run both recall functions and inspect which arm (vector vs. keyword) recovered each.
Stretch: Filter candidate SERVES edges so the path passes through a chosen port node; you'll need to traverse carrier → lane → port → lane → port and sum the two leg costs, not just one edge.
Portfolio: Wrap the chunk→embed→index→hybrid→generate chain in a function that takes a question string and returns (answer, [citations]); save recall_hybrid to a JSON file and print it on --eval.