New test_protocol.py validates 6 protocol invariants from PROTOCOL.md:
- Invariant 1: constants sourced from mlsysim registries (not hardcoded)
- Invariant 4: multi-part tabbed structure (4-5 parts + synthesis)
- Invariant 5: multiple deployment contexts (2-3 hardware tiers)
- Zone structure (4 zones: opening, widgets, tabs, ledger)
- Ledger integration (ledger.save with correct chapter number)
- Pedagogical flow (predictions per part, mo.stop gates, stakeholder msgs)
Known gaps surface as xfail, not hard failures — provides a quality
dashboard without blocking CI while labs are brought up to protocol.