# Contributing to the physics-lint Space The one non-negotiable rule: > **The numbers on the page come from `demo_logic.py`, which imports no UI > framework.** Everything a visitor sees is produced by code the test suite exercises directly. `app.py` and `index.html` arrange it; they never compute it. If a number could only be produced by the UI layer, it is a number nobody has tested, on the most public surface in the portfolio. ## What a good contribution looks like - **A clearer refusal.** An upload the Space accepts and reports on without really validating, or a message that says what went wrong without saying what to do about it. - **A better negative control.** The *run the negative control* button exists because a checker reporting 100% compliance is indistinguishable from one that has quietly stopped working. Both directions are shown — a law that stops rejecting violators has gone blind, one that starts rejecting good networks has gone hysterical — and anything that strengthens that is welcome. - **A counterexample to the certified bound.** The sliders exist so a skeptical reader can try to refute it. Sampling cannot prove the bound; if you find a layout that exceeds it, that is the most useful thing you could send. ## Before you open a PR ```bash pip install -r requirements.txt python -m pytest tests/ -q # 35 passed python -u app.py # http://127.0.0.1:7860 ``` The Gradio Lite version in `index.html` is **pinned**, because newer releases currently fail to resolve their own `huggingface-hub` dependency inside Pyodide — which shows up as a micropip error in the browser console rather than as anything on the page. If you bump it, boot the built page and confirm all three tabs work before submitting. Every number shown must be reproducible by running the published code. The one exception in the portfolio is labelled where it appears; do not add a second.