# Generated artifacts — regenerated by run.sh on every run; never committed. # CI collects these from the workspace / results PVC; they are inputs to the gate, # not source. (Root .gitignore also covers *.junit.xml and coverage/.) _artifacts/ # Downloaded pinned tool binaries (run.sh may fetch chainsaw/kubectl here). .bin/ # Python bytecode from lib/ (status.py imports coverage.py); never committed. __pycache__/ # --- THE ONE EXCEPTION: the committed run ledger (runs/) ------------------------------- # `runs/-/{report.junit.xml,run.log}` + `runs/ledger.jsonl` are the # machine-readable proof-of-pass record that lib/status.py's docstring asks for. They are # SOURCE, not regenerated artifacts: a run's evidence cannot be reconstructed after the # fact, so it must survive in git. # # The negations are needed because the ROOT .gitignore ignores `*.junit.xml` globally # (and `coverage/`). A deeper .gitignore overrides a shallower one, and nothing ignores # the `conformance/runs/` directory itself, so re-including the files here works (git # cannot re-include a file whose PARENT DIRECTORY is excluded — that is why this must not # live under _artifacts/). # # The run LOG is the load-bearing half: Chainsaw's JUnit carries no stdout, and the L2/L3 # tests self-skip GREEN, so the sentinel token in run.log is the only thing separating # "proven" from "skipped". Never commit a report.junit.xml without its run.log. !runs/ !runs/** !runs/**/*.junit.xml